Разработчики при создании сложных отчетов в 1С часто сталкиваются с парадоксальной ситуацией: тяжелый пакетный запрос с временными таблицами и левыми соединениями идеально отрабатывает в консоли запросов, но при переносе в схему компоновки данных (СКД) внешнего отчета возвращает ошибку сборки макета. Текст ошибки обычно выглядит так: «Поле не найдено "ИмяВременнойТаблицы.ИмяПоля"».
В этой статье мы детально разберем внутренние механизмы платформы 1С, которые приводят к такому поведению системы, и рассмотрим по шагам все способы устранения этой распространенной технической проблемы.
Выясним причину, которая чаще всего спасает разработчиков на практике, когда логических ошибок в кодовой базе не обнаружено. Платформа 1С сохраняет структуру вариантов отчетов и пользовательские настройки во внутреннем кэше информационной базы, жестко привязывая их к идентификатору внешнего отчета (его UUID).
Если в процессе разработки вы меняли текст запроса в схеме компоновки (например, удаляли, добавляли или переименовывали реквизиты кадровой истории), но запускаете отчет под старым именем или используете сохраненный ранее вариант, СКД пытается применить старые настройки к новой структуре. Из-за этого возникает конфликт метаданных, и система сообщает об отсутствии поля, которого фактически уже нет в самом запросе.
Разберем, как правильно очистить кэш настроек:
Проанализируем более глубокую техническую причину, связанную с интеллектуальной оптимизацией запросов СКД. Консоль запросов выполняет код последовательно «как есть», выбирая абсолютно все поля, описанные в секции ВЫБРАТЬ.
СКД работает иначе. Перед отправкой запроса к СУБД оптимизатор СКД анализирует настройки компоновщика (выбранные поля, группировки, отборы, условное оформление). Если какое-то поле (например, ВидЗанятости во временной таблице ВТКадроваяИсторияСотрудников) не выводится пользователем на форму и не участвует в активных отборах, СКД в целях повышения производительности просто исключает это поле из выборки на этапе формирования временной таблицы.
При этом, если данное поле используется далее в жестких связях между другими временными таблицами пакета (например, в условиях соединения СведенияКадровойИсторияСотрудников.ВидЗанятости <> СведенияКадровойИсторияСотрудников2.ВидЗанятости), СУБД не может выполнить соединение, так как поле было оптимизировано и стерто. В итоге платформа выдает ошибку компоновки макета.
Разберем по шагам, как зафиксировать критически важные поля пакета запросов:
ВидЗанятости).Рассмотрим ситуацию с флагом «Автозаполнение» в наборе данных — запросе. Когда этот флаг активен, платформа пытается автоматически сопоставить поля таблиц базы данных с полями схемы компоновки, достраивая пути к данным.
В сложных пакетных запросах с левыми соединениями и вложенными выборками автозаполнение может сработать некорректно, сформировав ложные связи. Отключение автозаполнения позволяет полностью взять структуру полей под ручной контроль.
Порядок действий:
Автозаполнение в строке набора данных.{}, если это необходимо для расширенных отборов.Если мы разрабатываем отчет для конфигурации «1С:Зарплата и управление персоналом» (ЗУП 3.1) или «1С:ERP Управление предприятием», важно учитывать специфику получения кадровых данных. В этих прикладных решениях кадровые данные (такие как подразделения, должности, виды занятости сотрудников) извлекаются через специализированный программный интерфейс БСП.
Исходный текст запроса СКД содержит временные таблицы-заглушки (например, КадроваяИсторияСотрудников), которые должны подменяться платформой на лету в процессе работы отчета. В консоли запросов эти данные могут инициализироваться программно специальным кодом инициализации, а во внешнем отчете без дополнительной подготовки этого не происходит. В итоге СКД обращается к физической таблице, структура которой отличается от ожидаемой виртуальной (например, отсутствует поле ВидЗанятости).
Посмотрим, какой программный вызов необходимо добавить в модуль объекта внешнего отчета, чтобы решить эту проблему:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Инициализируем программные источники данных кадрового учета БСП
ПараметрыОтчета = Новый Структура;
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект, ПараметрыОтчета);
// Выполняем стандартный вывод отчета с подготовленными данными
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Данный вызов гарантирует, что все виртуальные кадровые срезы будут развернуты платформой корректно, и ошибка «Поле не найдено» больше не побеспокоит пользователей.
Проанализируем еще один нюанс. Иногда разработчики проверяют только основные настройки выбранных полей отчета, забывая про детальные настройки отдельных группировок, таблиц или диаграмм.
Если в какой-то из вложенных группировок (например, в детальных записях или колонках таблицы отчета) осталось старое выбранное поле, помеченное серым или красным цветом, СКД будет пытаться извлечь его из базы. Обязательно пройдемся по всем элементам структуры отчета и очистим списки выбранных полей, группировок и отборов от устаревших реквизитов.
Применяя данные подходы последовательно, мы сможем быстро локализовать и устранить любые несоответствия между работой запроса в консоли и выводом отчета через СКД.