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