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