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