При разработке внешних печатных форм в конфигурациях, использующих Библиотеку стандартных подсистем (БСП), например, 1С:Зарплата и Управление Персоналом, разработчики часто сталкиваются с невыразительной диагностикой ошибок. Одна из таких ситуаций — появление системного сообщения «Не указано место хранения получаемого файла». Ошибка возникает внезапно, часто на конкретных документах, тогда как на других аналогичных объектах все работает корректно. Рассмотрим подробнее, почему это происходит и как найти «виновника» в программном коде или макете.
Для начала проанализируем, в какой момент возникает эта ошибка. В современных конфигурациях печать офисных документов (Microsoft Word или OpenOffice) реализуется через общий модуль УправлениеПечатью. Процесс формирования файла выглядит следующим образом:
УправлениеПечатью.СформироватьДокумент, который упаковывает все присоединенные области в итоговый файл и помещает его во временное хранилище.Ошибка «Не указано место хранения получаемого файла» сигнализирует о том, что на финальном этапе формирования документа система обнаружила, что ей нечего сохранять. Если в структуру документа не было добавлено ни одной области, БСП не может создать файл, что и приводит к прерыванию выполнения.
Разберем наиболее распространенную ситуацию, упомянутую в обсуждении. Если алгоритм формирования печатной формы опирается на запрос, который по какой-то причине не вернул строк для конкретного документа, цикл вывода областей просто не запустится.
Проанализируем пример запроса, который может привести к такой проблеме:
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.Дата КАК Дата
|ИЗ
| Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Ссылка В(&МассивОбъектов)
| И (НЕ ВЫРАЗИТЬ(Сотрудники.Ссылка КАК Документ.РаботаВВыходныеИПраздничныеДни).ВремяВЧасах
| И НЕ Сотрудники.НеРаботал
| ИЛИ ВЫРАЗИТЬ(Сотрудники.Ссылка КАК Документ.РаботаВВыходныеИПраздничныеДни).ВремяВЧасах
| И Сотрудники.ОтработаноЧасов > 0)";
В данном коде используется сложная фильтрация в секции ГДЕ. Если в документе заполнены сотрудники, но ни один из них не удовлетворяет условиям (например, у всех стоит признак «Не работал» или не заполнено время), запрос вернет пустой результат. Программа пропустит цикл Пока Выборка.Следующий(), ни одна область макета не будет выведена методом УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры, и при вызове СформироватьДокумент мы получим обсуждаемую ошибку.
Иногда проблема кроется не в данных, а в самом шаблоне .docx или .odt. Система БСП ищет в файле специальные теги вида {v8 Область.ИмяОбласти}. Если парсер не может найти указанную в коде область, она не будет добавлена в документ.
Выясним основные причины «невидимости» областей:
{v8 Область.Шапка} находится внутри ячейки таблицы, а закрывающий — за её пределами, структура документа нарушается. Проверьте, чтобы теги областей не разрывали логические блоки офисного документа.Область и ИмяОбласти) могут появиться невидимые спецсимволы, разрывы строк или лишние пробелы. Визуально тег выглядит правильно, но программно он не распознается.Рассмотрим фрагмент кода, где выполняется заполнение параметров. Важно убедиться, что логика программы гарантированно заходит в методы формирования хотя бы один раз. Посмотрим на пример правильной последовательности действий в процедуре Печать:
// Инициализируем печатную форму
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Уведомление");
ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
// Получаем макет и инициализируем его
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, Неопределено);
ПечатнаяФормаДокумента = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Макет.НастройкиСтраницыМакета, Макет);
// ВЫВОД ДАННЫХ (Критический участок)
Данные = Новый Структура("Дата", ТекущаяДата());
Область = УправлениеПечатью.ОбластьМакета(Макет, "Заголовок");
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, Данные);
// Формирование итогового файла
АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаДокумента);
Если условие, перед которым стоит УправлениеПечатью.ОбластьМакета, не выполняется, то переменная ПечатнаяФормаДокумента останется «пустой». Всегда проверяйте количество итераций в циклах обработки данных.
Для эффективного поиска причины ошибки рекомендуем выполнить следующие шаги:
АдресХранилища = УправлениеПечатью.СформироватьДокумент(...). Перед выполнением этой строки изучите содержимое объекта ПечатнаяФормаДокумента. Если дерево описания документа пустое — проблема в логике заполнения или в выборке данных.v8.Подводя итог, можно сказать, что ошибка «Не указано место хранения получаемого файла» — это лишь симптом того, что в итоговый офисный документ не попало ни одного байта информации. Внимательный анализ условий в запросах и структуры макета позволяет решить эту проблему в кратчайшие сроки.