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