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