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