При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда поле добавлено в запрос, выбрано в настройках, но при формировании отчета колонка упорно не появляется. Особенно часто это происходит в типовых конфигурациях, таких как 1С:Зарплата и управление персоналом 3.1, где механизмы вывода отчетов сильно кастомизированы. Разберем по шагам, почему так происходит и как добиться появления данных в отчете.
Первым делом проанализируем запрос. В приведенном примере автор добавляет поле следующим образом: NULL КАК СуммаУОТ. С точки зрения платформы 1С, поле с типом NULL не имеет определенного типа данных. Если в дальнейшем вы планируете назначить это поле Ресурсом (чтобы считать по нему итоги), СКД может проигнорировать его при расчете макета.
Рассмотрим, как правильно инициализировать поле в запросе. Вместо использования NULL, крайне рекомендуется использовать явное приведение типов. Это гарантирует, что компоновщик данных правильно определит доступные агрегатные функции. Посмотрим на пример правильного объявления поля:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Доходы.Регистратор КАК Регистратор,
// ... другие поля ...
ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) КАК СуммаУОТ
ИЗ
РегистрНакопления.СведенияОДоходахНДФЛ КАК Доходы
Также важно помнить о структуре ОБЪЕДИНИТЬ ВСЕ. Если ваш запрос состоит из нескольких частей, новое поле должно быть добавлено в каждый блок ВЫБРАТЬ на ту же самую позицию. Если хотя бы в одном из объединяемых запросов поле будет пропущено или будет иметь несовместимый тип, структура набора данных в СКД может быть нарушена.
Даже если запрос написан идеально, поле может быть скрыто настройками самой схемы. Перейдем на закладку «Наборы данных» и проанализируем ситуацию:
СуммаУОТ не стоят галочки в субколонках «Поле», «Условие» или «Группировка».Сумма(СуммаУОТ).Во многих типовых конфигурациях отчеты формируются не стандартной кнопкой «Сформировать», а через переопределяемую процедуру ПриКомпоновкеРезультата в модуле объекта отчета. Разберем код, который часто становится причиной «исчезновения» колонок:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
ДокументРезультат.Очистить();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
// Важный момент: НастройкиОтчета должны содержать ваше новое поле!
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
КонецПроцедуры
Проанализируем этот фрагмент. Метод КомпоновщикМакета.Выполнить принимает в качестве второго параметра настройки. Если вы добавили поле в схему, но не добавили его в «Выбранные поля» текущего варианта отчета, программный процессор просто не включит его в итоговый табличный документ. Убедитесь, что в пользовательских настройках или в настройках варианта по умолчанию галочка напротив нового поля установлена.
Если все настройки верны, поле есть в «Выбранных полях», но на экране его нет — мы столкнулись с проблемой кэширования метаданных. В платформе 1С существует неприятная особенность: при частой правке одних и тех же объектов (особенно отчетов) через удаленный рабочий стол (RDP), клиентское приложение может использовать старую версию структуры объекта из локального кэша.
Рассмотрим способы решения этой проблемы в порядке возрастания радикальности:
%AppData%\1C\1cv8\ и %LocalAppData%\1C\1cv8\. Это самый надежный способ «забыть» старую структуру отчета.Как показал опыт обсуждения на форуме, именно очистка кэша или работа на «чистой» базе часто выявляет, что код на самом деле рабочий, а проблема кроется в особенностях работы платформы с временными файлами в терминальных сессиях.
Чтобы окончательно выяснить причину, воспользуемся проверенным методом: выгрузим схему отчета в Консоль системы компоновки данных. Если в консоли поле выводится и заполняется данными, значит, проблема не в запросе и не в схеме, а в механизмах вывода конкретной конфигурации (например, в общих модулях ЗУП, которые могут динамически менять состав колонок) или в кэше. Если же и в консоли поля нет — возвращаемся к проверке типов данных и условий ГДЕ, которые могут отсекать записи с вашим новым полем.