Почему возникает ошибка «Несоответствие типов (параметр номер '1')» при вызове СкомпоноватьРезультат и как её исправить?

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

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

Причина возникновения ошибки

Ошибка связанна с тем, что в 1С:Предприятие существуют два одноименных метода СкомпоноватьРезультат, но вызваны они могут быть в разных контекстах и имеют принципиально разные параметры:

  1. Метод формы отчета (контекст формы): синтаксис данного метода выглядит как СкомпоноватьРезультат(<РежимКомпоновки>). Единственным необязательным параметром здесь является элемент системного перечисления РежимКомпоновкиРезультата (например, РежимКомпоновкиРезультата.Авто). Если передать в него ссылку на объект отчета Отчет, контекст формы ЭтотОбъект или табличный документ, платформа выдаст ошибку несоответствия типов первого параметра.
  2. Метод объекта отчета (контекст объекта): синтаксис метода объекта выглядит как ОтчетОбъект.СкомпоноватьРезультат(<ТабличныйДокумент>, <ДанныеРасшифровки>). В данном контексте первый параметр обязателен и должен иметь тип ТабличныйДокумент.

Проанализируем типовые решения данной проблемы для управляемых форм.

Способ 1. Исправление вызова метода формы

Если код выполняется в модуле управляемой формы отчета на сервере, достаточно вызвать метод СкомпоноватьРезультат() без параметров или с указанием системного перечисления. Также оптимизируем программную установку параметров компоновки данных с помощью метода УстановитьЗначениеПараметра.

Разберем пример кода на сервере формы:


&НаСервере
Процедура СформироватьНаСервере()
    
    // Получаем параметры компоновщика настроек
    ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
    
    // Устанавливаем параметры отчета (флаг Использование взводится автоматически)
    ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(Отчет.Период));
    ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(Отчет.Период));
    ПараметрыДанных.УстановитьЗначениеПараметра("Организация", Отчет.Организация);
    
    // Вызываем метод формы без параметров
    СкомпоноватьРезультат();
    
КонецПроцедуры

Способ 2. Вывод через объект отчета

Если требуется сформировать отчет программно и вывести его в конкретный реквизит формы с типом ТабличныйДокумент, необходимо преобразовывать реквизит формы Отчет в объект и передавать табличный документ первым параметром.

Рассмотрим, как это реализовать:


&НаСервере
Процедура СформироватьНаСервере()
    
    // Преобразуем реквизит формы "Отчет" в объект отчета
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    
    // Вызываем метод объекта, передавая ТабличныйДокумент
    ОтчетОбъект.СкомпоноватьРезультат(Элементы.Результат);
    
КонецПроцедуры

Способ 3. Перенос логики в модуль объекта (событие ПриКомпоновкеРезультата)

Наиболее правильным архитетурным подходом в 1С является вынос логики заполнения параметров СКД в модуль объекта отчета. В этом случае код формы остается минимальным, а заполнение происходит в предопределенном обработчике ПриКомпоновкеРезультата.

В модуле объекта отчета создаем процедуру:


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

КонецПроцедуры

Что делать, если возникает ошибка «Невозможно осуществить вывод результата»?

Если после устранения ошибки типов вызов СкомпоноватьРезультат() приводит к сообщению «Невозможно осуществить вывод результата», проверим следующие настройки:

  1. Основная схема компоновки данных: убедимся, что в свойствах отчета в конфигураторе указана ОсновнаяСхемаКомпоновкиДанных.
  2. Поле вывода на форме: в управляемой форме должен присутствовать элемент типа ТабличныйДокумент (обычно с именем Результат), в который платформа выводит сформированный отчет.
  3. Типы параметров в СКД: проанализируем типы данных параметров на вкладке «Параметры» в схеме компоновки. Если параметр имеет тип СтандартнаяДатаНачала или СтандартныйПериод, передача в него обычной даты (тип Дата) вызовет ошибку выполнения. В этом случае необходимо изменить тип параметра в СКД на Дата или перед передачей формировать соответствующий системный объект.
← На главную