Часто в процессе доработки типовых конфигураций 1С разработчики сталкиваются с ситуацией, когда на форме в режиме «Предприятие» отображается кнопка или команда, которую совершенно не видно в конфигураторе. Попытки найти её в дереве элементов формы или в списке команд ни к чему не приводят. Это происходит потому, что такие команды создаются динамически при создании формы на сервере. Особенно часто это встречается в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП). В этой статье мы подробно разберем, как обнаружить «невидимую» команду и правильно перенести её в расширение, чтобы сохранить поддержку основной конфигурации.
Прежде чем приступать к написанию кода, нам необходимо выяснить техническое имя команды и место её определения. Рассмотрим инструменты для анализа зависимостей и несколько эффективных способов поиска.
Способ А: Осмотр формы (Shift + Alt + F2)
Проанализируем состав формы непосредственно в режиме пользователя. Платформа 1С предоставляет мощный инструмент «Осмотр формы». Для его вызова нужно нажать сочетание клавиш Shift + Alt + F2 (или зайти в меню «Сервис» — «Настройки» — «Осмотр формы»). В открывшемся дереве элементов мы увидим все объекты, включая созданные программно. Найдем нашу кнопку, посмотрим её свойство Имя и ИмяКоманды. Это даст нам точную строку для глобального поиска в конфигураторе.
Способ Б: Замер производительности
Выясним, какой код выполняется при нажатии на кнопку. Этот метод безотказен, даже если команда запрятана глубоко в недрах БСП. Выполним следующие действия:
ПодключаемыеКоманды, ДополнительныеОтчетыИОбработки или в модуле менеджера объекта.Способ В: Глобальный поиск по заголовку
Самый простой, но иногда действенный метод — нажать Ctrl + Shift + F и ввести текст заголовка кнопки (то, что написано на кнопке в интерфейсе). Искать следует не только в текстах модулей, но и в значениях свойств (хотя для программных команд текст обычно задается строкой в коде).
Разберем, где именно может «прятаться» описание команды в зависимости от её типа (отдельного внимания заслуживает отладка внешних печатных форм):
ПриОпределенииКомандПодключенныхКОбъекту().ДополнительныеОтчетыИОбработки. В этом случае код команды находится во внешней обработке в процедуре СведенияОВнешнейОбработке().ОбщиеКоманды. Они могут быть добавлены в командную панель формы автоматически через механизм заимствования прав или функциональных опций.Допустим, мы выяснили, что команда исчезает после того, как мы возвращаем форму на поддержку (делаем её типовой). Это происходит потому, что в типовой форме удалены вызовы-связки с подсистемой подключаемых команд. Чтобы восстановить работу команды через расширение, нам необходимо добавить форму в расширение и создать «обвязку» для БСП. Рассмотрим, как это сделать правильно.
Нам нужно перехватить стандартные события формы. Вместо полной замены процедур, используем аннотации &После или &ПриИзменении, чтобы не нарушать типовую логику.
Ниже представлен пример кода, который необходимо разместить в модуле формы в расширении для корректной работы подключаемых команд:
&НаСервере
Процедура П_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Инициализация подключаемых команд БСП
Если Метаданные.ОбщиеМодули.Найти("ПодключаемыеКоманды") <> Неопределено Тогда
МодульПодключаемыеКоманды = ОбщийМодуль("ПодключаемыеКоманды");
МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура П_Подключаемый_ВыполнитьКоманду(Команда)
// Обработка нажатия на динамическую кнопку
Если Метаданные.ОбщиеМодули.Найти("ПодключаемыеКомандыКлиент") <> Неопределено Тогда
МодульПодключаемыеКомандыКлиент = ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию: почему даже после добавления кода кнопка может не появиться? Рассмотрим основные причины:
ПодменюПечать, ПодменюЗаполнить или ПодменюОтчеты. Если их нет, добавьте их вручную в дерево элементов формы.&Вместо или &После для процедуры ПриОпределенииКомандПодключенныхКОбъекту.Пример расширения модуля менеджера для добавления своей команды:
&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура П_ПриОпределенииКомандПодключенныхКОбъекту(НастройкиРегистрации)
// Здесь можно программно добавить описание новой команды,
// если она не является внешней обработкой
НоваяКоманда = НастройкиРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Моя спец. команда";
НоваяКоманда.Идентификатор = "МояКомандаИдент";
НоваяКоманда.ИмяГруппы = "ПодменюЗаполнить";
НоваяКоманда.Порядок = 10;
КонецПроцедуры
Разберем итоги: чтобы успешно найти и перенести «скрытую» команду, мы должны мыслить шире визуального редактора форм. Использование замера производительности и инструмента осмотра формы позволяет быстро локализовать место возникновения команды. А механизм расширений 1С дает возможность внедрить необходимые обработчики событий (ПриСозданииНаСервере, ПриОткрытии), не снимая конфигурацию с поддержки. Таким образом, мы сохраняем чистоту типового решения и обеспечиваем работоспособность кастомного функционала.