Почему во внешней обработке 1С возникает ошибка «Печатная форма недоступна» и как ее исправить

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

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

Причина 1: Несоответствие идентификаторов

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

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


ДобавитьКоманду(ТаблицаКоманд,
    "Дополнительное соглашение индексация заработка",
    "Дополнительное соглашение индексация заработка",
    "ВызовСерверногоМетода",
    Истина,
    "ПечатьMXL");

А в процедуре Печать мы проверяем условие:


Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Дополнительное соглашение индексация заработка") Тогда
    // Формирование документа
КонецЕсли;

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

Причина 2: Критическая ошибка в запросе (Типы данных)

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


| ГДЕ
| Сотрудники.Ссылка В(&МассивОбъектов)

В методе СведенияОВнешнейОбработке указано назначение: Документ.ИндексацияЗаработка. Это значит, что в МассивОбъектов придут ссылки именно на этот тип документа. Однако в тексте запроса автор обращается к таблицам другого документа — Документ.ИзменениеПлановыхНачислений.Сотрудники. Поскольку ссылка одного типа документа никогда не будет найдена в таблице другого, запрос всегда будет пустым. Коллекция печатных форм не заполнится, и система выдаст сообщение о недоступности.

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

Причина 3: Логическая ловушка при проверке данных

Проанализируем фрагмент кода, отвечающий за вывод данных. Иногда программисты случайно инвертируют логику проверки существования записей. Посмотрим на этот участок:


СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка);
ВыборкаПоДокументам.Сбросить();
Если ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска) Тогда
    Текст = "В документе отсутствуют сотрудники...";
    // ... Сообщить пользователю
    Продолжить; // ПЕРЕХОД К СЛЕДУЮЩЕМУ ДОКУМЕНТУ, ПЕЧАТЬ ПРЕРВАНА
КонецЕсли;

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

Причина 4: Безопасный режим и привилегии

При регистрации внешней обработки часто устанавливается параметр:

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

Рассмотрим, как это влияет на результат. В безопасном режиме:

  1. Запрещены вызовы некоторых методов общих модулей, работающих с COM-объектами или внешними компонентами (например, компоненты склонения ФИО).
  2. Игнорируется УстановитьПривилегированныйРежим(Истина). Если у пользователя нет прямых прав на чтение регистров сведений (например, паспортных данных или адресов), запрос вернет NULL или пустые значения.

Если ваша печатная форма использует сложные кадровые данные или функции склонения, попробуйте временно установить БезопасныйРежим = Ложь и проверить работоспособность.

Как провести эффективную отладку

Для того чтобы выяснить точную причину «недоступности», пройдем по шагам процесса отладки:

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

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

← На главную