Как установить параметры СКД по умолчанию без предопределенных значений и затирания выбора пользователя?

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

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

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

Почему классический подход в ПриКомпоновкеРезультата не работает?

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

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

  1. Пользователь открывает отчет. В параметрах по умолчанию стоит, например, «Основной склад».
  2. Пользователь вручную меняет «Основной склад» на «Склад №2» и нажимает кнопку «Сформировать».
  3. Срабатывает событие ПриКомпоновкеРезультата, код на сервере вновь находит «Основной склад» и перезаписывает выбор пользователя.
  4. Отчет выводится по «Основному складу», игнорируя действие пользователя.

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

Способ 1. Использование выражений параметров в схеме СКД (Самый простой способ)

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

Разберем этот способ по шагам:

  1. Откройте схему компоновки данных вашего отчета и перейдите на вкладку «Параметры».
  2. Найдите нужный параметр и обратите внимание на колонку «Выражение».
  3. В этой колонке мы можем написать вызов любой функции общего модуля конфигурации, которая доступна на сервере. Главное условие — модуль должен быть глобальным или иметь флаг «Вызов сервера».

Рассмотрим примеры выражений, которые можно прописать в данной колонке:


// Пример 1: Получение значения через вызов функции общего модуля
ОбщегоНазначения.ПолучитьОсновнуюОрганизацию()

// Пример 2: Прямой поиск элемента справочника по коду
Справочники.Склады.НайтиПоКоду("000000001")

Как это работает? Система вычисляет выражение, указанное в параметре СКД, ровно один раз — при первоначальном создании компоновщика настроек и инициализации схемы. Полученное значение подставляется в качестве дефолтного. Поскольку этот параметр выведен в пользовательские настройки, пользователь видит заполненное поле, может его очистить или выбрать другое значение. При нажатии кнопки «Сформировать» повторного вычисления выражения не происходит, и выбор пользователя не затирается.

Способ 2. Использование механизмов БСП (Для типовых конфигураций)

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

Для реализации этого метода выполните следующие действия в модуле объекта внешнего отчета:

Шаг 1. Опишите процедуру определения настроек формы. Нам нужно сообщить системе, что мы хотим перехватить событие загрузки настроек на сервере.


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

Шаг 2. Заполните параметры в соответствующем обработчике. Создайте экспортную процедуру, которая будет выполняться при инициализации настроек отчета.


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

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

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

Способ 3. Инициализация в собственной форме отчета (ПриСозданииНаСервере)

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

Для этого откройте модуль вашей управляемой формы отчета и пропишите логику заполнения в процедуре ПриСозданииНаСервере:


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

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

Способ 4. Трюк с сохранением настроек варианта в XML (Low-code подход)

Рассмотрим очень интересный альтернативный метод решения задачи, который не требует написания кода вообще. Этот метод базируется на сохранении настроек компоновки в XML-формат.

Давайте разберем последовательность действий:

  1. Откройте отчет в режиме «1С:Предприятие».
  2. В открывшейся форме отчета установите в параметрах нужные значения по умолчанию (выберите конкретные элементы справочников из вашей базы данных).
  3. Перейдите в меню формы «Еще» -> «Изменить вариант».
  4. В открывшемся окне настройки варианта нажмите кнопку «Еще» -> «Сохранить настройки» и сохраните XML-файл на жесткий диск. 1С запишет ваши настройки вместе со ссылками на объекты баз данных в виде уникальных идентификаторов (UUID).
  5. Вернитесь в Конфигуратор и откройте схему СКД вашего отчета.
  6. Перейдите на вкладку «Настройки» (настройки варианта по умолчанию).
  7. Нажмите кнопку «Загрузить настройки» (значок папки с синей стрелкой) и выберите сохраненный ранее XML-файл.

Важное предостережение: Данный метод отлично подходит для локальных баз данных, а также для распределенных информационных баз (РИБ), где уникальные идентификаторы (UUID) элементов справочников гарантированно совпадают. Если вы планируете переносить этот отчет между абсолютно разными конфигурациями или несвязанными базами данных, этот способ использовать не рекомендуется, так как UUID объектов в разных базах будут различаться, и параметры при открытии окажутся пустыми или будут содержать объект «<Битая ссылка>». Для корректной миграции данных в условиях несовпадающих ссылок применяется перенос данных между похожими конфигурациями 1С с сопоставлением объектов по произвольным полям.

Подведем итоги

Мы подробно проанализировали проблему установки параметров СКД по умолчанию и разобрали четыре эффективных практических подхода для её решения:

Выбирайте наиболее подходящий для вашей конфигурации метод и создавайте удобные отчеты для ваших пользователей!

← На главную