Почему не печатаются табличные документы в 1С 7.7 в терминальном режиме и как это исправить

Системный администратор 1С v7.7 IT и автоматизация бизнеса
← На главную

Приветствуем вас, коллеги! В этой статье мы детально разберем классическую системную проблему, с которой часто сталкиваются администраторы и пользователи систем на базе платформы 1С:Предприятие 7.7 при работе в терминальном режиме (RDP). Симптомы неисправности выглядят очень специфически: при попытке распечатать любой табличный документ (например, накладную, отчет или счет) программа никак не реагирует на нажатие кнопки «Печать» — диалоговое окно выбора принтера просто не появляется. При этом обычные текстовые файлы из 1С печатаются без каких-либо затруднений.

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

Почему текстовый документ печатается, а табличный (Moxel) — нет?

Для того чтобы понять корень проблемы, проанализируем, как 1С:Предприятие 7.7 взаимодействует с подсистемой печати Windows. Дело в том, что текстовые и табличные документы обрабатываются платформой абсолютно по-разному:

  1. Текстовые документы выводятся силами стандартных системных вызовов Windows API. Они обращаются напрямую к операционной системе и используют текущий системный принтер по умолчанию. Этот механизм работает практически безотказно.
  2. Табличные документы (формы класса Moxel) обрабатываются собственной библиотекой платформы — Moxel.dll. Эта библиотека хранит индивидуальные настройки принтера для каждого пользователя и для каждого отчета в системном реестре Windows. При попытке отправить таблицу на печать или открыть свойства страницы 1С обращается к ветке реестра пользователя.

В терминальной сессии при каждом новом подключении пользователя его локальные принтеры перенаправляются заново (так называемый RDP-маппинг). При этом имя принтера постоянно меняется, например, с HP LaserJet (redirected 2) на HP LaserJet (redirected 5). Библиотека Moxel.dll пытается найти в реестре старый принтер, который был сохранен в прошлой сессии. Не найдя его, служба печати Windows (Spooler) уходит в бесконечный таймаут опроса портов, а сессия 1С просто зависает или полностью игнорирует команду печати.

Когда мы принудительно запускаем печать обычного текста, операционная система инициализирует стандартный системный диалог. Это заставляет spooler обновить список активных устройств и временно перезаписать текущий принтер для всей сессии. После этого библиотека Moxel.dll начинает видеть актуальный принтер до следующего перезахода пользователя.

Решение 1. Очистка кэша принтеров в реестре (ветка Moxel)

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

HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\<Имя_Базы>\V7\<Имя_Пользователя>\Moxel\

Для того чтобы решить проблему раз и навсегда, рекомендуется автоматизировать процесс очистки этой ветки при каждом входе пользователя в терминал. Мы можем реализовать это с помощью простого сценария входа (Logon Script) или командного файла, запускающего 1С. Рассмотрим пример такого .bat файла:


@echo off
rem Очищаем ветку реестра Moxel перед запуском 1С
reg delete "HKCU\Software\1C\1Cv7\7.7\TradeDB\V7\Ivanov\Moxel" /f
rem Запускаем 1С:Предприятие 7.7
start "" "C:\Program Files (x86)\1Cv77\bin\1cv7.exe" enterprise /d"C:\DB\TradeDB\"

Если пользователей на сервере много, можно использовать универсальный скрипт очистки для текущего активного пользователя, который удалит параметры Moxel для всех баз в его профиле:


@echo off
for /f "tokens=*" %%a in ('reg query "HKCU\Software\1C\1Cv7\7.7"') do (
    reg delete "%%a" /f /v "Moxel" 2>nul
)

После удаления этих веток 1С при первом обращении к табличному документу автоматически создаст новые чистые параметры, привязав их к актуальному принтеру по умолчанию в текущей RDP-сессии.

Решение 2. Борьба с длинными именами принтеров

Еще одна неочевидная проблема кроется в архитектурном ограничении платформы 1С 7.7. Библиотека Moxel.dll некорректно обрабатывает имена принтеров, длина которых превышает 30 символов. При подключении через RDP имена принтеров часто раздуваются из-за добавления префиксов и суффиксов (например, HP LaserJet Professional P1102 (перенаправлено в сеанс 14)).

Чтобы исключить влияние этого бага, выполним следующие настройки на сервере и рабочих станциях:

  1. Сократите сетевые имена принтеров. Переименуйте принтеры на локальных компьютерах пользователей и на самом сервере так, чтобы их имена были короткими, состояли только из латинских букв и не содержали пробелов (например, HP1102, Canon220, KyoceraFS).
  2. Используйте прямой маппинг портов. Если все принтеры находятся в одной локальной сети с сервером, откажитесь от перенаправления принтеров через RDP. Установите принтеры как стандартные сетевые устройства непосредственно на терминальном сервере, задав им лаконичные сетевые пути.

Решение 3. Устранение зависания окна «Параметры страницы»

Бывает ситуация, когда при попытке зайти в меню «Файл — Параметры страницы» окно программы намертво зависает или аварийно закрывается. Это связано со сбоем числовых параметров разметки страницы в реестре. Там могут прописаться некорректные или отрицательные значения полей (например, -1200 вместо стандартных размеров).

Посмотрим на пример того, как можно программно принудительно инициализировать корректные параметры страницы непосредственно из кода 1С, минуя чтение поврежденных настроек из реестра. Для этого разработчики могут внедрить в глобальный модуль или в код конкретной печатной формы перед вызовом метода Показать() или Напечатать() следующую конструкцию:


Таб = СоздатьОбъект("Таблица");
// Устанавливаем принудительные стандартные параметры страницы:
// Портретная ориентация, масштаб 100%, поля по 10 мм
Таб.ПараметрыСтраницы(1, 100, 1, 10, 10, 10, 10, 0, 0, 1, 1, );
Таб.ИсходнаяТаблица("КассовыйОрдер");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0, 0, 0, 0);
Таб.Показать("Печать ордера", "");

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

Решение 4. Правильная настройка печати на уровне ОС и RDP

Для обеспечения стабильной печати в среде Windows Server выполним ряд системных рекомендаций:


net stop spooler
timeout /t 5
net start spooler

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

← На главную