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

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

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

Способ 1. Использование колонки «Выражение» в схеме СКД

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

Разберем пример поиска по наименованию. Если нам нужно установить вид цены с названием «Оптовая», в поле «Выражение» для соответствующего параметра следует написать:

Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая", Истина)

Важные нюансы этого метода:

  1. Надежность: Этот метод крайне чувствителен к изменениям в данных. Если пользователь переименует «Оптовая» в «Оптовая (основная)», отчет перестанет находить этот элемент и параметр останется пустым.
  2. Поиск по коду: Более стабильным вариантом будет поиск по коду, так как коды меняют реже, чем наименования: Справочники.ВидыЦен.НайтиПоКоду("000000001").
  3. Поиск по уникальному идентификатору (GUID): Самый надежный программный способ в рамках одной базы. Даже если изменить и код, и наименование, GUID останется прежним. Выражение будет выглядеть так:

Справочники.ВидыЦен.ПолучитьСсылку(Новый УникальныйИдентификатор("ваш-guid-здесь"))

Способ 2. Программная установка в модуле отчета

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

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


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

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

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

Способ 3. Ручное заполнение списка доступных значений

Малоизвестный, но эффективный способ — использование механизма «Доступные значения» в самой схеме СКД. Рассмотрим, как это сделать:

  1. В конструкторе СКД перейдем на закладку «Параметры».
  2. Найдем колонку «Доступные значения» и нажмем на кнопку выбора (три точки).
  3. В открывшемся окне мы можем вручную добавить элементы. Выбираем тип данных (например, СправочникСсылка.ВидыЦен) и подбираем конкретные элементы из текущей информационной базы.
  4. После того как список доступных значений заполнен, в колонке «Значение» (рядом с выражением) появится возможность выбрать конкретный элемент из этого списка как значение по умолчанию.

Внимание: Этот метод подходит только для баз, которые не планируется переносить (например, из копии в рабочую или между разными узлами РИБ), так как ссылки (GUID) в разных базах будут отличаться, и настройка «слетит».

Способ 4. Архитектурный подход через константы

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

Создайте в конфигурации Константу (например, ОсновнойВидЦенДляОтчетов). Тогда в СКД в поле «Выражение» вы сможете просто написать:

Константы.ОсновнойВидЦенДляОтчетов.Получить()

Это дает огромную гибкость: если бизнес-процессы изменятся и «Оптовая» цена сменится на «Дилерскую», администратору достаточно будет один раз сменить значение в константе, и все отчеты автоматически подхватят новое значение без участия программиста.

Почему выражение в СКД может не срабатывать?

Выясним причину ситуации, когда выражение прописано верно, но при запуске отчета поле остается пустым. Чаще всего это происходит из-за механизма пользовательских настроек:

  1. В 1С:Предприятие 8.3 значения, сохраненные в пользовательских настройках, имеют приоритет над значениями из схемы. Если пользователь один раз открыл отчет, когда параметр был пуст, система запомнила это «пустое» состояние.
  2. Чтобы увидеть результат работы выражения, попробуйте сбросить настройки отчета к стандартным (кнопка «Еще» — «Установить стандартные настройки»).
  3. Если вы хотите, чтобы параметр всегда вычислялся выражением и пользователь не мог его изменить, установите флаг «Ограничение доступности» на закладке «Параметры».

Метод «Служебного параметра» для сложной логики

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

  1. Создаем параметр ВидЦеныПользователь (доступен пользователю).
  2. Создаем параметр ВидЦеныРасчетный (скрыт от пользователя галочкой «Ограничение доступности»).
  3. В запросе используем именно &ВидЦеныРасчетный.
  4. В выражении для ВидЦеныРасчетный пишем логику:

ВЫБОР 
    КОГДА &ВидЦеныПользователь = ЗНАЧЕНИЕ(Справочник.ВидыЦен.ПустаяСсылка) 
    ТОГДА Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая") 
    ИНАЧЕ &ВидЦеныПользователь 
КОНЕЦ

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

← На главную