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

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

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

Анализ структуры запроса и типизация полей

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

Рассмотрим, как правильно инициализировать поле в запросе. Вместо использования NULL, крайне рекомендуется использовать явное приведение типов. Это гарантирует, что компоновщик данных правильно определит доступные агрегатные функции. Посмотрим на пример правильного объявления поля:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Доходы.Регистратор КАК Регистратор,
    // ... другие поля ...
    ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК СуммаУОТ
ИЗ
    РегистрНакопления.СведенияОДоходахНДФЛ КАК Доходы

Также важно помнить о структуре ОБЪЕДИНИТЬ ВСЕ. Если ваш запрос состоит из нескольких частей, новое поле должно быть добавлено в каждый блок ВЫБРАТЬ на ту же самую позицию. Если хотя бы в одном из объединяемых запросов поле будет пропущено или будет иметь несовместимый тип, структура набора данных в СКД может быть нарушена.

Проверка настроек набора данных в СКД

Даже если запрос написан идеально, поле может быть скрыто настройками самой схемы. Перейдем на закладку «Наборы данных» и проанализируем ситуацию:

  1. Проверим колонку «Ограничение доступности». Убедимся, что для поля СуммаУОТ не стоят галочки в субколонках «Поле», «Условие» или «Группировка».
  2. Выясним, назначена ли полю правильная Роль. Если отчет строится по периодам или имеет сложную иерархию, некорректная настройка ролей может привести к тому, что система исключит поле из итогового макета.
  3. Проверим закладку «Ресурсы». Если поле должно выводиться в итогах, добавим его в ресурсы и укажем выражение, например, Сумма(СуммаУОТ).

Особенности программного вывода отчета

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


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

КонецПроцедуры

Проанализируем этот фрагмент. Метод КомпоновщикМакета.Выполнить принимает в качестве второго параметра настройки. Если вы добавили поле в схему, но не добавили его в «Выбранные поля» текущего варианта отчета, программный процессор просто не включит его в итоговый табличный документ. Убедитесь, что в пользовательских настройках или в настройках варианта по умолчанию галочка напротив нового поля установлена.

Проблема кэширования и работа через RDP

Если все настройки верны, поле есть в «Выбранных полях», но на экране его нет — мы столкнулись с проблемой кэширования метаданных. В платформе 1С существует неприятная особенность: при частой правке одних и тех же объектов (особенно отчетов) через удаленный рабочий стол (RDP), клиентское приложение может использовать старую версию структуры объекта из локального кэша.

Рассмотрим способы решения этой проблемы в порядке возрастания радикальности:

  1. Сброс настроек варианта отчета: В режиме «1С:Предприятие» зайдите в настройки отчета и выполните команду «Установить стандартные настройки». Это заставит систему перечитать структуру выбранных полей из обновленной схемы.
  2. Переименование объекта: Попробуйте сохранить отчет как внешний или временно переименовать его в конфигураторе. Это создаст новый идентификатор в кэше, и система будет вынуждена прочитать актуальную структуру запроса.
  3. Очистка кэша пользователя: Закройте 1С и удалите содержимое папок %AppData%\1C\1cv8\ и %LocalAppData%\1C\1cv8\. Это самый надежный способ «забыть» старую структуру отчета.
  4. Обновление конфигурации базы данных: Иногда помогает повторное сохранение конфигурации с небольшим фиктивным изменением (например, добавление пробела в комментарии) и последующее обновление (F7).

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

Использование консоли СКД для диагностики

Чтобы окончательно выяснить причину, воспользуемся проверенным методом: выгрузим схему отчета в Консоль системы компоновки данных. Если в консоли поле выводится и заполняется данными, значит, проблема не в запросе и не в схеме, а в механизмах вывода конкретной конфигурации (например, в общих модулях ЗУП, которые могут динамически менять состав колонок) или в кэше. Если же и в консоли поля нет — возвращаемся к проверке типов данных и условий ГДЕ, которые могут отсекать записи с вашим новым полем.

← На главную