В практике администрирования и программирования на платформе 1С:Предприятие часто возникает загадочная ситуация: одна и та же печатная форма у одного пользователя (например, у администратора) формируется идеально на одной странице, а у другого пользователя тот же самый документ с парой строк номенклатуры принудительно разрывается на несколько страниц. Ситуация усложняется тем, что даже разворачивание копии базы данных на другом сервере и очистка локального кэша на компьютере пользователя не приносят результатов. Настройки как будто "намертво" привязываются к учетной записи конкретного сотрудника.
В этой статье мы подробно разберем, почему возникает подобное поведение платформы, как устроен внутренний механизм хранения параметров печати, и рассмотрим пошаговые методы исправления этой проблемы — как интерактивные, так и программные.
Для того чтобы понять природу этой ошибки, проанализируем внутреннее устройство объекта ТабличныйДокумент в платформе 1С. У данного объекта существует важнейшее свойство — КлючПараметровПечати (в более ранних версиях платформы оно именовалось как ИмяПараметровПечати).
Рассмотрим по шагам логику работы этого механизма:
КлючПараметровПечати в коде печатной формы, платформа 1С понимает, что для данного документа нужно запоминать настройки печати.Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_<ИмяКлюча>.Если пользователь хотя бы один раз случайно зашел в параметры страницы и установил там некорректные настройки (например, формат бумаги Letter вместо стандартного А4, огромные поля или печать в масштабе 100% при широкой таблице), то при каждом последующем формировании этой печатной формы 1С будет принудительно применять эти искаженные параметры. В итоге документ, состоящий всего из двух строк, начинает разбиваться на несколько листов.
Многие администраторы пытаются решить проблему стандартными методами: удаляют базу из списка запуска (очищают локальный кэш конфигурации) или заходят в пользовательские настройки интерфейса в режиме "1С:Предприятие" и удаляют сохраненные настройки форм. Однако это не приносит результата.
Дело в том, что обычные пользовательские настройки (такие как видимость колонок в списках, положение окон, настройки отчетов СКД) хранятся в других ветках метаданных. Системные параметры печати лежат гораздо глубже в структуре хранения данных 1С. Платформа не классифицирует параметры страницы как "пользовательские настройки формы", поэтому стандартные интерактивные инструменты очистки их просто не видят и не затрагивают.
Рассмотрим подробно несколько эффективных способов решения данной проблемы.
Если проблема наблюдается у одного или двух пользователей, мы можем исправить ситуацию непосредственно в пользовательском режиме без написания кода. Для этого выполним следующие действия под учетной записью проблемного пользователя:
После этого новые корректные параметры перезапишут старые искаженные данные в системном хранилище СУБД, и последующий вывод печатной формы придет в норму.
Если проблемных пользователей много, или у вас нет возможности зайти под учетной записью каждого из них, мы можем очистить сохраненные настройки программно. Для этого используется глобальный объект ХранилищеСистемныхНастроек.
Выполним очистку с помощью внешней обработки или консоли кода. Нам потребуется написать следующую строку:
ХранилищеСистемныхНастроек.Удалить("Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_ИмяВашегоКлючаПечати", , "ИмяПроблемногоПользователя");
Разберем параметры этого метода:
ИмяВашегоКлючаПечати необходимо подставить точное значение свойства КлючПараметровПечати, которое задано в конфигураторе для этой печатной формы.Рассмотрим пример функции, которая производит полную очистку системных настроек для определенной печатной формы:
Процедура СброситьНастройкиПечати(ИмяКлюча, ИмяПользователя = Неопределено) Экспорт
ПутьКНастройке = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_" + ИмяКлюча;
Попытка
ХранилищеСистемныхНастроек.Удалить(ПутьКНастройке, , ИмяПользователя);
Сообщить("Настройки печати по ключу '" + ИмяКлюча + "' успешно сброшены.");
Исключение
ЗаписьЖурналаРегистрации("Печать.СбросНастроек", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Часто причиной возникновения подобных проблем является логическая ошибка самого разработчика при написании кода формирования табличного документа. Выясним, как правильно инициализировать свойства табличного документа.
Рассмотрим типичный неправильный вариант инициализации:
// НЕПРАВИЛЬНО!
ТабДок = Новый ТабличныйДокумент;
ТабДок.КлючПараметровПечати = "СправкаОДоходах";
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Почему такой код может работать некорректно? Дело в том, что как только строке ТабДок.КлючПараметровПечати = "СправкаОДоходах"; присваивается значение, платформа 1С тут же пытается прочитать ранее сохраненные настройки пользователя из СУБД и применить их к объекту ТабДок. Если у пользователя сохранены некорректные настройки, они загружаются в документ, затирая дефолтные параметры, которые разработчик пытается задать строками ниже.
Проанализируем правильный вариант написания кода:
// ПРАВИЛЬНО!
ТабДок = Новый ТабличныйДокумент;
// Сначала жестко устанавливаем базовые параметры по умолчанию
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
// И только в самом конце связываем с ключом параметров печати
ТабДок.КлючПараметровПечати = "СправкаОДоходах";
При такой последовательности платформа сначала инициализирует табличный документ правильными жестко заданными параметрами. Если у пользователя в системе еще нет сохраненных индивидуальных настроек печати для ключа "СправкаОДоходах", документ сформируется по правилам разработчика (с авто-масштабом и полями по 10 мм). Если же пользователь решит переопределить настройки вручную, его персональные изменения наложатся поверх базовых, но не сломают первичное формирование у других сотрудников.
Нельзя исключать и аппаратный фактор. В процессе формирования печатной формы 1С обращается к драйверу принтера, установленного по умолчанию у данного пользователя в операционной системе. Разные принтеры имеют различные физические ограничения области печати (так называемые "непечатные зоны").
Рассмотрим типичные ситуации:
Решением в данном случае является проверка принтера по умолчанию в операционной системе Windows у проблемного пользователя и приведение параметров страницы в соответствие со стандартным офисным принтером А4.
Для предотвращения проблем с разным отображением печатных форм у пользователей придерживайтесь следующих правил:
ТабличныйДокумент в правильном порядке: сначала задавайте АвтоМасштаб, ОриентацияСтраницы и поля, и только затем присваивайте КлючПараметровПечати.ХранилищеСистемныхНастроек.Удалить().