Выручка и себестоимость продаж (PG-запрос с 2 параметрами и партицированием)

В данной статье продемонстрирован пример создания в Экстракторе 1С проекта выгрузки регистра накопления «Выручка и себестоимость продаж» с использованием двух параметров партицирования и источником данных «Запрос». Выгрузка производится в БД PostgreSQL.

Рассмотрим пример выгрузки PostgreSQL-запроса с двумя параметрами на базе “Выручки и себестоимости продаж”. В данном случае у нас будет использоваться партицирование без сегментирования.

Подробнее об партицировании и сегментировании и их отличии можно прочитать в следующих статьях:

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

Примечание

Об обработчиках можно прочитать в статье «Обработчики».

Итак:

1. Открываем Экстрактор 1С и нажимаем кнопку «Проекты».

2. Нажимаем “Создать“ в верхней панели интерфейса списка проектов.

3. Теперь выбираем тип источника данных, в нашем случае — это “Запрос“. Затем нажимаем “Далее“.

4. Нажимаем кнопку «Конструктор…» в открывшемся окне.

Теперь необходимо сконструировать запрос. В данном случае в списке «База данных» выбираем «РегистрыНакопления», а внутри находим «ВыручкаИСебестоимостьПродажОбороты». Сразу настроим параметры виртуальной таблицы «ВыручкаИСебестоимостьПродажОбороты», для этого выбираем ее и нажимаем кнопку «Параметры виртуальной таблицы».

В открывшейся форме, указываем:

  • НачалоПериода — НАЧАЛОПЕРИОДА(&ПарамДата, МЕСЯЦ)

  • КонецПериода — КОНЕЦПЕРИОДА(&ПарамДата, МЕСЯЦ)

  • Периодичность — Регистратор

А также указываем следующее условие:

ВЫБОР КОГДА Склад <= "Я" ТОГДА "" ИНАЧЕ ПОДСТРОКА(ЕСТЬNULL(Склад.Наименование, ""), 1, 10) КОНЕЦ = &ПарамСклад
Обратите внимание!

В запросе выбирается 10 символов от наименования склада, т.к. при физическом партицировании в PostgreSQL есть ограничения. Партиция — это физически таблица в базе данных и у нее есть Имя, которое состоит из имени таблицы и имени партиции и длина этого имени ограничена.

Нажимаем “ОК“. Далее в списке “Таблицы“ добавляем нужные нам поля для выборки.

Теперь заходим во вкладку “Объединения/Псевдонимы“. Здесь мы дадим более короткие наименования — псевдонимы нашим полям таблицы.

Снова нажимаем “ОК“.

У нас получился следующий текст запроса:

ВЫБРАТЬ ВыручкаИСебестоимостьПродажОбороты.ЗаказКлиента КАК ЗаказКлиента, ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Партнер КАК Партнер, ВыручкаИСебестоимостьПродажОбороты.Партия КАК Партия, ВыручкаИСебестоимостьПродажОбороты.Склад КАК Склад, ВыручкаИСебестоимостьПродажОбороты.Договор КАК Договор, ВыручкаИСебестоимостьПродажОбороты.Менеджер КАК Менеджер, ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам.Организация КАК Организация, ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура, ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Характеристика КАК Характеристика, ВыручкаИСебестоимостьПродажОбороты.Период КАК Период, ВыручкаИСебестоимостьПродажОбороты.Регистратор КАК Регистратор, ВыручкаИСебестоимостьПродажОбороты.КоличествоОборот КАК Количество, ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК Выручка, ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиБезНДСОборот КАК ВыручкаБезНДС, ВыручкаИСебестоимостьПродажОбороты.СтоимостьОборот КАК Себестоимость, ВыручкаИСебестоимостьПродажОбороты.СтоимостьБезНДСОборот КАК СебестоимостьБезНДС, ВыручкаИСебестоимостьПродажОбороты.ДопРасходыОборот КАК ДопРасходы, ВыручкаИСебестоимостьПродажОбороты.ДопРасходыБезНДСОборот КАК ДопРасходыБезНДС, ВыручкаИСебестоимостьПродажОбороты.ТрудозатратыОборот КАК Трудозатраты, ВыручкаИСебестоимостьПродажОбороты.РасходыНаПродажуСНДСОборот КАК РасходыНаПродажуСНДС ИЗ РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты( НАЧАЛОПЕРИОДА(&ПарамДата, МЕСЯЦ), КОНЕЦПЕРИОДА(&ПарамДата, МЕСЯЦ), Регистратор, ВЫБОР КОГДА Склад <= "Я" ТОГДА "" ИНАЧЕ ПОДСТРОКА(ЕстьNULL(Склад.Наименование,""), 1, 10) КОНЕЦ = &ПарамСклад) КАК ВыручкаИСебестоимостьПродажОбороты

Нажимаем “Далее“.

5. Проверяем, чтобы все поля были выделены, ничего не меняем, и нажимаем “Далее“.

Нажимаем “Далее“.

6. Пропускаем следующий шаг с дополнительной настройкой исходных данных и нажимаем “Далее“.

7. Выбираем нужное подключение или создаем новое, снова нажимаем “Далее“.

8. Создаем новую таблицу, назовем ее “Тест_Выручка“, нажимаем “Далее“.

9. В сопоставлении полей убираем флаги в колонке “Поле сегмента“ для использующихся в данном проекте параметров.

Примечание

Данный пример демонстрирует исключительно физическое партицирование, поэтому здесь мы убираем флаги для сегментирования.

10. Теперь перейдем к расширенным настройкам таблицы.

Здесь мы добавляем в поля партиции с нашими параметрами. Нажимаем кнопку “Добавить“ и выбираем из выпадающего списка “ПараметрПарамДата“ и затем, таким же образом добавляем и “ПараметрПарамСклад“.

В итоге, у нас добавлено два параметра, нажимаем “Далее“.

Снова “Далее“, таблица успешно создана.

11. После создания таблицы даем наименование проекту в соответствующем поле.

В данном проекте используется собственный обработчик формирования очереди для первичной/полной выгрузки данных, поэтому создадим его здесь.

Для этого заходим в настройки строки проекта, нажав значок , выбираем “Обработчик формирования очереди для первичной/полной выгрузки данных“, активируем переключатель “Обработчик:“, выбираем “Обработчик“.

Обратите внимание!

В качестве способа обновления необходимо установить “Перезапись партиции“.

Теперь переходим к созданию собственного обработчика.

Примечание

Подробнее о создании собственного обработчика можно почитать в статье “Обработчики“.

Полную инструкцию по созданию собственного обработчика Вы найдете в статье “Как написать собственный обработчик и сохранить его в справочнике?“

В выпадающем списке для добавления обработчика нажимаем “+“.

Теперь указываем наименование обработчика в соответствующем поле, проверяем, что у нас выбран правильный тип обработчика. Далее указываем параметры в поле “Параметры“, в нашем случае имена параметров “Дата начала выгрузки“ и “Дата окончания выгрузки“, тип для каждого параметра указываем “Дата“.

заполняем поле “Алгоритм“ кодом обработчика написанном на языке 1С и нажимаем “Записать и закрыть“.

Код обработчика для копирования
//-----------------------------ПАРАМЕТРЫ-------------------------------------------------------------------------------- // параметры процедуры мы можем задать просто напрямую в обработчике, как этот ИмяПараметраПериод = "ПарамДата"; //как в запросе источнике ИмяПараметраСклад = "ПарамСклад"; //как в запросе источнике //или как это значение: его мы задали в настройках параметров обработчика, поэтому просто получаем его оттуда ДатаНачалаВыгрузки = Параметры.Получить("Дата начала выгрузки"); ДатаОкончанияВыгрузки=Дата(2024,8,30); Если НЕ ЗначениеЗаполнено(ДатаОкончанияВыгрузки) Тогда ДатаОкончанияВыгрузки = КонецМесяца(ТекущаяДата()); КонецЕсли; //---------------------------------------------------------------------------------------------------------------------- Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | НачалоПериода(ВыручкаИСебестоимостьПродаж.Период,МЕСЯЦ) КАК НачалоПериода, | (ВЫБОР | КОГДА Склад<= ""Я"" ТОГДА """" | ИНАЧЕ ПОДСТРОКА(ЕстьNull(Склад.Наименование,""""), 1, 10) | КОНЕЦ) КАК Склад |ИЗ | РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК ВыручкаИСебестоимостьПродаж |ГДЕ | ВыручкаИСебестоимостьПродаж.Период МЕЖДУ &ДатаНачалаВыгрузки И &ДатаОкончанияВыгрузки | |СГРУППИРОВАТЬ ПО | НачалоПериода(ВыручкаИСебестоимостьПродаж.Период,МЕСЯЦ), | (ВЫБОР | КОГДА Склад<= ""Я"" ТОГДА """" | ИНАЧЕ ПОДСТРОКА(ЕстьNull(Склад.Наименование,""""), 1, 10) | КОНЕЦ) "; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки",ДатаНачалаВыгрузки); Запрос.УстановитьПараметр("ДатаОкончанияВыгрузки",ДатаОкончанияВыгрузки); Выборка = Запрос.Выполнить().Выбрать(); ФорматнаяСтрока = "ДФ='yyyyMM'"; //форматная строка для партицирования по месяцам Пока Выборка.Следующий() Цикл НачалоПериода = Выборка.НачалоПериода; Склад = Выборка.Склад; //функция преобразуем дату к формату нужного представления в зависимости от используемой периодичности. У нас это месяц НачалоПериодаЧисло = Экс_ClickHouse.ПреобразоватьДатуВЧисло(НачалоПериода, "МЕСЯЦ"); //Создадим запись в очереди ЭлементОчереди = Очередь.Добавить(); //заполним параметры записи ЭлементОчереди.Параметры = Новый Структура(ИмяПараметраПериод + ", " + ИмяПараметраСклад, НачалоПериода, Склад); //заполним партицию ЭлементОчереди.Партиция = Новый Массив; ЭлементОчереди.Партиция.Добавить(НачалоПериодаЧисло); ЭлементОчереди.Партиция.Добавить(Склад); КонецЦикла;

В окне настройки строки проекта нажимаем “Сохранить“ и “Применить и закрыть“.

12. Теперь последовательно нажимаем “Записать“, “Сформировать очередь“ и “Выполнить проект“.