При работе с конфигурацией «1С:Управление торговлей 10.3» разработчики часто сталкиваются с тем, что в стандартном или самописном отчете, базирующемся на механизме «Универсального отчета», отсутствуют или недоступны группировки колонок по временным интервалам (день, неделя, декада и т.д.). В отличие от современной системы компоновки данных (СКД), где периоды формируются автоматически, классический ПостроительОтчета, на котором построен универсальный отчет, требует детальной ручной настройки запроса и метаданных. Разберем пошагово, как исправить эту ситуацию и заставить отчет выводить данные в разрезе периодов.
Для начала проанализируем ситуацию: универсальный отчет в УТ 10.3 — это надстройка над объектом ПостроительОтчета. Чтобы поле стало доступным для группировки (особенно в колонках), построитель должен «увидеть» это поле в секции выбора. Если вы используете произвольный текст запроса, то простого упоминания поля Период в тексте недостаточно. Построитель должен понимать роль этого поля.
Рассмотрим основной механизм взаимодействия построителя с запросом. Чтобы поля периодов появились в списке доступных настроек, их необходимо явно описать в расширении языка запросов для построителя отчетов — внутри фигурных скобок {}. Если мы пишем запрос вручную, нам нужно убедиться, что поля периодов (ПериодДень, ПериодНеделя и др.) прописаны в секции {ВЫБРАТЬ...}.
Посмотрим на пример правильного оформления секции выбора в запросе:
ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.КоличествоОборот КАК Количество,
ПродажиОбороты.Период КАК Период,
НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ПериодДень,
НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, НЕДЕЛЯ) КАК ПериодНеделя
{ВЫБРАТЬ
Номенклатура.*,
Количество,
Период,
ПериодДень,
ПериодНеделя}
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Авто, ) КАК ПродажиОбороты
Обратим внимание на параметр Авто во второй секции виртуальной таблицы оборотов. Это критически важный момент. Если там будет жестко указано, например, Месяц, то детализация до дня станет физически невозможной, так как система получит данные, уже сгруппированные по месяцам.
Проанализируем ситуацию, когда запрос вроде бы верен, но группировки все равно неактивны. В ПостроителеОтчета крайне важно, чтобы у поля была назначена соответствующая роль. Выясним причину: если мы создаем отчет программно, нам нужно убедиться, что для выбранных полей установлена пометка «Период».
В коде это может выглядеть так при настройке построителя:
ПостроительОтчета.ВыбранныеПоля.Добавить("ПериодДень");
// Убеждаемся, что тип значения поля позволяет интерпретировать его как дату
Однако в универсальном отчете УТ 10.3 за это отвечает программный код в модуле объекта. Вызовем процедуру, которая регистрирует стандартные периоды.
Если вы разрабатываете отчет на базе типового шаблона УниверсальныйОтчет, найдите в модуле объекта процедуру УстановитьНачальныеНастройки. В типовых конфигурациях существует общий модуль (обычно с названием УниверсальныйОтчет), содержащий вспомогательные функции. Для автоматического добавления периодов необходимо вызвать метод ДобавитьДополнительныеПоляПериода.
Рассмотрим пример реализации в модуле отчета:
Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
// Основная настройка построителя
УниверсальныйОтчет.УстановитьНачальныеНастройкиОбъекта(ЭтотОбъект);
// Добавляем возможности группировки по периодам
// Это позволит пользователю выбирать "Период по дням", "Период по неделям" в настройках
УниверсальныйОтчет.ДобавитьДополнительныеПоляПериода(ЭтотОбъект);
КонецПроцедуры
Эта функция анализирует доступные поля даты в запросе и автоматически добавляет в настройки построителя вычисляемые поля для различных интервалов времени. Без этого вызова пользователь просто не увидит эти поля в форме настройки группировок.
Разберем ситуацию, упомянутую в обсуждении: почему при попытке добавить поля периода в запрос вручную программа выдает ошибку. Чаще всего это происходит по двум причинам:
Период, и вы добавляете Период КАК ПериодДень без использования функции НАЧАЛОПЕРИОДА, построитель может запутаться в итогах.СГРУППИРОВАТЬ ПО, все новые поля периодов обязаны быть включены в эту секцию.Посмотрим, как должен выглядеть фрагмент кода с группировкой:
ВЫБРАТЬ
Номенклатура,
СУММА(Количество) КАК Кол,
НАЧАЛОПЕРИОДА(Период, ДЕНЬ) КАК ПериодДень
ИЗ
РегистрНакопления.Продажи
ГДЕ
Период МЕЖДУ &Дата1 И &Дата2
СГРУППИРОВАТЬ ПО
Номенклатура,
НАЧАЛОПЕРИОДА(Период, ДЕНЬ)
Важно помнить, что в УТ 10.3 универсальный отчет разделяет группировки строк и группировки колонок. Чтобы поле периода можно было перетащить именно в «Группировки колонок», оно должно быть доступно в коллекции ДоступныеПоля построителя.
Выясним еще один нюанс: если отчет строится по виртуальной таблице Обороты, то поле Регистратор часто мешает корректной работе периодических группировок. Если вам нужна аналитика по дням и неделям в колонках, старайтесь избегать вывода регистратора в том же самом запросе, либо настраивайте итоги так, чтобы период был выше регистратора в иерархии.
Проанализировав все шаги, составим финальный алгоритм действий для разработчика:
Авто.{ВЫБРАТЬ...} перечислены все необходимые поля периодов с понятными псевдонимами (например, ПериодДень, ПериодНеделя).УниверсальныйОтчет.ДобавитьДополнительныеПоляПериода(ЭтотОбъект).ПостроительОтчета.ДоступныеПоля данные поля присутствуют и имеют правильный тип.Следуя этим правилам, вы обеспечите гибкость отчета, позволяя пользователям самостоятельно настраивать динамику продаж или остатков в разрезе любых календарных периодов прямо в пользовательском режиме.