При работе с системой 1С:Предприятие 8.3 часто возникает необходимость программно формировать отчеты, используя заранее подготовленные схемы компоновки данных (СКД). Особенно это актуально, когда требуется использовать форму «Универсального отчета» в качестве контейнера для нашей собственной, кастомной схемы СКД. Однако, как показывает практика, просто загрузить настройки в компоновщик настроек отчета недостаточно. Многие разработчики сталкиваются с ошибкой «Поле не найдено», даже если их схема СКД безупречно работает при ручном запуске.
Рассмотрим подробнее ситуацию, описанную пользователем. Изначально была предпринята попытка передать схему СКД в универсальный отчет с помощью следующего кода:
Форма = ПолучитьФорму("Отчет.УниверсальныйОтчет.Форма");
Настройки = ПолучитьНастройкиОтчетаПродажи();
Форма.Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Форма.СкомпоноватьРезультат();
Форма.Открыть();
Этот код приводит к ошибке «Поле не найдено "Клиент"» на строке Форма.СкомпоноватьРезультат();. При этом, если после открытия формы вручную нажать кнопку «Сформировать», отчет формируется, но не по нужной схеме, хотя при переходе в «Редактировать схему» видно, что настройки загружены верно.
В чем же причина такого поведения и как правильно «подсунуть» свою схему СКД универсальному отчету?
Суть проблемы заключается в том, что «Универсальный отчет», как и любой другой отчет на СКД, имеет свою собственную, часто базовую, схему компоновки данных. Когда мы получаем форму отчета и загружаем в нее настройки с помощью КомпоновщикНастроек.ЗагрузитьНастройки(), эти настройки применяются к текущей активной схеме компоновки данных, которая уже установлена в отчете. Если наша пользовательская схема СКД (из которой взяты настройки) отличается от базовой схемы «Универсального отчета» (например, содержит другие наборы данных, поля, параметры), то при попытке скомпоновать результат, система будет искать поля, указанные в настройках, в неподходящей базовой схеме. Естественно, она их не найдет и выдаст ошибку «Поле не найдено».
Таким образом, для корректной работы необходимо не только загрузить настройки, но и явно указать саму схему компоновки данных, по которой должен формироваться отчет.
Для успешной передачи вашей схемы СКД и ее настроек в универсальный отчет, мы должны выполнить следующие ключевые шаги:
СхемаКомпоновкиДанных.СхемаКомпоновкиДанных объекта отчета.Давайте посмотрим на исправленный и дополненный пример кода, который позволит нам успешно передать и использовать нашу схему СКД в универсальном отчете:
// 1. Получаем форму универсального отчета.
// Предполагаем, что Отчет.УниверсальныйОтчет существует в конфигурации.
Форма = ПолучитьФорму("Отчет.УниверсальныйОтчет.Форма");
// Получаем объект отчета, который управляет компоновщиком настроек и схемой.
ОтчетОбъект = Форма.Отчет;
// 2. Получаем нашу пользовательскую схему компоновки данных.
// Предполагается, что ваша схема СКД хранится в макете с именем "МояСхемаПродаж".
// Этот макет может быть в самом "УниверсальномОтчете" или в другом вашем отчете.
// Если макет находится в текущем отчете, можно использовать ЭтотОбъект.ПолучитьМакет("МояСхемаПродаж");
// Если макет находится в другом отчете, например, в "Отчет.МоиПродажи", то:
ВашаСхемаСКД = Отчеты.МоиПродажи.ПолучитьМакет("МояСхемаПродаж");
// 3. Устанавливаем полученную схему в объект отчета.
// Это ключевой шаг для того, чтобы компоновщик настроек работал с вашей схемой.
ОтчетОбъект.СхемаКомпоновкиДанных = ВашаСхемаСКД;
// 4. Получаем настройки, совместимые с ВашейСхемойСКД.
// Есть несколько вариантов:
// а) Использовать стандартные настройки по умолчанию из самой схемы:
// Настройки = ВашаСхемаСКД.НастройкиПоУмолчанию;
// б) Если у вас есть сохраненный вариант настроек (НастройкиОтчетаПродажи),
// который вы ранее создали для ВашейСхемыСКД, то используем его:
Настройки = ПолучитьНастройкиОтчетаПродажи(); // Предполагается, что эта функция возвращает объект Тип("НастройкиКомпоновкиДанных")
// 5. Загружаем настройки в компоновщик настроек отчета.
// Теперь компоновщик будет применять эти настройки к только что установленной ВашейСхемойСКД.
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
// 6. Формируем результат отчета.
// Если на форме отчета есть элемент типа "ПолеТабличногоДокумента" с именем "Результат",
// и компоновщик результата настроен на вывод в него, то этот метод его заполнит.
// Или же можно напрямую использовать КомпоновщикМакета и ПроцессорКомпоновки.
Форма.СкомпоноватьРезультат();
// 7. Открываем форму отчета для пользователя.
Форма.Открыть();
Функция ПолучитьНастройкиОтчетаПродажи() в примере выше предполагает, что у вас уже есть сохраненные настройки. Настройки СКД можно получить различными способами:
ВашаСхемаСКД.НастройкиПоУмолчанию.НастройкиКомпоновкиДанных и заполнить его выбранными полями, отборами, группировками и т.д.Например, если вы хотите получить настройки по умолчанию из вашей схемы:
ВашаСхемаСКД = Отчеты.МоиПродажи.ПолучитьМакет("МояСхемаПродаж");
ОтчетОбъект.СхемаКомпоновкиДанных = ВашаСхемаСКД;
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ВашаСхемаСКД.НастройкиПоУмолчанию);
Давайте еще раз проанализируем, почему возникает ошибка «Поле не найдено "Клиент"»:
КомпоновщикНастроек, предполагают наличие поля «Клиент». Если в этот момент активна другая схема СКД (базовая схема «Универсального отчета»), в которой поля «Клиент» нет в наборах данных, то система не сможет сформировать отчет.Всегда проверяйте:
«Универсальный отчет» в типовых конфигурациях 1С (например, 1С:Бухгалтерия, 1С:Управление торговлей, 1С:ERP) — это мощный инструмент, который позволяет пользователям и разработчикам создавать разнообразные отчеты по различным данным конфигурации (регистрам, справочникам, документам) без необходимости создавать новый объект отчета в конфигураторе. Он выступает в роли гибкой «обертки» для системы компоновки данных. Программно используя его форму, мы получаем следующие преимущества:
Когда мы программно передаем нашу собственную схему СКД в «Универсальный отчет», мы фактически говорим ему: «Используй мою схему для формирования отчета, а не свою базовую». Это позволяет нам полностью контролировать структуру и данные отчета, используя при этом удобный и стандартизированный интерфейс «Универсального отчета».
Таким образом, основное правило при программной работе с СКД и передаче ее в другие отчеты или обработки: всегда явно устанавливайте свойство СхемаКомпоновкиДанных объекта отчета или компоновщика настроек перед загрузкой настроек. Это гарантирует, что настройки будут применяться к нужной схеме, и позволит избежать ошибок типа «Поле не найдено».