К статье
Практический материал

Разработка и Конфигурация · 13 мин

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

Как получить дополнительный реквизит в запросе 1С: соединение с табличной частью ДополнительныеРеквизиты, параметры видов свойств, примеры кода и типичные ошибки.

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

Типичная задача выглядит так: у справочника «Номенклатура» добавлен доп реквизит «Цвет», и его нужно вывести в отчёт или использовать в отборе. Решение — левое соединение с таблицей Справочник.Номенклатура.ДополнительныеРеквизиты, где поле Свойство сравнивается с параметром, а значение берётся из поля Значение.

Ниже разобраны рабочие примеры запросов, способы задать параметр свойства, вариант с несколькими доп реквизитами, альтернатива через схему компоновки данных и частые ошибки, из-за которых запрос возвращает пустой или задвоенный результат.

Где физически хранятся дополнительные реквизиты

Когда в конфигураторе или в режиме предприятия (через «Администрирование — Общие настройки — Дополнительные реквизиты и сведения») объекту добавляют доп реквизит, платформа не меняет структуру основной таблицы. Вместо этого у объекта появляется табличная часть ДополнительныеРеквизиты с колонками Свойство и Значение.

Поле Свойство содержит ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения — именно там описано, что это за реквизит, его заголовок и тип значения. Поле Значение имеет составной тип и хранит само значение: строку, число, дату, булево или ссылку на другой объект.

Важно понимать различие между доп реквизитами и доп сведениями. Доп реквизиты хранятся в табличной части самого объекта и доступны в запросе через ИмяТаблицы.ДополнительныеРеквизиты. Доп сведения хранятся в регистре сведений ДополнительныеСведения, и к ним обращаются иначе — через соединение с этим регистром по полю Объект.

Базовый запрос: один доп реквизит через соединение

Самый простой рабочий шаблон — левое соединение основной таблицы с табличной частью. Левое соединение выбирают, чтобы объекты без заполненного реквизита тоже попали в выборку (с пустым значением). Если нужны только объекты с заполненным свойством, используют внутреннее соединение.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Номенклатура,

| ДопРеквизиты.Значение КАК Цвет

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты

| ПО Номенклатура.Ссылка = ДопРеквизиты.Ссылка

| И (ДопРеквизиты.Свойство = &Свойство)";

Запрос.УстановитьПараметр("Свойство", СвойствоЦвет);

Результат = Запрос.Выполнить().Выгрузить();

Ключевой момент — условие ДопРеквизиты.Свойство = &Свойство должно стоять в секции ПО соединения, а не в ГДЕ. Если перенести его в ГДЕ при левом соединении, строки с незаполненным реквизитом будут отброшены, и левое соединение фактически превратится во внутреннее.

Переменная СвойствоЦвет должна содержать ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения. Как её получить — разобрано в следующем разделе.

Порядок действий
  1. 1
    Определите, к какому объекту привязан доп реквизит (справочник или документ)
  2. 2
    Найдите ссылку на свойство в плане видов характеристик ДополнительныеРеквизитыИСведения
  3. 3
    Напишите запрос с левым соединением к табличной части ДополнительныеРеквизиты
  4. 4
    Добавьте условие Свойство = &Свойство в секцию ПО соединения
  5. 5
    Передайте параметр и проверьте результат в консоли запросов

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

По наименованию свойства

Самый распространённый способ — найти элемент плана видов характеристик по наименованию. Это удобно, когда свойство создавалось вручную и его заголовок известен.

СвойствоЦвет = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет");

Запрос.УстановитьПараметр("Свойство", СвойствоЦвет);

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

По имени предопределённого элемента или через свойства менеджера

Если свойство создано в конфигураторе как предопределённое, ссылку получают по имени: ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения["ИмяСвойства"]. В типовых конфигурациях с БСП также есть программный интерфейс модуля УправлениеСвойствами (в старых версиях — УправлениеСвойствамиСлужебный), через который можно получать свойства объектов без ручного поиска.

Для отладки удобно открыть элемент свойства в режиме предприятия и посмотреть его набор: свойство привязывается к конкретному набору доп реквизитов (например, «Справочник Номенклатура»), и в запросе важно использовать именно то свойство, которое входит в набор нужного объекта.

Несколько доп реквизитов в одном запросе

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

ВЫБРАТЬ

Номенклатура.Ссылка КАК Номенклатура,

Цветы.Значение КАК Цвет,

Размеры.Значение КАК Размер

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК Цветы

ПО Номенклатура.Ссылка = Цветы.Ссылка

И (Цветы.Свойство = &СвойствоЦвет)

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК Размеры

ПО Номенклатура.Ссылка = Размеры.Ссылка

И (Размеры.Свойство = &СвойствоРазмер)

Количество соединений стоит держать разумным: каждое соединение — это дополнительная работа СУБД. Если реквизитов больше пяти-семи, иногда выгоднее получить их отдельным запросом с группировкой или переложить задачу на СКД с характеристиками.

Отбор по значению доп реквизита

Доп реквизит можно использовать не только в выборке, но и в условии отбора. Например, выбрать всю номенклатуру красного цвета. Здесь достаточно внутреннего соединения:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Номенклатура

ИЗ

Справочник.Номенклатура КАК Номенклатура

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты

ПО Номенклатура.Ссылка = ДопРеквизиты.Ссылка

И (ДопРеквизиты.Свойство = &Свойство)

И (ДопРеквизиты.Значение = &Значение)

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

Дополнительные сведения: запрос через регистр

Доп сведения устроены иначе: они хранятся в регистре сведений ДополнительныеСведения с измерением Объект и Свойство и ресурсом Значение. Соединение строится по двум полям:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Номенклатура,

Сведения.Значение КАК Производитель

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведения

ПО Номенклатура.Ссылка = Сведения.Объект

И (Сведения.Свойство = &Свойство)

Ошибка новичков — путать табличную часть и регистр: если свойство заведено как доп сведение, запрос к ДополнительныеРеквизиты вернёт пустые значения, и наоборот. Уточнить вид свойства можно в форме «Дополнительные реквизиты и сведения» в настройках объекта.

Сравнение вариантов

Табличная часть ДополнительныеРеквизиты

Для доп реквизитов объекта. Соединение по Ссылка, фильтр по Свойство, значение в поле Значение.

Регистр сведений ДополнительныеСведения

Для доп сведений. Соединение по полю Объект, фильтр по Свойство, значение в ресурсе Значение.

СКД с набором «Характеристики»

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

Вариант для СКД: доп реквизиты без ручных соединений

В отчётах на системе компоновки данных доп свойства можно подключать декларативно. В схеме компоновки на закладке «Характеристики» описывают источник характеристик: тип объекта, таблицу свойств, поля ключа и значения. После этого в настройках отчёта доп реквизит становится доступен как обычное поле через конструкцию вида Ссылка.[Цвет].

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

Перед написанием запроса откройте объект в режиме предприятия и убедитесь, что доп реквизит действительно заполнен хотя бы у нескольких элементов. Пустая табличная часть — самая частая причина «запрос ничего не возвращает», хотя сам запрос написан правильно.
ПЗ
Практическое замечание

Проверка результата и типичные ошибки

Отлаживать такие запросы удобнее всего в консоли запросов: вставить текст, задать параметр свойства и посмотреть выборку. Признак корректного результата — каждая строка объекта встречается один раз, а значение реквизита совпадает с тем, что видно в карточке объекта.

Если в выборке появились дубли строк, почти наверняка в условии соединения пропущен фильтр по Свойство: тогда объект соединяется со всеми строками своей табличной части. Если значения пустые у всех строк — проверьте, что параметр содержит именно ссылку на свойство, а не строку с наименованием, и что свойство относится к нужному набору объекта.

Ещё одна тонкость — составной тип поля Значение. При выгрузке в таблицу значений колонка получит составной тип, и последующие сравнения или сортировки могут вести себя неожиданно. При необходимости приводите значение к конкретному типу функцией ВЫРАЗИТЬ(... КАК ...).

Типичные ошибки
01
Условие по Свойство перенесено в ГДЕ при левом соединении — строки без реквизита теряются
02
Нет фильтра по Свойство в соединении — строки объекта задваиваются по числу его свойств
03
В параметр передана строка с наименованием вместо ссылки на свойство — выборка пустая
04
Запрос обращается к табличной части, хотя свойство заведено как доп сведение в регистре — значения всегда пустые
05
Несколько свойств выбираются одним соединением со списком В — значения разваливаются по разным строкам
Контрольные точки

Как проверить результат

Число строк в выборке
Норма

Совпадает с числом объектов в отборе

Тревожный признак

Строк больше — задвоение из-за соединения без фильтра по Свойство

Значение доп реквизита
Норма

Совпадает с данными карточки объекта

Тревожный признак

Пусто у всех строк — неверный параметр свойства или не тот источник (сведения вместо реквизитов)

Объекты без заполненного реквизита
Норма

Присутствуют с пустым значением при левом соединении

Тревожный признак

Отсутствуют — условие по свойству попало в ГДЕ

Частые вопросы

Можно ли обратиться к доп реквизиту как к обычному полю, без соединения?

Нет. Доп реквизиты не являются полями основной таблицы объекта, поэтому конструкция вида Номенклатура.Цвет в запросе не сработает. Обращение возможно только через соединение с табличной частью ДополнительныеРеквизиты или через механизм характеристик СКД.

Как вывести доп реквизит в динамический список?

В произвольном запросе динамического списка добавьте то же левое соединение с табличной частью ДополнительныеРеквизиты и выведите поле Значение. Учтите, что соединения с табличными частями могут замедлить список на больших объёмах данных.

Чем отличается доп реквизит от доп сведения?

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

Почему запрос возвращает дубли строк?

Почти всегда причина в соединении с табличной частью без условия по полю Свойство: объект соединяется со всеми своими доп реквизитами. Добавьте в секцию ПО условие ДопРеквизиты.Свойство = &Свойство — дубли исчезнут.

Как сделать отбор по значению доп реквизита строкового типа?

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

Работает ли этот подход в запросах к документам?

Да, механизм одинаков: у документа с доп реквизитами есть табличная часть Документ.ИмяДокумента.ДополнительныеРеквизиты, и соединение строится по полю Ссылка точно так же, как для справочника.

Итог

Что важно запомнить

Доп реквизит в запросе 1С получают левым соединением с табличной частью ДополнительныеРеквизиты по полю Ссылка с условием Свойство = &Свойство в секции ПО. Доп сведения берут из регистра ДополнительныеСведения по полю Объект. Для каждого свойства — отдельное соединение, а параметр должен содержать ссылку на элемент плана видов характеристик.