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