Хранилище информации
О функционале
Хранилище информации в режиме загрузки Инжектора 1С — это система хранения данных, которая использует инструменты Инжектора 1С для оптимизации процессов хранения, анализа данных и решения задач, связанных с работой алгоритмов загрузки данных.
В узком смысле: хранилище данных — это своего рода оперативная память конкретного проекта загрузки.
Настроить все возможные обработчики перед/после/в процессе загрузки можно на вкладке «Настройки обработчиков»
Пример использования
Предположим, в базе 1С ведется серийный учет по определенным группам товаров. Из внешней СУБД подгружаются документы продажи, которые не хранят в себе информацию по серийным номерам номенклатуры. Задача загрузки состоит в том, чтобы при создании и проведении документов продажи в них подставлялись корректные серийные номера и списание товаров со склада происходило согласно настроенному серийному учету.
Что делаем?
На вкладке «Настройки обработчиков» в раздел «Перед загрузкой данных» создадим запрос, через который получим текущие остатки по номенклатуре и сериям, запомним их в сквозном параметре (Хранилище информации).
//получим текущие остатки по номенклатуре и сериям, запомним их в сквозном параметре Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, | ТоварыНаСкладахОстатки.Серия КАК Серия, | ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки"; Результат = Запрос.Выполнить(); ТаблицаЗначенийОстаткиСерии = Результат.Выгрузить(); ПараметрыЗагрузки.Вставить("ТаблицаЗначенийСерий",ТаблицаЗначенийОстаткиСерии);
В разделе «После добавления строки» добавим структуру, которая распределит хранящиеся серии из сквозного параметра (хранилища) в строки документа продажи в соответствии с серийном учетом.
ПарамОтбора = Новый Структура("Номенклатура",ТекущиеДанные.Номенклатура); НайденныеСтрокиОстатков = ПараметрыЗагрузки.ТаблицаЗначенийСерий.НайтиСтроки(ПарамОтбора); ТребуетсяПодобратьКоличество = ТекущиеДанные.Количество; Для счетчик = 0 по НайденныеСтрокиОстатков.Количество()-1 Цикл НайденнаяСтрокаОстатков = НайденныеСтрокиОстатков[счетчик]; Если ТребуетсяПодобратьКоличество<=НайденнаяСтрокаОстатков["ВНаличииОстаток"] Тогда ТекущиеДанные.Серия = НайденнаяСтрокаОстатков["Серия"]; НайденнаяСтрокаОстатков["ВНаличииОстаток"] = НайденнаяСтрокаОстатков["ВНаличииОстаток"] - ТребуетсяПодобратьКоличество; ТребуетсяПодобратьКоличество = 0; ИначеЕсли НайденнаяСтрокаОстатков["ВНаличииОстаток"]>0 Тогда ТекущиеДанные.Серия = НайденнаяСтрокаОстатков["Серия"]; ТекущиеДанные.Количество = НайденнаяСтрокаОстатков["ВНаличииОстаток"]; ТекущиеДанные.КоличествоУпаковок = НайденнаяСтрокаОстатков["ВНаличииОстаток"];//не будем рассматривать пересчет упаковок ТребуетсяПодобратьКоличество = ТребуетсяПодобратьКоличество - НайденнаяСтрокаОстатков["ВНаличииОстаток"]; НайденнаяСтрокаОстатков["ВНаличииОстаток"] = 0; НоваяСтрокаДокумента = Объект.Товары.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрокаДокумента,ТекущиеДанные,,"Серия,Количество,КоличествоУпаковок"); НоваяСтрокаДокумента.Количество = ТребуетсяПодобратьКоличество; НоваяСтрокаДокумента.КоличествоУпаковок = ТребуетсяПодобратьКоличество; //в идеале - еще надо прописать пересчет сумм ТекущиеДанные = НоваяСтрокаДокумента;//перенесем обрабатываему строку КонецЕсли; Если ТребуетсяПодобратьКоличество<=0 Тогда Прервать; КонецЕсли;
Результат:
В результате выполнения проекта мы получаем список проведенных документов продажи и серийными номерами.
В данном примере мы рассмотрели только серийный учет, но также аналогично подобную настройку можно использовать в базах 1С с учетом товаров по партии или по сроку годности.