Как вывести дополнительные свойства контрагентов в отчет 1С через конструктор

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

В работе с программами 1С часто возникает необходимость дополнить стандартные отчеты данными, которые хранятся не в основных реквизитах справочника (таких как ИНН или Наименование), а на вкладке Свойства. Эти данные обычно располагаются в отдельном регистре сведений. В данной статье мы подробно разберем, как правильно составить запрос, чтобы подтянуть значения свойств в отчет, и почему возникают ошибки при работе с параметрами в консоли отчетов.

Понимание структуры хранения данных свойств

Прежде чем приступать к написанию запроса, нам необходимо разобраться, где именно 1С хранит дополнительные данные. В большинстве конфигураций (особенно в классических решениях, таких как УПП, КА 1.1 или старые версии БП) используется механизм свойств и категорий. Данные о значениях свойств хранятся в регистре сведений ЗначенияСвойствОбъектов (или ДополнительныеСведения в более современных версиях на базе БСП).

Основные поля этого регистра, которые нам понадобятся:

  1. Объект — ссылка на контрагента (владелец свойства).
  2. Свойство — ссылка на само свойство (например, "Дебитор" или "Регион" из Плана видов характеристик).
  3. Значение — то самое значение, которое ввел пользователь в карточке.

Шаг 1. Базовое соединение таблиц

Проанализируем типичную ситуацию: нам нужно вывести список всех контрагентов и рядом колонку с их особым статусом из свойств. Если мы просто выберем таблицу Справочник.Контрагенты, мы не увидим там поля "Дебитор". Нам нужно выполнить ЛЕВОЕ СОЕДИНЕНИЕ с регистром сведений. Почему именно левое? Если мы используем внутреннее соединение, то контрагенты, у которых свойство не заполнено, просто исчезнут из отчета. Рассмотрим пример структуры запроса:


ВЫБРАТЬ
    Контрагенты.Наименование КАК Наименование,
    Контрагенты.ИНН КАК ИНН,
    ЗначенияСвойствОбъектов.Значение КАК Дебитор
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ЗначенияСвойствОбъектов.Объект = Контрагенты.Ссылка

Однако такой запрос в чистом виде выдаст ошибку или "кашу" из данных, если у контрагента заполнено несколько разных свойств. Программа выведет столько строк по одному контрагенту, сколько свойств у него заполнено в регистре.

Шаг 2. Фильтрация по конкретному свойству

Чтобы получить значение только конкретного свойства (в нашем примере — "Дебитор"), нам нужно наложить условие на соединение. Важно помнить: условие на свойство лучше ставить именно в блоке ПО (условие связи), а не в блоке ГДЕ. Если поставить условие в ГДЕ, левое соединение фактически превратится во внутреннее, и пустые значения отсекутся. Разберем правильный синтаксис:


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.Наименование,
    Контрагенты.ИНН,
    ЕСТЬNULL(ЗначенияСвойствОбъектов.Значение, "Не задано") КАК ЗначениеДебитор
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ЗначенияСвойствОбъектов.Объект = Контрагенты.Ссылка
        И ЗначенияСвойствОбъектов.Свойство = &СвойствоДебитор

Здесь мы применили функцию ЕСТЬNULL, которая позволяет вывести понятный текст вместо пустой ячейки, если свойство у контрагента не заполнено. Переменная &СвойствоДебитор является параметром, который мы должны передать в запрос.

Шаг 3. Решение проблемы с параметрами в Консоли отчетов

Часто пользователи сталкиваются с ошибкой: "Не задано значение параметра СвойствоДебитор". Выясним причину этой проблемы. Когда вы используете конструктор запросов или консоль отчетов, программа видит символ & и понимает, что это внешняя переменная. Вы не можете просто написать в коде Свойство = "Дебитор", так как "Дебитор" в базе — это не строка, а объект (элемент Плана видов характеристик).

Для корректной работы выполним следующие действия:

  1. Перейдем на вкладку Параметры в вашей консоли отчетов или компоновке данных.
  2. Найдем в списке параметр СвойствоДебитор.
  3. В колонке "Значение" нажмем кнопку выбора и выберем тип данных (План видов характеристик "Свойства объектов" или "Дополнительные реквизиты").
  4. Выберем из справочника конкретный элемент с названием "Дебитор".

Только после этого 1С сможет сопоставить данные в регистре с вашим запросом.

Шаг 4. Оптимизация вывода нескольких свойств

Если нам нужно вывести не одно, а три разных свойства (например, "Дебитор", "Срок доставки" и "Важность"), использование трех левых соединений может замедлить работу системы. Рассмотрим более профессиональный подход с использованием агрегатных функций. Мы можем сгруппировать данные по контрагенту и "развернуть" свойства в колонки:


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

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

Особенности использования СКД (Системы компоновки данных)

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

Посмотрим, как это упрощает жизнь:

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

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

← На главную