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