Часто в процессе разработки возникает задача автоматизации: пользователь нажимает кнопку в обработке, и перед ним сразу открывается отчет, в котором уже заполнены необходимые фильтры. Если в качестве фильтра используется реквизит с типом Список значений, возникают вопросы: как правильно передать массив данных из обработки и как сделать так, чтобы значения в списке сразу были выбраны (отмечены флажками).
Рассмотрим пошагово, как решить эту задачу правильно, чтобы код оставался универсальным и не вызывал ошибок при обычном открытии отчета.
Для передачи данных из обработки мы используем структуру ПараметрыФормы. Важно передавать данные так, чтобы их можно было легко обработать в вызываемом объекте. Создадим массив элементов и упакуем его в структуру для передачи.
// В процедуре обработки на стороне клиента
Процедура ОтчетОстатков(Команда)
МассивСсылок = ПолучитьФилиалРаботы(Сотрудник);
// Формируем структуру параметров
ПараметрыОткрытия = Новый Структура("СписокФилиалов", МассивСсылок);
ОткрытьФорму("Отчет.ОстаткиТовараВСервисе.Форма.ФормаОтчета", ПараметрыОткрытия);
КонецПроцедуры
Главная ошибка многих разработчиков — попытка обратиться к параметру напрямую через Параметры.ИмяПараметра. Если отчет откроют из стандартного меню без передачи параметров, возникнет ошибка «Поле объекта не обнаружено». Чтобы этого избежать, используем метод Свойство() объекта Параметры.
В модуле формы отчета в обработчике ПриСозданииНаСервере мы проверяем наличие переданных данных. Обратите внимание: просто добавить значение в Список значений недостаточно — чтобы элемент был «выбран» (с галочкой), нужно установить свойство Пометка в значение Истина.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Объявляем переменную для получения данных
ПереданныйСписок = Неопределено;
// Проверяем наличие параметра, переданного из обработки
Если Параметры.Свойство("СписокФилиалов", ПереданныйСписок) Тогда
// Заполняем реквизит формы типа СписокЗначений
Для Каждого Элемент Из ПереданныйСписок Цикл
СписокФилиалов.Добавить(Элемент, , Истина);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Разберем подробнее, что здесь происходит:
Свойство проверяет наличие ключа СписокФилиалов в структуре параметров. Если он найден, значение автоматически запишется в переменную ПереданныйСписок.Если вернет Ложь, код внутри не выполнится, и отчет откроется с пустым списком, что предотвратит критические ошибки.СписокЗначений.Добавить(Значение, Представление, Пометка) позволяет сразу при добавлении установить флаг Пометка = Истина.Иногда после выполнения кода ПриСозданииНаСервере вы можете заметить, что данные все равно пропадают или сбрасываются. Это происходит из-за механизма сохранения и восстановления настроек пользователя. 1С загружает последние сохраненные настройки отчета *после* события ПриСозданииНаСервере, тем самым затирая программно установленные значения.
Если вы столкнулись с таким поведением, у вас есть два варианта:
ПриОткрытии (клиентское событие), которое выполняется уже после загрузки настроек, или использовать процедуру ПриВосстановленииЗначенийНастроек, если нужно принудительно переопределить настройки после их загрузки.Таким образом, использование метода Параметры.Свойство в связке с циклом по элементам СписокЗначений является самым надежным и профессиональным способом передачи фильтров между объектами конфигурации 1С.