Как передать параметры и настроить вывод разделов во внешней печатной форме 1С:ERP

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

При разработке внешних печатных форм (ВПФ) для сложных конфигураций, таких как 1С:ERP Управление предприятием или 1С:CRM, программисты часто сталкиваются с тем, что стандартный механизм БСП (Библиотека стандартных подсистем) не передает нужные параметры или не выводит специфические блоки данных, например, разделители разделов и итоги по ним. Рассмотрим подробно, как решить эти задачи, основываясь на опыте интеграции печатных форм в модуль «Коммерческое предложение клиенту».

Передача параметров в процедуру Печать

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

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


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Если параметры не переданы извне, инициализируем их принудительно
    Если ПараметрыПечати = Неопределено Тогда
        ПараметрыПечати = Новый Структура;
    КонецЕсли;
    
    // Устанавливаем специфические параметры для ERP + CRM
    ПараметрыПечати.Вставить("ОтображатьСкидки", Ложь);
    ПараметрыПечати.Вставить("НомерВарианта", 1);
    ПараметрыПечати.Вставить("ВыводитьИтогиПоРазделам", Истина);

    // Далее вызываем штатную логику формирования
    СформироватьПечатнуюФорму(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати);
    
КонецПроцедуры

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

Проблема вызова кода из расширений конфигурации

Часто логика формирования коммерческих предложений в ERP дорабатывается с помощью расширений. Например, процедура ПроизвольноеНаименованиеНоменклатуры может находиться в расширении и переопределять стандартное поведение. Внешняя печатная форма, запущенная как отдельный объект, может «не видеть» экспортные методы из модулей менеджеров расширений.

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

  1. Полный перенос кода: Скопируйте необходимые процедуры из расширения непосредственно в модуль объекта вашей внешней обработки. Это гарантирует автономность ВПФ и её корректную работу независимо от изменений в расширении.
  2. Вызов через общие модули: Если логика вынесена в серверный общий модуль с установленным флагом «Вызов сервера» и «Экспорт», ВПФ сможет обратиться к ней. Однако для процедур в модулях менеджеров объектов этот способ не всегда надежен.

Реализация логики разделов и итогов по группам

В документе «Коммерческое предложение клиенту» (особенно с модулем CRM) товары могут группироваться по разделам. В табличной части это обычно реализуется через служебные строки-разделители. Если в вашей ВПФ не выводятся итоги по этим разделам, значит, стандартный алгоритм обхода строк не получает нужных данных или макет не содержит соответствующих областей.

Разберем алгоритм ручного формирования итогов по разделам. Нам нужно организовать цикл обхода табличной части, где мы будем отслеживать смену раздела и выводить промежуточные итоги. Проанализируем пример реализации:


// Пример логики вывода строк с разделами
ТекущийРаздел = Неопределено;
СуммаПоРазделу = 0;

Для Каждого СтрокаТЧ Из ДанныеОбъекта.Товары Цикл
    
    // Проверяем, является ли строка разделителем раздела
    Если СтрокаТЧ.ЭтоРаздел Тогда // Имя поля зависит от метаданных CRM
        
        // Если это не первый раздел, выводим итог по предыдущему
        Если ТекущийРаздел <> Неопределено Тогда
            ВывестиИтогПоРазделу(ТабличныйДокумент, Макет, СуммаПоРазделу);
        КонецЕсли;
        
        // Выводим заголовок нового раздела
        ВывестиЗаголовокРаздела(ТабличныйДокумент, Макет, СтрокаТЧ.НаименованиеРаздела);
        
        // Сбрасываем счетчик и обновляем текущий раздел
        ТекущийРаздел = СтрокаТЧ.НаименованиеРаздела;
        СуммаПоРазделу = 0;
        
    Иначе
        // Обычная строка товара
        ВывестиСтрокуТовара(ТабличныйДокумент, Макет, СтрокаТЧ);
        СуммаПоРазделу = СуммаПоРазделу + СтрокаТЧ.Сумма;
    КонецЕсли;
    
КонецЦикла;

// Не забываем вывести итог по последнему разделу
Если ТекущийРаздел <> Неопределено Тогда
    ВывестиИтогПоРазделу(ТабличныйДокумент, Макет, СуммаПоРазделу);
КонецЕсли;

Проверка вывода и работа с макетом

Если параметры переданы верно, но разделители страниц или итоги всё равно «съезжают», используем метод ПроверитьВывод(). Это позволит программно контролировать, помещается ли область на текущую страницу, и принудительно вставлять разделитель при необходимости.

Также убедитесь, что в макете вашей ВПФ созданы именованные области для итогов. Если вы просто копируете макет из типовой конфигурации, проверьте заполнение параметров в ячейках. Часто во внешних формах параметры области не заполняются автоматически, так как структура ДанныеОбъекта во внешней обработке может отличаться от типового набора данных, формируемого в модуле менеджера документа.

Совет: Чтобы быстро проверить, какие параметры ожидает печатная форма, используйте отладчик в типовом коде в момент вызова функции СформироватьПечатныеФормы. Сравните содержимое структуры ПараметрыПечати в типовом сеансе и в сеансе работы вашей ВПФ. Все недостающие ключи нужно добавить в модуль ВПФ вручную.

Регистрация обработки в дереве конфигурации

Если вы решили перенести ВПФ в состав конфигурации (в ветку «Обработки»), помните, что для появления команды в интерфейсе документа недостаточно просто создать обработку. Вам необходимо:

  1. В модуле менеджера самого документа (например, КоммерческоеПредложениеКлиенту) в процедуре ДобавитьКомандыПечати(КомандыПечати) прописать регистрацию вашей новой команды.
  2. Указать тип параметра команды — ссылку на ваш документ.
  3. Либо использовать механизм БСП через справочник «Дополнительные отчеты и обработки», что является более гибким вариантом и не требует изменения типовой конфигурации.

Придерживаясь этой структуры и перенося критическую логику формирования данных непосредственно в контекст внешней обработки, вы добьетесь идентичности печатных форм и корректного отображения всех CRM-надстроек.

← На главную