Почему не печатается сохраненный из 1С 7.7 в Excel документ и как решить проблему зависания принтера?

Программист 1С v7.7 Бухгалтерский учет Торговля и дистрибуция
← На главную

В практике поддержки пользователей систем на платформе 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. Исправление макета печатной формы в 1С (Рекомендуемый способ)

Самое надежное и правильное решение — исключить генерацию длинных строк из символов подчеркивания в самом макете 1С 7.7. Вместо ввода текстовых знаков «_____» мы настроим визуальное оформление ячеек таблицы.

Выполним следующие шаги по шагам:

  1. Откроем конфигуратор 1С 7.7 и найдем шаблон проблемной печатной формы (например, макет акта сверки).
  2. Найдем секцию, где выводятся линии для подписей сторон (ФИО руководителя, главного бухгалтера и т.д.).
  3. Удалим текстовые символы подчеркивания из ячеек макета.
  4. Выделим ячейку (или несколько объединенных ячеек), где должна стоять подпись.
  5. Нажмем правой кнопкой мыши по ячейке, выберем пункт «Свойства» (Свойства ячейки).
  6. Перейдем на вкладку «Границы» (Borders) и установим для выделенной области только нижнюю границу (Bottom Border).

При экспорте в Excel нижняя граница ячейки преобразуется в стандартный стиль границы листа (Border Line). Этот элемент отлично оптимизирован, корректно обрабатывается любыми версиями Microsoft Office и никогда не вызывает сбоев у драйверов печати.


Способ 2. Оптимизация программного кода вывода печатной формы

Иногда строки подчеркивания генерируются динамически в программном модуле, когда длина строки рассчитывается в зависимости от наличия данных контрагента. Например, если ФИО подписанта пустое, программа заполняет поле подчеркиваниями.

Рассмотрим пример кода, который может приводить к ошибке:


// Проблемный код автозаполнения строки подписи
Если ПустоеЗначение(РуководительКонтрагента) = 1 Тогда
    ПечПодпись = "Представитель: " + СокрЛП(Контрагент) + " ___________________________";
КонецЕсли;

Чтобы избежать этой проблемы программно без перерисовки всего макета, мы можем заменить символ подчеркивания на другие менее «тяжелые» для принтера символы (например, точки или дефисы), либо выводить пустую ячейку с включенной границей:


// Безопасный код с использованием точек для заполнения
Если ПустоеЗначение(РуководительКонтрагента) = 1 Тогда
    ПечПодпись = "Представитель: " + СокрЛП(Контрагент) + " ...........................";
КонецЕсли;

Символ точки (.) при растеризации шрифта драйвером принтера обрабатывается как отдельные простые глифы и не перегружает буфер устройства печати.


Способ 3. Быстрое решение на стороне пользователя (Настройка принтера)

Если проблему нужно устранить «здесь и сейчас» непосредственно на рабочем месте пользователя, а возможности изменить код или макет в конфигураторе нет, можно изменить настройки печати в операционной системе Windows.

Проанализируем этот обходной путь:

  1. Откроем меню «Устройства и принтеры» в Панели управления Windows.
  2. Кликнем правой кнопкой мыши на целевом принтере и выберем «Настройка печати».
  3. Перейдем на вкладку «Дополнительно» (или «Качество печати» — расположение зависит от производителя устройства).
  4. Найдем параметр «Печатать как графику» (Print as Image) или переключим режим обработки шрифтов со «Встроенных шрифтов принтера» на «Загружаемые шрифты» (Download as Softfont).
  5. Сохраним настройки и попробуем распечатать файл из Excel повторно.

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


Способ 4. Очистка кэша параметров печати (Moxel) в реестре

Иногда разработчики замечают странное поведение: при комментировании или изменении параметров печати в коде (например, ПараметрыПечати.Ориентация) печать на время восстанавливается, а затем снова зависает.

Давайте посмотрим на классический код экспорта:


ТабДокумент = СоздатьОбъект("ТабличныйДокумент");
ТабДокумент.ЗагрузитьИзТаблицы(АктивныйКонтекст);
//ТабДокумент.ПараметрыПечати.Ориентация = 1; // Проблемная строка
ТабДокумент.Записать(СохранитьМакетВфайл, 1);

Платформа 1С 7.7 кэширует параметры печати для каждого макета в реестре Windows. Если настройки принтера по умолчанию изменились или произошел конфликт форматов листа, запись некорректных метаданных в файл Excel может блокировать его отправку на печать.

Для исправления этой проблемы рекомендуется очистить ветку реестра Windows для текущего пользователя:

  1. Закроем программу 1С:Предприятие.
  2. Откроем редактор реестра (сочетание клавиш Win + R, ввести regedit).
  3. Перейдем по пути:
    HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя_Базы>\V7\<Имя_Пользователя>\Moxel\
  4. Найдем ветку с названием проблемного отчета (например, «АктСверки») и удалим ее.

При следующем формировании отчета 1С 7.7 создаст чистые параметры печати по умолчанию, что предотвратит программные сбои при последующей конвертации в Excel.

← На главную