При разработке или модификации отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда новое поле добавлено в запрос, но оно упорно не появляется в настройках выбранных полей в пользовательском режиме. Особенно остро эта проблема проявляется в конфигурациях на базе БСП, таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация». В этой статье мы подробно разберем, почему так происходит, и пройдем по шагам от проверки кода до настройки функциональных опций.
Рассмотрим типичный пример: нам необходимо добавить цены поступления и реализации в типовой отчет ВедомостьПоТоварамНаСкладах. Мы модифицируем запрос, добавляя временные таблицы для получения цен из документов. Проанализируем структуру запроса, которую обычно используют в таких случаях:
ВЫБРАТЬ
ПоступлениеТоваровНаСкладТовары.Ссылка КАК Ссылка,
ПоступлениеТоваровНаСкладТовары.Ссылка.Склад КАК Склад,
ПоступлениеТоваровНаСкладТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровНаСкладТовары.Серия КАК Серия,
ПоступлениеТоваровНаСкладТовары.Цена КАК ЦенаПриход
ПОМЕСТИТЬ ВременнаяПриход
ИЗ
Документ.ПоступлениеТоваровНаСклад.Товары КАК ПоступлениеТоваровНаСкладТовары
ГДЕ
ПоступлениеТоваровНаСкладТовары.Ссылка.Проведен = ИСТИНА
И ПоступлениеТоваровНаСкладТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
РеализацияТоваровУслугТовары.Ссылка.Склад КАК Склад,
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Серия КАК Серия,
РеализацияТоваровУслугТовары.Цена КАК ЦенаРасход
ПОМЕСТИТЬ ВременнаяРасход
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Затем эти данные соединяются с основной таблицей остатков и оборотов регистра ТоварыНаСкладах. Проблема заключается в том, что поле ЦенаРасход отображается в доступных полях, а ЦенаПриход — нет, хотя логика добавления идентична. Выясним причину этой аномалии.
Первым делом проанализируем настройки самого набора данных в конфигураторе. Откроем схему компоновки данных и перейдем на закладку «Наборы данных». Нам нужно проверить несколько ключевых моментов:
ЦенаПриход не установлены галочки в колонках «Ограничение поля», «Ограничение условия» или «Ограничение группировки». Если они установлены, СКД скроет это поле от пользователя.Сумма(ЦенаПриход)).В современных конфигурациях 1С (УТ 11, ERP) активно используются Функциональные опции. Это механизм, который позволяет отключать ненужный функционал прямо в пользовательском режиме. Если функциональная опция, связанная с объектом метаданных, выключена, платформа 1С ведет себя следующим образом:
В нашем случае поле ЦенаПриход выбирается из документа ПоступлениеТоваровНаСклад. Проанализируем ситуацию: в актуальных версиях УТ 11 документ ПоступлениеТоваровНаСклад часто используется только при ордерной схеме или в специфических сценариях. Основным документом закупки является ПриобретениеТоваровУслуг. Если в настройках системы использование документа ПоступлениеТоваровНаСклад не активировано, то поле, полученное из него, просто исчезнет из отчета, даже если оно прописано в тексте запроса.
Решение: Замените в тексте запроса обращение к таблицам Документ.ПоступлениеТоваровНаСклад на Документ.ПриобретениеТоваровУслуг или убедитесь, что соответствующая функциональная опция включена в разделе «НСИ и администрирование».
Чтобы окончательно убедиться, что именно СКД «вырезает» наше поле, проанализируем реальный текст запроса, который отправляется в СУБД. Платформа 1С динамически модифицирует ваш текст запроса в зависимости от настроек пользователя и прав доступа. Рассмотрим, как это увидеть:
Используйте консоль системы компоновки данных (внешняя обработка). Загрузите туда вашу схему и сформируйте отчет. В консоли можно увидеть «Исполняемый запрос». Если вы увидите, что в итоговом тексте отсутствует ЛЕВОЕ СОЕДИНЕНИЕ с вашей временной таблицей или поле ЦенаПриход заменено на NULL, значит, срабатывает либо механизм функциональных опций, либо RLS (ограничение доступа на уровне записей).
В типовых отчетах, таких как «Ведомость по товарам на складах», часто используется соединение по полю Регистратор. Проанализируем фрагмент кода соединения:
ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяПриход КАК ВременнаяПриход
ПО ТоварыНаСкладахОстаткиИОбороты.Регистратор = ВременнаяПриход.Ссылка
И ТоварыНаСкладахОстаткиИОбороты.Склад = ВременнаяПриход.Склад
И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = ВременнаяПриход.Номенклатура
Поскольку Регистратор имеет составной тип данных, при левом соединении с конкретной таблицей документа (например, ПоступлениеТоваровНаСклад) система может оптимизировать запрос так, что при отсутствии прав или выключенной функциональной опции на этот документ, все поле будет исключено из выборки.
Совет: При работе с УТ 11 старайтесь получать цены и стоимостные показатели не из документов, а из регистров накопления, таких как ВыручкаИСебестоимостьПродаж или Закупки. Это не только решит проблему с «исчезающими» полями, но и значительно ускорит работу отчета, так как данные в регистрах уже оптимизированы для аналитики.
Подведем итог нашему исследованию. Если в СКД пропало поле, пройдем по чек-листу:
Использование правильных объектов метаданных (например, ПриобретениеТоваровУслуг вместо устаревших или специфических документов) позволяет избежать большинства проблем с видимостью полей и гарантирует корректную работу отчета у всех пользователей системы.