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

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

Агрегатный объект в 1С: что это такое и как с ним работать

Агрегатный объект в 1С 7.7: что это, какие виды бывают, как обращаться к атрибутам и методам через точку, типичные ошибки и примеры кода.

Агрегатный объект — это понятие из встроенного языка платформы «1С:Предприятие 7.7». Так называют объект, который создаётся не программно в модуле, а заранее описывается в конфигураторе и существует как единое целое со своим набором атрибутов (данных) и методов (действий). Документ, справочник, журнал расчётов, перечисление, отчёт — всё это агрегатные объекты, у каждого свой предопределённый состав полей и поведение.

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

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

Чем агрегатный объект отличается от обычной переменной

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

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

Второе отличие — способ доступа к данным. Значение простой переменной читается напрямую, а данные агрегатного объекта — только через точку: Спр.Наименование, Док.НомерДок. Попытка присвоить объект целиком в число или строку приведёт к ошибке типа.

Какие виды агрегатных объектов существуют

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

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

У каждого вида свой набор предопределённых атрибутов и методов. Например, у документа есть методы Записать(), Провести(), ВыбратьСтроки(), а у справочника — НайтиПоКоду(), ВыбратьЭлементы(). Общий список методов конкретного типа смотрят в синтакс-помощнике конфигуратора.

Как создать экземпляр и обратиться к данным

Стандартный способ получить объект в модуле — функция СоздатьОбъект(). Она возвращает ссылку на экземпляр указанного типа, с которым дальше работают через точку. Типичный фрагмент кода выглядит так:

Спр = СоздатьОбъект("Справочник.Контрагенты");

Если Спр.НайтиПоНаименованию("ООО Ромашка", 0, 1) = 1 Тогда

Сообщить("Найден: " + Спр.Наименование + ", ИНН: " + Спр.ИНН);

Иначе

Сообщить("Контрагент не найден");

КонецЕсли;

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

Для документов логика аналогична: Док.НайтиДокумент() или выборка через Док.ВыбратьДокументы() с циклом Пока Док.ПолучитьДокумент() = 1 Цикл. Внутри цикла доступны реквизиты шапки и табличной части текущего документа.

Порядок работы с агрегатным объектом
  1. 1
    Создайте экземпляр: Объект = СоздатьОбъект("Справочник.Имя")
  2. 2
    Спозиционируйте объект поиском или выборкой (НайтиПоКоду, ВыбратьЭлементы)
  3. 3
    Проверьте результат поиска: метод вернул 1 — объект на позиции
  4. 4
    Читайте или меняйте атрибуты через точку: Объект.Реквизит
  5. 5
    При изменении данных вызовите Записать() или Провести()
  6. 6
    Проверьте результат в интерфейсе или повторной выборкой

Контекст формы и предопределённые процедуры

Когда код выполняется в модуле формы документа или элемента справочника, отдельный вызов СоздатьОбъект() не нужен: сам объект доступен через контекст формы. Реквизиты текущего документа читаются напрямую по имени, а к табличной части обращаются методами ПолучитьСтроку(), НоваяСтрока().

Для агрегатных объектов в конфигураторе задаются предопределённые процедуры — обработчики событий: ПриЗаписи(), ОбработкаПроведения(), ВводНового() и другие. Система вызывает их автоматически при соответствующем действии пользователя или программы. Внутри такой процедуры доступен контекст объекта, включая его атрибуты и методы.

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

Типичные ошибки при работе с агрегатными объектами

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

Типичные ошибки
01
Чтение реквизитов до позиционирования объекта — атрибуты пустые, отчёт выводит нули
02
Обращение к несуществующему реквизиту — ошибка исполнения «Поле агрегатного объекта не обнаружено»
03
Изменение объекта без Записать() — данные теряются при закрытии модуля
04
Создание объекта внутри цикла выборки — лишние обращения и замедление работы
05
Путаница между контекстом формы и СоздатьОбъект() — изменения не видны в открытой форме
06
Попытка провести документ без проверки результата Провести() — проведение молча не выполнено

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

Ещё одна группа ошибок — работа с периодическими реквизитами справочников. Их значение зависит от даты, поэтому читать такой реквизит нужно через Получить(Дата) или при установленной дате выборки, иначе получите значение на непредсказуемый момент.

Как проверить, что код отработал правильно

После любой операции с агрегатным объектом результат стоит проверять, а не предполагать. Методы поиска и записи возвращают числовой код: 1 — успех, 0 — неудача. Игнорирование этого кода — прямой путь к скрытым сбоям.

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

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

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

Метод вернул 1, объект спозиционирован или записан

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

Возвращён 0 — объект не найден или запись не выполнена

Значения реквизитов после поиска
Норма

Реквизиты содержат данные найденного элемента

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

Пустые значения — объект не спозиционирован

Проведение документа
Норма

Провести() вернул 1, документ отмечен как проведённый

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

Документ остался непроведённым, движения не созданы

Видимость изменений в интерфейсе
Норма

После Записать() данные видны в списке и форме элемента

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

Изменения есть в коде, но не отображаются — объект не записан

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

Агрегатные объекты в 1С 8.x: что изменилось

В платформе 8.x термин «агрегатный объект» ушёл из документации, но концепция сохранилась в виде прикладных объектов: справочников, документов, регистров, планов счетов и других. Главное отличие в механике доступа: вместо единого СоздатьОбъект() появились менеджеры объектов (Справочники.Номенклатура, Документы.РеализацияТоваров), а работа разделена на объекты (для изменения) и ссылки (для чтения).

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

Подходы в разных версиях

1С 7.7

СоздатьОбъект("Вид.Имя"), доступ через точку, предопределённые процедуры в модуле объекта

1С 8.x

Менеджеры объектов, разделение на ссылку и объект, обработчики событий, запросы для выборки

Внешние компоненты и COM

Доступ к объектам 7.7 извне через OLE — только для интеграций, медленно и требует установленной платформы

Часто задаваемые вопросы

Что означает ошибка «Поле агрегатного объекта не обнаружено»?

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

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

В терминологии 7.7 атрибут — это любое именованное данное агрегатного объекта, включая системные поля (код, наименование, номер, дату). Реквизит — атрибут, который разработчик добавил в конфигураторе сам. В версии 8.x слово «атрибут» почти не используется, говорят «реквизит» и «стандартный реквизит».

Можно ли создать агрегатный объект, не описанный в конфигураторе?

Нет. Тип объекта должен существовать в метаданных конфигурации. Программно создаётся только экземпляр уже описанного типа. Исключение — вспомогательные типы встроенного языка (СписокЗначений, ТаблицаЗначений, Текст), которые не требуют описания в конфигураторе.

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

Присвоение значения атрибуту меняет объект только в памяти. Чтобы изменения попали в базу, нужно вызвать Записать() (для справочника или документа) либо Провести() для проведения документа. Также проверьте, что метод вернул 1 — запись могла быть отклонена, например, из-за длины поля или прав доступа.

Как перебрать все элементы справочника?

Используйте выборку: Спр.ВыбратьЭлементы(), затем цикл Пока Спр.ПолучитьЭлемент() = 1 Цикл ... КонецЦикла;. Внутри цикла объект спозиционирован на очередном элементе, и его реквизиты доступны через точку. Для подчинённых справочников предварительно установите владельца методом ИспользоватьВладельца().

Актуальны ли знания об агрегатных объектах сейчас?

Да, если вы сопровождаете конфигурации на платформе 7.7, читаете старый код или переносите данные и логику на 8.x. Сама концепция «объект с заданной в конфигураторе структурой» лежит в основе платформы и в современных версиях, меняется только синтаксис доступа.

Итог

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

Агрегатный объект — это объект метаданных 1С 7.7 с фиксированным набором атрибутов и методов. Работа строится по схеме: создать экземпляр, спозиционировать, прочитать или изменить атрибуты, записать и проверить код возврата. Большинство ошибок связано с чтением данных до позиционирования и с пропущенным вызовом Записать().