При разработке и обновлении внешних печатных форм (ВПФ) программисты часто сталкиваются с неочевидным поведением платформы. В этой статье мы подробно разберем две популярные проблемы: почему возникает ошибка «Несоответствие типов (параметр номер '1')» при попытке вывести данные в табличный документ, а также по какой причине ломаются старые запросы печатных форм с ошибкой «Поле не найдено "СчетНаОплату.ЗаРуководителяПоПриказу"».
Мы проанализируем причины возникновения этих ошибок, рассмотрим правильный синтаксис работы с параметрами областей макета и разберем архитектурные стандарты разработки печатных форм в системе «1С:Предприятие».
Выясним причины неполадок пошагово и разберем правильные варианты написания кода.
Рассмотрим ситуацию, когда при выводе области макета в табличный документ система аварийно завершает работу со следующим сообщением:
{ВнешняяОбработка.СчетНаОплатуСПечатьюАльянс.МодульОбъекта(361)}: Ошибка при вызове метода контекста (Заполнить)
ОбластьМакета.Параметры.Заполнить("АдресОрганизацииШапка");
по причине:
Несоответствие типов (параметр номер '1')
Выясним, почему это происходит. Метод Заполнить() коллекции ПараметрыМакетаТабличногоДокумента предназначен исключительно для группового заполнения параметров. Платформа ожидает, что в этот метод будет передан сложный объект-контейнер, свойства которого система автоматически сопоставит с именами параметров, объявленных в макете.
В качестве первого параметра метода Заполнить() допускается передавать:
ДокументОбъект или СправочникОбъект).Если передать в этот метод обычную строку или число (например, просто переменную с адресом или названием организации), платформа выдаст исключение о несоответствии типа параметра.
Рассмотрим правильные подходы к заполнению параметров макета.
Если в макете определено много параметров, наиболее лаконичным решением будет создание специальной структуры в коде программы. Ключи этой структуры должны в точности совпадать с именами параметров, которые вы прописали в свойствах ячеек макета (в свойствах ячейки должно быть выбрано заполнение «Параметр»).
Посмотрим на пример правильной реализации:
// 1. Получаем нужную область макета
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");
// 2. Создаем структуру для заполнения параметров
ДанныеПечати = Новый Структура;
ДанныеПечати.Вставить("АдресОрганизации", СведенияОПолучателе.ЮридическийАдрес);
ДанныеПечати.Вставить("НазваниеОрганизации", СведенияОПолучателе.ПолноеНаименование);
// 3. Пакетно заполняем параметры области
ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
// 4. Выводим заполненную область в итоговый табличный документ
ТабличныйДокумент.Вывести(ОбластьМакета);
При таком подходе платформа сама найдет в макете параметры АдресОрганизации и НазваниеОрганизации и подставит туда соответствующие текстовые значения из структуры.
Если параметров в выводимой области немного, создавать структуру избыточно. Гораздо проще и нагляднее заполнить параметры напрямую. Проанализируем типичную ошибку начинающих разработчиков, которые пытаются присвоить значения самой области или вызывают несуществующие свойства:
// ВНИМАНИЕ: Код ниже приведет к ошибке!
ОбластьМакета.НазваниеОрганизации = НазваниеОрганизации; // Ошибка!
ОбластьМакета.ТабличныйДокумент = НазваниеОрганизации; // Ошибка!
Запомните правило: обращаться к параметрам макета необходимо строго через свойство Параметры объекта ОбластьМакета. Правильный код прямого присвоения выглядит следующим образом:
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");
// Обращаемся к параметрам напрямую через точку от свойства "Параметры"
ОбластьМакета.Параметры.АдресОрганизации = СведенияОПолучателе.ЮридическийАдрес;
ОбластьМакета.Параметры.НазваниеОрганизации = СведенияОПолучателе.ПолноеНаименование;
ТабличныйДокумент.Вывести(ОбластьМакета);
Этот вариант работает быстрее, код легко читается и не требует выделения дополнительной памяти под создание объектов структуры.
При обновлении типовых конфигураций (например, «Бухгалтерия предприятия» редакции 3.0) старые внешние печатные формы могут перестать работать, выдавая ошибку при выполнении пакета запросов:
{ВнешняяОбработка.СчетНаОплатуСПечатьюАльянс.МодульОбъекта(73)}: Ошибка при вызове метода контекста (ВыполнитьПакет)
РезультатЗапроса = Запрос.ВыполнитьПакет();
по причине:
{(46, 17)}: Поле не найдено "СчетНаОплату.ЗаРуководителяПоПриказу"
СчетНаОплату.<<?>>ЗаРуководителяПоПриказу КАК ЗаРуководителяПоПриказу,
Разберем причину сбоя. В старых релизах конфигураций текстовые представления документов, на основании которых подписывались счета, хранились в реквизитах самого документа (имели тип Строка). Это были реквизиты ЗаРуководителяПоПриказу и ЗаГлавногоБухгалтераПоПриказу.
В ходе модернизации БСП и типовых решений разработчики фирмы «1С» перевели механизм подписей на новый справочник «Основания на право подписи документов». В результате реквизиты-строки были безвозвратно удалены из метаданных документов. На их месте появились новые реквизиты ссылочного типа:
ЗаРуководителяНаОснованииЗаГлавногоБухгалтераНаОснованииПоскольку старых реквизитов больше нет в структуре базы данных, СУБД возвращает ошибку при попытке выполнить старый SQL-запрос.
Рассмотрим по шагам процесс исправления запроса внешней печатной формы:
Было в запросе:
Выбрать
СчетНаОплату.ЗаРуководителяПоПриказу КАК ЗаРуководителяПоПриказу,
СчетНаОплату.ЗаГлавногоБухгалтераПоПриказу КАК ЗаГлавногоБухгалтераПоПриказу
Из
Документ.СчетНаОплатуПокупателю КАК СчетНаОплату
Стало в запросе после исправления:
Выбрать
СчетНаОплату.ЗаРуководителяНаОсновании КАК ЗаРуководителяНаОсновании,
СчетНаОплату.ЗаГлавногоБухгалтераНаОсновании КАК ЗаГлавногоБухгалтераНаОсновании
Из
Документ.СчетНаОплатуПокупателю КАК СчетНаОплату
После корректировки запроса убедитесь, что в коде вывода параметров также произошли изменения. Поскольку теперь эти поля возвращают ссылку на элемент справочника «Основания на право подписи документов», вам может потребоваться получить текстовое представление подписи (например, через обращение к реквизиту Основание этой ссылки или с помощью стандартных функций БСП).
Начинающие разработчики часто задаются вопросом: «Как отлаживать внешнюю печатную форму, если значения параметров не заполняются или при выводе возникают ошибки?»
Дело в том, что печатные формы, разработанные для работы в составе механизма дополнительных отчетов и обработок БСП, не имеют привычной экранной формы для запуска. Вся логика формирования документа находится в модуле объекта внутри экспортной процедуры Печать().
Рассмотрим эффективную методику отладки:
Файл -> Открыть в режиме «1С:Предприятие» и полноценно пошагово отлаживать код.-debug). Без этого ключа точки останова в коде ВПФ (который всегда выполняется в контексте сервера) срабатывать не будут.
Проанализируем фрагмент кода из темы форума:
Если СведенияОПолучателе.ИНН="7715990969" Тогда
ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЭконотел");
...
Прописывание конкретных ИНН и названий организаций в программном коде — это грубая архитектурная ошибка. Печатная форма становится негибкой: при изменении реквизитов организации, смене ИНН или добавлении нового юридического лица вам придется снова открывать конфигуратор и переписывать код.
Как сделать правильно:
Организации уже предусмотрены реквизиты для хранения картинок логотипов в присоединенных файлах. Вы можете динамически получать картинку нужной организации прямо в коде печати без привязки к текстовым ИНН.