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

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе с типовыми конфигурациями, такими как 1С:Бухгалтерия предприятия 3.0, разработчики часто сталкиваются с необходимостью вывести данные из табличной части ДополнительныеРеквизиты в одну строку с основным объектом (например, контрагентом). Сложность заключается в том, что в базе данных эти реквизиты хранятся в виде строк таблицы: одна строка — одно свойство. Если просто соединить справочник с его табличной частью, мы получим «размножение» строк объекта по количеству заполненных реквизитов.

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

Метод 1. Использование вложенного запроса с группировкой и агрегатными функциями

Проанализируем самый надежный способ, который работает на уровне чистого SQL-запроса в 1С. Этот метод часто называют «разворотом» или «пивотом» таблицы. Суть его заключается в том, что мы выбираем нужные нам свойства, помещаем их в разные колонки с помощью оператора ВЫБОР, а затем «схлопываем» строки с помощью группировки по ссылке объекта.

Рассмотрим пример кода, где нам нужно вывести два реквизита: «Основные виды расходов» и «Наш контрагент»:


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

СГРУППИРОВАТЬ ПО
    взЗначения.Ссылка

Почему мы используем МАКСИМУМ? Поскольку для каждой строки вложенного запроса заполнено только одно из полей (Значение1 или Значение2), а остальные содержат NULL, функция МАКСИМУМ позволяет выбрать единственное значащее (не пустое) значение для каждой колонки при группировке по ссылке контрагента.

Метод 2. Последовательные левые соединения

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

Разберем структуру такого запроса:


ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент,
    ЕСТЬNULL(ДопРеквизит1.Значение, "Не указано") КАК ВидРасходов,
    ЕСТЬNULL(ДопРеквизит2.Значение, ЛОЖЬ) КАК ЭтоНашКонтрагент
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.ДополнительныеРеквизиты КАК ДопРеквизит1
        ПО Контрагенты.Ссылка = ДопРеквизит1.Ссылка
            И ДопРеквизит1.Свойство = &Свойство1
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.ДополнительныеРеквизиты КАК ДопРеквизит2
        ПО Контрагенты.Ссылка = ДопРеквизит2.Ссылка
            И ДопРеквизит2.Свойство = &Свойство2

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

Метод 3. Механизм характеристик в СКД (рекомендуемый)

Если вы разрабатываете отчет на базе Системы компоновки данных (СКД), то ручное написание запросов для дополнительных реквизитов — это «велосипед». В 1С есть штатный механизм работы с такими данными.

Посмотрим, как настроить характеристики, чтобы реквизиты были доступны «через точку»:

  1. Откройте схему компоновки данных и перейдите на закладку «Характеристики».
  2. Нажмите «Добавить» и укажите следующие параметры:
    • Тип объекта: СправочникСсылка.Контрагенты.
    • Источник видов характеристик: выберите таблицу ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.
    • Поле ключа: Ссылка.
    • Поле имени: Наименование.
    • Источник значений: табличная часть Справочник.Контрагенты.ДополнительныеРеквизиты.
    • Поле ключа (значения): Ссылка (владелец ТЧ).
    • Поле вида характеристики: Свойство.
    • Поле значения: Значение.

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

Важные замечания по работе со строками и представлениями

В процессе обсуждения на форумах часто возникает вопрос: можно ли сложить представление контрагента и его комментарий прямо в запросе? Рассмотрим ограничения платформы 1С:

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

2. Сложение строк: В языке запросов 1С можно складывать строки только ограниченной длины. Если поле Значение в доп. реквизитах имеет составной тип (включая строку неограниченной длины), сложить его с чем-то через + в запросе не получится.

Решение: Используйте Вычисляемые поля в СКД. На вкладке «Вычисляемые поля» вы можете написать выражение: Строка(Контрагент) + " | " + Строка(ДопРеквизит1). Здесь нет ограничений языка запросов, так как вычисления происходят средствами встроенного языка 1С.

Типичные ошибки при реализации

Проанализируем ситуацию, когда запрос «плодит» строки. Это происходит, если вы делаете соединение по ссылке, но не фильтруете таблицу ДополнительныеРеквизиты по конкретному свойству. В итоге на одного контрагента система находит столько записей, сколько у него вообще заполнено свойств в карточке.

Также плохой практикой считается поиск свойства по наименованию: Свойство.Наименование = "Основные виды расходов". Помните: строковые сравнения замедляют запрос и запрос сломается, если пользователь переименует реквизит в пользовательском интерфейсе. Всегда используйте параметры (&Свойство1), в которые передавайте ссылки на элементы плана видов характеристик.

Подводя итог: для простых консольных запросов лучше использовать Метод 1 (МАКСИМУМ + Группировка), а для полноценных отчетов — Механизм характеристик СКД. Эти подходы гарантируют корректность данных и высокую скорость работы программы.

← На главную