В практике поддержки пользователей систем на платформе 1С:Предприятие 7.7 (например, конфигурации «Торговля и Склад») встречается коварная ошибка. Пользователь формирует печатную форму (чаще всего это «Акт сверки взаимных расчетов» или различные договоры), сохраняет её в формате Excel (.xls), открывает файл в Microsoft Excel, отправляет на печать, но принтер зависает. Индикатор устройства начинает мигать, задание на печать уходит в спулер Windows и «застревает» там без каких-либо видимых сообщений об ошибках, при этом другие документы печатаются абсолютно нормально.
Давайте подробно разберем, почему возникает эта техническая проблема, проанализируем её причины на стыке платформы 1С 7.7, формата Excel 95 и драйверов принтеров, а также рассмотрим надежные способы её решения.
Причиной такого поведения принтера является использование длинных непрерывных последовательностей символов нижнего подчеркивания (_), которые часто вставляют в макеты для создания полей ручного заполнения («мы, нижеподписавшиеся... _________________»).
Когда мы сохраняем таблицу из 1С 7.7 с помощью стандартного метода ТабДокумент.Записать(ИмяФайла, 1), платформа формирует файл в устаревшем формате Excel 95/97. При конвертации длинных строк из подчеркиваний внутренний движок отображения таблиц 1С (Moxel) преобразует эти данные специфическим образом.
При попытке распечатать такой файл из Excel современные драйверы принтеров (особенно использующие язык описания страниц PCL 5/6 на устройствах HP, Kyocera, Samsung) пытаются обработать непрерывный ряд подчеркиваний как один длинный неделимый векторный графический объект или некорректно сопоставляют шрифты. Это приводит к переполнению внутреннего буфера процессора принтера. Устройство уходит в бесконечный цикл обработки задачи (мигает индикатор), а компьютер считает, что документ успешно отправлен на печать.
Самое надежное и правильное решение — исключить генерацию длинных строк из символов подчеркивания в самом макете 1С 7.7. Вместо ввода текстовых знаков «_____» мы настроим визуальное оформление ячеек таблицы.
Выполним следующие шаги по шагам:
При экспорте в Excel нижняя граница ячейки преобразуется в стандартный стиль границы листа (Border Line). Этот элемент отлично оптимизирован, корректно обрабатывается любыми версиями Microsoft Office и никогда не вызывает сбоев у драйверов печати.
Иногда строки подчеркивания генерируются динамически в программном модуле, когда длина строки рассчитывается в зависимости от наличия данных контрагента. Например, если ФИО подписанта пустое, программа заполняет поле подчеркиваниями.
Рассмотрим пример кода, который может приводить к ошибке:
// Проблемный код автозаполнения строки подписи
Если ПустоеЗначение(РуководительКонтрагента) = 1 Тогда
ПечПодпись = "Представитель: " + СокрЛП(Контрагент) + " ___________________________";
КонецЕсли;
Чтобы избежать этой проблемы программно без перерисовки всего макета, мы можем заменить символ подчеркивания на другие менее «тяжелые» для принтера символы (например, точки или дефисы), либо выводить пустую ячейку с включенной границей:
// Безопасный код с использованием точек для заполнения
Если ПустоеЗначение(РуководительКонтрагента) = 1 Тогда
ПечПодпись = "Представитель: " + СокрЛП(Контрагент) + " ...........................";
КонецЕсли;
Символ точки (.) при растеризации шрифта драйвером принтера обрабатывается как отдельные простые глифы и не перегружает буфер устройства печати.
Если проблему нужно устранить «здесь и сейчас» непосредственно на рабочем месте пользователя, а возможности изменить код или макет в конфигураторе нет, можно изменить настройки печати в операционной системе Windows.
Проанализируем этот обходной путь:
В режиме «Печатать как графику» компьютер самостоятельно преобразует всю страницу Excel в единый растровый рисунок перед отправкой на принтер. Принтеру больше не требуется самостоятельно рассчитывать векторные символы шрифтов и подчеркиваний, что полностью снимает проблему зависания.
Иногда разработчики замечают странное поведение: при комментировании или изменении параметров печати в коде (например, ПараметрыПечати.Ориентация) печать на время восстанавливается, а затем снова зависает.
Давайте посмотрим на классический код экспорта:
ТабДокумент = СоздатьОбъект("ТабличныйДокумент");
ТабДокумент.ЗагрузитьИзТаблицы(АктивныйКонтекст);
//ТабДокумент.ПараметрыПечати.Ориентация = 1; // Проблемная строка
ТабДокумент.Записать(СохранитьМакетВфайл, 1);
Платформа 1С 7.7 кэширует параметры печати для каждого макета в реестре Windows. Если настройки принтера по умолчанию изменились или произошел конфликт форматов листа, запись некорректных метаданных в файл Excel может блокировать его отправку на печать.
Для исправления этой проблемы рекомендуется очистить ветку реестра Windows для текущего пользователя:
Win + R, ввести regedit).HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя_Базы>\V7\<Имя_Пользователя>\Moxel\При следующем формировании отчета 1С 7.7 создаст чистые параметры печати по умолчанию, что предотвратит программные сбои при последующей конвертации в Excel.