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