Почему при пакетном сохранении в PDF у всех документов отображается одинаковый штрихкод

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

При работе с 1С часто возникает задача объединить несколько печатных форм в один файл, например, в PDF. Для этого используется удобный объект ПакетОтображаемыхДокументов. Однако в некоторых версиях платформы можно столкнуться с неприятной и неочевидной проблемой: после сохранения пакета во всех документах внутри итогового PDF-файла отображается один и тот же штрихкод, обычно взятый из первого документа в пакете. При этом текстовая расшифровка под штрихкодом может быть правильной для каждого документа. Разберем, почему так происходит и как это исправить.

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


ПакетПечати = Новый ПакетОтображаемыхДокументов;

// Предположим, что ТабличныеДокументы - это массив уже сформированных
// печатных форм с уникальными штрихкодами
Для Каждого ТабДок Из ТабличныеДокументы Цикл
    ПакетПечати.Добавить(ТабДок);
КонецЦикла;

// Сохраняем итоговый пакет в один PDF-файл
ИмяВыходногоФайлаPDF = ПолучитьИмяВременногоФайла("pdf");
ПакетПечати.Записать(ИмяВыходногоФайлаPDF, ТипФайлаПакетаОтображаемыхДокументов.PDF);

// ПоказатьФайл(ИмяВыходногоФайлаPDF);

После выполнения этого кода в полученном PDF-файле на всех страницах оказывается один и тот же штрихкод. При этом сохранение в другие форматы, например, XLSX, работает корректно. Выясним причину такого поведения.

Основная причина — ошибка кэширования в платформе 1С

Это поведение является известной ошибкой платформы «1С:Предприятие», которая проявляется в определенных релизах, в частности, в диапазоне версий 8.3.13. Суть проблемы заключается в механизме оптимизации и кэширования ресурсов при формировании PDF-файла.

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

Именно поэтому, даже если вы программно присваиваете рисункам разные имена, платформа все равно может их "склеить", так как ориентируется не на имя объекта в 1С, а на физические свойства самого изображения. А штрихкоды, сгенерированные по одному шаблону, как правило, имеют одинаковые размеры.

Решение 1: Обновление платформы (рекомендуемый способ)

Самый правильный, надежный и простой способ исправить проблему — обновить платформу «1С:Предприятие» до более актуальной версии. В более поздних релизах (например, 8.3.14 и старше) разработчики исправили этот механизм кэширования, и проблема с дублированием изображений при сохранении пакетов в PDF больше не возникает.

  1. Проверьте текущую версию вашей платформы. Проблема характерна для релизов в районе 8.3.13.1644, 8.3.13.1513 и близких к ним.
  2. Скачайте с портала 1С:ИТС более свежий стабильный релиз платформы.
  3. Установите новую версию и убедитесь, что все клиентские машины и сервер 1С используют именно её.

Этот способ не требует никаких изменений в конфигурации и решает проблему на корневом уровне.

Решение 2: Программный обходной путь (сложный и нерекомендуемый)

Если по каким-то причинам обновить платформу невозможно, существует обходной путь. Его суть — сделать каждое изображение штрихкода уникальным с точки зрения платформы, чтобы механизм кэширования не мог их объединить. Как мы выяснили, платформа ориентируется на свойства картинки, например, на ее размер.

Идея: перед добавлением табличного документа в пакет нужно программно изменять размер картинки штрихкода на незначительную, незаметную для глаза величину.

Посмотрим на шаги, которые для этого потребуются:

  1. Найти место в коде, где формируется штрихкод. Обычно это общий модуль, связанный с подсистемой БСП "Печать" или "Работа со штрихкодами".
  2. Внести изменения в код. После того как картинка штрихкода сгенерирована и добавлена в область табличного документа, нужно получить к ней доступ и изменить ее размер. Чтобы каждое изменение было уникальным, можно использовать, например, номер документа в пакете.

Примерный концепт кода (требует адаптации):


// ... внутри цикла формирования печатных форм ...

// После того как штрихкод добавлен в ТабличныйДокумент
// ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
// ПоследнийРисунок = ТабличныйДокумент.Рисунки[ТабличныйДокумент.Рисунки.Количество() - 1];
// ПоследнийРисунок.Картинка = КартинкаШтрихкода;

// Делаем картинку "уникальной"
// Предположим, что ПорядковыйНомерВПакете - это счетчик
// ПоследнийРисунок.РазмерКартинки = РазмерКартинки.Реальный;
// ПоследнийРисунок.Ширина = ПоследнийРисунок.Ширина + ПорядковыйНомерВПакете; // Изменяем на 1, 2, 3... пикселя

// ... далее код добавления ТабличныйДокумент в пакет ...

Важные моменты этого подхода:

Использовать этот метод стоит только в крайнем случае, когда обновление платформы категорически невозможно.

Что не поможет решить проблему

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

Итог: столкнувшись с проблемой одинаковых штрихкодов при пакетном сохранении в PDF, в первую очередь проверьте версию платформы. Наиболее вероятной причиной является ее ошибка, а самым верным решением — ее обновление.

← На главную