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

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

При разработке или переносе отчетов на платформе 1С:Предприятие 8.3, особенно в конфигурации на базе Библиотеки стандартных подсистем (БСП), таких как «Бухгалтерия для Казахстана 3.0», «Бухгалтерия предприятия 3.0» или «ERP», разработчики часто сталкиваются с ошибкой: «Не найден внешний набор данных [ИмяНабора]». Ситуация осложняется тем, что один и тот же отчет может идеально работать в одной конфигурации и выдавать ошибку в другой. Для диагностики структуры подобных отчетов удобно использовать управляемую консоль запросов и отчетов — есть управляемая консоль запросов и отчетов для разработчика. В этой статье мы подробно разберем причины этой проблемы, проанализируем механизмы работы Системы компоновки данных (СКД) и выясним, как правильно инициализировать внешние источники данных.

Суть проблемы: почему СКД «теряет» данные

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

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

Разберем основную причину: работа в фоновом задании

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

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

Шаг 1. Переопределение процедуры ПриКомпоновкеРезультата

Откроем модуль объекта вашего отчета и найдем (или создадим) предопределенную процедуру ПриКомпоновкеРезультата. Именно здесь мы должны подготовить наши внешние данные и передать их в систему. Помочь в подготовке каркаса кода может консоль кода с ИИ-помощником — для этого подойдёт консоль кода с ИИ-помощником для разработчика. Рассмотрим пример кода:


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

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

Шаг 2. Особенности отладки на сервере

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

  1. Включите отладку фоновых заданий. В конфигураторе перейдите в меню «Отладка» -> «Подключение» -> «Автоматическое подключение» и установите флажок «Фоновые задания».
  2. Используйте остановку по ошибке. Настройте отладчик на остановку при возникновении исключения. Это позволит увидеть точное место в общем модуле (например, в ВариантыОтчетов), где система «спотыкается» о пустую структуру данных.
  3. Принудительное отключение фонового режима. Для целей тестирования можно временно отключить формирование в фоне. В некоторых конфигурациях это делается через настройки параметров запуска или путем модификации структуры ПараметрыОтчета, где флаг ВыполнятьВФоновомЗадании устанавливается в значение Ложь.

Шаг 3. Сопоставление имен и типов данных

Проанализируем еще одну частую причину ошибки — несоответствие структуры таблицы значений и описания набора данных в схеме. Рассмотрим важные моменты:

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

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

Типовые ошибки в конфигурациях на БСП

В конфигурациях вроде «Бухгалтерия для Казахстана» или «Управление торговлей 11» отчеты часто работают через общие модули ВариантыОтчетов и ОтчетыСервер. Рассмотрим специфические нюансы:

Итоги и рекомендации

Подведем итог нашему разбору. Если вы столкнулись с ошибкой «Не найден внешний набор данных», действуйте по следующему алгоритму:

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

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

В-третьих, настройте отладку фоновых заданий. Это единственный надежный способ увидеть, что происходит в серверном контексте в момент вызова ПроцессорКомпоновки.Инициализировать(). Посмотрите, какие ключи содержатся в структуре, передаваемой вторым параметром в этот метод.

Соблюдение этих правил и понимание того, как БСП управляет процессом формирования отчетов, позволит вам быстро локализовать и устранить ошибку, обеспечив стабильную работу отчета в любой конфигурации.

← На главную