Где найти обработчик глобальной параметризуемой команды в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Разберем природу глобальных параметризуемых команд

Для начала проанализируем, почему эти команды вообще появляются на форме. Платформа 1С:Предприятие 8 автоматически собирает список таких команд из всей конфигурации, основываясь на типах данных. Если в системе есть объект (например, документ ЗаказКлиента), который может быть создан на основании текущего справочника, платформа сама добавит соответствующую команду в интерфейс.

Рассмотрим основные источники этих команд:

  1. Ввод на основании: Механизм, определенный в метаданных объектов-приемников.
  2. Общие команды: Специальные объекты метаданных в ветке «Общие», имеющие настроенный тип параметра.
  3. Команды других объектов: Команды отчетов или обработок, параметром которых является ссылка на наш объект.

Способ 1: Поиск обработчика для команд «Ввода на основании»

Это самый распространенный случай. Если команда создает новый документ, используя данные текущей формы, то, скорее всего, она создана механизмом ввода на основании. В этом случае обработчик находится не в исходном объекте, а в модуле объекта-приемника.

Выполним следующие шаги для поиска кода:

  1. Определим, какой именно объект создается (например, документ ЗаказКлиента).
  2. Перейдем в дерево метаданных и найдем этот объект.
  3. Откроем Модуль объекта создаваемого документа.
  4. Найдем в нем предопределенную процедуру ОбработкаЗаполнения.

Проанализируем пример кода в процедуре ОбработкаЗаполнения:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Партнеры") Тогда
        // Здесь находится логика заполнения нового документа 
        // данными из справочника-основания
        Партнер = ДанныеЗаполнения;
        Валюта = ДанныеЗаполнения.ОсновнаяВалюта;
    КонецЕсли;
КонецПроцедуры

Важно помнить, что если параметр ДанныеЗаполнения соответствует типу вашего справочника, то именно этот блок кода отвечает за «магию» появления данных в новом документе.

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

Если визуальный поиск в метаданных не приносит результатов, воспользуемся инструментами отладки. Рассмотрим, как применить Замер производительности для обнаружения кода «невидимой» команды. Этот метод универсален и позволяет найти даже глубоко запрятанные вызовы в общих модулях.

Пошаговый алгоритм действий:

  1. Откроем нужную форму в режиме «1С:Предприятие».
  2. В конфигураторе перейдем в меню «Отладка» -> «Замер производительности» (включаем его).
  3. Быстро перейдем в окно предприятия и нажмем интересующую нас кнопку.
  4. Сразу после того, как команда отработала (открылась форма или создался объект), вернемся в конфигуратор и выключим замер.

После этого перед нами откроется таблица со списком всех выполненных строк кода. Проанализируем колонку «Исходный текст». Нам нужно найти первую строку, которая не относится к системным механизмам (например, не начинается с ПриОткрытии новой формы, а относится к инициализации данных). Обычно это будет вызов процедуры в Модуле команды или в Модуле объекта.

Способ 3: Общие команды и их модули

Если команда не относится к вводу на основании, она может быть определена как Общая команда. Посмотрим, как их идентифицировать. Глобальные команды часто используются для открытия специфических отчетов с фильтром по текущему элементу.

Выясним, где они прячутся:

  1. В дереве метаданных развернем ветку Общие -> Общие команды.
  2. Нам нужно просмотреть свойства команд. Главное свойство здесь — «Тип параметра команды».
  3. Если в этом типе указан наш справочник (или составной тип, включающий его), значит, эта команда отобразится в списке глобальных.
  4. Нажмем правой кнопкой на такую команду и выберем «Открыть модуль команды».

В модуле общей команды всегда присутствует процедура ОбработкаКоманды. Посмотрим на пример ее структуры:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // ПараметрКоманды — это ссылка на наш элемент справочника
    ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Владелец", ПараметрКоманды));
    ОткрытьФорму("Отчет.Продажи.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно);
КонецПроцедуры

Способ 4: Командный интерфейс формы

Рассмотрим ситуацию, когда команд очень много и трудно понять, какая из них как называется в метаданных. В редакторе формы справочника в конфигураторе есть закладка «Командный интерфейс». Проанализируем её содержимое.

В этом окне команды распределены по группам (Панель навигации, Панель действий). Здесь можно увидеть полное имя команды и объект, к которому она принадлежит. Например, запись вида Документ.ЗаказКлиента.СоздатьПоОснованию четко указывает на механизм ввода на основании, а запись ОбщаяКоманда.ПечатьЭтикеток — на общую команду. Для быстрой ориентации в устройствах управляемых форм можно использовать шпаргалку разработчика по работе с формами.

Дополнительные факторы: почему команда может не работать или исчезнуть

Иногда код найден, но поведение команды кажется странным. Разберем еще несколько важных моментов:

  1. Функциональные опции: Проверьте свойство «Функциональные опции» у найденной команды. Если опция отключена в константах, команда просто не появится в интерфейсе, даже если она есть в метаданных.
  2. Права доступа (Роли): Глобальные команды параметризуются автоматически только для тех объектов, на которые у текущего пользователя есть право Просмотр или Интерактивное добавление (для ввода на основании).
  3. Программное изменение: В модуле формы может быть переопределен обработчик ПриСоставленииКомандногоИнтерфейса. В этой процедуре разработчики часто скрывают ненужные типовые команды программно:
    
    &НаСервере
    Процедура ПриСоставленииКомандногоИнтерфейса(Команды)
        // Пример программного скрытия команды
        КомандаВводНаОсновании = Команды.Найти("Документ.ЗаказКлиента.Команда.СоздатьПоОснованию");
        Если КомандаВводНаОсновании <> Неопределено Тогда
            КомандаВводНаОсновании.Видимость = Ложь;
        КонецЕсли;
    КонецПроцедуры
    

Подводя итог, можно сказать, что поиск обработчика глобальной команды — это всегда детективная работа, требующая анализа как метаданных (ввода на основании и общих команд), так и использования инструментов живой отладки через замер производительности. Сочетание этих методов позволяет найти любую «скрытую» логику в конфигурациях любой сложности.

← На главную