Почему в отчете СКД не выводится добавленное поле и как это исправить?

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

Разработка отчетов на системе компоновки данных (СКД) часто преподносит сюрпризы: вы добавили поле в запрос, настроили его в ресурсах и выбранных полях, но при запуске отчета колонка просто не появляется. Или, что еще хуже, при попытке использовать это поле в группировках система выдает ошибку Поле не найдено. Особенно часто это встречается в сложных конфигурациях, таких как 1С:Зарплата и управление персоналом 3.1, где отчеты строятся динамически.

В этой статье мы подробно разберем причины такого поведения и способы их устранения, опираясь на практический опыт решения задачи в контексте сложных запросов с объединениями.

Причина 1: Особенности использования объединений (UNION ALL)

Проанализируем структуру запроса, представленного в примере. Мы видим масштабное использование оператора ОБЪЕДИНИТЬ ВСЕ. Это критически важный момент для СКД. Если вы добавляете новое поле (например, СуммаУОТ) в одну из веток объединения, оно обязательно должно присутствовать во всех остальных ветках этого же объединения.

Рассмотрим подробнее: если в первом блоке ВЫБРАТЬ поле отсутствует, а во втором оно добавлено, СКД может некорректно определить тип набора данных или вовсе проигнорировать поле. Правильным подходом будет добавление «пустышки» во все части запроса, где данных по этому полю нет.

Пример правильной структуры запроса в таких случаях:


// Первый блок объединения - здесь поле должно быть обязательно задано
ВЫБРАТЬ
    Доходы.ФизическоеЛицо КАК ФизическоеЛицо,
    Доходы.СуммаДохода КАК ДоходНачислено,
    NULL КАК СуммаУОТ // Добавляем пустое поле, чтобы выровнять структуру
ИЗ
    РегистрНакопления.СведенияОДоходахНДФЛ КАК Доходы

ОБЪЕДИНИТЬ ВСЕ

// Последний блок, где нам действительно нужны данные
ВЫБРАТЬ
    Начисления.ФизическоеЛицо,
    0,
    Начисления.Сумма // Здесь мы получаем реальное значение
ИЗ
    РегистрНакопления.НачисленияУдержанияПоСотрудникам.Обороты(...) КАК Начисления

Если пропустить добавление NULL или 0 хотя бы в одной из частей ОБЪЕДИНИТЬ ВСЕ, система компоновки может столкнуться с несоответствием количества полей, либо поле будет «отсечено» при оптимизации запроса самой платформой.

Причина 2: Программная компоновка результата

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

Когда мы устанавливаем СтандартнаяОбработка = Ложь, мы берем на себя полную ответственность за формирование макета и процессора компоновки. Рассмотрим код, который часто становится причиной «пропадания» полей:


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

В чем здесь подвох? Если вы добавили поле в СхемаКомпоновкиДанных в конфигураторе, но у пользователя сохранены старые настройки (вариант отчета), то при вызове КомпоновщикНастроек.ПолучитьНастройки() система загрузит структуру настроек, в которой вашего нового поля еще не существовало. В итоге в МакетКомпоновки это поле не попадет, так как оно не выбрано в настройках.

Причина 3: Кэширование настроек пользователя

Это одна из самых «невидимых» проблем. Платформа 1С сохраняет пользовательские настройки отчетов (расположение колонок, видимость, отборы) в системных хранилищах. Даже если вы нажали «Установить стандартные настройки» в режиме Предприятия, это не всегда гарантирует полную очистку кэша структуры.

Проанализируем шаги для гарантированного сброса кэша:

  1. Измените наименование варианта отчета в конфигураторе.
  2. В режиме Предприятия удалите все сохраненные пользовательские настройки для данного отчета через меню «Администрирование — Настройки пользователей и прав».
  3. Если отчет внешний — измените его имя (внутренний идентификатор объекта).

Как показывает практика, совет переименуй отчет из обсуждения является очень действенным, так как заставляет систему создать новую запись в хранилище настроек, игнорируя старую, «битую» структуру.

Причина 4: Флаг «Автозаполнение» и ручная настройка полей

Выясним причину, связанную с настройками набора данных. В конструкторе СКД на закладке «Набор данных» есть флаг «Автозаполнение».

Если этот флаг снят, то СКД не будет автоматически подтягивать новые поля из текста запроса в список доступных полей компоновки. В этом случае вам необходимо:

Ошибка «Поле не найдено» при группировке

Если поле выводится в детальных записях, но при попытке добавить его в группировку возникает ошибка, значит, у поля некорректно настроена Роль.

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

Как проверить данные запроса через вычисляемые поля?

Часто возникает вопрос: Можно ли в вычисляемом поле запросом получить данные?. Ответ — напрямую нет. Язык выражений СКД не поддерживает SQL-запросы.

Если вам нужно дополнить отчет данными, которые сложно получить в основном запросе (например, из-за структуры UNION), рассмотрите два варианта:

  1. Связи наборов данных: Создайте второй набор данных (запрос) и свяжите его с первым по ключевым полям (Физлицо, Период). Это наиболее правильный и производительный способ.
  2. Функции общих модулей: В вычисляемом поле можно вызвать ИмяМодуля.ИмяФункции(Параметр). Но помните, что этот метод заставит систему выполнять отдельный запрос для каждой строки отчета, что катастрофически снизит производительность на больших объемах данных.

Подведем итог: если поле не выводится, в первую очередь проверьте идентичность структуры всех блоков ОБЪЕДИНИТЬ в запросе и выполните полную очистку пользовательских настроек отчета. В 90% случаев в ЗУП проблема кроется именно в использовании старых настроек компоновщика при программном выводе результата.

← На главную