При работе с 1С часто возникает задача объединить несколько печатных форм в один файл, например, в PDF. Для этого используется удобный объект ПакетОтображаемыхДокументов. Однако в некоторых версиях платформы можно столкнуться с неприятной и неочевидной проблемой: после сохранения пакета во всех документах внутри итогового PDF-файла отображается один и тот же штрихкод, обычно взятый из первого документа в пакете. При этом текстовая расшифровка под штрихкодом может быть правильной для каждого документа. Разберем, почему так происходит и как это исправить.
Проанализируем ситуацию: вы формируете несколько табличных документов, в каждый из которых программно добавляете уникальный штрихкод. В отладчике вы видите, что для каждого документа генерируется своя картинка с уникальными данными. Затем вы добавляете эти документы в пакет и сохраняете:
ПакетПечати = Новый ПакетОтображаемыхДокументов;
// Предположим, что ТабличныеДокументы - это массив уже сформированных
// печатных форм с уникальными штрихкодами
Для Каждого ТабДок Из ТабличныеДокументы Цикл
ПакетПечати.Добавить(ТабДок);
КонецЦикла;
// Сохраняем итоговый пакет в один PDF-файл
ИмяВыходногоФайлаPDF = ПолучитьИмяВременногоФайла("pdf");
ПакетПечати.Записать(ИмяВыходногоФайлаPDF, ТипФайлаПакетаОтображаемыхДокументов.PDF);
// ПоказатьФайл(ИмяВыходногоФайлаPDF);
После выполнения этого кода в полученном PDF-файле на всех страницах оказывается один и тот же штрихкод. При этом сохранение в другие форматы, например, XLSX, работает корректно. Выясним причину такого поведения.
Это поведение является известной ошибкой платформы «1С:Предприятие», которая проявляется в определенных релизах, в частности, в диапазоне версий 8.3.13. Суть проблемы заключается в механизме оптимизации и кэширования ресурсов при формировании PDF-файла.
Когда платформа собирает итоговый документ из пакета, она анализирует все вставляемые изображения. Если она находит несколько картинок с идентичными характеристиками (например, одинаковый размер в пикселях, глубина цвета), она может посчитать их одним и тем же объектом, чтобы не дублировать данные и уменьшить размер конечного файла. В результате первое встреченное изображение штрихкода помещается в кэш и затем используется для всех последующих "похожих" картинок.
Именно поэтому, даже если вы программно присваиваете рисункам разные имена, платформа все равно может их "склеить", так как ориентируется не на имя объекта в 1С, а на физические свойства самого изображения. А штрихкоды, сгенерированные по одному шаблону, как правило, имеют одинаковые размеры.
Самый правильный, надежный и простой способ исправить проблему — обновить платформу «1С:Предприятие» до более актуальной версии. В более поздних релизах (например, 8.3.14 и старше) разработчики исправили этот механизм кэширования, и проблема с дублированием изображений при сохранении пакетов в PDF больше не возникает.
Этот способ не требует никаких изменений в конфигурации и решает проблему на корневом уровне.
Если по каким-то причинам обновить платформу невозможно, существует обходной путь. Его суть — сделать каждое изображение штрихкода уникальным с точки зрения платформы, чтобы механизм кэширования не мог их объединить. Как мы выяснили, платформа ориентируется на свойства картинки, например, на ее размер.
Идея: перед добавлением табличного документа в пакет нужно программно изменять размер картинки штрихкода на незначительную, незаметную для глаза величину.
Посмотрим на шаги, которые для этого потребуются:
Примерный концепт кода (требует адаптации):
// ... внутри цикла формирования печатных форм ...
// После того как штрихкод добавлен в ТабличныйДокумент
// ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// ПоследнийРисунок = ТабличныйДокумент.Рисунки[ТабличныйДокумент.Рисунки.Количество() - 1];
// ПоследнийРисунок.Картинка = КартинкаШтрихкода;
// Делаем картинку "уникальной"
// Предположим, что ПорядковыйНомерВПакете - это счетчик
// ПоследнийРисунок.РазмерКартинки = РазмерКартинки.Реальный;
// ПоследнийРисунок.Ширина = ПоследнийРисунок.Ширина + ПорядковыйНомерВПакете; // Изменяем на 1, 2, 3... пикселя
// ... далее код добавления ТабличныйДокумент в пакет ...
Важные моменты этого подхода:
Использовать этот метод стоит только в крайнем случае, когда обновление платформы категорически невозможно.
В ходе обсуждения подобных проблем часто возникают гипотезы, которые на практике не работают. Важно понимать, почему они неэффективны:
Рисунок.Имя = "Штрихкод_1") не поможет. Как было сказано выше, механизм формирования PDF, скорее всего, анализирует не имя объекта в 1С, а бинарное содержимое или физические атрибуты картинки.Итог: столкнувшись с проблемой одинаковых штрихкодов при пакетном сохранении в PDF, в первую очередь проверьте версию платформы. Наиболее вероятной причиной является ее ошибка, а самым верным решением — ее обновление.