В процессе разработки отчетов на базе системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в конструкторе схемы компоновки все поля выбраны и настроены правильно, но при запуске отчета в режиме 1С:Предприятие часть ресурсов (например, СуммаПР или СуммаВР) бесследно исчезает из списка доступных полей. Рассмотрим подробнее, почему это происходит, и разберем по шагам все возможные причины и способы их устранения.
Первое, что нам необходимо осознать: среда разработки (Конфигуратор) и пользовательский режим работают с метаданными по-разному. В Конфигураторе мы видим «статическую» картину — всё, что в принципе заложено в структуру таблиц. Однако в режиме «1С:Предприятие» система накладывает на эту структуру несколько динамических фильтров. Если вы загружаете схему в консоль компоновки данных и видите там крестики на полях или их полное отсутствие, это не всегда ошибка самой консоли. Чаще всего это работа механизмов платформы, которые защищают целостность данных и логику конфигурации.
Одной из самых частых причин исчезновения полей в таких конфигурациях, как КА 2.2 или ERP, является использование функциональных опций (ФО). Проанализируем ситуацию на примере ресурсов СуммаПР и СуммаВР. Эти поля напрямую связаны с ведением учета по ПБУ 18/02.
Если в настройках учетной политики организации не включен учет по ПБУ 18/02 или выбран метод, не предполагающий явное отражение постоянных и временных разниц в проводках, платформа автоматически скрывает эти поля. Для СКД это означает, что поле становится недоступным для выбора, даже если оно явно прописано в тексте запроса. Система считает, что раз функциональность отключена, то и данные в этих полях не имеют смысла.
Чтобы проверить эту гипотезу, выполните следующие действия:
Выясним еще одну причину: права доступа. В 1С существует возможность ограничивать чтение не только всей таблицы (регистра), но и отдельных его полей. Это называется Field Level Security. Если у текущего пользователя нет прав на просмотр конкретного ресурса (например, налоговых показателей), СКД исключит это поле из списка доступных сразу после инициализации макета компоновки.
Рассмотрим, как это проверить. Попробуйте запустить отчет под пользователем с полными правами. Если поля появились — проблема в ролях. Если же полей нет даже у администратора, значит, причина кроется в функциональных опциях или особенностях самого запроса.
Иногда мы сами того не замечая, выставляем ограничения в самой схеме. Откроем закладку Наборы данных и внимательно изучим колонки в списке полей:
Также важно проверить свойство Роль у полей ресурсов. Для корректной работы ресурсов остатков в виртуальных таблицах регистра бухгалтерии, в роли поля должны быть правильно указаны измерения (счет, субконто) и тип остатка.
Бывают задачи, когда структуру отчета нужно формировать динамически программным кодом. Разберем ситуацию, когда автоматическое заполнение доступных полей (АвтоЗаполнениеДоступныхПолей = Истина) не дает нужного результата.
Для того чтобы поле не просто появилось в наборе данных, а стало полноценным ресурсом, который можно суммировать в итогах, его нужно добавить в коллекцию ресурсов схемы компоновки данных. Посмотрим на пример кода, который демонстрирует правильный подход к созданию поля и превращению его в ресурс:
// Создаем поле в наборе данных
ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = "Сумма ПР (Остаток)";
ПолеНабора.ПутьКДанным = "СуммаПРКонечныйОстаток";
ПолеНабора.Поле = "СуммаПРКонечныйОстаток";
// Добавляем созданное поле в ресурсы схемы, чтобы оно стало доступным для агрегатных функций
Ресурс = СхемаКомпоновкиДанных.Ресурсы.Добавить();
Ресурс.ПутьКДанным = "СуммаПРКонечныйОстаток";
Ресурс.Выражение = "Сумма(СуммаПРКонечныйОстаток)";
Разберем по шагам, что здесь происходит. Сначала мы регистрируем поле в самом наборе данных, указывая ПутьКДанным. Это позволяет СКД понять, откуда брать значения. Затем мы обязательно добавляем запись в коллекцию Ресурсы. Если этого не сделать, поле будет считаться обычным реквизитом, и вы не сможете вывести по нему итоги в группировках.
Проанализируем специфику работы с таблицей ОстаткиИОбороты. Платформа 1С оптимизирует запросы к виртуальным таблицам. Если в параметрах виртуальной таблицы не указан конкретный счет или условие по счету, а в метаданных регистра для некоторых счетов учет по ПР/ВР отключен, платформа может "перестраховаться" и не выводить эти поля, так как они не являются универсальными для всего регистра.
Рекомендуется в тексте запроса СКД явно назначать псевдонимы полям. Вместо простого выбора поля из виртуальной таблицы используйте конструкцию ВЫРАЗИТЬ или хотя бы явный псевдоним:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.СуммаПРНачальныйОстаток КАК СуммаПРНачальныйОстаток,
ХозрасчетныйОстаткиИОбороты.СуммаВРНачальныйОстаток КАК СуммаВРНачальныйОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , , , ) КАК ХозрасчетныйОстаткиИОбороты
Явное указание псевдонимов помогает СКД жестко зафиксировать наличие этих полей в результирующем наборе данных, уменьшая вероятность их автоматического исключения платформой.
Если вы уверены, что все настройки верны, функциональные опции включены, а прав достаточно, но поля все равно не появляются — возможно, дело в кэшировании настроек. 1С сохраняет структуру доступных полей для отчетов в локальном кэше пользователя. При изменении запроса в процессе разработки старые данные в кэше могут конфликтовать с новыми.
Попробуйте выполнить следующие действия:
Подводя итог, можно сказать, что проблема "исчезающих" полей в СКД почти всегда имеет логическое объяснение, связанное с механизмами динамического управления метаданными в 1С. Тщательная проверка функциональных опций, прав доступа и программных настроек ресурсов позволяет успешно решить эту задачу и вывести все необходимые показатели в отчет.