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