При работе с расширениями в системе 1С:Предприятие 8.3 программисты часто сталкиваются с неприятной ситуацией: при добавлении типового макета (например, ПФ_MXL_УниверсальныйПередаточныйДокумент981_ru) в расширение, его структура «разъезжается». Ячейки меняют свои границы, текст дублируется, объединения строк сбрасываются, а штрихкоды смещаются или исчезают. Примечательно, что это происходит даже в том случае, если разработчик еще не успел внести в макет никаких изменений.
В рамках данной статьи мы подробно разберем, почему это происходит, проанализируем механизмы работы платформы с XML-структурами табличных документов и изучим три эффективных способа решения проблемы.
Для начала проанализируем ситуацию с технической точки зрения. Когда мы добавляем объект в расширение, платформа по умолчанию устанавливает для него режим взаимодействия «Объединять». Это касается не только модулей, но и макетов табличных документов.
Макет 1С в памяти представляет собой сложную XML-структуру. В режиме объединения платформа пытается динамически сопоставить структуру макета из основной конфигурации и макета из расширения. Она сравнивает индексы колонок, строк и параметры объединенных ячеек. В сложных документах, таких как УПД или ТОРГ-12, используется «шахматная» структура с сотнями именованных областей и вложенных объединений. Алгоритм сравнения 1С часто ошибается при расчете координат, что и приводит к визуальному хаосу: система пытается наложить одну сетку на другую, и макет «схлопывается».
Рассмотрим самый простой и логичный способ, который позволяет исправить макет буквально в два клика. Как выяснилось, разработчики платформы вынесли критически важную настройку не в свойства объекта «Макет», а в контекстное меню редактора таблиц.
Разберем этот метод по шагам:
Важный нюанс: Установив режим «Замещать», мы принудительно заставляем платформу полностью игнорировать типовой макет из основной конфигурации и использовать только тот экземпляр, который находится в расширении. Это моментально восстанавливает верную геометрию документа.
Однако помните о поддержке: если законодательство изменится и фирма «1С» выпустит обновление с новой формой УПД в основной конфигурации, ваше расширение с режимом «Замещать» продолжит выводить старую форму. В этом случае макет в расширении придется обновлять вручную.
Если по каким-то причинам первый способ не подходит или вы хотите полностью исключить влияние механизмов объединения макетов, можно воспользоваться альтернативным методом. Рассмотрим, как программно подменить макет.
Суть заключается в том, чтобы не «заимствовать» макет в расширение, а создать его полную копию как новый объект расширения.
Удалить_ПФ_MXL_УниверсальныйПередаточныйДокумент_Свой.ЗаполнитьТабличныйДокументУПД).&Вместо.
// Вместо стандартного получения макета:
// Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.РеализацияТоваровУслуг.ПФ_MXL_УниверсальныйПередаточныйДокумент981_ru");
// Используем получение макета из расширения по его полному имени:
Макет = РеквизитыОбъекта.Ссылка.ПолучитьОбъект().Метаданные().Макеты.Удалить_ПФ_MXL_УниверсальныйПередаточныйДокумент_Свой.Получить();
// Либо через менеджер, если макет добавлен в расширение к конкретному объекту
Этот способ более трудоемкий, так как требует копирования большого объема программного кода в расширение, но он гарантирует 100% стабильность визуального отображения. В качестве альтернативы расширениям для таких задач можно использовать пример внешней печатной формы на БСП.
Рассмотрим ситуацию, когда вам нужно изменить в УПД всего одну надпись или добавить логотип, и вы не хотите тянуть весь тяжелый макет в расширение (чтобы не иметь проблем с обновлениями в будущем). Опытные разработчики рекомендуют программный метод модификации уже сформированного документа.
Вместо перехвата макета, мы перехватываем уже готовый ТабличныйДокумент перед его выводом на печать. Посмотрим на логику реализации:
&После("СформироватьПечатнуюФормуУПД")
Процедура Расш1_СформироватьПечатнуюФормуУПД(ПараметрыТиражирования, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати)
// Находим нужную форму в коллекции
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "УниверсальныйПередаточныйДокумент");
Если ПечатнаяФорма <> Неопределено Тогда
ТабДок = ПечатнаяФорма.ТабличныйДокумент;
// Программно находим область и вносим правки
// Например, заменим текст в конкретной ячейке
Область = ТабДок.НайтиТекст("Грузоотправитель и его адрес");
Если Область <> Неопределено Тогда
Область.Текст = "Новое значение грузоотправителя";
КонецЕсли;
// Или добавим картинку (логотип) в определенные координаты
// Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// Рисунок.Картинка = БиблиотекаКартинок.ЛоготипКомпании;
// Рисунок.Расположить(ТабДок.Область("R1C1:R5C5"));
КонецЕсли;
КонецПроцедуры
Этот метод считается наиболее «чистым», так как вы вообще не добавляете макет в расширение. Следовательно, он никогда не «разъедется», а при обновлении конфигурации вы продолжите работать с актуальной формой от разработчика 1С, просто накладывая свои программные правки поверх.
Проанализируем еще одну частую причину искажений — объекты типа «Рисунок» (штрихкоды, логотипы, подписи). В макетах УПД штрихкод справа часто дублируется или смещает левую часть шапки. Чтобы этого избежать при использовании Способа 1:
Используя предложенные методы, вы сможете победить нестабильное поведение платформы при работе с макетами и обеспечить корректную печать документов в ваших расширениях. Для точной проверки геометрии и подгонки параметров перед выводом на печать подойдёт экранная линейка для печатных форм в 1С.