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

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

Что такое менеджер объекта в 1С и как с ним работать

Разбираем, что такое менеджер объекта в 1С: свойства, методы, примеры кода, отличия от других механизмов платформы и типичные ошибки разработчиков.

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

Обратиться к менеджеру объекта можно через коллекции глобального контекста: Справочники, Документы, ПланыВидовХарактеристик, РегистрыСведений, Обработки и другие. Например, выражение Справочники.Номенклатура возвращает именно менеджер справочника «Номенклатура», а не ссылку на конкретный товар и не таблицу с данными.

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

Зачем нужен менеджер объекта и чем он отличается от ссылки и объекта

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

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

Основные свойства и методы менеджера

Набор методов зависит от типа объекта конфигурации. У справочников доступны СоздатьЭлемент(), СоздатьГруппу(), НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), ПолучитьСсылку(), Выбрать(), ВыбратьИерархически(), ПустаяСсылка(). У документов — СоздатьДокумент(), НайтиПоНомеру(), ПолучитьСсылку(), Выбрать(). У регистров сведений менеджер предоставляет методы для работы с наборами записей и менеджерами записи: СоздатьНаборЗаписей(), СоздатьМенеджерЗаписи(), Получить(), Выбрать().

Типичный пример использования менеджера справочника для поиска и создания элемента выглядит так:

Менеджер = Справочники.Номенклатура;

СсылкаНаТовар = Менеджер.НайтиПоНаименованию("Кабель ВВГ 3х2.5", Истина);

Если СсылкаНаТовар.Пустая() Тогда

НовыйЭлемент = Менеджер.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Кабель ВВГ 3х2.5";

НовыйЭлемент.Записать();

СсылкаНаТовар = НовыйЭлемент.Ссылка;

КонецЕсли;

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

Модуль менеджера: где размещать собственный код

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

Например, функцию получения цены товара логично разместить в модуле менеджера справочника «Номенклатура»:

// Модуль менеджера справочника Номенклатура

Функция ПолучитьЦену(ТоварСсылка, ДатаЦены) Экспорт

// запрос к регистру сведений с ценами

// ...

Возврат Цена;

КонецФункции

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

Типовые сценарии использования менеджера

Получение пустой ссылки и проверка заполненности

Метод ПустаяСсылка() возвращает специальное значение — пустую ссылку соответствующего типа. Оно используется для сравнения: Если Реквизит = Справочники.Контрагенты.ПустаяСсылка() Тогда .... Это надёжнее, чем сравнение с Неопределено, потому что типизированный реквизит хранит именно пустую ссылку своего типа, а не Неопределено.

Получение ссылки по уникальному идентификатору

Метод ПолучитьСсылку(УникальныйИдентификатор) позволяет восстановить ссылку по GUID. Это незаменимо при обменах данными между базами, где ссылки передаются строковым представлением идентификатора. Если записи с таким идентификатором в базе нет, метод вернёт ссылку на несуществующий объект — так называемую «битую ссылку», что нужно учитывать при проверках.

Выборка данных без запроса

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

Сравнение вариантов

Методы поиска менеджера (НайтиПоКоду и др.)

Подходят для точечного поиска одного элемента по индексированным полям. Ограничение: ищут только по точному совпадению и не дают гибких условий.

Выборка через Выбрать()

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

Запрос (ВЫБРАТЬ ...)

Оптимален для сложных отборов, соединений и больших объёмов. Требует написания текста запроса и работы с результатом.

Менеджер объекта и права доступа

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

Когда требуется выполнить операцию независимо от прав текущего пользователя (например, служебную запись в журнал), используется конструкция УстановитьПривилегированныйРежим(Истина). Её следует применять осознанно и только для строго ограниченных операций: привилегированный режим отключает проверку прав целиком, включая ограничения доступа на уровне записей (RLS), и при неосторожном использовании создаёт дыру в безопасности.

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

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

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

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

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

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

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

Во-вторых, проверьте поведение на граничных случаях: элемент не найден, дубли наименований (поиск вернёт первый попавшийся), помеченные на удаление записи (методы поиска их не исключают). В-третьих, убедитесь, что запись реально происходит: после Записать() объект имеет заполненную ссылку и попадает в базу, что видно в форме списка.

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

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

Результат метода поиска
Норма

Возвращена непустая ссылка, Ссылка.Пустая() = Ложь

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

Пустая ссылка — элемент не найден, обращение к реквизитам даст значения по умолчанию

Запись нового элемента
Норма

После Записать() у объекта заполнено свойство Ссылка, элемент виден в списке

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

Исключение при записи или элемент не появляется — проверьте права и обработчики проверки заполнения

Вызов экспортного метода из модуля менеджера
Норма

Метод доступен как Справочники.Имя.ИмяМетода() и выполняется на сервере

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

Ошибка «Метод объекта не обнаружен» — забыто ключевое слово Экспорт или метод в другом модуле

FAQ

Чем менеджер объекта отличается от менеджера записи регистра сведений?

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

Можно ли вызвать метод модуля менеджера с клиента?

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

Почему НайтиПоНаименованию() не находит элемент, хотя он есть в базе?

Чаще всего причины такие: поиск идёт по точному совпадению с учётом регистра и пробелов, элемент помечен на удаление или находится в другой группе при иерархическом поиске с указанным родителем, либо у текущего пользователя нет прав на чтение этого элемента. Проверьте точную строку и права.

Что быстрее: НайтиПоКоду() или запрос?

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

Где посмотреть полный список методов менеджера конкретного объекта?

В конфигураторе откройте синтакс-помощник и найдите раздел, соответствующий типу объекта: например, «СправочникМенеджер.<имя>» для справочников. Там перечислены все методы с параметрами и описанием возвращаемых значений, включая отличия между типами объектов.

Нужно ли получать менеджер, чтобы просто прочитать реквизит по ссылке?

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

Итог

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

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