При разработке отчетов на 1С с использованием Системы компоновки данных (СКД) программисты часто сталкиваются с загадочной ситуацией: в конфигураторе запрос написан верно, поля выбраны, ресурсы определены, но при запуске в пользовательском режиме часть полей (чаще всего связанных с регистрами сведений или накопления) бесследно исчезает из доступных полей, группировок и настроек. Особенно это критично при создании сложных отчетов, объединяющих данные справочников, остатков и цен.
Рассмотрим ситуацию, когда необходимо вывести остатки номенклатуры вместе с ценами из периодического регистра сведений, включая позиции с нулевыми остатками. Разберем по шагам, почему поля могут пропадать и как решить эту проблему.
Первое, что необходимо проверить, — это права доступа. Даже если пользователь обладает ролью Полные права, в системе 1С существует возможность тонкой настройки прав на уровне отдельных полей (измерений, ресурсов и реквизитов) объектов метаданных. Проанализируем этот момент подробнее.
В конфигураторе откройте роль пользователя и найдите нужный РегистрСведений. Убедитесь, что установлена не только общая галочка Чтение, но и галочка Просмотр для каждого конкретного измерения и ресурса (например, для поля Цена). Если право Просмотр снято, СКД исключит это поле из списка доступных в пользовательском режиме, даже если оно используется в тексте запроса. Это происходит потому, что компоновщик макета СКД анализирует права текущего пользователя перед генерацией итогового отчета.
Часто причина кроется в настройках самого набора данных в схеме СКД. Перейдем на закладку Наборы данных и внимательно изучим таблицу полей. Рассмотрим колонки ограничений:
Иногда при импорте запроса или автоматическом заполнении схемы эти галочки могут проставиться ошибочно. Убедитесь, что для ресурсов, таких как Цена или КоличествоОстаток, данные ограничения сняты. Также проверьте свойство Роль у полей. Для измерений регистра накопления (Склад, Номенклатура) должна быть указана роль Измерение, а для остатков — роль Остаток с указанием соответствующего имени поля.
Если права в порядке и настройки схемы верны, но поля все равно не видны, велика вероятность влияния Хранилища системных настроек. 1С сохраняет пользовательские настройки отчетов (расположение колонок, видимость полей) в базе данных. Если вы открывали отчет на этапе разработки, когда поля еще не были добавлены или имели другие имена, система могла запомнить этот "неполный" вариант настроек.
Обычная очистка локального кэша файлов (папки AppData) в этом случае не помогает. Проанализируем способы решения:
ХранилищеСистемныхНастроек.При использовании виртуальных таблиц, таких как СрезПоследних или Остатки, важно правильно использовать расширения языка запросов для СКД. Если вы используете левое соединение (Left Join) справочника с регистром, СКД может некорректно типизировать пустые значения, что приведет к скрытию полей.
Посмотрим на пример правильного оформления запроса с использованием фигурных скобок для подсказки компоновщику:
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Номенклатура,
Цены.Цена КАК Цена,
Остатки.КоличествоОстаток КАК Остаток
{ВЫБРАТЬ
Номенклатура.*,
Цена,
Остаток}
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&Период, ) КАК Цены
ПО СпрНоменклатура.Ссылка = Цены.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки
ПО СпрНоменклатура.Ссылка = Остатки.Номенклатура
{ГДЕ
СпрНоменклатура.Ссылка.* КАК Номенклатура,
Цены.Цена,
Остатки.КоличествоОстаток}
Использование конструкции {ВЫБРАТЬ...} и {ГДЕ...} явно указывает СКД, какие поля должны быть доступны в интерфейсе. Также убедитесь, что включена опция Автозаполнение на закладке "Наборы данных". Если она выключена, вам придется вручную описывать каждое доступное поле в схеме.
Проанализируем ситуацию с функциональными опциями (ФО). В современных конфигурациях многие реквизиты привязаны к ФО. Если поле регистра включено в состав функциональной опции, которая в данный момент выключена в константах, это поле будет скрыто отовсюду: из форм, из запросов и из доступных полей СКД. Даже если конфигурация самописная, проверьте, не были ли случайно установлены ссылки на ФО в свойствах измерений или ресурсов регистра.
В некоторых случаях СКД не может определить тип поля из виртуальной таблицы, если оно получается в результате сложного вложенного запроса или соединения. Чтобы гарантировать появление поля, попробуйте явно использовать функцию ВЫРАЗИТЬ в тексте запроса. Это особенно актуально для ресурсов, которые могут принимать значение NULL при левом соединении.
Пример использования функции приведения типов:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
ЕСТЬNULL(ВЫРАЗИТЬ(Цены.Цена КАК ЧИСЛО(15, 2)), 0) КАК Стоимость
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК Цены
ПО Номенклатура.Ссылка = Цены.Номенклатура
Также проверьте закладку Ресурсы в СКД. Чтобы поле Цена или Сумма появилось в итоговых записях, оно должно быть добавлено в список ресурсов с указанием функции (например, СУММА(Цена) или МАКСИМУМ(Цена)). Если поле не является ресурсом и не участвует в группировках, оно может быть скрыто системой оптимизации СКД, если оно не выбрано в "Выбранных полях" в настройках отчета.
Подводя итог, если поля регистра пропадают в СКД, следует действовать по алгоритму: проверка прав Просмотр -> сброс стандартных настроек отчета -> проверка ограничений на закладке Наборы данных -> явное указание полей в секции {} запроса. Чаще всего проблема решается именно на этапе сброса сохраненных пользовательских настроек или проверки прав на уровне отдельных реквизитов.