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