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