Нередко при разработке или изменении печатных форм разработчики сталкиваются с ситуацией, когда стандартный вызов формирования и открытия отчета блокирует интерфейс пользователя на несколько минут. Замер производительности при этом указывает на единственную строку:
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, КлючУникальности);
При этом сам процесс сбора данных и заполнения табличного документа на сервере может занимать доли секунды, а зависание возникает спонтанно, преимущественно в клиент-серверных базах при работе пользователей через Remote Desktop (RDP). Выясним причину такого поведения платформы 1С и разберем по шагам действенные методы устранения проблемы.
Зависание на этапе открытия общей формы печати практически никогда не связано с тяжелыми запросами к базе данных. В момент инициализации формы ОбщаяФорма.ПечатьДокументов Библиотеки Стандартных Подсистем (БСП) и движка табличных документов (Moxel) происходят следующие процессы:
КлючПараметровПечати считываются сохраненные пользовательские настройки (выбранный принтер, масштаб, ориентация, поля).HP LaserJet (перенаправлено 4)). При смене сеанса старое имя принтера становится недействительным. Служба печати spoolsv.exe пытается достучаться до несуществующего RPC-порта, ожидая сетевого таймаута от 45 до 300 секунд. Использование драйвера Remote Desktop Easy Print усиливает эту задержку из-за дополнительной XPS-конвертации.Вместе со следующим, опцией Размещение = Переносить и параметром Автомасштаб = Истина, внутренний алгоритм платформы 1С уходит в квазибесконечный цикл расчета переноса строк, непрерывно отправляя запросы к драйверу принтера.Проанализируем самый простой и быстрый способ локализации проблемы. Если в кэше пользователя сохранены параметры несуществующего принтера, форма будет зависать при каждом открытии.
В процедуре формирования параметров печати изменим значение ключа, чтобы разорвать привязку к устаревшим настройкам:
// В процедуре формирования настроек печати документа
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Задаем новый уникальный ключ параметров печати
ПараметрыВывода.КлючПараметровПечати = "УникальныйКлюч_ТОРГ12_Версия2";
Если требуется очистить некорректные настройки централизованно для всех пользователей, выполним программную очистку хранилища системных настроек:
КлючОбъекта = "ОбщаяФорма.ПечатьДокументов/ПараметрыПечати";
ХранилищеОбщихНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя);
Также полезно открыть предварительный просмотр документа у проблемного пользователя и вручную перевыбрать реальный локальный принтер по умолчанию, сохранив параметры страницы.
Рассмотрим структуру самого макета печатной формы. Даже незначительные правки оформления шапки или подвала могут приводить к зависанию движка отображения. Выполним оптимизацию макета по следующим пунктам:
Переносить. Зададим фиксированную высоту строки или пересмотрим ширину базовых колонок.
// Временно отключаем автоматический подгон под страницу
ТабличныйДокумент.АвтоМасштаб = Ложь;
ТабличныйДокумент.МасштабПечати = 100;
Если зависание проявляется у нескольких сотрудников при одновременной работе, разберем настройки сервера терминалов Windows Server:
Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Перенаправление принтеров. Параметр Использовать в первую очередь драйвер принтера Remote Desktop Easy Print переведем в положение Отключено.Изолированно (Driver Isolation). В этом случае сбой или зависание драйвера в одном сеансе не будет приводить к блокировке системного процесса spoolsv.exe для всех остальных пользователей 1С.Если требуется оперативно обойти блокировку интерфейса для критически важного документа, пока администраторы настраивают сервер печати, заменим вызов тяжелой общей формы на прямой вывод табличного документа в отдельное окно:
// Прямой вывод сформированного табличного документа
ТабличныйДокумент.ОтображатьСетку = Ложь;
ТабличныйДокумент.ОтображатьЗаголовки = Ложь;
ТабличныйДокумент.Показать("Печать документа: ТОРГ-12");
Такой подход исключает запуск механизмов БСП по сопоставлению принтеров и чтению общих настроек, позволяя пользователю сразу увидеть печатную форму на экране.