Как получить значение КонецПериода в модуле формы отчета СКД

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с задачей вывода параметров периода (например, даты окончания отчета) в печатную форму, подвал или заголовок программным способом. Казалось бы, задача проста: обратиться к компоновщику настроек и забрать значение. Однако в обычных формах (например, в конфигурации БГУ 1.0, УПП или ЗУП 2.5) этот процесс имеет свои нюансы, из-за которых вместо нужной даты часто возвращается пустое значение. Рассмотрим подробно, почему так происходит и как правильно получить данные.

Почему стандартное обращение к настройкам возвращает пустую дату

Чаще всего разработчики пытаются получить значение следующим кодом:


ЗначениеПараметраКонецПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеParemetra(Новый ПараметрКомпоновкиДанных("КонецПериода")).Значение;

Проанализируем ситуацию: почему в Значение оказывается Дата('00010101')? Основная причина кроется в архитектуре СКД. Настройки в компоновщике разделены на несколько уровней:

  1. Общие настройки (Settings): те, что заданы в схеме компоновки по умолчанию.
  2. Пользовательские настройки (UserSettings): те, которые пользователь изменил на форме отчета.
  3. Фиксированные настройки: программно установленные ограничения, которые пользователь не может менять.

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

Решение 1: Использование метода ПолучитьНастройки()

Чтобы не искать значение по всем коллекциям вручную, в 1С предусмотрен метод ПолучитьНастройки(). Он собирает воедино все уровни настроек (основные, пользовательские и фиксированные) и выдает результирующий объект, который и будет использоваться при компоновке результата. Это самый правильный путь с точки зрения логики СКД.

Разберем пример кода для получения даты:


// Получаем полные настройки, объединяющие выбор пользователя и схему
ПолныеНастройки = КомпоновщикНастроек.ПолучитьНастройки();

// Ищем параметр по имени
ПараметрКонец = ПолныеНастройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));

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

Решение 2: Обращение к реквизиту формы (для обычных форм)

В типовых конфигурациях на обычных формах (таких как БГУ 1.0) параметры периода часто связаны напрямую с реквизитами формы. На форме может присутствовать реквизит с типом СтандартныйПериод или две отдельные даты. Выясним причину, почему это иногда надежнее: в момент нажатия кнопки "Сформировать" настройки из этих реквизитов еще могут не успеть "прогрузиться" в объект компоновщика, если вы обращаетесь к ним слишком рано или слишком поздно в жизненном цикле формы.

Проанализируем самый простой способ, который часто выручает в обычных формах:


// Если на форме есть реквизит "СтандартныйПериод"
Если ЗначениеЗаполнено(СтандартныйПериод.ДатаОкончания) Тогда
    ОбластьВывести.Параметры.Дата = СтандартныйПериод.ДатаОкончания;
КонецЕсли;

Важно: Этот способ работает, если реквизит СтандартныйПериод действительно добавлен на форму и связан с элементами управления.

Решение 3: Перебор параметров в цикле

Если вы хотите быть абсолютно уверены в получении данных или вам нужно отладить, какие именно параметры сейчас заполнены, можно воспользоваться перебором коллекции. Посмотрим на пример кода, который позволяет извлечь значение любого параметра по его имени:


Настройки = КомпоновщикНастроек.ПолучитьНастройки();
СоответствиеПараметров = Новый Соответствие;

Для Каждого ЭлементПараметра Из Настройки.ПараметрыДанных.Элементы Цикл
    // Заполняем соответствие для удобного поиска
    СоответствиеПараметров.Вставить(Строка(ЭлементПараметра.Параметр), ЭлементПараметра.Значение);
КонецЦикла;

// Получаем конкретное значение
ЗначениеКонПериода = СоответствиеПараметров.Получить("КонецПериода");

Критический момент: Когда вызывать код?

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

Рассмотрим правильный алгоритм действий в модуле формы:

  1. Пользователь нажимает кнопку "Сформировать".
  2. Сначала получаем дату из настроек компоновщика или реквизитов формы и сохраняем ее в переменную.
  3. Вызываем стандартный механизм формирования отчета СформироватьОтчет(...).
  4. Затем выводим дополнительные области (подписи, расшифровки) в табличный документ, используя сохраненную ранее переменную.

Пример реализации в обработчике кнопки:


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

    // 2. Формируем основной отчет
    ЭлементыФормы.Результат.Очистить();
    СформироватьОтчет(ЭлементыФормы.Результат, ДанныеРасшифровки);

    // 3. Выводим свой макет с подписями и датой
    Макет = ПолучитьМакет("МакетПодписи");
    Область = Макет.ПолучитьОбласть("Подпись");
    Область.Параметры.ДатаДокумента = Формат(ДатаДляПодписи, "ДФ=dd.MM.yyyy");
    ЭлементыФормы.Результат.Вывести(Область);
    
КонецПроцедуры

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

← На главную