Как правильно добавить команду на управляемую форму 1С для минимизации правок при обновлении

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

При разработке в среде 1С:Предприятие 8.3 часто возникает задача расширения функционала типовых документов. Типичный пример — добавление кнопки для групповой корректировки строк в табличной части документа ЗаказКлиента. Основная сложность здесь заключается не в самом написании кода, а в выборе архитектурного решения, которое позволит легко обновлять конфигурацию в будущем, не вступая в конфликты с типовыми изменениями от вендора. Рассмотрим и проанализируем основные способы реализации этой задачи.

Способ 1. Использование механизма БСП «Подключаемые команды»

Механизм Библиотеки Стандартных Подсистем (БСП) является наиболее «правильным» с точки зрения методологии разработки в типовых решениях (УТ 11, ERP, КА). Вопреки распространенному мнению, что БСП подходит только для печати, подсистема «Заполнение объектов» идеально справляется с добавлением произвольных команд в формы документов.

Разберем по шагам, как интегрировать команду через модуль менеджера объекта:

  1. Перейдем в модуль менеджера документа (например, ЗаказКлиента).
  2. Найдем или создадим процедуру ДобавитьКомандыЗаполнения(КомандыЗаполнения).
  3. Опишем параметры новой команды. Проанализируем пример кода:

Процедура ДобавитьКомандыЗаполнения(КомандыЗаполнения) Экспорт
    Команда = КомандыЗаполнения.Добавить();
    Команда.Менеджер = "Документ.ЗаказКлиента";
    Команда.Представление = НСтр("ru = 'Корректировка строк (БСП)'");
    Команда.Идентификатор = "КорректировкаСтрокЗаказа";
    Команда.ВариантЗапуска = "ВызовКлиентскогоМетода"; // Позволяет управлять формой напрямую
    Команда.ПоказыватьОповещение = Истина;
    Команда.Модификатор = "ГруппаЗаполнение";
КонецПроцедуры

Преимущества этого метода: команда автоматически появится во всех формах объекта, где подключена подсистема БСП. При обновлении конфигурации модуль менеджера объединяется значительно легче, чем визуальные формы.

Способ 2. Программное создание команды и элемента через Расширение

Если нам нужно добавить кнопку в конкретное место формы (например, непосредственно в командную панель табличной части Товары), лучшим выбором будет использование расширения конфигурации. Это позволяет избежать модификации основной конфигурации.

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


&После("ПриСозданииНаСервере")
Процедура ИТ_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Создаем команду формы
    ИмяКоманды = "ИТ_КомандаКорректировки";
    НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяКоманды);
    НоваяКоманда.Действие = "ИТ_ОбработчикКомандыКорректировки";
    НоваяКоманда.Заголовок = "Корректировать строки";
    
    // 2. Создаем кнопку на форме и привязываем её к команде
    // Ищем командную панель табличной части "Товары"
    РодительКнопки = ЭтаФорма.Элементы.ТоварыКоманднаяПанель;
    НоваяКнопка = ЭтаФорма.Элементы.Добавить("ИТ_КнопкаКорректировки", Тип("КнопкаФормы"), РодительКнопки);
    НоваяКнопка.ИмяКоманды = ИмяКоманды;
    
КонецПроцедуры

Обратите внимание, что обработчик команды ИТ_ОбработчикКомандыКорректировки также должен быть описан в расширении модуля формы с директивой &НаКлиенте.

Способ 3. Централизованное внедрение через «МодификацияКонфигурацииПереопределяемый»

Проанализируем ситуацию, когда одну и ту же команду нужно добавить сразу в несколько разных документов (например, во все документы продаж). Вместо создания десятка расширений для каждой формы, можно воспользоваться общим модулем МодификацияКонфигурацииПереопределяемый.

В этом модуле существует процедура ПриСозданииФорм. Рассмотрим пример её использования:


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

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

Решение проблемы пересчета итогов и обновления данных

Один из главных вопросов, который задает автор темы: как обновить зависимые поля и пересчитать итоги после работы внешней команды? Если мы просто поменяем данные в Объект.Товары, форма может не «увидеть» изменений немедленно, или итоговая сумма документа останется прежней.

Рассмотрим два эффективных пути решения этой проблемы:

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

2. Использование механизма оповещений. Если ваша команда открывает вспомогательную форму (обработку) для выбора параметров корректировки, используйте метод Оповестить() при закрытии формы обработки. В основной форме документа создайте обработчик ОбработкаОповещения, который при получении сигнала выполнит стандартные действия по обновлению:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗавершеноРедактированиеСтрок" Тогда
        // Этот метод инициирует пересчет итогов, предусмотренный разработчиками конфигурации
        ЭтотОбъект.Прочитать(); // Если данные менялись на сервере напрямую
        // Или вызов локального пересчета:
        РассчитатьИтогиНаФорме(); 
    КонецЕсли;
КонецПроцедуры

Резюме и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от ваших целей:

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

← На главную