Почему перечисление не отображается в отчете СКД и как это исправить?

Программист 1С v8.3 (Управляемые формы) Налоговый учет
← На главную

Мы часто сталкиваемся с ситуацией, когда в разработанном нами отчете на Системе Компоновки Данных (СКД) некоторые поля, которые прекрасно выводятся в консоли запросов, отказываются отображаться в режиме предприятия. Особенно часто это касается полей типа "Перечисление". Давайте рассмотрим подробнее, почему так происходит и какие существуют пути решения.

Предположим, у нас есть запрос, который выбирает данные из документа ПоступлениеТоваровУслуг, включая реквизит ОтражениеВУСН, который имеет тип "ПеречислениеСсылка.ОтражениеВУСН". В консоли запросов это поле выводится корректно, показывая значения "Принимаются", "Не принимаются" и так далее. Однако при попытке добавить это поле в настройках отчета СКД в пользовательском режиме, оно просто отсутствует в списке доступных полей или не отображает данные.

Основная причина: функциональные опции

Чаще всего, причина кроется в механизме функциональных опций платформы 1С:Предприятие. Функциональные опции предназначены для тонкой настройки конфигурации под нужды конкретного внедрения, позволяя включать или отключать определенные возможности программы.

Давайте разберем, как это работает:

  1. Связь реквизита с функциональной опцией: В конфигурации 1С любой реквизит объекта (например, наш ОтражениеВУСН в документе ПоступлениеТоваровУслуг.Товары) может быть связан с определенной функциональной опцией. В нашем случае, как верно указали пользователи форума, это может быть опция ПрименяетсяУСНДоходыМинусРасходы.
  2. Влияние на СКД: Если функциональная опция, к которой привязан реквизит, отключена в настройках программы (или для текущего пользователя/организации), то платформа автоматически скрывает связанные с ней элементы. Это касается не только элементов форм, но и полей в отчетах, построенных на СКД. Система считает, что если функция не используется, то и связанные с ней данные не должны быть доступны или отображаться пользователю. Соответственно, поле ОтражениеВУСН просто не появляется в списке доступных полей для вывода, группировки или отбора в пользовательских настройках отчета.
  3. Почему в консоли работает: В консоли запросов мы работаем напрямую с базой данных, минуя метаданные конфигурации и механизмы функциональных опций. Запрос получает данные "как есть" из таблиц базы, поэтому поле и его значения видны. СКД же, будучи высокоуровневым инструментом, учитывает все ограничения, наложенные метаданными, включая функциональные опции и права доступа.
  4. Права доступа: Аналогичная ситуация может возникнуть, если у пользователя недостаточно прав на просмотр определенного реквизита. СКД также скрывает такие поля. Это особенно актуально для составных полей или полей, доступ к которым ограничен на уровне ролей.

Влияние кэша и сохраненных настроек отчета

Иногда проблема может быть вызвана не только функциональными опциями, но и более прозаичными причинами, такими как устаревший кэш или сохраненные настройки отчета.

  1. Кэш метаданных: Платформа 1С кэширует структуру конфигурации и метаданные для повышения производительности. Если вы внесли изменения в отчет (добавили поле, изменили запрос), но кэш не обновился, система может продолжать использовать устаревшую информацию.
  2. Сохраненные варианты отчетов: Пользователи могут сохранять свои варианты настроек отчета. Если отчет был сохранен, когда поле ОтражениеВУСН отсутствовало или было скрыто (например, из-за выключенной функциональной опции), то даже после включения опции или изменения отчета в конфигураторе, сохраненный вариант может не обновиться автоматически.

Для решения этих проблем мы можем предпринять следующие шаги:

  1. Очистка кэша: Самый простой и часто эффективный способ. Мы можем вручную удалить кэш 1С для нашей информационной базы. Обычно это делается удалением каталога кэша (например, папок с длинными именами в %LOCALAPPDATA%\1C\1CE\).
  2. Сброс настроек отчета: В режиме предприятия, в форме отчета, мы можем попробовать сбросить все настройки отчета к стандартным или удалить пользовательские варианты. Это заставит СКД перечитать структуру отчета и применить актуальные метаданные.
  3. Переименование отчета: Иногда, если отчет попал в варианты отчета, простое переименование отчета в конфигураторе может помочь, так как система будет воспринимать его как новый отчет и не будет использовать старые сохраненные варианты.

Способы обхода ограничений функциональных опций в запросе

Если мы убедились, что функциональная опция действительно является причиной, или просто хотим гарантированно вывести поле, существуют способы обхода ограничений путем изменения запроса в СКД. Эти методы создают новое поле, которое СКД не связывает напрямую с исходным реквизитом, подпадающим под действие функциональной опции.

Использование конструкции ВЫБОР КОГДА

Этот подход является наиболее распространенным и часто рекомендуемым. Мы создаем вычисляемое поле, которое на основе значения перечисления возвращает строковое представление.

Как это работает: Мы не обращаемся напрямую к полю-перечислению для вывода, а используем оператор ВЫБОР КОГДА ... КОНЕЦ, чтобы преобразовать его значение в обычную строку. СКД видит это как новое строковое поле, которое не связано с метаданными исходного реквизита и, следовательно, не подвержено ограничениям функциональной опции.

Давайте посмотрим на пример запроса, демонстрирующего этот подход:


ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Принимаются) ТОГДА "Принимаются"
        КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.НеПринимаются) ТОГДА "Не принимаются"
        КОГДА ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Распределяются) ТОГДА "Распределяются"
    КОНЕЦ КАК ОтражениеВУСН
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
    ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
    ПоступлениеТоваровУслугУслуги.Номенклатура,
    ВЫБОР
        КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Принимаются) ТОГДА "Принимаются"
        КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.НеПринимаются) ТОГДА "Не принимаются"
        КОГДА ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ЗНАЧЕНИЕ(Перечисление.ОтражениеВУСН.Распределяются) ТОГДА "Распределяются"
    КОНЕЦ
ИЗ
    Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
ГДЕ
    ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен

Важно помнить, что после применения такого запроса, в настройках набора данных СКД для поля ОтражениеВУСН необходимо вручную указать тип "Строка", чтобы СКД корректно его интерпретировала.

Использование ЛЕВОГО СОЕДИНЕНИЯ с таблицей перечисления

Еще один эффективный метод обхода заключается в явном соединении с виртуальной таблицей самого перечисления. Этот способ также позволяет обойти ограничения функциональных опций.

Как это работает: Мы соединяем нашу основную таблицу с таблицей перечисления (например, Перечисление.ОтражениеВУСН) по соответствующему полю. Таким образом, мы получаем ссылку на элемент перечисления как на отдельную запись из другой таблицы. СКД воспринимает это как обычное соединение с таблицей, на поля которой не распространяются ограничения функциональной опции, привязанной к реквизиту документа.

Посмотрим на пример запроса с использованием ЛЕВОГО СОЕДИНЕНИЯ:


ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПеречОтражениеВУСН.Ссылка КАК ОтражениеВУСН
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ОтражениеВУСН КАК ПеречОтражениеВУСН
        ПО (ПоступлениеТоваровУслугТовары.ОтражениеВУСН = ПеречОтражениеВУСН.Ссылка)
ГДЕ
    ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
    ПоступлениеТоваровУслугУслуги.Номенклатура,
    ПеречОтражениеВУСН.Ссылка
ИЗ
    Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
        ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ОтражениеВУСН КАК ПеречОтражениеВУСН
        ПО (ПоступлениеТоваровУслугУслуги.ОтражениеВУСН = ПеречОтражениеВУСН.Ссылка)
ГДЕ
    ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен

Почему не работает функция ПРЕДСТАВЛЕНИЕ()

Некоторые могут попытаться использовать функцию ПРЕДСТАВЛЕНИЕ() для получения строкового отображения перечисления. Однако, как показал опыт, этот подход не работает, если исходное поле скрыто функциональной опцией.

Причина: Функция ПРЕДСТАВЛЕНИЕ(), хотя и возвращает строковое представление объекта, все равно оперирует с исходным полем-перечислением. Если СКД не имеет доступа к исходному полю из-за ограничений функциональной опции, она не сможет получить и его представление. Таким образом, эта функция не является обходным путем в данной ситуации.

Пример нерабочего запроса:


ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка КАК ПоступлениеРеализация,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    Представление(ПоступлениеТоваровУслугТовары.ОтражениеВУСН) КАК ОтражениеВУСН
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
    ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугТовары.Ссылка.Проведен

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПоступлениеТоваровУслугУслуги.Ссылка.Ссылка,
    ПоступлениеТоваровУслугУслуги.Номенклатура,
    Представление(ПоступлениеТоваровУслугУслуги.ОтражениеВУСН)
ИЗ
    Документ.ПоступлениеТоваровУслуг.Услуги КАК ПоступлениеТоваровУслугУслуги
ГДЕ
    ПоступлениеТоваровУслугУслуги.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    И ПоступлениеТоваровУслугУслуги.Ссылка.Проведен

Этот запрос не даст желаемого результата, так как функция Представление() будет пытаться работать с недоступным полем.

Дополнительные проверки в настройках СКД

Помимо перечисленных выше причин, всегда стоит проверить настройки самого отчета в СКД, чтобы исключить возможные ограничения, установленные там.

Мы должны обратить внимание на следующие аспекты:

  1. Закладка "Роли" для полей набора данных: В настройках набора данных отчета СКД есть закладка "Роли". Для каждого поля определены его роли в отчете.
    • Убедитесь, что для нашего поля ОтражениеВУСН установлен флажок "Поле". Если этот флажок снят, поле не будет доступно для вывода в отчет, даже если оно присутствует в запросе.
    • Проверьте, не установлены ли для поля специфичные роли, которые ограничивают его использование, например, "только для отбора" или "только для сортировки".
  2. Флажок "Обязательное поле": В некоторых сложных случаях, если мы уверены, что поле должно быть доступно, можно попробовать установить флажок "Обязательное" для этого поля на вкладке "Роли". Это может помочь принудительно отобразить его в некоторых сценариях.

Проверка активности функциональной опции

Прежде чем прибегать к обходным путям в запросе, нам необходимо убедиться, что соответствующая функциональная опция действительно активна или, наоборот, что её отключение является желаемым поведением.

  1. В настройках программы: В БП 3.0 настройки функциональных опций часто находятся в разделе "Администрирование" или "Главное" -> "Настройка налогов и отчетов". Для поля ОтражениеВУСН нам нужно проверить, включена ли опция, связанная с УСН, например, ПрименяетсяУСНДоходыМинусРасходы. Если она выключена, то это и есть причина.
  2. В конфигураторе: Мы можем проверить в конфигураторе свойства реквизита ОтражениеВУСН в документе ПоступлениеТоваровУслуг. На закладке "Дополнительно" или "Прочее" могут быть указаны функциональные опции, к которым привязан реквизит. Также мы можем найти саму функциональную опцию в дереве метаданных и посмотреть, какие реквизиты она регулирует.

Если функциональная опция отключена и это правильное поведение с точки зрения бизнес-логики, то использование обходных путей в запросе (ВЫБОР КОГДА или ЛЕВОЕ СОЕДИНЕНИЕ) является единственным способом принудительно вывести это поле в отчете.

В заключение, проблема с отображением перечислений в СКД отчетах 1С является достаточно распространенной и требует комплексного подхода к решению. Мы должны последовательно проверить влияние функциональных опций, целостность кэша и сохраненных настроек, а также рассмотреть возможность использования модифицированных запросов для гарантированного вывода данных. Применяя описанные методы, мы сможем эффективно справляться с подобными задачами и обеспечивать корректное отображение всех необходимых полей в наших отчетах.

← На главную