Как исправить ошибку «Не указано место хранения получаемого файла» при печати в 1С

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

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

Суть проблемы и механизм работы БСП

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

  1. Инициализируется макет на основе двоичных данных.
  2. Создается пустая структура будущей печатной формы.
  3. В цикле происходит обход данных и «присоединение» областей макета с заполнением параметров.
  4. В финале вызывается метод УправлениеПечатью.СформироватьДокумент, который упаковывает все присоединенные области в итоговый файл и помещает его во временное хранилище.

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

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

Разберем наиболее распространенную ситуацию, упомянутую в обсуждении. Если алгоритм формирования печатной формы опирается на запрос, который по какой-то причине не вернул строк для конкретного документа, цикл вывода областей просто не запустится.

Проанализируем пример запроса, который может привести к такой проблеме:


Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Сотрудник КАК Сотрудник,
| Сотрудники.Дата КАК Дата
|ИЗ
| Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Ссылка В(&МассивОбъектов)
| И (НЕ ВЫРАЗИТЬ(Сотрудники.Ссылка КАК Документ.РаботаВВыходныеИПраздничныеДни).ВремяВЧасах
| И НЕ Сотрудники.НеРаботал
| ИЛИ ВЫРАЗИТЬ(Сотрудники.Ссылка КАК Документ.РаботаВВыходныеИПраздничныеДни).ВремяВЧасах
| И Сотрудники.ОтработаноЧасов > 0)";

В данном коде используется сложная фильтрация в секции ГДЕ. Если в документе заполнены сотрудники, но ни один из них не удовлетворяет условиям (например, у всех стоит признак «Не работал» или не заполнено время), запрос вернет пустой результат. Программа пропустит цикл Пока Выборка.Следующий(), ни одна область макета не будет выведена методом УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры, и при вызове СформироватьДокумент мы получим обсуждаемую ошибку.

Причина 2: Ошибки в разметке офисного макета

Иногда проблема кроется не в данных, а в самом шаблоне .docx или .odt. Система БСП ищет в файле специальные теги вида {v8 Область.ИмяОбласти}. Если парсер не может найти указанную в коде область, она не будет добавлена в документ.

Выясним основные причины «невидимости» областей:

Причина 3: Ошибки в программном коде вывода

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


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

// Получаем макет и инициализируем его
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(ДвоичныеДанныеМакета, Неопределено);
ПечатнаяФормаДокумента = УправлениеПечатью.ИнициализироватьПечатнуюФорму(Неопределено, Макет.НастройкиСтраницыМакета, Макет);

// ВЫВОД ДАННЫХ (Критический участок)
Данные = Новый Структура("Дата", ТекущаяДата());
Область = УправлениеПечатью.ОбластьМакета(Макет, "Заголовок");
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФормаДокумента, Область, Данные);

// Формирование итогового файла
АдресХранилища = УправлениеПечатью.СформироватьДокумент(ПечатнаяФормаДокумента);

Если условие, перед которым стоит УправлениеПечатью.ОбластьМакета, не выполняется, то переменная ПечатнаяФормаДокумента останется «пустой». Всегда проверяйте количество итераций в циклах обработки данных.

Рекомендации по отладке

Для эффективного поиска причины ошибки рекомендуем выполнить следующие шаги:

  1. Использование точки останова: Установите точку останова на строке АдресХранилища = УправлениеПечатью.СформироватьДокумент(...). Перед выполнением этой строки изучите содержимое объекта ПечатнаяФормаДокумента. Если дерево описания документа пустое — проблема в логике заполнения или в выборке данных.
  2. Проверка запроса: Скопируйте запрос из кода в консоль запросов и выполните его для того документа, на котором возникает ошибка. Если результат пуст — корректируйте условия запроса.
  3. Проверка макета: Попробуйте временно упростить макет. Удалите все сложные области и оставьте только одну простую область с одним параметром. Если ошибка исчезла — проблема была в синтаксисе тегов v8.
  4. Анализ прав доступа: В редких случаях ошибка может возникать на стороне сервера, если у пользователя, под которым запущен сервер 1С, нет прав на запись во временные папки операционной системы.

Подводя итог, можно сказать, что ошибка «Не указано место хранения получаемого файла» — это лишь симптом того, что в итоговый офисный документ не попало ни одного байта информации. Внимательный анализ условий в запросах и структуры макета позволяет решить эту проблему в кратчайшие сроки.

← На главную