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