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