Как передать параметры периода из интерфейса СКД при использовании внешней таблицы значений?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов на СКД часто возникает необходимость использовать собственный запрос для подготовки данных, а затем передавать полученную ТаблицаЗначений в систему компоновки. Однако при таком подходе стандартные параметры СКД перестают автоматически связываться с вашим кодом. Давайте разберем, как обеспечить управление периодом из пользовательского интерфейса, когда вы используете внешний набор данных.

Настройка параметров в схеме компоновки данных

Чтобы пользователь мог выбирать период, прежде всего, необходимо правильно настроить саму СхемаКомпоновкиДанных. Выполните следующие шаги:

  1. Откройте вкладку Параметры в СКД.
  2. Создайте параметр, например, с именем Период и типом СтандартныйПериод.
  3. Перейдите на вкладку Настройки. Найдите раздел Параметры данных.
  4. Установите флажки напротив вашего параметра, чтобы сделать его доступным для изменения. Убедитесь, что для него не установлен флаг Ограничение доступности.

Передача значений параметров в коде модуля

Поскольку при использовании внешнего набора данных система не может сама подставить значения из интерфейса в ваш запрос, нам потребуется получить их вручную из объекта КомпоновщикНастроек в процедуре ПриКомпоновкеРезультата. Рассмотрим подробнее, как это реализовать:

Для корректного получения данных необходимо считать настройки компоновщика, найти нужный элемент параметров и передать его значения в метод УстановитьПараметр вашего объекта Запрос.


// В процедуре ПриКомпоновкеРезультата
НастройкиСКД = КомпоновщикНастроек.ПолучитьНастройки();
ПараметрПериода = НастройкиСКД.ПараметрыДанных.Элементы.Найти("Период");

Если ПараметрПериода <> Неопределено И ПараметрПериода.Использование Тогда
    ДатаНачала = НачалоДня(ПараметрПериода.Значение.ДатаНачала);
    ДатаОкончания = КонецДня(ПараметрПериода.Значение.ДатаОкончания);
Иначе
    // Обработка случая, если параметр не задан пользователем
    ДатаНачала = ТекущаяДата();
    ДатаОкончания = ТекущаяДата();
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст = "... Ваш запрос к базе данных ...";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
ТЗ = Запрос.Выполнить().Выгрузить();

Почему важно использовать НачалоДня и КонецДня?

При работе с типом СтандартныйПериод важно учитывать, что ДатаОкончания может содержать время 00:00:00 текущего дня. Если вы просто передадите эту дату в условие МЕЖДУ, вы можете потерять документы, созданные в течение этого дня. Использование функций НачалоДня() и КонецДня() позволяет включить в выборку все записи за указанный диапазон целиком.

Работа с табличными частями

Если в вашем отчете необходимо вывести данные из табличных частей (например, Запасы), вы можете поступить одним из двух способов:

  1. Денормализация: Соедините шапку документа с табличной частью в одном запросе. Полученная «плоская» таблица значений легко воспринимается СКД как один набор данных.
  2. Связи наборов данных: Добавьте в СКД два набора данных: «Запрос (шапка)» и «Запрос (табличная часть)». Установите связь между ними по полю Ссылка. Этот подход позволяет более гибко управлять выводом иерархических структур.

Совет: Если логика отчета становится слишком сложной, рекомендуем рассмотреть возможность полного отказа от внешнего набора данных в пользу стандартного НаборДанныхЗапрос внутри СКД. Это позволит системе автоматически оптимизировать запросы и упростит поддержку кода в будущем.

← На главную