Почему 1С аварийно завершает работу при сохранении табличного документа в PDF и как это исправить?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Штатный механизм сохранения печатных форм в формат PDF через метод Записать объекта ТабличныйДокумент с параметром ТипФайлаТабличногоДокумента.PDF является удобным инструментом для отправки счетов, накладных и актов по электронной почте. Однако на практике разработчики нередко сталкиваются с ситуацией, когда при попытке экспорта платформа 1С аварийно закрывается с записью аварийного дампа памяти или выдает критическую ошибку модуля moxell.dll. Разберем основные причины такого поведения и рассмотрим надежные способы устранения неполадок.

Проблема 1: Пустые или некорректно инициализированные графические объекты

Одной из наиболее частых причин вылета платформы является обработка областей с логотипами, факсимильными подписями и печатями. Если в макете или печатной форме присутствует объект типа «Рисунок», но в процессе формирования печатной формы изображение в него не передается (например, у организации не загружена подпись бухгалтера или факсимиле директора), движок экспорта платформы дает критический сбой при попытке растеризации пустой ссылки.

Рассмотрим несколько вариантов решения этой проблемы в зависимости от архитектуры вашей печатной формы:

  1. Явная инициализация пустым объектом картинки. Если рисунок должен оставаться на форме, присвоим ему пустой объект типа Картинка в коде модуля формирования печатной формы:
    
    Если КартинкаПодписи = Неопределено Тогда
        ОбластьМакета.Рисунки.ПодписьБухгалтера.Картинка = Новый Картинка;
    Иначе
        ОбластьМакета.Рисунки.ПодписьБухгалтера.Картинка = КартинкаПодписи;
    КонецЕсли;
    
  2. Удаление неиспользуемого рисунка из коллекции. Если инициализация пустым объектом на используемой версии платформы не устраняет сбой, программно удалим графический объект из коллекции рисунков табличного документа:
    
    РисунокПодписи = ТабДок.Рисунки.Найти("ПодписьБухгалтера");
    Если РисунокПодписи <> Неопределено И Не ЗначениеЗаполнено(РисунокПодписи.Картинка) Тогда
        ТабДок.Рисунки.Удалить(РисунокПодписи);
    КонецЕсли;
    
  3. Подстановка минимального прозрачного растрового файла. В случаях, когда удаление рисунка нарушает разметку макета, можно заранее загрузить в макет или общие макеты минимальное пустое растровое изображение размером 1х1 пиксель и подставлять его вместо отсутствующего файла.

Проблема 2: Неподдерживаемые форматы изображений и метафайлы

Платформа 1С накладывает жесткие ограничения на графические форматы при экспорте в PDF. Проанализируем требования к графике внутри макетов:

  1. Векторные метафайлы (WMF, EMF). Встроенный генератор PDF не поддерживает преобразование метафайлов. Присутствие таких файлов в макете приводит к немедленному сбою moxell.dll. Заменим все векторные метафайлы на стандартные растровые форматы PNG или JPEG.
  2. Особенности формата PNG. Избегаем использования изображений с 32-битным альфа-каналом глубокой прозрачности и чересстрочной разверткой (interlaced). Оптимальным выбором является стандартный 24-битный PNG или качественный JPEG с цветовой палитрой RGB (цветовые профили CMYK платформой не поддерживаются).

Проблема 3: Нестандартные и поврежденные шрифты

При генерации PDF-файла платформа производит внедрение подмножества символов (font subsetting) формата TrueType (TTF). Если в макете используются специфические символьные шрифты (например, Webdings, Wingdings) или некоторые шрифты для формирования штрихкодов (например, Free 3 of 9), модуль формирования документа завершает работу аварийно из-за невозможности корректно разобрать структуру глифов.

Для устранения конфликтов шрифтов выполним следующие действия:

  1. Замена нестандартных символов. Исключим из макетов использование системных пиктограммных шрифтов. Специальные символы оформим через стандартные шрифты Юникода либо заменим небольшими растровыми иконками.
  2. Корректный подбор шрифтов штрихкодов. При формировании штрихкодов формата Code 39 заменим сбойный шрифт Free 3 of 9 на проверенный аналог Ccode39 (ContactCode39), который стабильно обрабатывается встроенным генератором PDF.
  3. Проверка прав на внедрение (fsType). Не используем шрифты с флагом запрета на внедрение в заголовке файла, а также шрифты формата OpenType с PostScript-контурами (OTF/CFF) — ограничимся стандартными шрифтами Arial, Times New Roman, Tahoma.

Проблема 4: Настройки подсистемы печати и принтера по умолчанию

Даже при программном сохранении в файл движок 1С обращается к системному диспетчеру печати (Windows Print Spooler) и текущему принтеру по умолчанию для расчета метрик, переноса строк и пагинации. Если принтер по умолчанию недоступен (сетевой принтер отключен), драйвер поврежден или служба печати остановлена, процесс 1С падает с созданием дампа.

Разберем порядок настройки рабочего места или сервера:

  1. Убедимся, что служба диспетчера очереди печати в операционной системе запущена и работает стабильно.
  2. Установим в качестве принтера по умолчанию локальный программный драйвер (например, стандартный системный PDF-принтер или XPS Document Writer).
  3. Перед записью табличного документа явно проинициализируем параметры страницы в коде, чтобы исключить ошибки расчета геометрии:
    
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
    ТабДок.ПолеСлева = 10;
    ТабДок.ПолеСправа = 10;
    ТабДок.ПолеСверху = 10;
    ТабДок.ПолеСнизу = 10;
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
    

Проблема 5: Нехватка адресного пространства и очистка памяти

Формирование больших отчетов с графикой в 32-разрядных версиях платформы часто упирается в лимит адресного пространства процесса (2 ГБ). Если перед сохранением выполняется повторная очистка или перестроение тяжелого документа, платформа может завершить работу с ошибкой недостаточно памяти.

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

← На главную