Мы часто сталкиваемся с ситуацией, когда в разработанном нами отчете на Системе Компоновки Данных (СКД) некоторые поля, которые прекрасно выводятся в консоли запросов, отказываются отображаться в режиме предприятия. Особенно часто это касается полей типа "Перечисление". Давайте рассмотрим подробнее, почему так происходит и какие существуют пути решения.
Предположим, у нас есть запрос, который выбирает данные из документа ПоступлениеТоваровУслуг, включая реквизит ОтражениеВУСН, который имеет тип "ПеречислениеСсылка.ОтражениеВУСН". В консоли запросов это поле выводится корректно, показывая значения "Принимаются", "Не принимаются" и так далее. Однако при попытке добавить это поле в настройках отчета СКД в пользовательском режиме, оно просто отсутствует в списке доступных полей или не отображает данные.
Чаще всего, причина кроется в механизме функциональных опций платформы 1С:Предприятие. Функциональные опции предназначены для тонкой настройки конфигурации под нужды конкретного внедрения, позволяя включать или отключать определенные возможности программы.
Давайте разберем, как это работает:
ОтражениеВУСН в документе ПоступлениеТоваровУслуг.Товары) может быть связан с определенной функциональной опцией. В нашем случае, как верно указали пользователи форума, это может быть опция ПрименяетсяУСНДоходыМинусРасходы.ОтражениеВУСН просто не появляется в списке доступных полей для вывода, группировки или отбора в пользовательских настройках отчета.Иногда проблема может быть вызвана не только функциональными опциями, но и более прозаичными причинами, такими как устаревший кэш или сохраненные настройки отчета.
ОтражениеВУСН отсутствовало или было скрыто (например, из-за выключенной функциональной опции), то даже после включения опции или изменения отчета в конфигураторе, сохраненный вариант может не обновиться автоматически.Для решения этих проблем мы можем предпринять следующие шаги:
%LOCALAPPDATA%\1C\1CE\).Если мы убедились, что функциональная опция действительно является причиной, или просто хотим гарантированно вывести поле, существуют способы обхода ограничений путем изменения запроса в СКД. Эти методы создают новое поле, которое СКД не связывает напрямую с исходным реквизитом, подпадающим под действие функциональной опции.
Этот подход является наиболее распространенным и часто рекомендуемым. Мы создаем вычисляемое поле, которое на основе значения перечисления возвращает строковое представление.
Как это работает: Мы не обращаемся напрямую к полю-перечислению для вывода, а используем оператор ВЫБОР КОГДА ... КОНЕЦ, чтобы преобразовать его значение в обычную строку. СКД видит это как новое строковое поле, которое не связано с метаданными исходного реквизита и, следовательно, не подвержено ограничениям функциональной опции.
Давайте посмотрим на пример запроса, демонстрирующего этот подход:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Принимаются) ТОГДА "Принимаются"
КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.НеПринимаются) ТОГДА "Не принимаются"
КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Распределяются) ТОГДА "Распределяются"
КОНЕЦ КАК ОтражениеВУСН
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
ПоступлениеТоваровУслугУслуги.Номенклатура,
ВЫБОР
КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Принимаются) ТОГДА "Принимаются"
КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.НеПринимаются) ТОГДА "Не принимаются"
КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Распределяются) ТОГДА "Распределяются"
КОНЕЦ
ИЗ
Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
ГДЕ
ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен
Важно помнить, что после применения такого запроса, в настройках набора данных СКД для поля ОтражениеВУСН необходимо вручную указать тип "Строка", чтобы СКД корректно его интерпретировала.
Еще один эффективный метод обхода заключается в явном соединении с виртуальной таблицей самого перечисления. Этот способ также позволяет обойти ограничения функциональных опций.
Как это работает: Мы соединяем нашу основную таблицу с таблицей перечисления (например, Перечисление.ОтражениеВУСН) по соответствующему полю. Таким образом, мы получаем ссылку на элемент перечисления как на отдельную запись из другой таблицы. СКД воспринимает это как обычное соединение с таблицей, на поля которой не распространяются ограничения функциональной опции, привязанной к реквизиту документа.
Посмотрим на пример запроса с использованием ЛЕВОГО СОЕДИНЕНИЯ:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ПеречОтражениеВУСН.Ссылка КАК ОтражениеВУСН
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ОтражениеВУСН КАК ПеречОтражениеВУСН
ПО (ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ПеречОтражениеВУСН.Ссылка)
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
ПоступлениеТоваровУслугУслуги.Номенклатура,
ПеречОтражениеВУСН.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ОтражениеВУСН КАК ПеречОтражениеВУСН
ПО (ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ПеречОтражениеВУСН.Ссылка)
ГДЕ
ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен
Некоторые могут попытаться использовать функцию ПРЕДСТАВЛЕНИЕ() для получения строкового отображения перечисления. Однако, как показал опыт, этот подход не работает, если исходное поле скрыто функциональной опцией.
Причина: Функция ПРЕДСТАВЛЕНИЕ(), хотя и возвращает строковое представление объекта, все равно оперирует с исходным полем-перечислением. Если СКД не имеет доступа к исходному полю из-за ограничений функциональной опции, она не сможет получить и его представление. Таким образом, эта функция не является обходным путем в данной ситуации.
Пример нерабочего запроса:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
Представление(ПоступлениеТоваровУслугТовары.ОтражениеВУСН) КАК ОтражениеВУСН
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
ПоступлениеТоваровУслугУслуги.Номенклатура,
Представление(ПоступлениеТоваровУслугУслуги.ОтражениеВУСН)
ИЗ
Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
ГДЕ
ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен
Этот запрос не даст желаемого результата, так как функция Представление() будет пытаться работать с недоступным полем.
Помимо перечисленных выше причин, всегда стоит проверить настройки самого отчета в СКД, чтобы исключить возможные ограничения, установленные там.
Мы должны обратить внимание на следующие аспекты:
ОтражениеВУСН установлен флажок "Поле". Если этот флажок снят, поле не будет доступно для вывода в отчет, даже если оно присутствует в запросе.Прежде чем прибегать к обходным путям в запросе, нам необходимо убедиться, что соответствующая функциональная опция действительно активна или, наоборот, что её отключение является желаемым поведением.
ОтражениеВУСН нам нужно проверить, включена ли опция, связанная с УСН, например, ПрименяетсяУСНДоходыМинусРасходы. Если она выключена, то это и есть причина.ОтражениеВУСН в документе ПоступлениеТоваровУслуг. На закладке "Дополнительно" или "Прочее" могут быть указаны функциональные опции, к которым привязан реквизит. Также мы можем найти саму функциональную опцию в дереве метаданных и посмотреть, какие реквизиты она регулирует.Если функциональная опция отключена и это правильное поведение с точки зрения бизнес-логики, то использование обходных путей в запросе (ВЫБОР КОГДА или ЛЕВОЕ СОЕДИНЕНИЕ) является единственным способом принудительно вывести это поле в отчете.
В заключение, проблема с отображением перечислений в СКД отчетах 1С является достаточно распространенной и требует комплексного подхода к решению. Мы должны последовательно проверить влияние функциональных опций, целостность кэша и сохраненных настроек, а также рассмотреть возможность использования модифицированных запросов для гарантированного вывода данных. Применяя описанные методы, мы сможем эффективно справляться с подобными задачами и обеспечивать корректное отображение всех необходимых полей в наших отчетах.