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