При отладке печатных форм в системе «1С:Предприятие» разработчики часто сталкиваются с загадочным поведением табличных документов. Например, на сервере или локальном компьютере по умолчанию установлен один принтер, но при формировании печатной формы (такой как УПД или Торг-12) в свойстве ИмяПринтера объекта ТабличныйДокумент автоматически прописывается совершенно другое устройство. Ещё более неприятная ситуация — когда на предварительном просмотре документ выглядит идеально, а при физической печати строки «съезжают», текст усекается, а количество страниц неожиданно увеличивается.
В этой статье мы подробно разберем внутренние механизмы работы платформы 1С с печатающими устройствами, выясним причину возникновения таких несоответствий и рассмотрим практические способы решения этих проблем.
Для того чтобы понять, откуда в свойстве ИмяПринтера берется конкретное устройство, проанализируем ситуацию взаимодействия платформы с операционной системой и сохраненными настройками пользователя. Процесс строится на работе с ключами параметров печати.
В коде конфигураций 1С (особенно в комплексных типовых решениях, таких как «Управление торговлей») табличному документу практически всегда присваивается уникальный идентификатор настроек. В обычных формах (например, в УТ 10.3) для этого используется свойство ИмяПараметровПечати, а в управляемых формах — КлючПараметровПечати. Рассмотрим типичный пример из общего модуля:
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент981";
На первый взгляд, в этой строке нет ни слова о принтере. Однако именно присвоение этого ключа запускает следующий механизм:
"ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент981").ТабДокумент.ИмяПараметровПечати = ... дает платформе команду: «Найди в сохраненных настройках пользователя параметры с этим ключом и примени их к текущему объекту ТабДокумент». В этот момент в свойство ИмяПринтера автоматически подставляется то устройство, на которое пользователь печатал данный документ в прошлый раз.Таким образом, появление стороннего принтера в свойствах документа — это абсолютно штатное поведение платформы. Система пытается упростить жизнь пользователю, запоминая его последний выбор для конкретной печатной формы.
Выясним, где именно платформа хранит эти данные, так как это критично для решения проблем с некорректными устройствами:
_SystemSettings). Путь к записи выглядит как Общее/НастройкиПечатиТабличногоДокумента/<ИмяПараметровПечати>. Это позволяет пользователю сохранять настройки принтеров даже при смене рабочего компьютера.%APPDATA%\1C\1Cv8\.... Если у пользователя повреждается этот кэш или ограничены права на запись в данную директорию, настройки печати могут «слетать» к параметрам по умолчанию при каждом сеансе.Теперь ответим на второй важнейший вопрос: может ли некорректное имя принтера в свойствах табличного документа приводить к смещению строк и изменению количества страниц при печати?
Ответ однозначный: да, может, и это одна из самых частых причин искажения макетов.
Рассмотрим подробнее физику этого процесса. Когда платформа 1С формирует табличный документ на экране, она выполняет верстку (расчет высоты строк, распределение текста, разбиение на страницы), ориентируясь на метрики устройства, указанного в ТабДок.ИмяПринтера. Если это свойство пустое, система ориентируется на системный принтер по умолчанию.
Каждый драйвер принтера передает операционной системе уникальный набор параметров:
Если макет документа рассчитывается под виртуальный PDF-принтер (с нулевыми полями), а фактическая печать отправляется на локальный принтер с широкими технологическими полями, драйвер принтера принудительно сжимает или обрезает области документа. В результате строки, которые на экране идеально умещались на одном листе, переползают на следующую страницу, полностью сбивая форматирование.
Особую сложность эта проблема представляет при работе пользователей в терминальных сессиях (RDP). При подключении к серверу принтеры пользователей часто пробрасываются динамически, получая имена вида: HP LaserJet 1020 (перенаправлено 43).
Проанализируем развитие событий:
HP LaserJet 1020 (перенаправлено 12).... (перенаправлено 43). Поскольку такого устройства в системе больше нет, сервер тратит до 30 секунд на опрос несуществующего сетевого ресурса (в этот момент программа «зависает»), после чего сбрасывает настройки на дефолтные или выдает ошибку печати.Для предотвращения таких ситуаций в терминальной среде рекомендуется настраивать статические сетевые пути к принтерам или использовать специализированный софт для стабилизации имен принтеров.
Если вы самостоятельно разрабатываете или модифицируете печатные формы, крайне важно соблюдать последовательность инициализации свойств табличного документа. Платформа 1С считывает сохраненные пользовательские настройки строго в момент присвоения ключа параметров печати.
Рассмотрим правильный и неправильный варианты построения кода.
Правильный вариант (сначала дефолтные настройки разработчика, затем ключ):
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УПД";
Как это работает: Сначала мы устанавливаем ландшафтную ориентацию по умолчанию. Затем платформа загружает сохраненные настройки пользователя. Если пользователь ранее вручную изменил ориентацию этого документа на портретную, то его выбор приоритетен и переопределит наш ландшафт. Если пользователь ничего не менял, применится ландшафт.
Неправильный вариант (сначала ключ, затем настройки разработчика):
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УПД";
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Как это работает: Платформа загружает пользовательские настройки (например, портретную ориентацию, которую выбрал клиент), но следующей же строкой разработчик жестко перезаписывает ее на ландшафт. В итоге любые персональные настройки принтера и страницы, сделанные пользователем, будут сбрасываться при каждом открытии формы.
Что делать, если у пользователя сохранились некорректные настройки принтера, из-за чего печать постоянно сбоит или зависает? Мы можем принудительно очистить сохраненные параметры для конкретного ключа печати. Напрямую объект настроек не подлежит изменению через стандартный интерфейс, но мы можем использовать объект ХранилищеСистемныхНастроек.
Рассмотрим пример кода, который полностью очищает зависшие параметры печати для конкретного пользователя:
// Определяем ключ объекта настроек, соответствующий нашей печатной форме
КлючОбъекта = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент981";
// Удаляем настройки для определенного пользователя
ИмяПользователя = "ИвановИИ"; // Можно получить через ПользователиИнформационнойБазы.ТекущийПользователь().Имя
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, , ИмяПользователя);
После выполнения этого кода при следующем открытии печатной формы УПД платформа создаст чистые параметры, взяв за основу актуальный принтер по умолчанию, прописанный в операционной системе Windows.