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