Разработка и Конфигурация · 13 мин
Как получить дополнительный реквизит 1С в запросе
Как получить дополнительный реквизит в запросе 1С: соединение с табличной частью ДополнительныеРеквизиты, параметры видов свойств, примеры кода и типичные ошибки.
Дополнительные реквизиты в 1С хранятся не в основной таблице объекта, а в отдельной табличной части ДополнительныеРеквизиты конкретного справочника или документа. Поэтому обратиться к ним в запросе напрямую, как к обычному полю, нельзя — нужно соединить основную таблицу с табличной частью по ссылке и отфильтровать строки по конкретному виду свойства.
Типичная задача выглядит так: у справочника «Номенклатура» добавлен доп реквизит «Цвет», и его нужно вывести в отчёт или использовать в отборе. Решение — левое соединение с таблицей Справочник.Номенклатура.ДополнительныеРеквизиты, где поле Свойство сравнивается с параметром, а значение берётся из поля Значение.
Ниже разобраны рабочие примеры запросов, способы задать параметр свойства, вариант с несколькими доп реквизитами, альтернатива через схему компоновки данных и частые ошибки, из-за которых запрос возвращает пустой или задвоенный результат.
Где физически хранятся дополнительные реквизиты
Когда в конфигураторе или в режиме предприятия (через «Администрирование — Общие настройки — Дополнительные реквизиты и сведения») объекту добавляют доп реквизит, платформа не меняет структуру основной таблицы. Вместо этого у объекта появляется табличная часть ДополнительныеРеквизиты с колонками Свойство и Значение.
Поле Свойство содержит ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения — именно там описано, что это за реквизит, его заголовок и тип значения. Поле Значение имеет составной тип и хранит само значение: строку, число, дату, булево или ссылку на другой объект.
Важно понимать различие между доп реквизитами и доп сведениями. Доп реквизиты хранятся в табличной части самого объекта и доступны в запросе через ИмяТаблицы.ДополнительныеРеквизиты. Доп сведения хранятся в регистре сведений ДополнительныеСведения, и к ним обращаются иначе — через соединение с этим регистром по полю Объект.
Базовый запрос: один доп реквизит через соединение
Самый простой рабочий шаблон — левое соединение основной таблицы с табличной частью. Левое соединение выбирают, чтобы объекты без заполненного реквизита тоже попали в выборку (с пустым значением). Если нужны только объекты с заполненным свойством, используют внутреннее соединение.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ДопРеквизиты.Значение КАК Цвет
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
| ПО Номенклатура.Ссылка = ДопРеквизиты.Ссылка
| И (ДопРеквизиты.Свойство = &Свойство)";
Запрос.УстановитьПараметр("Свойство", СвойствоЦвет);
Результат = Запрос.Выполнить().Выгрузить();
Ключевой момент — условие ДопРеквизиты.Свойство = &Свойство должно стоять в секции ПО соединения, а не в ГДЕ. Если перенести его в ГДЕ при левом соединении, строки с незаполненным реквизитом будут отброшены, и левое соединение фактически превратится во внутреннее.
Переменная СвойствоЦвет должна содержать ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения. Как её получить — разобрано в следующем разделе.
- 1Определите, к какому объекту привязан доп реквизит (справочник или документ)
- 2Найдите ссылку на свойство в плане видов характеристик ДополнительныеРеквизитыИСведения
- 3Напишите запрос с левым соединением к табличной части ДополнительныеРеквизиты
- 4Добавьте условие Свойство = &Свойство в секцию ПО соединения
- 5Передайте параметр и проверьте результат в консоли запросов
Как получить ссылку на свойство для параметра запроса
По наименованию свойства
Самый распространённый способ — найти элемент плана видов характеристик по наименованию. Это удобно, когда свойство создавалось вручную и его заголовок известен.
СвойствоЦвет = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет");
Запрос.УстановитьПараметр("Свойство", СвойствоЦвет);
Метод ненадёжен, если наименование могут переименовать или если свойств с одинаковым названием несколько (для разных наборов объектов). В таком случае поиск вернёт первый попавшийся элемент, который может относиться к другому виду объектов.
По имени предопределённого элемента или через свойства менеджера
Если свойство создано в конфигураторе как предопределённое, ссылку получают по имени: ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения["ИмяСвойства"]. В типовых конфигурациях с БСП также есть программный интерфейс модуля УправлениеСвойствами (в старых версиях — УправлениеСвойствамиСлужебный), через который можно получать свойства объектов без ручного поиска.
Для отладки удобно открыть элемент свойства в режиме предприятия и посмотреть его набор: свойство привязывается к конкретному набору доп реквизитов (например, «Справочник Номенклатура»), и в запросе важно использовать именно то свойство, которое входит в набор нужного объекта.
Несколько доп реквизитов в одном запросе
Когда нужно вывести два и больше доп реквизитов, для каждого добавляют отдельное соединение с уникальным псевдонимом таблицы. Объединять все свойства одним соединением со списком В (&Свойства) нельзя — тогда одна строка объекта размножится на число свойств, и значения окажутся в разных строках, а не в колонках.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Цветы.Значение КАК Цвет,
Размеры.Значение КАК Размер
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК Цветы
ПО Номенклатура.Ссылка = Цветы.Ссылка
И (Цветы.Свойство = &СвойствоЦвет)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК Размеры
ПО Номенклатура.Ссылка = Размеры.Ссылка
И (Размеры.Свойство = &СвойствоРазмер)
Количество соединений стоит держать разумным: каждое соединение — это дополнительная работа СУБД. Если реквизитов больше пяти-семи, иногда выгоднее получить их отдельным запросом с группировкой или переложить задачу на СКД с характеристиками.
Отбор по значению доп реквизита
Доп реквизит можно использовать не только в выборке, но и в условии отбора. Например, выбрать всю номенклатуру красного цвета. Здесь достаточно внутреннего соединения:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО Номенклатура.Ссылка = ДопРеквизиты.Ссылка
И (ДопРеквизиты.Свойство = &Свойство)
И (ДопРеквизиты.Значение = &Значение)
При сравнении значения учитывайте его тип: если свойство ссылочного типа, параметр должен содержать ссылку соответствующего вида, иначе сравнение не сработает без явного приведения типов.
Дополнительные сведения: запрос через регистр
Доп сведения устроены иначе: они хранятся в регистре сведений ДополнительныеСведения с измерением Объект и Свойство и ресурсом Значение. Соединение строится по двум полям:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Сведения.Значение КАК Производитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведения
ПО Номенклатура.Ссылка = Сведения.Объект
И (Сведения.Свойство = &Свойство)
Ошибка новичков — путать табличную часть и регистр: если свойство заведено как доп сведение, запрос к ДополнительныеРеквизиты вернёт пустые значения, и наоборот. Уточнить вид свойства можно в форме «Дополнительные реквизиты и сведения» в настройках объекта.
Сравнение вариантов
Для доп реквизитов объекта. Соединение по Ссылка, фильтр по Свойство, значение в поле Значение.
Для доп сведений. Соединение по полю Объект, фильтр по Свойство, значение в ресурсе Значение.
Когда отчёт строится на СКД и доп свойства должны подключаться автоматически без ручных соединений. Требует описания характеристик в схеме.
Вариант для СКД: доп реквизиты без ручных соединений
В отчётах на системе компоновки данных доп свойства можно подключать декларативно. В схеме компоновки на закладке «Характеристики» описывают источник характеристик: тип объекта, таблицу свойств, поля ключа и значения. После этого в настройках отчёта доп реквизит становится доступен как обычное поле через конструкцию вида Ссылка.[Цвет].
Этот подход избавляет от ручного написания соединений и автоматически поддерживает произвольный набор свойств, но требует аккуратной настройки схемы и понимания механизма характеристик СКД. Для разового программного запроса проще прямое соединение, для отчёта с пользовательскими настройками — характеристики СКД.
Перед написанием запроса откройте объект в режиме предприятия и убедитесь, что доп реквизит действительно заполнен хотя бы у нескольких элементов. Пустая табличная часть — самая частая причина «запрос ничего не возвращает», хотя сам запрос написан правильно.
Проверка результата и типичные ошибки
Отлаживать такие запросы удобнее всего в консоли запросов: вставить текст, задать параметр свойства и посмотреть выборку. Признак корректного результата — каждая строка объекта встречается один раз, а значение реквизита совпадает с тем, что видно в карточке объекта.
Если в выборке появились дубли строк, почти наверняка в условии соединения пропущен фильтр по Свойство: тогда объект соединяется со всеми строками своей табличной части. Если значения пустые у всех строк — проверьте, что параметр содержит именно ссылку на свойство, а не строку с наименованием, и что свойство относится к нужному набору объекта.
Ещё одна тонкость — составной тип поля Значение. При выгрузке в таблицу значений колонка получит составной тип, и последующие сравнения или сортировки могут вести себя неожиданно. При необходимости приводите значение к конкретному типу функцией ВЫРАЗИТЬ(... КАК ...).
Как проверить результат
Совпадает с числом объектов в отборе
Строк больше — задвоение из-за соединения без фильтра по Свойство
Совпадает с данными карточки объекта
Пусто у всех строк — неверный параметр свойства или не тот источник (сведения вместо реквизитов)
Присутствуют с пустым значением при левом соединении
Отсутствуют — условие по свойству попало в ГДЕ
Частые вопросы
Можно ли обратиться к доп реквизиту как к обычному полю, без соединения?
Нет. Доп реквизиты не являются полями основной таблицы объекта, поэтому конструкция вида Номенклатура.Цвет в запросе не сработает. Обращение возможно только через соединение с табличной частью ДополнительныеРеквизиты или через механизм характеристик СКД.
Как вывести доп реквизит в динамический список?
В произвольном запросе динамического списка добавьте то же левое соединение с табличной частью ДополнительныеРеквизиты и выведите поле Значение. Учтите, что соединения с табличными частями могут замедлить список на больших объёмах данных.
Чем отличается доп реквизит от доп сведения?
Доп реквизит хранится в табличной части самого объекта и отображается на его форме. Доп сведение хранится в регистре сведений ДополнительныеСведения отдельно от объекта. В запросе первое получают через табличную часть, второе — через соединение с регистром по полю Объект.
Почему запрос возвращает дубли строк?
Почти всегда причина в соединении с табличной частью без условия по полю Свойство: объект соединяется со всеми своими доп реквизитами. Добавьте в секцию ПО условие ДопРеквизиты.Свойство = &Свойство — дубли исчезнут.
Как сделать отбор по значению доп реквизита строкового типа?
Используйте внутреннее соединение с табличной частью и добавьте в условие ДопРеквизиты.Значение = &Значение или ПОДОБНО для поиска по подстроке. Помните, что поле Значение составного типа — для строковых операций иногда требуется приведение через ВЫРАЗИТЬ.
Работает ли этот подход в запросах к документам?
Да, механизм одинаков: у документа с доп реквизитами есть табличная часть Документ.ИмяДокумента.ДополнительныеРеквизиты, и соединение строится по полю Ссылка точно так же, как для справочника.
Что важно запомнить
Доп реквизит в запросе 1С получают левым соединением с табличной частью ДополнительныеРеквизиты по полю Ссылка с условием Свойство = &Свойство в секции ПО. Доп сведения берут из регистра ДополнительныеСведения по полю Объект. Для каждого свойства — отдельное соединение, а параметр должен содержать ссылку на элемент плана видов характеристик.