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

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

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

Разбираем архитектуру БСП и экспортные методы

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

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

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Назначение.Добавить("Документ.ТребованиеНакладная");
    ПараметрыРегистрации.Наименование = "Моя внешняя печатная форма";
    ПараметрыРегистрации.Идентификатор = "ВПФ_ТребованиеНакладная";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Печать Требования-накладной (спец. формат)";
    НоваяКоманда.Идентификатор = "СпецФормат"; // Этот ID важен для процедуры Печать
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
КонецФункции

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

Анализируем процедуру «Печать»

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


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Проверяем наличие нашей команды в коллекции
    ПараметрыПечати = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СпецФормат");
    Если ПараметрыПечати <> Неопределено Тогда
        ПараметрыПечати.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
        ПараметрыПечати.СинонимМакета = "Спец. формат печати";
    КонецЕсли;
КонецПроцедуры

Если вы пропустите хотя бы один параметр, например ПараметрыВывода, или не добавите слово Экспорт, механизм БСП не сможет вызвать этот метод, и пользователь увидит сообщение о недоступности. Проанализируем ситуацию: в семерке мы привыкли к прямому вызову макета, здесь же мы работаем с коллекциями, которые система передает "снаружи".

Почему запросы лучше перебора строк (оптимизация)

В процессе обучения многие начинающие разработчики задаются вопросом: зачем использовать сложные объекты Запрос, если можно просто перебрать табличную часть документа через Для Каждого Строка Из ТЧ? Рассмотрим подробнее, почему подход 1С 7.7 здесь считается плохим тоном.

Во-первых, это производительность. Когда вы обращаетесь к данным через точку, например СтрокаТЧ.Номенклатура.Наименование, система выполняет отдельный неявный запрос к базе данных для каждого обращения. Если в документе 100 строк, а вы печатаете 10 документов сразу (групповая печать), общее количество обращений к БД может исчисляться тысячами. Запрос же получает все необходимые данные одним пакетом.

Во-вторых, это работа с типами данных. С помощью запроса мы можем сразу получить значения свойств, итогов и связанных реквизитов, не нагружая оперативную память сервера созданием тяжелых объектов типа ДокументОбъект.

Посмотрим на пример правильного получения данных для печати:


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

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
РезультатЗапроса = Запрос.Выполнить();

Безопасный режим и отладка

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

Выясним, как проверить влияние этого режима:

  1. Зайдите в раздел Администрирование — Печатные формы, отчеты и обработки.
  2. Найдите вашу обработку в списке «Дополнительные отчеты и обработки».
  3. В карточке обработки проверьте состояние переключателя «Режим выполнения». Попробуйте установить его в значение «Небезопасный» и проверьте работоспособность.

Для эффективной отладки ВПФ (чтобы не перезагружать файл в базу после каждой правки) профессионалы используют «заглушки». Создайте в обработке обычную экранную форму, добавьте на нее кнопку и в коде кнопки вызовите процедуру Печать, передав в нее ссылку на любой документ из вашей базы. Это позволит вам использовать точку останова и клавишу F11, чтобы пошагово пройти по коду и увидеть, где именно возникает ошибка.

Подводим итоги

Для успешного запуска внешней печатной формы в 1С 8.3 необходимо:

Переходный возраст между 7.7 и 8.3 — это время открытий. Несмотря на кажущуюся сложность, механизмы БСП предоставляют колоссальные возможности для автоматизации, которые в старых версиях платформы требовали написания сотен строк кода вручную.

← На главную