Как вывести параметры даты СКД на обычную форму в 1С

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

При разработке отчетов на базе Системы компоновки данных (СКД) для обычных форм (ОФ) программисты часто сталкиваются с тем, что простое размещение полей ввода на форме не приводит к автоматическому заполнению параметров в схеме компоновки. В отличие от управляемых форм, где платформа берет на себя значительную часть работы по синхронизации данных, на обычных формах нам необходимо явно указать системе, как связать элементы управления с настройками компоновщика. В данной статье мы разберем несколько эффективных способов решения этой задачи: от программного управления параметрами до использования стандартных визуальных компонентов.

Причина возникновения проблемы

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

Способ 1: Программная установка параметров через обработчики событий

Этот метод считается наиболее гибким и понятным. Мы создаем на форме обычные поля ввода (типа Дата), а при их изменении принудительно записываем значения в компоновщик настроек. Рассмотрим этот процесс по шагам.

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


Процедура НачПериодаПриИзменении(Элемент)
    УстановитьПараметрКомпоновкиДанных("ДатаНачала", НачалоДня(НачПериода));
КонецПроцедуры

Процедура КонПериодаПриИзменении(Элемент)
    УстановитьПараметрКомпоновкиДанных("ДатаОкончания", КонецДня(КонПериода));
КонецПроцедуры

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

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

Способ 2: Использование табличного поля для управления всеми параметрами

Если параметров много и вы не хотите рисовать отдельное поле для каждого, можно воспользоваться стандартным механизмом отображения параметров СКД. Для этого на форму добавляется элемент управления Табличное поле.

Выполним следующие действия:

  1. Добавим на форму элемент Табличное поле.
  2. В свойстве Данные этого поля укажем путь: КомпоновщикНастроек.Настройки.ПараметрыДанных.
  3. Система автоматически создаст колонки "Параметр" и "Значение".

Полезный совет: Чтобы пользователь не видел технические параметры (например, скрытые константы или служебные флаги), зайдем в схему компоновки данных на закладку "Параметры" и установим галочку Ограничение доступности для тех параметров, которые не должны редактироваться пользователем в этой таблице.

Способ 3: Стандартный период и его интеграция с СКД

В обычных формах 1С есть удобный встроенный механизм выбора периода. Вы можете вставить его через меню "Форма" -> "Вставить" -> "Выбор периода". Это создаст набор элементов управления (кнопка выбора, надписи с датами), которые выглядят профессионально и привычны пользователям.

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


Процедура УстановитьПериодВНастройки()
    Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодОтчета");
    Если Параметр <> Неопределено Тогда
        Параметр.Использование = Истина;
        Параметр.Значение = НашРеквизитПериодСФормы; // Тип СтандартныйПериод
    КонецЕсли;
КонецПроцедуры

Однако запросы в СКД часто требуют именно две отдельные даты (начало и конец). В этом случае мы можем применить "хитрость" в самой схеме компоновки:

Таким образом, пользователю достаточно выбрать период один раз на форме, а СКД сама "разложит" его на составляющие для использования в условиях запроса.

Способ 4: Обработка параметров в модуле объекта (ПриКомпоновкеРезультата)

Иногда удобнее всего передавать параметры непосредственно перед формированием отчета, особенно если они зависят от реквизитов самого объекта "Отчет". Для этого в модуле объекта отчета существует предопределенная процедура ПриКомпоновкеРезультата. Проанализируем ситуацию, когда данные берутся из реквизитов объекта:


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

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

КонецПроцедуры

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

Нюанс с пользовательскими настройками

В версиях платформы 8.2.14 и выше появилась концепция "Пользовательских настроек". Если параметр вынесен в этот раздел (кнопка в конструкторе СКД "Свойства элемента пользовательской настройки"), то программно обращаться нужно не к КомпоновщикНастроек.Настройки, а к КомпоновщикНастроек.ПользовательскиеНастройки.

Посмотрим, как найти нужный элемент в пользовательских настройках:


ИдентификаторНастройки = ПараметрСКД.ИдентификаторПользовательскойНастройки;
ЭлементНастройки = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторНастройки);
Если ЭлементНастройки <> Неопределено Тогда
    ЭлементНастройки.Значение = НовоеЗначение;
    ЭлементНастройки.Использование = Истина;
КонецЕсли;

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

← На главную