Запросы и сегментирование

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

Важно понимать, зачем мы пишем запрос. Что он должен выбирать? На первый взгляд кажется, что запрос должен выбирать весь набор данных, который мы хотим выгрузить, но это не так. На самом деле запрос, который мы строим — это запрос на выборку одного сегмента данных, а какого именно сегмента — задается параметрами сегментирования.

Важно!

Запрос должен возвращать данные одного конкретного сегмента!

При сегментировании Экстрактор 1С:

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

  2. Перебирает очередь и для каждого отдельного сегмента выполняет запрос.

Именно поэтому запрос и должен возвращать данные одного конкретного сегмента.

Пример 1. Запрос с одним параметром периода

В данном примере мы будем использовать тип источника данных «Запрос».

Заходим в Экстрактор 1С в раздел «Проекты», нажимаем кнопку «Запрос» и выбираем тип источника данных «Запрос».

1

2

3

4

Воспользуйтесь уже готовым текстом запроса. Вставьте его в соответствующее окно.

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

В данном случае, мы будем сегментировать выгрузку параметру: Период с разделением по дням регистра накопления Выручка и себестоимость продаж. Для этого будем передавать параметр &Дата.

ВыручкаИСебестоимостьПродаж.Период МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ) И КОНЕЦПЕРИОДА(&Дата, ДЕНЬ)

Данная конструкция является условием, в котором:

  • НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА — это атрибуты функций;

  • &Дата — это переменная;

  • День — фракция до которой будет округляться, соответственно.

Условие задается во вкладке «Условие» Конструктора запроса.

1

2

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

На следующем этапе проверяем набор данных, здесь ничего менять не требуется.

Пропускаем этап настройки вычисляемых полей (этап 5), затем выбираем подключение, создаем таблицу, даем ей название (этап 6 и этап 7).

На этапе сопоставления полей проверяем, чтобы для поля «Параметр.Дата» был установлен флаг «Сегмент».

Следующий этап снова пропускаем.

Задаем наименование проекту.

Теперь настроим обработчики. Заходим в настройки строки проекта по кнопке .

Настроим обработчик формирования очереди для первичной/полной выгрузки данных:

  • активируем переключатель «Обработчик:»;

  • выбираем вид обработчика «Предопределенный обработчик»;

  • выбираем обработчик «Инициализация очереди выгрузки по периоду».

  • нажимаем кнопку и указываем следующие параметры:

    • Вид объекта — РегистрыНакопления;

    • Имя объекта — ВыручкаИСебестоимостьПродаж;

    • Поле даты — Период;

    • Имя параметра — Дата;

    • Периодичность — День.

1

2

3

4

Примечание:

для вида объекта «Документы» необходимо указывать дату как «Дата», а не как «Период».

Настроим обработчик формирования очереди при изменении объектов:

  • устанавливаем флаг «Вкл.»;

  • выбираем вид объекта «РегистрыНакопления»;

  • выбираем имя объекта «ВыручкаИСебестоимостьПродаж»;

  • выбираем вид обработчика «Предопределенный обработчик»;

  • выбираем обработчик «Регистрация изменений по периоду»

  • нажимаем «Настройка» и указываем следующие параметры:

    • Поле даты — Период;

    • Имя параметра — Дата;

    • Режим — Стандартный;

    • Периодичность — День.

1

2

Сохраняем настройки строки проекта, нажав кнопку «Применить и закрыть», которые внесли и последовательно нажимаем кнопки «Записать», «Сформировать очередь» и «Выполнить проект», чтобы начать выгрузку проекта.

1

2

Посмотрим выгрузку. Все, как и хотели с сегментированием по параметру «Дата».

Пример 2. Сегментирование виртуальной таблицы «Обороты» по параметру Периода и передача фиксированного параметра

В данном примере мы настроим выгрузку всех оборотов регистра «Выручка и себестоимость продаж» с точностью до Регистратора. При этом сегментировать выгрузку будем помесячно. Немного усложним задачу условием, что выгружаться всегда должны только записи одного определенно склада (например, нам нужна отдельная таблица для аналитики по этому складу).

Т.е. сегмент у нас будет по одному параметру: Месяц (Периода), где:

  • «Месяц» — это функция сегментирования;

  • «Период» — имя реквизита РН, по которому производится сегментирование.

Важно!

«Период» - это еще не имя параметра!

Примечание

Обычно в запросах 1С использует параметры &НачалоПериода и &КонецПериода.
Для того, чтобы корректно настроить сегментирование вместо этих параметров будем указывать НачалоПериода(&Дата,Месяц) и КонецПериода(&Дата,Месяц), где Месяц— необходимый размер сегмента выгрузки.

Теперь придумаем имя для параметра сегментирования:
1. &Дата — параметр сегментирования для поля «Период». Он будет передаваться из обработчиков формирования очереди и регистрации изменений.
2. &ПСклад — фиксированный параметр для задания конкретного значения, которые указываются на закладке «Параметры».
Так должен будет выглядеть запрос для нашего примера:

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

Таким образом, мы выбрали виртуальную таблицу «Обороты» и указали такие параметры, чтобы запрос возвращал данные для одного сегмента, когда в него программно будут поданы параметры этого сегмента:

Зададим конкретное значение для Склада на закладке «Параметры», нажав кнопку «Далее».
Здесь видно, что указан и наш параметр сегментирования: «Дата». Его значение будет задаваться программно и браться будет из очереди выгрузки:


Пройдя по конструктору до этапа сопоставления полей задаем наш параметр сегментирования, проставив напротив него флаг:

Теперь выбираем подходящий предопределенный обработчик инициализации очереди и заполняем параметры:

Затем запишем проект, сформируем очередь, выполним проект и посмотрим, что выгрузилось все, как мы хотели:

Пример 3. Сегментирование виртуальной таблицы «Остатки»

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

Т.е. сегмент у нас будет по одному параметру: Месяц (ДатаОстатка), где:

  • «Месяц» — это функция сегментирования;

  • «ДатаОстатка» — параметр, по которому производится сегментирование.

Важно!

Тут«&ДатаОстатка» — это уже сразу и имя параметра! Так как, поля «ДатаОстатка» в виртуальных таблицах нет, мы будем выводить эту дату, как значение нашего параметра в полях выбора.

Так должен будет выглядеть запрос для нашего примера :

Текст запроса
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Характеристика КАК Характеристика, ТоварыНаСкладахОстатки.Назначение КАК Назначение, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.Помещение КАК Помещение, ТоварыНаСкладахОстатки.Серия КАК Серия, КОНЕЦПЕРИОДА(&ДатаОстатка, МЕСЯЦ) КАК ДатаОстатка, ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&ДатаОстатка, МЕСЯЦ), ) КАК ТоварыНаСкладахОстатки

То есть кроме того, что мы задали параметры виртуальной таблицы «Остатки», мы еще и в полях выбора добавили расчетное поле:

КОНЕЦПЕРИОДА(&ДатаОстатка, МЕСЯЦ) КАК ДатаОстатка.

Для каждого сегмента это поле будет иметь свое значение. Таким образом, мы увидим динамику остатков (на конец каждого месяца).
Наш параметр сегментирования появится во вкладке «Параметры» на следующем этапе конструктора. Убедимся в этом:

Пройдя по конструктору до этапа сопоставления полей задаем наш параметр сегментирования, проставив напротив него флаг:

Теперь выбираем подходящий предопределенный обработчик инициализации очереди и заполняем параметры:

Затем запишем проект, сформируем очередь, выполним проект и посмотрим, что выгрузилось все, как мы хотели:

Примечание

для сегментирования по дате вместо обычных параметров НачалоПериода и КонецПериода используется один параметр Дата, а также функции НачалоПериода(&Дата, [Периодичность]) и КонецПериода(&Дата, [Периодичность]).