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

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

Как обратиться к общему реквизиту в 1С

Как обратиться к общему реквизиту в 1С: обращение через точку, запросы, отборы, типовые ошибки и проверка результата. Практические примеры кода для разработчика.

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

Главная особенность, из-за которой возникают вопросы: общий реквизит не существует как отдельное поле у конкретного объекта в явном виде. Он «присоединяется» к объекту через состав, поэтому обращение к нему в коде, запросах и отборах имеет свои нюансы. Ниже разобраны все практические сценарии: чтение и запись через точку, работа в запросах, обращение из расширений и типичные ошибки.

Что такое общий реквизит и где он настраивается

Общие реквизиты находятся в ветке конфигуратора «Общие → Общие реквизиты». У каждого общего реквизита есть свойство «Состав» — именно оно определяет, к каким объектам метаданных реквизит будет добавлен. Для каждого элемента состава можно задать режим использования: «Автоматически» или «Использовать» — в обоих случаях реквизит появится у объекта.

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

Ещё одно важное свойство — «Разделение данных». Оно используется в сервисных (SaaS) решениях и влияет на то, как хранятся данные в разделённых информационных базах. В обычных коробочных конфигурациях это свойство чаще всего не задействовано, но при работе в модели сервиса его нужно учитывать.

Обращение к общему реквизиту в коде через точку

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

// Чтение значения

ТекущаяОрганизация = ДокументОбъект.Организация;

// Запись значения

ДокументОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000001");

// Обращение через ссылку (значение читается из базы)

КомментарийДокумента = ДокументСсылка.Комментарий;

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

Проверка заполненности выполняется стандартной функцией:

Если Не ЗначениеЗаполнено(ДокументОбъект.Организация) Тогда

Сообщить("Не заполнена организация");

КонецЕсли;

Как проверить наличие реквизита у объекта перед обращением

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

Первый — анализ метаданных. Метод Найти() у коллекции реквизитов объекта вернёт реквизит, если он есть (общие реквизиты входят в эту коллекцию):

МетаданныеДокумента = ДокументСсылка.Метаданные();

Если МетаданныеДокумента.Реквизиты.Найти("Организация") <> Неопределено Тогда

Организация = ДокументСсылка.Организация;

КонецЕсли;

Второй способ — проверка состава самого общего реквизита:

ЭлементСостава = Метаданные.ОбщиеРеквизиты.Организация.Состав.Найти(МетаданныеДокумента);

Если ЭлементСостава <> Неопределено

И ЭлементСостава.Использование <> Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.НеИспользовать Тогда

// Реквизит доступен у этого объекта

КонецЕсли;

Обращение к общему реквизиту в запросах

В запросах общий реквизит используется как обычное поле таблицы — по имени, без какого-либо специального синтаксиса:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка,

РеализацияТоваровУслуг.Организация,

РеализацияТоваровУслуг.Комментарий

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

ГДЕ

РеализацияТоваровУслуг.Организация = &Организация

Если запрос обращается к полю, которого нет у таблицы, конструктор запроса и платформа выдадут ошибку «Поле не найдено». Поэтому в универсальных отчётах, где источник данных меняется динамически, текст запроса нужно формировать программно с учётом состава общего реквизита.

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

Типичные ошибки
01
Обращение к общему реквизиту у объекта, который не входит в его состав — ошибка «Поле объекта не обнаружено»
02
Чтение реквизита через точку от ссылки внутри цикла — каждый проход выполняет отдельный запрос к базе и резко замедляет код
03
Поиск общего реквизита только в Метаданные.ОбщиеРеквизиты без проверки состава — реквизит существует в конфигурации, но не у данного объекта
04
Ожидание, что общий реквизит появится в табличной части — общие реквизиты добавляются только в шапку объекта

Общий реквизит в отборах, формах и динамических списках

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

При программной установке отбора в динамическом списке обращение идёт по имени поля:

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = ВыбраннаяОрганизация;

ЭлементОтбора.Использование = Истина;

На форме объекта общий реквизит добавляется как обычный элемент формы, связанный с реквизитом данных. Если конфигурация типовая и реквизит добавлен через расширение или изменение состава — после обновления конфигурации базы данных поле появится в структуре объекта автоматически.

Работа с общими реквизитами в расширениях конфигурации

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

Практическая рекомендация: если нужно добавить поле «Организация» или аналогичное к объектам, где его нет в типовой поставке, безопаснее добавить собственный реквизит конкретного объекта в расширении, чем расширять состав типового общего реквизита. Так меньше риск конфликтов при обновлении и неожиданного появления поля в объектах, где оно не должно участвовать в логике (например, в критериях отбора и разделителях).

Проверка результата после обращения или изменения состава

После изменения состава общего реквизита и обновления конфигурации базы данных проверьте три вещи. Во-первых, откройте форму объекта и убедитесь, что поле видно и заполняется. Во-вторых, выполните простой запрос к этому полю — он не должен выдавать ошибку «Поле не найдено». В-третьих, проверьте типовые механизмы, где реквизит мог неявно участвовать: критерии отбора, журналы документов, отчёты.

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

Контрольные точки

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

Обращение через точку в коде
Норма

Значение читается и записывается без исключений

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

Ошибка «Поле объекта не обнаружено» — объект не в составе реквизита

Запрос к полю
Норма

Запрос выполняется, поле возвращает данные

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

Ошибка «Поле не найдено» в тексте запроса

Форма объекта после изменения состава
Норма

Поле отображается и сохраняется вместе с объектом

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

Поле отсутствует или не сохраняет значение

Итог

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

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

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

Почему возникает ошибка «Поле объекта не обнаружено» при обращении к общему реквизиту?

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

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

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

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

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

Добавляются ли общие реквизиты в табличные части?

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

Как программно узнать, какие объекты входят в состав общего реквизита?

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

Чем общий реквизит отличается от критерия отбора?

Общий реквизит — это физическое поле в таблицах объектов, хранящее данные. Критерий отбора — виртуальный механизм поиска объектов по значению указанных реквизитов, он не добавляет полей. Часто они используются вместе: общий реквизит «Организация» плюс критерий отбора по нему.