Как исправить ошибку при сохранении печатной формы в Excel через меню «Еще» в 1С

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

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

Анализируем причину возникновения ошибки

Выясним, в чем заключается принципиальная разница между способами сохранения. Когда мы нажимаем на стандартную кнопку сохранения на панели табличного документа, платформа 1С:Предприятие просто выполняет экспорт текущего состояния ячеек в выбранный формат. Однако кнопка «Сохранить» в меню «Еще» вызывает специальную обработку из состава БСП. Эта обработка обладает расширенным функционалом: она умеет упаковывать несколько документов в один ZIP-архив, транслитерировать имена файлов и, что самое важное, разделять один общий табличный документ на несколько разных файлов, если на печать было выведено несколько объектов сразу.

Для реализации этого механизма подсистема печати БСП должна четко понимать, какие строки табличного документа относятся к какому объекту (например, к какому конкретно заказу или накладной). Чтобы это разделение произошло, в табличном документе должны быть созданы именованные области, а в программном коде — сформирована коллекция, связывающая ссылку на объект с именем этой области. Если имен областей нет или они заполнены некорректно (например, вместо строкового имени передана ссылка), алгоритм БСП «теряется» и выдает ошибку «Не определен список получаемых файлов» или закрывает диалог без результата.

Разберем типичную ошибку в коде

Проанализируем фрагмент кода, который чаще всего становится источником проблем. Рассмотрим, как делать неправильно:


ОбластиОбъектов = Новый СписокЗначений;
// ОШИБКА: во второй параметр (представление) передается ссылка, а не имя области
ОбластиОбъектов.Добавить(Объект.Ссылка, Объект.Ссылка); 
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);

В данном примере во второй параметр метода Добавить передается ссылка на объект. Система БСП ожидает увидеть там строковой идентификатор области, которая существует внутри ТабличногоДокумента. Из-за этого несоответствия при попытке программного разбора документа для сохранения в Excel механизм не может найти начало и конец данных.

Пошаговое решение: правильная подготовка печатной формы

Чтобы функция сохранения через «Еще» заработала, нам необходимо выполнить два условия: разметить сам ТабличныйДокумент и правильно заполнить СписокЗначений для управления печатью.

Шаг 1. Именование области в табличном документе

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


// В функции формирования печатной формы на сервере
ИмяОбласти = "Документ_" + Формат(1, "ЧН=; ЧГ="); // Формируем уникальное имя
НомерСтрокиНачало = 1;
НомерСтрокиОкончание = ТабДок.ВысотаТаблицы;

// Назначаем имя области, охватывающей все строки документа
ТабДок.Область(НомерСтрокиНачало, , НомерСтрокиОкончание, ).Имя = ИмяОбласти;
Возврат ТабДок;

Шаг 2. Корректное заполнение коллекции ОбластиОбъектов

Теперь на стороне клиента, где вызывается процедура печати, мы должны передать это же имя в структуру управления печатью. Рассмотрим исправленный вариант основной процедуры:


&НаКлиенте
Процедура Печать_М15(Команда)
    // 1. Получаем сформированный табличный документ с сервера
    ТабДок = ПечатьНаСервере(); 
    
    // 2. Подготавливаем коллекцию печатных форм по стандарту БСП
    КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм("МакетМ15");
    ПечатнаяФорма = УправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, "МакетМ15");
    ПечатнаяФорма.СинонимМакета = "Накладная М-15";
    ПечатнаяФорма.ТабличныйДокумент = ТабДок;
    ПечатнаяФорма.ИмяФайлаПечатнойФормы = "М15_" + Объект.Номер;
    
    // 3. Важнейший этап: связываем ссылку объекта с именем области в макете
    ОбластиОбъектов = Новый СписокЗначений;
    ИмяОбласти = "Документ_1"; // Должно совпадать с тем, что задали в ТабДок.Имя
    ОбластиОбъектов.Добавить(Объект.Ссылка, ИмяОбласти);
    
    // 4. Вызываем стандартное окно предпросмотра
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
КонецПроцедуры

Использование стандартных методов БСП (Рекомендуемый способ)

Чтобы не вычислять высоту таблицы вручную и не заниматься склеиванием строк для имен областей, в БСП предусмотрен специальный метод ЗадатьОбластьПечатиДокумента. Рассмотрим, как интегрировать его в процесс формирования макета. Это наиболее правильный путь с точки зрения поддержки конфигурации.

В серверном модуле при обходе выборки документов используем следующий подход:


Пока Выборка.Следующий() Цикл
    НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
    
    // ... здесь идет вывод секций макета (Шапка, Строки, Подвал) ...
    // ТабличныйДокумент.Вывести(ОбластьШапка);
    
    // Автоматизируем разметку для БСП
    УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, 
        НомерСтрокиНачало, ОбъектыПечати, Выборка.Ссылка);
КонецЦикла;

Этот метод самостоятельно выполняет несколько важных действий:

  1. Генерирует уникальное имя области (например, Документ_1, Документ_2).
  2. Добавляет в переданный список значений ОбъектыПечати связь между ссылкой и именем.
  3. Устанавливает свойство Имя для соответствующего диапазона строк в ТабличныйДокумент.
  4. Корректно обрабатывает картинки, подписи и печати, если они используются в документе.

Важные замечания по формату .xls

Проанализируем еще один нюанс. Формат Excel 97-2003 (.xls) имеет жесткие ограничения на имена областей. Если вы задаете имя области вручную, помните:

Именно поэтому стандартный префикс "Документ_" в методах БСП является наиболее безопасным выбором. Если вы нарушите правила именования, табличный документ может отобразиться корректно, но при попытке экспорта в .xls через диалог БСП возникнет исключение на уровне платформенного движка сохранения.

Подведем итог: для исправления ошибки сохранения в Excel через «Еще» всегда проверяйте, чтобы в ТабличномДокументе была создана именованная область, а в СписокЗначений, передаваемый в процедуру печати, было добавлено строковое имя этой области в качестве представления ссылки. Соблюдение этих правил гарантирует стабильную работу всех сервисных функций БСП, включая отправку печатных форм по почте и их массовое сохранение.

← На главную