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