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