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