При разработке внешних печатных форм (ВПФ) в среде 1С:Предприятие 8.3 (особенно для конфигураций на базе БСП, таких как «Бухгалтерия предприятия 3.0»), часто возникает задача изменения внешнего вида документа в зависимости от того, по какой организации он выводится. Рассмотрим подробно, как правильно реализовать выбор макета, избежав типичных ошибок начинающих разработчиков.
Разберем ситуацию, когда разработчик пытается программно определить нужный макет. В процессе анализа кода часто выявляются две критические ошибки:
Если Организация = "Рога и копыта" Тогда, программа сравнивает объект типа СправочникСсылка.Организации со строковым значением. Это условие никогда не будет истинным. Необходимо обращаться к реквизиту Наименование или ИНН.Запрос.Выполнить() мы получаем результат запроса, но не сами данные. Чтобы получить конкретное значение, нужно либо выгрузить результат в таблицу значений, либо использовать метод Выбрать() и Следующий().Для того чтобы печатная форма работала корректно, особенно при массовой печати документов, мы должны использовать МассивСсылок, который передается в функцию формирования печатной формы. Проанализируем правильную структуру запроса и последующего выбора макета.
Рассмотрим пример кода, где мы получаем наименование организации из документа и на его основе выбираем макет:
Функция СформироватьПечатнуюФорму(МассивСсылок, ОбъектыПечати)
// Создаем запрос для получения данных организации
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
Запрос.Текст =
"ВЫБРАТЬ
| Реестр.Ссылка КАК Ссылка,
| Реестр.Организация.Наименование КАК ОрганизацияНаименование,
| Реестр.Организация.ИНН КАК ИНН
|ИЗ
| Документ.бит_РеестрПлатежей КАК Реестр
|ГДЕ
| Реестр.Ссылка В(&МассивСсылок)";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ТабличныйДокумент = Новый ТабличныйДокумент;
Пока Выборка.Следующий() Цикл
// Определяем макет в зависимости от наименования организации
Если Выборка.ОрганизацияНаименование = "РКС_Пенза" Тогда
Макет = ПолучитьМакет("РеестрПлатежей_Пенза");
ИначеЕсли Выборка.ОрганизацияНаименование = "РКС_Сочи" Тогда
Макет = ПолучитьМакет("РеестрПлатежей_Сочи");
Иначе
Макет = ПолучитьМакет("РеестрПлатежей_Общий");
КонецЕсли;
// Далее идет заполнение областей макета и вывод в ТабличныйДокумент
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// ... заполнение параметров ...
ТабличныйДокумент.Вывести(ОбластьЗаголовок);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Обратите внимание, что получение макета происходит внутри цикла Пока Выборка.Следующий(). Это критически важно, если пользователь выделил в списке несколько документов разных организаций и нажал кнопку печати. Если вынести получение макета за пределы цикла, все документы будут распечатаны по шаблону первой найденной организации.
Проанализируем ситуацию: бухгалтер изменил название организации в справочнике (например, вместо "РКС_Пенза" написал "ООО РКС-Пенза"). В этом случае программный код, завязанный на Наименование, перестанет работать. Профессиональным подходом считается использование ИНН, так как этот реквизит меняется крайне редко.
Выясним, как изменить условие:
// В запросе получаем ИНН
// ...
Если Выборка.ИНН = "5836010101" Тогда
Макет = ПолучитьМакет("РеестрПлатежей_Пенза");
ИначеЕсли Выборка.ИНН = "2320020202" Тогда
Макет = ПолучитьМакет("РеестрПлатежей_Сочи");
// ...
КонецЕсли;
Если структура документов у разных организаций схожа, и отличаются только небольшие детали (например, логотип или текст в шапке), мы можем не создавать несколько полных макетов. Вместо этого в одном основном макете можно создать разные области. Рассмотрим подробнее, как это реализовать:
Допустим, у нас есть области в одном макете с именами Шапка_Пенза и Шапка_Сочи. Мы можем программно «собрать» имя области:
Суффикс = ?(Выборка.ОрганизацияНаименование = "РКС_Пенза", "Пенза", "Сочи");
Попытка
ОбластьШапка = Макет.ПолучитьОбласть("Шапка_" + Суффикс);
Исключение
ОбластьШапка = Макет.ПолучитьОбласть("Шапка_Общая");
КонецПопытки;
Часто разработчики сталкиваются с тем, что точка останова в модуле объекта ВПФ не срабатывает. Это происходит потому, что код выполняется на стороне сервера, а отладка на сервере может быть не включена. Разберем способы решения этой проблемы:
-debug. Если у вас нет доступа к серверу, этот метод не подойдет.Сообщить() или запись в Журнал Регистрации, чтобы выяснить, какие значения принимают переменные Организация или ИНН в момент выполнения кода.Выбор макета в зависимости от организации — это стандартная задача, требующая аккуратности в работе с типами данных. Всегда помните о необходимости использования МассиваСсылок и корректной работе с результатами запросов. Использование идентификаторов вроде ИНН сделает вашу разработку более устойчивой к изменениям данных пользователями.