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

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

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

Выясним причину ошибки: почему СКД не может вывести результат

Проанализируем контекст выполнения кода. Ошибка чаще всего возникает из-за неверной передачи параметров в метод или нарушения контекста клиент-серверного взаимодействия:

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

Рассмотрим по шагам основные способы корректного формирования отчета.

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

В управляемом приложении форма отчета имеет специальное расширение, предоставляющее собственный метод СкомпоноватьРезультат(). Это самый лаконичный и рекомендуемый способ, так как платформа берет на себя все операции по связи компоновщика настроек и табличного документа формы.

Посмотрим на пример вызова на клиенте, например, в обработчике смены варианта или при открытии:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    СкомпоноватьРезультат(РежимКомпоновкиРезультата.Непосредственно);
КонецПроцедуры

В данном случае нам не требуется вручную конвертировать данные формы в объект, очищать табличный документ и беспокоиться о контексте. Платформа самостоятельно инициирует формирование отчета и отобразит готовый результат на форме.

Способ 2. Формирование через серверный объект с передачей реквизита формы

Если логика формы требует программной предобработки на стороне сервера перед выводом, разберем правильный вызов серверного метода отчета. Основное правило — передавать в качестве параметра именно реквизит формы с типом ТабличныйДокумент (обычно на форме отчета он называется Результат), а не элемент управления из коллекции Элементы.

Посмотрим на реализацию серверной процедуры:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    СформироватьРезультатНаСервере();
КонецПроцедуры

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

Обратим внимание на ключевую деталь: переменная Результат в данном контексте — это реквизит управляемой формы. Серверный метод объекта СкомпоноватьРезультат заполняет его напрямую, после чего изменения автоматически отражаются в пользовательском интерфейсе.

Способ 3. Полный программный вывод СКД на сервере

В ситуациях, когда требуется тонкая настройка процесса формирования, переопределение макета или отладка каждого шага компоновки, рассмотрим классический алгоритм программного вывода СКД. Он позволяет точно выявить, на каком этапе возникает ошибка — при создании макета, инициализации процессора компоновки или выводе строк.

Разберем по шагам создание всех объектов компоновщика:


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

При ручном выводе важно помнить о работе расшифровки: объект ДанныеРасшифровки необходимо поместить во временное хранилище, а полученный адрес записать в реквизит или свойство поля табличного документа ДанныеРасшифровки на форме, чтобы интерактивные действия пользователя в отчете продолжали функционировать.

Способ 4. Использование штатного параметра открытия формы

Если единственная цель доработки — сформировать отчет сразу при его открытии из другого места конфигурации или меню, писать программный код в модуле формы вовсе не обязательно. Достаточно передать стандартный параметр при вызове открытия формы:


ПараметрыОткрытия = Новый Структура("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.МойОтчет.Форма", ПараметрыОткрытия);

В этом случае платформа самостоятельно выполнит стандартное формирование отчета в соответствии с текущими сохраненными настройками пользователя.

← На главную