Почему зависает открытие формы печати документов в 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Торговля и дистрибуция
← На главную

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


ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, КлючУникальности);

При этом сам процесс сбора данных и заполнения табличного документа на сервере может занимать доли секунды, а зависание возникает спонтанно, преимущественно в клиент-серверных базах при работе пользователей через Remote Desktop (RDP). Выясним причину такого поведения платформы 1С и разберем по шагам действенные методы устранения проблемы.

Анализ причин: конфликт подсистемы печати и параметров макета

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

  1. Восстановление параметров печати. Из информационной базы по идентификатору КлючПараметровПечати считываются сохраненные пользовательские настройки (выбранный принтер, масштаб, ориентация, поля).
  2. Обращение к подсистеме Windows Spooler. Платформа запрашивает контекст графического устройства (Device Context) у текущего принтера, чтобы рассчитать метрики шрифтов, разбиение на страницы и автовысоту строк.
  3. Сетевые таймауты в RDP-сессиях. Если пользователь подключается удаленно, Windows перенаправляет его локальные принтеры с динамическими именами сессий (например, HP LaserJet (перенаправлено 4)). При смене сеанса старое имя принтера становится недействительным. Служба печати spoolsv.exe пытается достучаться до несуществующего RPC-порта, ожидая сетевого таймаута от 45 до 300 секунд. Использование драйвера Remote Desktop Easy Print усиливает эту задержку из-за дополнительной XPS-конвертации.
  4. Зацикливание движка Moxel при расчете страниц. Если в измененном макете печатной формы присутствуют объединенные ячейки с включенным свойством Вместе со следующим, опцией Размещение = Переносить и параметром Автомасштаб = Истина, внутренний алгоритм платформы 1С уходит в квазибесконечный цикл расчета переноса строк, непрерывно отправляя запросы к драйверу принтера.

Способ 1. Сброс и изменение ключа параметров печати

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

В процедуре формирования параметров печати изменим значение ключа, чтобы разорвать привязку к устаревшим настройкам:


// В процедуре формирования настроек печати документа
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();

// Задаем новый уникальный ключ параметров печати
ПараметрыВывода.КлючПараметровПечати = "УникальныйКлюч_ТОРГ12_Версия2";

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


КлючОбъекта = "ОбщаяФорма.ПечатьДокументов/ПараметрыПечати";
ХранилищеОбщихНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя);

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

Способ 2. Исправление ошибок и скрытых дефектов в макете

Рассмотрим структуру самого макета печатной формы. Даже незначительные правки оформления шапки или подвала могут приводить к зависанию движка отображения. Выполним оптимизацию макета по следующим пунктам:

  1. Отключение свойства «Вместе со следующим». Откроем макет, выделим все ячейки (Ctrl+A) и в палитре свойств снимем флаг Вместе со следующим для строк и колонок. Данное свойство в сочетании с автомасштабом часто вызывает зацикливание механизма разбивки на страницы.
  2. Очистка невидимых областей за границами макета. Случайный пробел или рамка в ячейке на строке 2000 или в колонке ZZ заставляют платформу генерировать виртуальный документ гигантского размера. Выделим все пустые строки ниже печатной области макета и удалим их через контекстное меню (кнопка Удалить, а не очистка содержимого). Аналогично удалим неиспользуемые колонки справа.
  3. Контроль автовысоты и объединения ячеек. В строках, содержащих длинные наименования и объединенные ячейки, не рекомендуется одновременно использовать автовысоту строки и режим размещения Переносить. Зададим фиксированную высоту строки или пересмотрим ширину базовых колонок.
  4. Проверка автомасштабирования в коде. В модуле формирования печатной формы перед возвратом табличного документа временно отключим автоматический подгон ширины листа, чтобы локализовать проблему:

// Временно отключаем автоматический подгон под страницу
ТабличныйДокумент.АвтоМасштаб = Ложь;
ТабличныйДокумент.МасштабПечати = 100;

Способ 3. Оптимизация подсистемы печати на сервере терминалов (RDP)

Если зависание проявляется у нескольких сотрудников при одновременной работе, разберем настройки сервера терминалов Windows Server:

  1. Отключение приоритета Easy Print. Драйвер Easy Print нестабильно взаимодействует с вызовами GDI из 1С. В редакторе локальной групповой политики (gpedit.msc) перейдем по пути: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Перенаправление принтеров. Параметр Использовать в первую очередь драйвер принтера Remote Desktop Easy Print переведем в положение Отключено.
  2. Установка однотипных базовых драйверов. Установим на терминальный сервер нативные драйверы используемых принтеров (рекомендуются версии PCL5 или PCL6 без тяжеловесных клиентских утилит от производителей оборудования). Версии драйверов на клиентских машинах и на сервере должны строго совпадать.
  3. Включение изоляции драйверов. В оснастке «Управление печатью» (Print Management) на сервере для всех драйверов зададим режим Изолированно (Driver Isolation). В этом случае сбой или зависание драйвера в одном сеансе не будет приводить к блокировке системного процесса spoolsv.exe для всех остальных пользователей 1С.
  4. Очистка фантомных портов и очередей. Удалим неиспользуемые старые сетевые принтеры в профилях пользователей на терминальном сервере, так как обращение 1С к недоступному сетевому ресурсу гарантированно вызывает паузу до истечения сетевого таймаута.

Способ 4. Альтернативный вывод без общей формы БСП

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


// Прямой вывод сформированного табличного документа
ТабличныйДокумент.ОтображатьСетку = Ложь;
ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
ТабличныйДокумент.Показать("Печать документа: ТОРГ-12");

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

← На главную