Как исправить ошибку печати "Недопустимое значение параметра" для документа в расширении 1С?

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

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

Проанализируем, почему возникает эта ошибка и как ее исправить по шагам.

Анализ исходного кода и постановка проблемы

Представим, что мы создали в расширении Расш2 новый документ Документ1 и добавили для него команду печати. Код обработчика команды на клиенте выглядит стандартно:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ВыбратьНужныйМакет = "Макет";
    УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
        "Документ.Расш2_Документ1", 
        ВыбратьНужныйМакет, 
        ПараметрКоманды, 
        ПараметрыВыполненияКоманды, 
        Неопределено
    );
КонецПроцедуры

На сервере, в модуле менеджера документа, также реализована экспортная процедура Печать:


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

При нажатии на кнопку печати система выдает ошибку:

при вызове метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати. Ожидалось: Массив, ЛюбаяСсылка.

Самое запутанное здесь то, что отладчик показывает: параметр ПараметрКоманды (третий по счету) содержит корректную ссылку на объект документа, что полностью соответствует ожидаемому типу ЛюбаяСсылка. Это наводит на мысль, что проблема не в передаваемых данных, а в том, как система их обрабатывает внутри себя.

Шаг 1: Глубокая отладка — ключ к разгадке

Когда текст ошибки противоречит данным в отладчике, единственно верный путь — это отладка с заходом внутрь вызываемых процедур. В нашем случае необходимо зайти внутрь метода УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.

  1. Установите точку останова на строке вызова этой процедуры.
  2. Запустите отладку и, когда исполнение остановится, нажмите клавишу F11 (Зайти в процедуру/функцию).
  3. Продолжайте пошаговую отладку (F10), внимательно следя за значениями переменных.

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

ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВладелецФормы, ...);

Анализ структуры ПараметрыОткрытия показывает корень проблемы. В этой структуре есть ключ ИмяМенеджераПечати. Для объектов основной конфигурации его значением является строка (например, "Документ.НакладныеРеализаций"). Однако для нашего документа из расширения в этом поле оказывается не строка, а ссылка на сам документ (ДокументСсылка.Расш2_Документ1).

Вывод: Механизм БСП не смог по строковому имени "Документ.Расш2_Документ1" найти соответствующий менеджер печати. Из-за этой неудачи он некорректно сформировал параметры для формы печати, что и привело к ошибке несоответствия типов на более позднем этапе.

Шаг 2: Поиск истинной причины — проблема с идентификацией объекта расширения

Итак, мы выяснили, что система "не видит" менеджер печати нашего нового документа. Это типичная проблема при добавлении объектов в расширения, которые должны взаимодействовать с подсистемами из БСП. Чтобы БСП корректно работала с новыми объектами, они должны быть правильно зарегистрированы в ее механизмах.

Подсистема печати для поиска информации об объектах метаданных использует специальные справочники:

Если информация о нашем документе Расш2_Документ1 отсутствует или некорректна в справочнике ИдентификаторыОбъектовРасширений, то БСП не сможет сопоставить строку "Документ.Расш2_Документ1" с реальным объектом метаданных.

Шаг 3: Правильное решение — регистрация объекта в БСП

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

Порядок действий:

  1. Создайте в расширении переопределяемый модуль. Если его еще нет, добавьте в расширение общий модуль с именем УправлениеПечатьюПереопределяемый. Убедитесь, что у него установлены флаги "Клиент (управляемое приложение)", "Сервер" и "Вызов сервера".

  2. Создайте в этом модуле процедуру ПриОпределенииОбъектовСКомандамиПечати. Эта процедура вызывается БСП для сбора сведений обо всех объектах, у которых есть печатные формы.

  3. Добавьте в процедуру код для регистрации вашего документа.

    
    // В модуле УправлениеПечатьюПереопределяемый
    Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
    
        // Описываем наш новый документ из расширения
        НовыйОбъектПечати = СписокОбъектов.Добавить();
        
        // Указываем полное имя объекта метаданных. 
        // Формат: ТипОбъекта.ИмяРасширения_ИмяОбъекта
        НовыйОбъектПечати.Имя = "Документ.Расш2_Документ1";
        
        // Указываем его же в качестве менеджера печати
        НовыйОбъектПечати.МенеджерПечати = "Документ.Расш2_Документ1"; 
        
        // Задаем понятное пользователю представление
        НовыйОбъектПечати.Представление = "Новый документ 1";
    
    КонецПроцедуры
    

После добавления этого кода подсистема печати при инициализации вызовет эту процедуру, получит информацию о вашем документе и корректно запишет ее в свои служебные регистры. После этого вызов УправлениеПечатьюКлиент.ВыполнитьКомандуПечати будет работать без ошибок.

Итоговый план действий и рекомендации

Если вы столкнулись с ошибкой "Недопустимое значение параметра" при печати из расширения, выполните следующие шаги:

  1. Проверьте полное имя объекта. Убедитесь, что в первом параметре метода ВыполнитьКомандуПечати указано корректное полное имя: "Тип.ИмяРасширения_ИмяОбъекта".
  2. Используйте отладчик. Всегда заходите внутрь функций БСП, чтобы увидеть, на каком именно этапе происходит сбой и искажение данных.
  3. Зарегистрируйте объект в БСП. Используйте модуль УправлениеПечатьюПереопределяемый и процедуру ПриОпределенииОбъектовСКомандамиПечати для явного указания системе, что у вашего объекта есть команды печати. Это наиболее надежный метод.
  4. Обновите конфигурацию базы данных. После внесения изменений в расширение не забудьте обновить конфигурацию БД, чтобы все изменения вступили в силу.
  5. Очистите кэш. В некоторых случаях проблемы могут быть связаны с закэшированными метаданными. Очистка кэша может помочь решить "плавающие" ошибки.

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

← На главную