При доработке типовых печатных форм в решениях на платформе 1С:Предприятие 8.3 (особенно в конфигурациях 1С:Розница, 1С:Управление торговлей или 1С:ERP) разработчики часто сталкиваются с крайне странным поведением системы. Логотип компании, рекламная информация, условия возврата товара или штрихкоды, добавленные в макет, отлично видны в режиме предварительного просмотра и даже без проблем распечатываются, если открыть документ напрямую и нажать кнопку печати. Однако при отправке на печать непосредственно из Рабочего места кассира (РМК) или при попытке сохранить документ в файл эти новые области бесследно исчезают.
В этой статье мы подробно разберем, почему возникает такое расхождение в поведении платформы, проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП) и покажем, как правильно доработать программный код печатной формы, чтобы решить эту проблему раз и навсегда.
Чтобы понять природу этой ошибки, необходимо заглянуть под капот механизмов печати современных конфигураций 1С. В типовых решениях за вывод документов отвечает специализированная подсистема БСП под названием «Печать». Основным инструментом разметки печатных форм в ней является метод общего модуля УправлениеПечатью.ЗадатьОбластьПечатиДокумента.
Этот метод предназначен для логического разделения одного большого результирующего табличного документа на отдельные печатные листы (документы). Он связывает конкретный диапазон строк табличного документа (начиная со строки, переданной в параметре, и заканчивая текущим низом таблицы на момент вызова функции) с конкретным объектом базы данных (ссылкой на документ).
Давайте подробно рассмотрим, как этот механизм реагирует на различные сценарии использования печатной формы:
ТабличныйДокумент в специальное поле табличного документа. В этот момент на экране отображается абсолютно всё, что программист вывел в таблицу программным путем. Механизмы пакетной разметки БСП здесь практически не задействованы, поэтому и логотип, и дополнительный текст отображаются без искажений. При печати из этого окна силами платформы документ уходит на принтер целиком.ЗадатьОбластьПечатиДокумента). Программа берет только те строки, которые вошли в этот зарегистрированный диапазон. Всё, что оказалось ниже или выше границ этого диапазона, БСП просто игнорирует и отсекает.Давайте проанализируем типичный сценарий доработки кода, который приводит к исчезновению логотипа и дополнительных данных при печати из РМК. Рассмотрим пример некорректного алгоритма формирования печатной формы:
// НЕКОРРЕКТНЫЙ КОД формирования печатной формы
Процедура ВывестиПечатнуюФормуТоварногоЧека(ТабличныйДокумент, Ссылка)
// 1. Фиксируем начальную строку вывода для БСП
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// 2. Выводим стандартный макет (Шапка, Табличная часть, Итоги)
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьШапка);
// ... Вывод строк табличной части ...
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТабличныйДокумент.Вывести(ОбластьПодвал);
// 3. Вызываем метод БСП для фиксации области печати документа!
// На данный момент ВысотаТаблицы равна, например, 50 строкам.
// БСП зафиксирует область печати для данного документа со строки НомерСтрокиНачало по 50 строку.
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Ссылка);
// 4. ОШИБКА: Добавление кастомных областей (логотип, реклама) после фиксации области печати!
// Эти строки будут выведены на физический лист (строки 51-60), но БСП о них "не узнает".
ОбластьДополнительно = Макет.ПолучитьОбласть("ДополнительнаяИнформация");
ТабличныйДокумент.Вывести(ОбластьДополнительно);
КонецПроцедуры
В приведенном примере вызов функции УправлениеПечатью.ЗадатьОбластьПечатиДокумента происходит до того, как в документ выведен блок с дополнительной информацией. Поскольку высота таблицы на момент вызова метода БСП была меньше и не включала кастомную область, добавленные строки с логотипом и условиями возврата автоматически отсекаются при печати из РМК и при сохранении в файл.
Разберем по шагам, как исправить эту ошибку и добиться стабильной печати документа во всех режимах работы системы.
Главное правило при работе с подсистемой печати БСП: вызов метода УправлениеПечатью.ЗадатьОбластьПечатиДокумента должен производиться строго в самом конце алгоритма формирования документа, когда абсолютно все области (включая шапки, подвалы, кастомные логотипы, рекламные тексты и дополнительные поля) уже успешно выведены в ТабличныйДокумент.
Давайте посмотрим на пример корректного кода формирования печатной формы:
// КОРРЕКТНЫЙ КОД формирования печатной формы
Процедура ВывестиПечатнуюФормуТоварногоЧека(ТабличныйДокумент, Ссылка)
// 1. Фиксируем начальную строку вывода для БСП
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// 2. Выводим стандартный макет
Макет = ПолучитьМакет("Макет");
ОбластьШапка = ... // Получение и заполнение параметров шапки
ТабличныйДокумент.Вывести(ОбластьШапка);
// ... Вывод строк табличной части ...
ОбластьПодвал = ... // Получение и вывод стандартного подвала
ТабличныйДокумент.Вывести(ОбластьПодвал);
// 3. Выводим наши новые доработанные области ДО фиксации области печати БСП
ОбластьДополнительно = Макет.ПолучитьОбласть("ДополнительнаяИнформация");
// Здесь мы можем заполнить параметры логотипа или текст условий возврата
ТабличныйДокумент.Вывести(ОбластьДополнительно);
// 4. Фиксируем область печати.
// Теперь ВысотаТаблицы включает в себя абсолютно все выведенные области!
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Ссылка);
КонецПроцедуры
Если ваш логотип добавлен в макет как графический рисунок (объект типа РисунокТабличногоДокумента), необходимо обратить особое внимание на его позиционирование. Если границы картинки по вертикали выходят ниже физической границы последней строки выведенной области, БСП может обрезать часть изображения.
Для предотвращения этой проблемы воспользуйтесь следующими рекомендациями:
Реальный размер или Пропорционально, а сам рисунок жестко привязан к границам строк.В некоторых случаях, даже после внесения корректных изменений в программный код модуля, на рабочих местах кассиров (РМК) может продолжать воспроизводиться старое поведение. Это связано с кэшированием программного кода платформой или механизмами обновления конфигурации на локальных машинах.
Проанализируем процедуру очистки кэша для исправления данной ситуации:
/ClearCache.Следуя этим простым шагам и соблюдая правильную последовательность вызова функций БСП, вы добьетесь стабильного и предсказуемого вывода на печать абсолютно любых доработанных областей табличных документов как в интерактивном режиме, так и при автоматической печати из РМК.