Как найти и перенести программную команду на форме 1С в расширение

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто в процессе доработки типовых конфигураций 1С разработчики сталкиваются с ситуацией, когда на форме в режиме «Предприятие» отображается кнопка или команда, которую совершенно не видно в конфигураторе. Попытки найти её в дереве элементов формы или в списке команд ни к чему не приводят. Это происходит потому, что такие команды создаются динамически при создании формы на сервере. Особенно часто это встречается в конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП). В этой статье мы подробно разберем, как обнаружить «невидимую» команду и правильно перенести её в расширение, чтобы сохранить поддержку основной конфигурации.

Шаг 1. Поиск источника команды через интерфейс и инструменты платформы

Прежде чем приступать к написанию кода, нам необходимо выяснить техническое имя команды и место её определения. Рассмотрим инструменты для анализа зависимостей и несколько эффективных способов поиска.

Способ А: Осмотр формы (Shift + Alt + F2)

Проанализируем состав формы непосредственно в режиме пользователя. Платформа 1С предоставляет мощный инструмент «Осмотр формы». Для его вызова нужно нажать сочетание клавиш Shift + Alt + F2 (или зайти в меню «Сервис» — «Настройки» — «Осмотр формы»). В открывшемся дереве элементов мы увидим все объекты, включая созданные программно. Найдем нашу кнопку, посмотрим её свойство Имя и ИмяКоманды. Это даст нам точную строку для глобального поиска в конфигураторе.

Способ Б: Замер производительности

Выясним, какой код выполняется при нажатии на кнопку. Этот метод безотказен, даже если команда запрятана глубоко в недрах БСП. Выполним следующие действия:

  1. Откроем конфигуратор и запустим Замер производительности (Отладка — Замер производительности).
  2. В режиме «Предприятие» нажмем на искомую кнопку.
  3. Вернемся в конфигуратор и остановим замер.
  4. Проанализируем полученный список строк кода (в этом поможет скилл для ИИ по отладке). Обратим внимание на вызовы процедур в модулях с названиями ПодключаемыеКоманды, ДополнительныеОтчетыИОбработки или в модуле менеджера объекта.

Способ В: Глобальный поиск по заголовку

Самый простой, но иногда действенный метод — нажать Ctrl + Shift + F и ввести текст заголовка кнопки (то, что написано на кнопке в интерфейсе). Искать следует не только в текстах модулей, но и в значениях свойств (хотя для программных команд текст обычно задается строкой в коде).

Шаг 2. Идентификация типа команды

Разберем, где именно может «прятаться» описание команды в зависимости от её типа (отдельного внимания заслуживает отладка внешних печатных форм):

Шаг 3. Реализация механизма в расширении

Допустим, мы выяснили, что команда исчезает после того, как мы возвращаем форму на поддержку (делаем её типовой). Это происходит потому, что в типовой форме удалены вызовы-связки с подсистемой подключаемых команд. Чтобы восстановить работу команды через расширение, нам необходимо добавить форму в расширение и создать «обвязку» для БСП. Рассмотрим, как это сделать правильно.

Нам нужно перехватить стандартные события формы. Вместо полной замены процедур, используем аннотации &После или &ПриИзменении, чтобы не нарушать типовую логику.

Ниже представлен пример кода, который необходимо разместить в модуле формы в расширении для корректной работы подключаемых команд:


&НаСервере
Процедура П_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Инициализация подключаемых команд БСП
    Если Метаданные.ОбщиеМодули.Найти("ПодключаемыеКоманды") <> Неопределено Тогда
        МодульПодключаемыеКоманды = ОбщийМодуль("ПодключаемыеКоманды");
        МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура П_Подключаемый_ВыполнитьКоманду(Команда)
    // Обработка нажатия на динамическую кнопку
    Если Метаданные.ОбщиеМодули.Найти("ПодключаемыеКомандыКлиент") <> Неопределено Тогда
        МодульПодключаемыеКомандыКлиент = ОбщийМодуль("ПодключаемыеКомандыКлиент");
        МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
    КонецЕсли;
КонецПроцедуры

Шаг 4. Важные нюансы при работе с расширением

Проанализируем ситуацию: почему даже после добавления кода кнопка может не появиться? Рассмотрим основные причины:

  1. Отсутствие групп команд: БСП ищет на форме конкретные контейнеры для размещения кнопок. Проверьте, чтобы в элементах формы в расширении присутствовали группы (обычно это подменю) с именами ПодменюПечать, ПодменюЗаполнить или ПодменюОтчеты. Если их нет, добавьте их вручную в дерево элементов формы.
  2. Функциональные опции: Проверьте, не привязана ли видимость команды к функциональной опции. Если в расширении или основной базе опция выключена, программный код не создаст элемент управления.
  3. Модуль менеджера: Если команда была прописана в коде модуля менеджера типовой конфигурации напрямую (как доработка), её также необходимо перенести в расширение. Создайте в расширении модуль менеджера соответствующего объекта и используйте аннотацию &Вместо или &После для процедуры ПриОпределенииКомандПодключенныхКОбъекту.

Пример расширения модуля менеджера для добавления своей команды:


&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура П_ПриОпределенииКомандПодключенныхКОбъекту(НастройкиРегистрации)
    // Здесь можно программно добавить описание новой команды, 
    // если она не является внешней обработкой
    НоваяКоманда = НастройкиРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Моя спец. команда";
    НоваяКоманда.Идентификатор = "МояКомандаИдент";
    НоваяКоманда.ИмяГруппы     = "ПодменюЗаполнить";
    НоваяКоманда.Порядок      = 10;
КонецПроцедуры

Заключение

Разберем итоги: чтобы успешно найти и перенести «скрытую» команду, мы должны мыслить шире визуального редактора форм. Использование замера производительности и инструмента осмотра формы позволяет быстро локализовать место возникновения команды. А механизм расширений 1С дает возможность внедрить необходимые обработчики событий (ПриСозданииНаСервере, ПриОткрытии), не снимая конфигурацию с поддержки. Таким образом, мы сохраняем чистоту типового решения и обеспечиваем работоспособность кастомного функционала.

← На главную