Как во внешней печатной форме выбрать макет в зависимости от организации

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

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

Анализ типичных ошибок при выборе макета

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

  1. Сравнение Ссылки со Строкой: Когда мы пишем Если Организация = "Рога и копыта" Тогда, программа сравнивает объект типа СправочникСсылка.Организации со строковым значением. Это условие никогда не будет истинным. Необходимо обращаться к реквизиту Наименование или ИНН.
  2. Отсутствие обхода выборки запроса: После метода Запрос.Выполнить() мы получаем результат запроса, но не сами данные. Чтобы получить конкретное значение, нужно либо выгрузить результат в таблицу значений, либо использовать метод Выбрать() и Следующий().

Реализация через запрос к данным документа

Для того чтобы печатная форма работала корректно, особенно при массовой печати документов, мы должны использовать МассивСсылок, который передается в функцию формирования печатной формы. Проанализируем правильную структуру запроса и последующего выбора макета.

Рассмотрим пример кода, где мы получаем наименование организации из документа и на его основе выбираем макет:


Функция СформироватьПечатнуюФорму(МассивСсылок, ОбъектыПечати)
    
    // Создаем запрос для получения данных организации
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Реестр.Ссылка КАК Ссылка,
        |   Реестр.Организация.Наименование КАК ОрганизацияНаименование,
        |   Реестр.Организация.ИНН КАК ИНН
        |ИЗ
        |   Документ.бит_РеестрПлатежей КАК Реестр
        |ГДЕ
        |   Реестр.Ссылка В(&МассивСсылок)";
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    Пока Выборка.Следующий() Цикл
        
        // Определяем макет в зависимости от наименования организации
        Если Выборка.ОрганизацияНаименование = "РКС_Пенза" Тогда
            Макет = ПолучитьМакет("РеестрПлатежей_Пенза");
        ИначеЕсли Выборка.ОрганизацияНаименование = "РКС_Сочи" Тогда
            Макет = ПолучитьМакет("РеестрПлатежей_Сочи");
        Иначе
            Макет = ПолучитьМакет("РеестрПлатежей_Общий");
        КонецЕсли;
        
        // Далее идет заполнение областей макета и вывод в ТабличныйДокумент
        ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
        // ... заполнение параметров ...
        ТабличныйДокумент.Вывести(ОбластьЗаголовок);
        
    КонецЦикла;
    
    Возврат ТабличныйДокумент;

КонецФункции

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

Использование ИНН для повышения надежности

Проанализируем ситуацию: бухгалтер изменил название организации в справочнике (например, вместо "РКС_Пенза" написал "ООО РКС-Пенза"). В этом случае программный код, завязанный на Наименование, перестанет работать. Профессиональным подходом считается использование ИНН, так как этот реквизит меняется крайне редко.

Выясним, как изменить условие:


// В запросе получаем ИНН
// ...
Если Выборка.ИНН = "5836010101" Тогда
    Макет = ПолучитьМакет("РеестрПлатежей_Пенза");
ИначеЕсли Выборка.ИНН = "2320020202" Тогда
    Макет = ПолучитьМакет("РеестрПлатежей_Сочи");
// ...
КонецЕсли;

Метод динамического формирования имени области

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

Допустим, у нас есть области в одном макете с именами Шапка_Пенза и Шапка_Сочи. Мы можем программно «собрать» имя области:


Суффикс = ?(Выборка.ОрганизацияНаименование = "РКС_Пенза", "Пенза", "Сочи");
Попытка
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка_" + Суффикс);
Исключение
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка_Общая");
КонецПопытки;

Рекомендации по отладке внешних печатных форм

Часто разработчики сталкиваются с тем, что точка останова в модуле объекта ВПФ не срабатывает. Это происходит потому, что код выполняется на стороне сервера, а отладка на сервере может быть не включена. Разберем способы решения этой проблемы:

  1. Включение отладки на сервере: Это требует перезапуска службы 1С с параметром -debug. Если у вас нет доступа к серверу, этот метод не подойдет.
  2. Использование внешней обработки для отладки: Создайте в вашей ВПФ обычную форму. На форму добавьте реквизит с типом нужного документа. В модуле формы вызовите экспортную процедуру печати из модуля объекта. Теперь вы сможете открыть ВПФ через «Файл — Открыть», выбрать документ и запустить отладку — в этом режиме точки останова будут работать гарантированно.
  3. Запись сообщений: Если отладка совсем недоступна, используйте метод Сообщить() или запись в Журнал Регистрации, чтобы выяснить, какие значения принимают переменные Организация или ИНН в момент выполнения кода.

Заключение

Выбор макета в зависимости от организации — это стандартная задача, требующая аккуратности в работе с типами данных. Всегда помните о необходимости использования МассиваСсылок и корректной работе с результатами запросов. Использование идентификаторов вроде ИНН сделает вашу разработку более устойчивой к изменениям данных пользователями.

← На главную