Почему внешняя печатная форма 1С не сохраняется в папку: разбираем причины и исправляем код

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Разработка внешних печатных форм — стандартная задача для программиста 1С, однако механизмы Библиотеки Стандартных Подсистем (БСП) часто преподносят сюрпризы. Одна из распространенных проблем: печатная форма успешно формируется на экране, выводится в виде табличного документа, но при нажатии на стандартную кнопку «Сохранить» ничего не происходит. Файл не появляется в выбранной папке, при этом система не выдает никаких ошибок. В этой статье мы подробно разберем, почему так происходит, и как правильно доработать код внешней обработки, чтобы стандартный функционал сохранения работал корректно.

Анализируем причину проблемы: механизм связки табличного документа и объекта

Когда мы используем стандартную форму печати (общая форма ПечатьДокументов), платформа 1С ожидает не просто набор ячеек, а структурированные данные. Основная причина, по которой сохранение «тихо» прерывается, заключается в отсутствии связи между сформированным табличным документом и ссылкой на объект метаданных (например, документом «Реализация товаров и услуг»).

Рассмотрим подробнее: механизм БСП использует специальную коллекцию ОбъектыПечати. Если эта коллекция пуста или в ней не указано представление объекта, процедура сохранения не может определить контекст (имя файла по умолчанию, права доступа и т.д.) и прекращает работу. Выясним, как правильно инициализировать эти данные в модуле объекта внешней печатной формы.

Решение №1: Использование метода ЗадатьОбластьПечатиДокумента

Это самый важный этап. В коде формирования печатной формы (обычно это процедура Печать в модуле объекта) необходимо явно указать системе, какой объект печатается в данный момент. Для этого используется процедура общего модуля УправлениеПечатью.ЗадатьОбластьПечатиДокумента. Проанализируем ее параметры:


// Синтаксис метода:
// УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, Ссылка)

Часто программисты допускают ошибку, передавая в последний параметр Неопределено или забывая вызвать эту процедуру вовсе. Разберем по шагам правильную реализацию внутри цикла обхода печатаемых объектов:


Процедура СформироватьПечатнуюФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    // Получаем макет и создаем таблицу
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МояОбработка_УникальноеИмя";
    
    Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
        
        // Запоминаем номер начальной строки для текущего объекта
        НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
        
        // ... здесь идет код заполнения макета данными из СсылкаИзМассива ...
        
        // КРИТИЧЕСКИ ВАЖНЫЙ МОМЕНТ:
        // Связываем область табличного документа с конкретной ссылкой
        УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, СсылкаИзМассива);
        
    КонецЦикла;
    
    // Добавляем результат в коллекцию
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ИмяМакетаИзПараметровРегистрации");
    ПечатнаяФорма.ТабличныйДокумент = ТабличныйДокумент;

КонецПроцедуры

Благодаря этому вызову, в переменную ОбъектыПечати попадает соответствие между строками документа и ссылкой. Именно это позволяет стандартной кнопке «Сохранить» корректно отрабатывать.

Решение №2: Инициализация параметров печати

Посмотрим на ситуацию со стороны настроек. В процессе исследования проблемы часто выясняется, что у стандартных форм признак Печатать установлен в Истина, а у внешних — в Ложь. Это связано с тем, что система не находит сохраненных настроек для новой формы.

Чтобы платформа могла сохранять настройки (ориентацию страницы, поля, масштаб и историю сохранений), необходимо всегда заполнять свойство ИмяПараметровПечати табличного документа. Посмотрите на пример:

ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ПроизвольныйТекст";

Важно: Имя должно быть уникальным для каждой вашей печатной формы, чтобы настройки разных отчетов не перемешивались в кэше пользователя.

Решение №3: Обработка офисных документов в коллекции

В современных редакциях БСП (начиная с 3.0 и выше) структура таблицы КоллекцияПечатныхФорм стала сложнее. Для корректной работы механизмов экспорта в Word или Excel система может проверять наличие определенных колонок. Если ваша печатная форма игнорирует стандартную структуру, сохранение в специфические форматы может сбоить.

Проанализируем ситуацию: в некоторых случаях требуется добавить колонку ОфисныеДокументы в описание коллекции. Если вы формируете таблицу вручную (хотя БСП обычно делает это сама), убедитесь, что структура соответствует ожиданиям системы:


// В функции Печать, где подготавливается коллекция
Если Не КоллекцияПечатныхФорм.Колонки.Найти("ОфисныеДокументы") = Неопределено Тогда
    // Колонка уже есть, ничего не делаем
Иначе
    КоллекцияПечатныхФорм.Колонки.Добавить("ОфисныеДокументы", Новый ОписаниеТипов("Строка"));
КонецЕсли;

Хотя чаще всего достаточно просто правильно заполнить ОбъектыПечати, проверка состава колонок поможет в случаях, когда сохранение не работает только в определенные форматы (например, только в PDF работает, а в DOCX — нет).

Дополнительные нюансы: Безопасный режим и права доступа

Рассмотрим еще один аспект — Безопасный режим. При регистрации внешней печатной формы в справочнике «Дополнительные отчеты и обработки» по умолчанию устанавливается безопасный режим. В некоторых версиях платформы 8.3.15+ работа в безопасном режиме накладывает ограничения на запись файлов во временные каталоги сеанса.

Выясним, влияет ли это на вашу проблему. В функции СведенияОВнешнейОбработке убедитесь, что вы явно управляете этим параметром:

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

Если безопасный режим выключен, а сохранение все равно не работает — значит, проблема на 100% в коде формирования ОбъектыПечати, который мы разобрали выше.

Резюме для быстрой проверки

Если ваша печатная форма не сохраняется в папку, пройдите по этому чек-листу:

  1. Проверьте, передается ли в процедуру Печать параметр ОбъектыПечати.
  2. Убедитесь, что внутри цикла формирования строк вызывается УправлениеПечатью.ЗадатьОбластьПечатиДокумента.
  3. Проверьте, что в четвертый параметр этой процедуры передается реальная ссылка на объект, а не Неопределено.
  4. Установите свойство ТабличныйДокумент.ИмяПараметровПечати для сохранения контекста настроек.

Соблюдение этих правил гарантирует, что ваша внешняя печатная форма будет вести себя точно так же, как и встроенные формы типовой конфигурации, обеспечивая пользователю привычный комфорт при работе с файлами.

← На главную