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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто в процессе разработки конфигураций на платформе 1С возникает задача: пользователь открывает форму выбора справочника с установленным отбором, чтобы найти нужную номенклатуру, но, не найдя её, хочет создать новую. При этом логично, чтобы реквизит, по которому был установлен отбор, автоматически заполнился в новом элементе. Давайте разберем, как реализовать этот механизм корректно.

Шаг 1: Перехват стандартного действия при нажатии кнопки «Создать»

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

Рассмотрим, как это выглядит в коде:


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

Шаг 2: Правильное определение имени формы

Одна из частых ошибок — использование метода ПолучитьФорму() без параметров. В этом случае система открывает форму по умолчанию, которая может отличаться от той, что вы настроили в конфигураторе. Всегда явно указывайте имя формы, например, "ФормаЭлемента", чтобы быть уверенными, что пользователь увидит именно те элементы управления, которые вы подготовили.

Шаг 3: Особенности работы в «обычном» и «управляемом» режимах

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

Если вам критически важно использовать современные формы в старой конфигурации, проверьте настройки конфигурации: необходимо установить параметр Использовать управляемые формы в толстом клиенте в обычном режиме в значение Истина. Однако помните, что это может потребовать дополнительной адаптации кода для передачи параметров, так как механизмы работы с контекстом данных в этих режимах существенно различаются.

Шаг 4: Рекомендованный подход через параметры

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

Вы можете передать структуру в форму при открытии:


ПараметрыЗаполнения = Новый Структура("ВидыНоменклатуры", ЗначениеОтбора);
Форма = Справочники.ВашСправочник.ПолучитьФорму("ФормаЭлемента", , );
// В самой форме элемента в процедуре ПриОткрытии или ПриСозданииНаСервере 
// считываем эти параметры и устанавливаем значения реквизитов объекта.

Этот способ позволяет сделать код чище и удобнее для последующей поддержки. Использование ЗначенияЗаполнения значительно упрощает разработку, так как позволяет избежать прямого обращения к реквизитам объекта из внешней формы, сохраняя инкапсуляцию логики внутри справочника.

Совет: Всегда проверяйте состояние отбора через свойство Использование. Это обезопасит ваш код от ошибок, если отбор в форме выбора был программно сброшен, но не очищен.

← На главную