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

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

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

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

Выясним причины неполадок пошагово и разберем правильные варианты написания кода.

 

Решение проблемы 1. Ошибка метода Заполнить() и некорректная передача параметров

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


{ВнешняяОбработка.СчетНаОплатуСПечатьюАльянс.МодульОбъекта(361)}: Ошибка при вызове метода контекста (Заполнить)
            ОбластьМакета.Параметры.Заполнить("АдресОрганизацииШапка");
по причине:
Несоответствие типов (параметр номер '1')

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

В качестве первого параметра метода Заполнить() допускается передавать:

  1. Структуру или Соответствие (где ключи совпадают с именами параметров в ячейках макета).
  2. Строку таблицы значений.
  3. Выборку из результата запроса.
  4. Прикладной объект (например, ДокументОбъект или СправочникОбъект).

Если передать в этот метод обычную строку или число (например, просто переменную с адресом или названием организации), платформа выдаст исключение о несоответствии типа параметра.

Рассмотрим правильные подходы к заполнению параметров макета.

 

Способ А. Пакетное заполнение через Структуру (рекомендуется)

Если в макете определено много параметров, наиболее лаконичным решением будет создание специальной структуры в коде программы. Ключи этой структуры должны в точности совпадать с именами параметров, которые вы прописали в свойствах ячеек макета (в свойствах ячейки должно быть выбрано заполнение «Параметр»).

Посмотрим на пример правильной реализации:


// 1. Получаем нужную область макета
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");

// 2. Создаем структуру для заполнения параметров
ДанныеПечати = Новый Структура;
ДанныеПечати.Вставить("АдресОрганизации", СведенияОПолучателе.ЮридическийАдрес);
ДанныеПечати.Вставить("НазваниеОрганизации", СведенияОПолучателе.ПолноеНаименование);

// 3. Пакетно заполняем параметры области
ОбластьМакета.Параметры.Заполнить(ДанныеПечати);

// 4. Выводим заполненную область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);

При таком подходе платформа сама найдет в макете параметры АдресОрганизации и НазваниеОрганизации и подставит туда соответствующие текстовые значения из структуры.

 

Способ Б. Прямое обращение к параметрам области

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


// ВНИМАНИЕ: Код ниже приведет к ошибке!
ОбластьМакета.НазваниеОрганизации = НазваниеОрганизации; // Ошибка!
ОбластьМакета.ТабличныйДокумент = НазваниеОрганизации; // Ошибка!

Запомните правило: обращаться к параметрам макета необходимо строго через свойство Параметры объекта ОбластьМакета. Правильный код прямого присвоения выглядит следующим образом:


ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");

// Обращаемся к параметрам напрямую через точку от свойства "Параметры"
ОбластьМакета.Параметры.АдресОрганизации  = СведенияОПолучателе.ЮридическийАдрес;
ОбластьМакета.Параметры.НазваниеОрганизации = СведенияОПолучателе.ПолноеНаименование;

ТабличныйДокумент.Вывести(ОбластьМакета);

Этот вариант работает быстрее, код легко читается и не требует выделения дополнительной памяти под создание объектов структуры.

 

Решение проблемы 2. Ошибка «Поле не найдено "СчетНаОплату.ЗаРуководителяПоПриказу"»

При обновлении типовых конфигураций (например, «Бухгалтерия предприятия» редакции 3.0) старые внешние печатные формы могут перестать работать, выдавая ошибку при выполнении пакета запросов:


{ВнешняяОбработка.СчетНаОплатуСПечатьюАльянс.МодульОбъекта(73)}: Ошибка при вызове метода контекста (ВыполнитьПакет)
    РезультатЗапроса = Запрос.ВыполнитьПакет();
по причине:
{(46, 17)}: Поле не найдено "СчетНаОплату.ЗаРуководителяПоПриказу"
СчетНаОплату.<<?>>ЗаРуководителяПоПриказу КАК ЗаРуководителяПоПриказу,

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

В ходе модернизации БСП и типовых решений разработчики фирмы «1С» перевели механизм подписей на новый справочник «Основания на право подписи документов». В результате реквизиты-строки были безвозвратно удалены из метаданных документов. На их месте появились новые реквизиты ссылочного типа:

Поскольку старых реквизитов больше нет в структуре базы данных, СУБД возвращает ошибку при попытке выполнить старый SQL-запрос.

 

Как исправить запрос в модуле объекта печатной формы:

Рассмотрим по шагам процесс исправления запроса внешней печатной формы:

  1. Откроем модуль внешней обработки в конфигураторе.
  2. Найдем текст запроса (обычно он расположен в функции печати).
  3. Заменим устаревшие поля на актуальные реквизиты. Например:

Было в запросе:


Выбрать
    СчетНаОплату.ЗаРуководителяПоПриказу КАК ЗаРуководителяПоПриказу,
    СчетНаОплату.ЗаГлавногоБухгалтераПоПриказу КАК ЗаГлавногоБухгалтераПоПриказу
Из
    Документ.СчетНаОплатуПокупателю КАК СчетНаОплату

Стало в запросе после исправления:


Выбрать
    СчетНаОплату.ЗаРуководителяНаОсновании КАК ЗаРуководителяНаОсновании,
    СчетНаОплату.ЗаГлавногоБухгалтераНаОсновании КАК ЗаГлавногоБухгалтераНаОсновании
Из
    Документ.СчетНаОплатуПокупателю КАК СчетНаОплату

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

 

Особенности отладки внешних печатных форм (ВПФ) на БСП

Начинающие разработчики часто задаются вопросом: «Как отлаживать внешнюю печатную форму, если значения параметров не заполняются или при выводе возникают ошибки?»

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

Рассмотрим эффективную методику отладки:

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

 

Архитектурная рекомендация: Избегайте жесткого кодирования (хардкода)

Проанализируем фрагмент кода из темы форума:


Если СведенияОПолучателе.ИНН="7715990969" Тогда
    ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");
...

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

Как сделать правильно:

← На главную