Остатки товаров (Запрос) с использованием двух параметров партицирования (составная партиция)

В данной статье продемонстрирован пример создания в Экстракторе 1С проекта выгрузки регистра накопления «Товары на складах. Остатки» с использованием двух параметров партицирования (составная партиция) и источником данных «Запрос».

Создание проекта и первичная выгрузка

Задача : первичная выгрузка данных должна включать выгрузку остатков по всем периодам (месяцам) и складам (наименованиям складов).

Создание проекта

  • Для начала Создадим новый проект с источником данных “Запрос”. &Дата (дата остатков, это будет любая дата месяца) и &Склад (наименование)- это наши два параметра, по которым мы будем выгружать остатки, беря значения параметров из очереди выгрузки. Т.е. в одной конкретной “порции” выгружаемых данных будут содержаться записи, соответствующие одному конкретному наименованию склада и одному конкретному месяцу.

Вот так будет выглядеть наш текст запроса:
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Характеристика КАК Характеристика, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.Серия КАК Серия, НАЧАЛОПЕРИОДА(&Дата, МЕСЯЦ) КАК ПериодМесяц, ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток, ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ), Склад.Наименование = &Склад) КАК ТоварыНаСкладахОстатки
  • Перейдем далее и обратим внимание, что на закладке “Параметры” автоматически выбрались 2 наших параметра (подставились из запроса).

  • Выберем нужные поля для выгрузки на закладке “Поля”:

  • пройдем по мастеру до самого конца и на последнем этапе настроим партиции

  • у нас должна настроиться выгрузка с партицированием. Зайдем в настройки строки проекта и убедимся в этом, нажав на

Обработчик формирования очереди выгрузки.

  • Прежде чем приступить непосредственно к выгрузке - настроим обработчик формирования очереди. А вернее напишем его. Для этого зайдем в настройки строки проекта, нажав на :

    Согласно нашей задаче обработчик должен выглядеть так:

Скрипт обработчика инициализации
Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад, | ТоварыНаСкладахОстаткиИОбороты.Период КАК Период |ИЗ | РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , Месяц, , ) КАК ТоварыНаСкладахОстаткиИОбороты | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладахОстаткиИОбороты.Склад, | ТоварыНаСкладахОстаткиИОбороты.Период | |УПОРЯДОЧИТЬ ПО | Период, | Склад"; Выборка = Запрос.Выполнить().Выбрать(); ФорматнаяСтрока = "ДФ='yyyyMM'"; Пока Выборка.Следующий() Цикл Период = Выборка.Период; Склад = Выборка.Склад; Партиции = Новый Массив; Партиции.Добавить(ГОД(Период) * 100 + МЕСЯЦ(Период) * 1); Партиции.Добавить(нрег(Склад.Наименование)); ЭлементОчереди = Очередь.Добавить(); ЭлементОчереди.Параметры = Новый Структура("Дата,Склад", Выборка.Период,Выборка.Склад.Наименование); ЭлементОчереди.Партиция = Партиции; КонецЦикла;
  • Теперь можно сформировать очередь, нажав на “Сформировать очередь”:

    получим вот такую очередь:

  • И выполним проект. В этот момент будут выгружены остатки за каждую отдельную партицию (месяц-наименование склада) в нескольких параллельных потоках. первичная выгрузка данных завершена.

Регистрация изменений

Теперь настроим обработчик регистрации изменений.

Скрипт обработчика регистрации изменений
ТЗ = Источник.Выгрузить(, "Период,Склад"); ТЗ.Свернуть("Период,Склад"); ТЗ.Колонки.Добавить("Партиция"); ДатаНачалаВыгрузки = ТЗ[0]["Период"]; //смотрим, по какому периоду(периодам) прошло изменение Склад = ТЗ[0]["Склад"]; //смотрим, по какому складу(складам) прошло изменение Если ЗначениеЗаполнено(Склад) Тогда СкладНаименование= Склад.Наименование; Иначе СкладНаименование =""; КонецЕсли; ТекущаяДата = ТекущаяДата(); ФорматнаяСтрока = "ДФ='yyyyMM'"; //форматная строка для периодичности по месяцам ТекПериод = ДатаНачалаВыгрузки; Пока ТекПериод <= ТекущаяДата Цикл Партиции = Новый Массив; Партиции.Добавить(ГОД(ТекПериод) * 100 + МЕСЯЦ(ТекПериод) * 1); Партиции.Добавить(нрег(СкладНаименование)); ЭлементОчереди = Очередь.Добавить(); ЭлементОчереди.Параметры = Новый Структура("Дата,Склад", НачалоМесяца(ТекПериод),СкладНаименование); ЭлементОчереди.Партиция = Партиции; //берем следуюший период пока не дойдем до текущей даты ТекПериод = ДобавитьМесяц(ТекПериод, 1); КонецЦикла;

Теперь остается только настроить расписание выгрузки и данные будут актуализироваться по расписанию.