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