Нередко при автоматизации вывода комплектов печатных форм возникает неприятная ситуация: под учетной записью администратора комплект формируется корректно единым документом, а у конкретного пользователя разбивается на несколько самостоятельных документов или заданий печати. При выводе одного экземпляра это может остаться незамеченным. Однако при тиражировании нескольких копий порядок следования страниц полностью нарушается: принтер сначала печатает все первые страницы (например, титульные листы), а затем все вторые листы.
Проанализируем природу этого поведения платформы «1С:Предприятие», разберем причины сбоя и рассмотрим практические способы решения — от быстрой очистки пользовательских настроек до программных доработок макетов.
Когда мы отправляем комплект документов в диспетчер печати Windows (spooler), платформа формирует задание. Если комплект состоит из нескольких макетов или табличных документов, 1С пытается объединить их в общий поток. Однако это объединение разрывается в следующих случаях:
ИмяПараметровПечати у табличных документов комплекта имеет разные значения или не задано согласованно, платформа считывает для каждого документа независимые настройки.Если комплект изначально собирался корректно и сбой наблюдается только у определенных сотрудников, самый быстрый путь — сбросить сохраненные настройки табличных документов. Разберем по шагам, как это сделать административно:
В типовых конфигурациях на базе БСП также можно перейти непосредственно в справочник Пользователи, открыть карточку сотрудника, перейти на вкладку Настройки и в группе прочих настроек удалить индивидуальные параметры печати. После этого табличные документы начнут формироваться с исходными параметрами макетов, и объединение восстановится.
Если требуется очистить некорректные параметры у группы пользователей пакетно, применим программное удаление записей через ХранилищеСистемныхНастроек. Посмотрим на пример кода обработки:
КлючОбъекта = "ТабличныйДокумент/ПараметрыПечати/";
// Удаляем сохраненную настройку для конкретного макета и пользователя
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта + ИмяПечатнойФормы, "", ИмяПользователя);
Такой подход позволяет точечно сбросить сбившиеся масштабы и поля, не затрагивая пользовательские настройки интерфейса, динамических списков и отборов.
Если комплект собирается «ручками» в модуле печати, наиболее надежным способом избежать влияния пользовательских настроек на разбивку заданий является объединение всех форм в единый объект ТабличныйДокумент перед передачей на печать. Рассмотрим подробнее, как это реализовать:
ИтоговыйТабДок = Новый ТабличныйДокумент;
// Задаем общее имя настроек печати для всего комплекта
ИтоговыйТабДок.ИмяПараметровПечати = "ПараметрыПечати_ЕдиныйКомплект";
// Выводим первую часть комплекта
ИтоговыйТабДок.Вывести(ТабДокТитульныйЛист);
// Разделяем листы комплекта
ИтоговыйТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Выводим вторую часть комплекта
ИтоговыйТабДок.Вывести(ТабДокОсновнаяЧасть);
// Отправляем на печать единый документ
ИтоговыйТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Обратим внимание: в рамках одного объекта ТабличныйДокумент параметры страницы (поля, альбомная или книжная ориентация) действуют глобально на весь документ. Если все составляющие комплекта имеют одинаковый формат, этот метод гарантирует формирование строго одного задания печати и корректную работу сортировки по копиям.
В ситуациях, когда формы комплекта должны оставаться отдельными документами (например, они требуют индивидуальных колонтитулов или имеют разную структуру), воспользуемся объектом ПакетОтображаемыхДокументов. Разберем по шагам создание пакета с явным включением разбора по копиям:
Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.КоличествоЭкземпляров = КоличествоКопий;
Пакет.РазборПоКопиям = Истина;
// Помещаем первый документ комплекта во временное хранилище
Элемент1 = Пакет.Состав.Добавить();
Элемент1.Данные = ПоместитьВоВременноеХранилище(ТабДок1, Новый УникальныйИдентификатор);
// Помещаем второй документ комплекта
Элемент2 = Пакет.Состав.Добавить();
Элемент2.Данные = ПоместитьВоВременноеХранилище(ТабДок2, Новый УникальныйИдентификатор);
// Отправляем пакет на принтер
Пакет.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Использование пакета позволяет платформе передать задание печати драйверу принтера максимально скоординированно, предотвращая перемешивание страниц при печати тиражей.