Как заполнить реквизиты объекта при его создании по нажатию на «зеленый плюс» в поле ввода?

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

При разработке интерфейсов в 1С:Предприятие 8.3 часто возникает задача: необходимо, чтобы при создании нового элемента справочника (например, номенклатуры) непосредственно из поля ввода документа, в новом объекте уже были заполнены определенные реквизиты. Пользователи привыкли нажимать на «зеленый плюс» (кнопку создания) в поле выбора, но стандартное поведение платформы не всегда учитывает контекст конкретного документа. Рассмотрим подробнее, как можно реализовать передачу параметров и автоматическое заполнение данных в таких ситуациях.

Проблема «зеленого плюса» и стандартные механизмы

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

Метод 1: Использование свойства «Значения заполнения»

Самый простой и правильный с точки зрения архитектуры платформы способ — это использование свойства элемента формы ЗначенияЗаполнения. Это свойство позволяет передать структуру параметров, которые будут автоматически переданы в процедуру ОбработкаЗаполнения модуля создаваемого объекта.

Проанализируем ситуацию: если нам нужно, чтобы при создании номенклатуры из документа «Реализация» всегда подставлялся определенный вид номенклатуры, мы можем установить это свойство программно в обработчике ПриСозданииНаСервере формы документа:


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

После выполнения этого кода платформа сама «подложит» эти данные в параметры создания. Когда пользователь нажмет на плюс, откроется форма новой номенклатуры, где ВидНоменклатуры уже будет заполнен.

Метод 2: Связи параметров выбора

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

Рассмотрим, как это настроить в конфигураторе:

  1. Откройте свойства поля ввода в табличной части формы.
  2. Найдите пункт Связи параметров выбора.
  3. Добавьте новую связь, где в колонке «Параметр выбора» укажите реквизит создаваемого объекта (например, Отбор.ОсновнойСклад), а в колонке «Путь к данным» — реквизит текущей строки (Объект.Товары.Склад).

Этот механизм работает не только для фильтрации списка выбора, но и автоматически передает данные в создаваемый объект через «плюс».

Метод 3: Перехват события «НачалоВыбора»

Если логика определения параметров слишком сложная и не укладывается в простые связи, мы можем пойти по пути полной замены стандартной обработки. Посмотрим на пример реализации через событие НачалоВыбора.


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

Важный момент: при таком подходе вы полностью заменяете стандартный выбор. Это дает максимальный контроль, но требует написания кода для обработки результата выбора.

Метод 4: Обработка в модуле самого объекта

Независимо от того, как мы инициировали создание, данные попадают в модуль создаваемого справочника. Проанализируем, как правильно принять эти данные в модуле объекта Номенклатура.


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

Именно процедура ОбработкаЗаполнения является точкой входа для всех данных, которые мы передавали через ЗначенияЗаполнения или Связи параметров выбора.

Метод 5: Замена стандартных команд (рекомендация для чистого кода)

Как отмечалось в обсуждении на форуме, иногда «костыли» с перехватом системных кнопок могут усложнить поддержку кода. Рассмотрим альтернативный путь: скрытие стандартных команд и создание собственных.

Пошаговый алгоритм:

  1. В свойствах формы или таблицы отключите Состав команд (снимите флажки с «Создать» или «Добавить»).
  2. Создайте свою команду, например, СоздатьСпецифичныйТовар.
  3. Разместите кнопку на командной панели.
  4. В коде команды пропишите открытие формы с нужным контекстом, используя метод ОткрытьФорму, как показано в примере выше.

Этот способ делает поведение программы прозрачным для следующего разработчика: он будет видеть конкретную команду и конкретный код, который за ней стоит, вместо того чтобы искать, почему «стандартный плюс» ведет себя необычно.

Резюме

Для решения задачи заполнения реквизитов через «зеленый плюс» мы рекомендуем придерживаться следующей иерархии решений:

  1. ЗначенияЗаполнения — если контекст статичен или определяется при открытии формы документа.
  2. Связи параметров выбора — если данные зависят от других полей строки.
  3. Свои команды — если требуется сложная бизнес-логика создания, отличная от типовой.

Используя эти методы, вы обеспечите корректное заполнение данных и удобство работы пользователя без нарушения логики работы платформы 1С:Предприятие.

← На главную