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