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