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