Как вывести свойства и категории справочника в универсальном отчете в 1С:УПП 1.3?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов в конфигурациях на обычных формах, таких как 1С:Управление производственным предприятием (УПП 1.3), 1С:Управление торговлей (УТ 10.3) или 1С:Комплексная автоматизация (КА 1.1), программисты часто используют технологию «Универсального отчета». Этот инструмент позволяет быстро разворачивать функциональные отборы, группировки и сортировки.

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

Выясняем причину: как универсальный отчет работает со свойствами

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

Для того чтобы система смогла внедрить таблицы свойств динамически, в тексте запроса обязательно должны присутствовать жестко заданные комментарии-заглушки (маркеры). Если их нет, универсальный отчет либо проигнорирует вызовы методов настройки свойств, либо выдаст ошибку о недоступности полей.

Проанализируем по шагам весь процесс подготовки отчета — от написания правильного запроса до инициализации настроек в коде.

Шаг 1: Подготовка текста запроса с маркерами автоподстановки

Рассмотрим структуру запроса для получения остатков номенклатуры или просто списка справочника. Нам необходимо расставить специальные комментарии в блоках ВЫБРАТЬ, ИЗ, а также в описании полей построителя отчета. Обратите внимание на обязательное использование псевдонима таблицы и разыменования ссылочного поля.

Ниже представлен правильный шаблон запроса, который должен быть передан в построитель универсального отчета:


ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    СпрНоменклатура.Код КАК Код,
    СпрНоменклатура.Артикул КАК Артикул
    //ПОЛЯ_СВОЙСТВА
    //ПОЛЯ_КАТЕГОРИИ
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    //СОЕДИНЕНИЯ
{ВЫБРАТЬ
    Номенклатура.*,
    Код,
    Артикул
    //ПСЕВДОНИМЫ_СВОЙСТВА
    //ПСЕВДОНИМЫ_КАТЕГОРИИ
}
{ГДЕ
    СпрНоменклатура.Ссылка.* КАК Номенклатура
    //УСЛОВИЯ_СВОЙСТВА
    //УСЛОВИЯ_КАТЕГОРИИ
}
{УПОРЯДОЧИТЬ ПО
    Номенклатура.*
}
ИТОГИ ПО
    Номенклатура
    //ИТОГИ_СВОЙСТВА
    //ИТОГИ_КАТЕГОРИИ

Важное правило: Обратите внимание на блок //СОЕДИНЕНИЯ в секции ИЗ. Он должен располагаться строго после основных таблиц вашего запроса, но до ключевого слова ГДЕ (если оно используется вне фигурных скобок). Именно вместо этого комментария универсальный отчет подставит левое соединение с регистром сведений ЗначенияСвойствОбъектов.

Шаг 2: Настройка программного кода в модуле отчета

Теперь перейдем в модуль объекта нашего отчета. Все манипуляции по инициализации структуры отчета выполняются в предопределенной процедуре УстановитьНачальныеНастройки(). Здесь критически важно соблюдать строгую последовательность выполнения вызовов функций общего модуля универсального отчета.

Выясним правильный порядок инициализации на примере следующего фрагмента кода:


Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт

    // 1. Обязательно включаем флаг использования свойств и категорий
    УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;

    // 2. Описываем базовые настройки построителя (имя таблицы, представление)
    УниверсальныйОтчет.ИмяРегистра = "Справочник.Номенклатура";
    УниверсальныйОтчет.ПредставлениеСписка = "Список номенклатуры";

    // 3. Формируем исходный текст запроса (берем шаблон из Шага 1)
    ТекстЗапроса = ПолучитьТекстЗапроса();

    // 4. Привязываем механизм свойств к конкретному полю запроса.
    // Обратите внимание: первый параметр должен точно совпадать с конструкцией "ИмяТаблицы.Поле" в запросе.
    // Второй параметр — это псевдоним поля в блоке {ВЫБРАТЬ} построителя отчета.
    УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля(
        "СпрНоменклатура.Ссылка", 
        "Номенклатура", 
        "Номенклатура", 
        ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура
    );

    // 5. Вызываем процедуру парсинга и модификации текста запроса.
    // Этот метод найдет комментарии-заглушки и внедрит туда необходимый код выборки свойств.
    УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса);

    // 6. Передаем измененный текст запроса в построитель отчета
    УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;

    // 7. Инициализируем типы значений для отборов по свойствам (иначе они не появятся в диалоге настроек)
    УниверсальныйОтчет.УстановитьТипыЗначенийСвойствДляОтбора();

    // 8. Настраиваем стандартные поля, группировки и отборы по умолчанию
    УниверсальныйОтчет.УстановитьНачальныеНастройки(Ложь);

КонецПроцедуры

Разбор типичных ошибок разработчиков

Рассмотрим детально, из-за каких частых оплошностей механизм может выдавать ошибки компиляции или просто не отображать свойства в интерфейсе:

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

Соблюдение этих простых правил позволит вам быстро и без лишней рутины выводить любые пользовательские свойства и категории номенклатуры (а также контрагентов, договоров и других объектов) в стандартных отчетах на базе конфигурации УПП 1.3.

← На главную