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

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

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

Рассмотрим пошагово, как решить эту задачу правильно, чтобы код оставался универсальным и не вызывал ошибок при обычном открытии отчета.

Шаг 1: Подготовка данных в коде обработки

Для передачи данных из обработки мы используем структуру ПараметрыФормы. Важно передавать данные так, чтобы их можно было легко обработать в вызываемом объекте. Создадим массив элементов и упакуем его в структуру для передачи.


// В процедуре обработки на стороне клиента
Процедура ОтчетОстатков(Команда)
    МассивСсылок = ПолучитьФилиалРаботы(Сотрудник);
    // Формируем структуру параметров
    ПараметрыОткрытия = Новый Структура("СписокФилиалов", МассивСсылок);
    ОткрытьФорму("Отчет.ОстаткиТовараВСервисе.Форма.ФормаОтчета", ПараметрыОткрытия);
КонецПроцедуры

Шаг 2: Безопасное получение параметров в отчете

Главная ошибка многих разработчиков — попытка обратиться к параметру напрямую через Параметры.ИмяПараметра. Если отчет откроют из стандартного меню без передачи параметров, возникнет ошибка «Поле объекта не обнаружено». Чтобы этого избежать, используем метод Свойство() объекта Параметры.

Шаг 3: Заполнение и установка пометки в Списке значений

В модуле формы отчета в обработчике ПриСозданииНаСервере мы проверяем наличие переданных данных. Обратите внимание: просто добавить значение в Список значений недостаточно — чтобы элемент был «выбран» (с галочкой), нужно установить свойство Пометка в значение Истина.


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

Разберем подробнее, что здесь происходит:

  1. Метод Свойство проверяет наличие ключа СписокФилиалов в структуре параметров. Если он найден, значение автоматически запишется в переменную ПереданныйСписок.
  2. Если пользователь открывает отчет из интерфейса, условие Если вернет Ложь, код внутри не выполнится, и отчет откроется с пустым списком, что предотвратит критические ошибки.
  3. Метод СписокЗначений.Добавить(Значение, Представление, Пометка) позволяет сразу при добавлении установить флаг Пометка = Истина.

Почему могут возникать проблемы с настройками пользователя?

Иногда после выполнения кода ПриСозданииНаСервере вы можете заметить, что данные все равно пропадают или сбрасываются. Это происходит из-за механизма сохранения и восстановления настроек пользователя. 1С загружает последние сохраненные настройки отчета *после* события ПриСозданииНаСервере, тем самым затирая программно установленные значения.

Если вы столкнулись с таким поведением, у вас есть два варианта:

Таким образом, использование метода Параметры.Свойство в связке с циклом по элементам СписокЗначений является самым надежным и профессиональным способом передачи фильтров между объектами конфигурации 1С.

← На главную