Разработка внешних печатных форм — одна из самых частых задач для программиста 1С, использующего Библиотеку стандартных подсистем (БСП). Однако довольно часто после загрузки файла обработки в справочник «Дополнительные отчеты и обработки» пользователь видит досадное сообщение: «Печатная форма недоступна». Давайте вместе разберемся, почему это происходит и как исправить код, чтобы форма работала стабильно.
Ошибка «Печатная форма недоступна» чаще всего сигнализирует о том, что механизм печати 1С не смог корректно инициализировать вызов вашей обработки. Основные причины можно разделить на три группы:
Печать типовой механизм всегда передает МассивОбъектов. Если код написан в расчете на одну ссылку (как это часто бывает при отладке «внутри» файла), при подключении в базу возникает конфликт контекстов.СведенияОВнешнейОбработке указан один идентификатор команды, а в процедуре Печать при заполнении коллекции используется другой, система не найдет нужный макет.Самая распространенная ошибка — использование одиночной ссылки там, где ожидается массив. Даже если вы печатаете один документ, 1С передает массив. Рассмотрим, как правильно адаптировать код.
Если в вашем модуле используется переменная СсылкаНаОбъект для обращения к документу, вы получите ошибку, так как при вызове из формы система передает МассивОбъектов. Чтобы исправить это, необходимо извлечь первый элемент массива:
// Вместо обращения к СсылкаНаОбъект напрямую:
// Запрос.УстановитьПараметр("ТекущийДокумент", СсылкаНаОбъект);
// Используем первый элемент массива:
Запрос.УстановитьПараметр("ТекущийДокумент", МассивОбъектов[0]);
Проверьте весь код в модуле обработки. Если вы находите там СсылкаНаОбъект, обязательно замените её на МассивОбъектов[0] во всех обращениях к данным объекта.
Чтобы система знала, что именно вызывать, функция СведенияОВнешнейОбработке должна содержать точную структуру данных. Рассмотрим пример правильной регистрации, который минимизирует ошибки:
Функция СведенияОВнешнейОбработке Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Наименование", "Счет на оплату с номером");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.СчетНаОплатуПокупателю");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Счет на оплату с номером",
"СчетНаОплатуПокупателюСНомером",
"ВызовСерверногоМетода",
Истина,
"ПечатьMXL");
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание на параметр Идентификатор («СчетНаОплатуПокупателюСНомером»). Именно эта строка должна фигурировать в процедуре Печать при вызове УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию.
В самой процедуре Печать убедитесь, что имя команды совпадает с тем, что вы зарегистрировали ранее. Если идентификаторы различаются хотя бы на один символ, 1С вернет ошибку доступности, так как не сможет сопоставить запрос пользователя с доступными макетами обработки.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетНаОплатуПокупателюСНомером") Тогда
// Формируем табличный документ
ТабДок = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
// Выводим в коллекцию
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СчетНаОплатуПокупателюСНомером",
"Счет на оплату с номером",
ТабДок);
КонецЕсли;
КонецПроцедуры
ПараметрыРегистрации.БезопасныйРежим = Ложь) — хороший способ проверить, является ли проблема следствием ограничений БСП, но помните, что для финального релиза лучше настроить права правильно, оставив безопасный режим включенным.Следуя этим шагам, вы сможете не только исправить ошибку «Печатная форма недоступна», но и сделать ваши внешние печатные формы более надежными и соответствующими стандартам БСП.