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