Почему возникает ошибка «Поле не найдено» при использовании набора данных объект в СКД и как ее исправить?

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

Перенос отчетов с платформы 8.2 на управляемые формы 8.3 зачастую сопровождается необходимостью пересмотра архитектуры данных. Одной из частых проблем является ошибка исполнения отчета, когда система сообщает: Поле не найдено. Давайте разберем по шагам, как выявить причину и устранить этот сбой, особенно когда вы используете Набор данных - объект в качестве источника для СКД.

Понимание причины ошибки

Когда система 1С выдает сообщение о том, что поле (например, Регистратор) не найдено, это не всегда означает, что его физически нет в вашей Таблице значений. Чаще всего проблема кроется в том, как СКД интерпретирует структуру данных, которую вы ей передаете. Рассмотрим основные аспекты, которые необходимо проанализировать.

Шаг 1: Проверка типов данных в Таблице значений

Система СКД крайне требовательна к типам данных. Если вы программно формируете Таблицу значений и передаете её через ВнешниеНаборыДанных, убедитесь, что типы колонок определены жестко. Если тип колонки не задан или определен неверно, СКД не сможет «увидеть» нужные метаданные внутри объекта.

Рекомендуем при создании таблицы явно задавать ОписаниеТипов:


// Пример правильного создания колонки с типом
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
МассивТипов.Добавить(Тип("ДокументСсылка.ПоступлениеТоваровУслуг"));
ОписаниеТиповДокументов = Новый ОписаниеТипов(МассивТипов);

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Регистратор", ОписаниеТиповДокументов);

Если типы не заданы, СКД может попытаться привести данные к строке, и при обращении к полю Регистратор возникнет ошибка, так как система не понимает, что перед ней ссылка на документ.

Шаг 2: Настройка схемы компоновки данных

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

Важным моментом является колонка Тип значения в списке полей набора данных. Убедитесь, что там выбран именно тот тип (составной тип ссылок), который вы используете в Таблице значений. Если поле добавлено автоматически, СКД могла распознать его неверно.

Шаг 3: Проверка сцепленных наборов данных

Если ваш отчет использует несколько наборов данных (например, один получает данные из базы, а второй — расчеты из Таблицы значений), ошибка часто возникает в Связях наборов данных. Проанализируйте следующие моменты:

  1. Проверьте, правильно ли указаны Левое выражение и Правое выражение в настройках связи.
  2. Убедитесь, что поле, по которому идет связь, присутствует в обоих наборах данных.
  3. Исключите ситуацию, когда связь накладывается на поле, которое не участвует в выборке из-за условий отбора.

Шаг 4: Диагностика формирования отчета

Чтобы понять, в какой именно момент «падает» отчет, используйте конструкцию Попытка...Исключение в процедуре ПриКомпоновкеРезультата. Вы можете вывести отладочную информацию в журнал регистрации или в сообщение пользователю:


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

Дополнительные советы

Если проблема не решилась, выполните следующие действия:

Работая сообща над структурой Таблицы значений и настройками схемы СКД, вы сможете добиться корректной работы отчета. Помните: соответствие типов данных в коде и в схеме — это 90% успеха при работе с наборами данных типа «Объект».

← На главную