Разработка внешних печатных форм — стандартная задача для программиста 1С, однако механизмы Библиотеки Стандартных Подсистем (БСП) часто преподносят сюрпризы. Одна из распространенных проблем: печатная форма успешно формируется на экране, выводится в виде табличного документа, но при нажатии на стандартную кнопку «Сохранить» ничего не происходит. Файл не появляется в выбранной папке, при этом система не выдает никаких ошибок. В этой статье мы подробно разберем, почему так происходит, и как правильно доработать код внешней обработки, чтобы стандартный функционал сохранения работал корректно.
Когда мы используем стандартную форму печати (общая форма ПечатьДокументов), платформа 1С ожидает не просто набор ячеек, а структурированные данные. Основная причина, по которой сохранение «тихо» прерывается, заключается в отсутствии связи между сформированным табличным документом и ссылкой на объект метаданных (например, документом «Реализация товаров и услуг»).
Рассмотрим подробнее: механизм БСП использует специальную коллекцию ОбъектыПечати. Если эта коллекция пуста или в ней не указано представление объекта, процедура сохранения не может определить контекст (имя файла по умолчанию, права доступа и т.д.) и прекращает работу. Выясним, как правильно инициализировать эти данные в модуле объекта внешней печатной формы.
Это самый важный этап. В коде формирования печатной формы (обычно это процедура Печать в модуле объекта) необходимо явно указать системе, какой объект печатается в данный момент. Для этого используется процедура общего модуля УправлениеПечатью.ЗадатьОбластьПечатиДокумента. Проанализируем ее параметры:
// Синтаксис метода:
// УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Ссылка)
Часто программисты допускают ошибку, передавая в последний параметр Неопределено или забывая вызвать эту процедуру вовсе. Разберем по шагам правильную реализацию внутри цикла обхода печатаемых объектов:
Процедура СформироватьПечатнуюФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Получаем макет и создаем таблицу
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояОбработка_УникальноеИмя";
Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
// Запоминаем номер начальной строки для текущего объекта
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
// ... здесь идет код заполнения макета данными из СсылкаИзМассива ...
// КРИТИЧЕСКИ ВАЖНЫЙ МОМЕНТ:
// Связываем область табличного документа с конкретной ссылкой
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, СсылкаИзМассива);
КонецЦикла;
// Добавляем результат в коллекцию
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ИмяМакетаИзПараметровРегистрации");
ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;
КонецПроцедуры
Благодаря этому вызову, в переменную ОбъектыПечати попадает соответствие между строками документа и ссылкой. Именно это позволяет стандартной кнопке «Сохранить» корректно отрабатывать.
Посмотрим на ситуацию со стороны настроек. В процессе исследования проблемы часто выясняется, что у стандартных форм признак Печатать установлен в Истина, а у внешних — в Ложь. Это связано с тем, что система не находит сохраненных настроек для новой формы.
Чтобы платформа могла сохранять настройки (ориентацию страницы, поля, масштаб и историю сохранений), необходимо всегда заполнять свойство ИмяПараметровПечати табличного документа. Посмотрите на пример:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПроизвольныйТекст";
Важно: Имя должно быть уникальным для каждой вашей печатной формы, чтобы настройки разных отчетов не перемешивались в кэше пользователя.
В современных редакциях БСП (начиная с 3.0 и выше) структура таблицы КоллекцияПечатныхФорм стала сложнее. Для корректной работы механизмов экспорта в Word или Excel система может проверять наличие определенных колонок. Если ваша печатная форма игнорирует стандартную структуру, сохранение в специфические форматы может сбоить.
Проанализируем ситуацию: в некоторых случаях требуется добавить колонку ОфисныеДокументы в описание коллекции. Если вы формируете таблицу вручную (хотя БСП обычно делает это сама), убедитесь, что структура соответствует ожиданиям системы:
// В функции Печать, где подготавливается коллекция
Если Не КоллекцияПечатныхФорм.Колонки.Найти("ОфисныеДокументы") = Неопределено Тогда
// Колонка уже есть, ничего не делаем
Иначе
КоллекцияПечатныхФорм.Колонки.Добавить("ОфисныеДокументы", Новый ОписаниеТипов("Строка"));
КонецЕсли;
Хотя чаще всего достаточно просто правильно заполнить ОбъектыПечати, проверка состава колонок поможет в случаях, когда сохранение не работает только в определенные форматы (например, только в PDF работает, а в DOCX — нет).
Рассмотрим еще один аспект — Безопасный режим. При регистрации внешней печатной формы в справочнике «Дополнительные отчеты и обработки» по умолчанию устанавливается безопасный режим. В некоторых версиях платформы 8.3.15+ работа в безопасном режиме накладывает ограничения на запись файлов во временные каталоги сеанса.
Выясним, влияет ли это на вашу проблему. В функции СведенияОВнешнейОбработке убедитесь, что вы явно управляете этим параметром:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Если безопасный режим выключен, а сохранение все равно не работает — значит, проблема на 100% в коде формирования ОбъектыПечати, который мы разобрали выше.
Если ваша печатная форма не сохраняется в папку, пройдите по этому чек-листу:
Печать параметр ОбъектыПечати.УправлениеПечатью.ЗадатьОбластьПечатиДокумента.Неопределено.ТабличныйДокумент.ИмяПараметровПечати для сохранения контекста настроек.Соблюдение этих правил гарантирует, что ваша внешняя печатная форма будет вести себя точно так же, как и встроенные формы типовой конфигурации, обеспечивая пользователю привычный комфорт при работе с файлами.