При организации пакетной печати первичных документов в платформе 1С:Предприятие 7.7 часто используется подход с объединением нескольких печатных форм в один результирующий объект типа Таблица. Это позволяет отправить на принтер сразу сотни документов без необходимости открывать каждый из них в отдельном окне. Однако при добавлении новых сложных макетов (например, транспортной накладной) разработчики нередко сталкиваются с ситуацией, когда платформа внезапно и без вывода каких-либо сообщений об ошибках завершает работу прямо при вызове метода Таб.Показать().
Разберем детально, почему возникает такое поведение платформы, какие скрытые дефекты макетов к этому приводят и как по шагам восстановить стабильную работу групповой печати.
В момент выполнения метода Показать() табличный процессор 1С 7.7 производит рендеринг документа в графической подсистеме Windows (GDI) и обращается к установленному в системе драйверу принтера по умолчанию для пересчета межстрочных интервалов, метрик шрифтов и границ страниц. Если в структуре макета содержатся повреждения, движок платформы может вызвать критическое исключение (Access Violation).
Выделим основные причины, приводящие к падению процесса 1cv7s.exe:
Симв(0)) способно разрушить строковый поток отрисовки таблицы.Как показывает практика, наиболее частой причиной спонтанных падений является накопленная ошибка в самом файле макета (.mxl или макете внутри внешней обработки .ert). Обычное разъединение ячеек проблему не решает, так как поврежденные дескрипторы остаются внутри структуры документа.
Разберем по шагам алгоритм восстановления макета:
Если задача заключается исключительно в отправке пакета на печать, вызов метода Таб.Показать() является избыточным шагом, нагружающим графический интерфейс. Отправку сформированного объекта Таблица можно производить напрямую в спулер печати.
Посмотрим на пример кода, позволяющего отправить документы на принтер минуя экранное отображение:
// Формируем сводный табличный документ
ТабОбщая = СоздатьОбъект("Таблица");
Пока ВыборкаДокументов.ПолучитьДокумент() = 1 Цикл
// Вызываем процедуру печати конкретного документа, выводящую секции в ТабОбщая
ПечатьДокументаВТаблицу(ВыборкаДокументов.ТекущийДокумент(), ТабОбщая);
ТабОбщая.НоваяСтраница();
КонецЦикла;
// Вместо ТабОбщая.Показать() отправляем напрямую на печать:
// Параметр 0 - печать без вывода диалога настройки
// Параметр 1 - печать с выводом стандартного диалога выбора принтера
ТабОбщая.Напечатать(0);
Если объем печатаемой первички исчисляется сотнями страниц, рекомендуется оптимизировать процесс вывода данных системно:
Таблица разобьем процесс на батчи по 20–30 документов. После отправки каждой пачки на печать будем пересоздавать объект через ТабОбщая = СоздатьОбъект("Таблица"), что гарантированно освободит оперативную память и дескрипторы GDI.