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

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

1С: как вызвать из менеджера объекта

Как в 1С вызвать методы из менеджера объекта: СправочникиМенеджер, ДокументыМенеджер, ОбработкиМенеджер. Синтаксис, примеры кода, типичные ошибки.

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

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

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

Что такое менеджер объекта и какие менеджеры существуют

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

Для каждого типа метаданных существует своя коллекция менеджеров:

  • Справочники — менеджеры справочников;
  • Документы — менеджеры документов;
  • Перечисления — менеджеры перечислений;
  • ПланыВидовХарактеристик, ПланыСчетов, ПланыВидовРасчета — менеджеры планов;
  • РегистрыСведений, РегистрыНакопления, РегистрыБухгалтерии, РегистрыРасчета — менеджеры регистров;
  • Обработки и Отчеты — менеджеры обработок и отчётов;
  • БизнесПроцессы и Задачи — менеджеры бизнес-процессов и задач;
  • Константы — менеджер констант (набор и отдельные значения).

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

Базовый синтаксис вызова из менеджера

Общая форма вызова выглядит так:

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

Результат = Справочники.Номенклатура.НайтиПоНаименованию("Кирпич");

Менеджер можно присвоить переменной и вызывать методы через неё — это удобно, когда имя объекта вычисляется динамически:

ИмяСправочника = "Номенклатура";

Менеджер = Справочники[ИмяСправочника];

Ссылка = Менеджер.НайтиПоКоду("000001");

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

Основные методы менеджеров справочников и документов

Набор методов зависит от типа объекта. Для справочников наиболее востребованы:

  • НайтиПоКоду(Код) — поиск по коду, возвращает ссылку или пустую ссылку;
  • НайтиПоНаименованию(Наименование, ТочноеСоответствие) — поиск по наименованию;
  • НайтиПоРеквизиту(ИмяРеквизита, Значение) — поиск по значению реквизита;
  • СоздатьЭлемент() / СоздатьГруппу() — создание нового объекта;
  • ПолучитьСсылку(УникальныйИдентификатор) — ссылка по GUID;
  • ПустаяСсылка() — пустая ссылка для сравнений;
  • Выбрать(Родитель, Владелец, Отбор) — выборка элементов с обходом в цикле.

Для документов аналогично доступны НайтиПоНомеру(Номер, Дата), СоздатьДокумент(), ПолучитьСсылку(), Выбрать(). Пример типового вызова создания и записи:

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Дата = ТекущаяДатаСеанса();

НовыйДокумент.Заполнить(ДанныеЗаполнения);

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

Для перечислений менеджер используется для доступа к значениям: Перечисления.СтавкиНДС.НДС20, а также для получения пустой ссылки и обхода значений через метаданные.

bsl
Ссылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7707083893");
Если Ссылка.Пустая() Тогда
    НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
    НовыйКонтрагент.Наименование = "ООО Ромашка";
    НовыйКонтрагент.Записать();
КонецЕсли;

Как вызвать собственную функцию из модуля менеджера

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

В модуле менеджера объявите экспортную функцию:

Функция НайтиПоИНН(ИНН) Экспорт

Возврат Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);

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

Вызов из любого места кода — через менеджер:

Контрагент = Справочники.Контрагенты.НайтиПоИНН("7707083893");

Ключевое слово Экспорт обязательно: без него метод будет доступен только внутри самого модуля менеджера. Модуль менеджера выполняется на сервере, поэтому в нём нельзя использовать клиентские методы (предупреждения, диалоги, работу с формами).

Порядок добавления своего метода в менеджер
  1. 1
    Откройте конфигуратор, найдите объект (например, справочник Контрагенты)
  2. 2
    Через контекстное меню откройте «Модуль менеджера»
  3. 3
    Добавьте функцию или процедуру с ключевым словом Экспорт
  4. 4
    Обновите конфигурацию базы данных (F7)
  5. 5
    Вызовите метод через менеджер: Справочники.Контрагенты.ВашМетод()
  6. 6
    Проверьте результат в отладчике или через Сообщить()

Вызов менеджеров регистров, обработок и отчётов

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

Менеджеры обработок и отчётов нужны в первую очередь для создания экземпляра объекта:

ОбработкаОбъект = Обработки.ЗагрузкаДанныхИзФайла.Создать();

ОбработкаОбъект.ВыполнитьЗагрузку(ПараметрыЗагрузки);

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

Как получить данные: менеджер или запрос

Методы менеджера (НайтиПоКоду, Выбрать)

Подходят для поиска одного элемента по индексированному полю и простых обходов. Код короче, но массовые операции выполняются медленнее

Запрос (Запрос.Выполнить)

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

ПолучитьСсылку по GUID

Единственный быстрый способ получить ссылку, когда известен уникальный идентификатор, например при обмене данными

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

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

Вторая группа ошибок связана с контекстом выполнения. Вызов СоздатьЭлемент() или Записать() в клиентской процедуре тонкого клиента приводит к ошибке — такие операции выполняются только на сервере. Признак проблемы: код работает в толстом клиенте и падает в тонком.

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

Типичные ошибки
01
Метод объявлен без Экспорт — вызов через менеджер завершается ошибкой «Метод не обнаружен»
02
Код с вызовом менеджера размещён в клиентской процедуре тонкого клиента — ошибка недоступности метода
03
Изменён модуль менеджера, но конфигурация БД не обновлена — выполняется старая версия кода
04
Поиск НайтиПоНаименованию без флага точного соответствия возвращает не тот элемент при частичном совпадении
05
Проверка результата поиска через Неопределено вместо Ссылка.Пустая() — методы поиска возвращают пустую ссылку, а не Неопределено

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

Методы поиска (НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту) при отсутствии результата возвращают пустую ссылку, а не Неопределено. Корректная проверка:

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

// элемент не найден

КонецЕсли;

Для отладки вызовов менеджера используйте точки останова в модуле менеджера — отладчик останавливается в нём так же, как в любом другом модуле. Если точка останова «не срабатывает», чаще всего выполняется другая версия кода (не обновлена конфигурация БД) или вызов идёт в другом соединении/фоновом задании, которое не подключено к отладке.

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

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

Как проверить корректность вызова

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

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

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

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

Доступность метода
Норма

Код компилируется и выполняется без ошибок

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

«Метод объекта не обнаружен» — проверьте Экспорт, имя объекта и обновление конфигурации БД

Контекст выполнения
Норма

Код работает и в тонком клиенте через серверный вызов

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

Ошибка только в тонком/веб-клиенте — серверный метод вызван в клиентском контексте

FAQ

Чем модуль менеджера отличается от модуля объекта?

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

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

Да. Используйте обращение через квадратные скобки: Справочники[ИмяСтрокой].НайтиПоКоду(Код). Перед вызовом полезно проверить существование объекта через Метаданные.Справочники.Найти(ИмяСтрокой) — это защитит от ошибки выполнения при опечатке.

Почему НайтиПоКоду не находит элемент, который точно есть?

Частые причины: поиск по коду учитывает длину и ведущие нули — передавайте код в том же формате, что хранится в базе; элемент находится в другой группе при иерархическом поиске с указанным родителем; код является числом, а передана строка (или наоборот). Проверьте тип и значение параметра в отладчике.

Как вызвать метод менеджера из формы в тонком клиенте?

Напрямую из клиентской процедуры — никак. Создайте в модуле формы серверную процедуру с директивой &НаСервере или &НаСервереБезКонтекста, поместите вызов менеджера туда, а из клиентской процедуры вызовите эту серверную. Для &НаСервереБезКонтекста передавайте данные через параметры, так как реквизиты формы там недоступны.

Что быстрее: НайтиПоРеквизиту или запрос?

Для поиска одного элемента по индексированному реквизиту разница практически незаметна, и НайтиПоРеквизиту короче в коде. Для поиска по неиндексированному полю и для массовых выборок запрос предпочтительнее: он выполняется одним обращением к СУБД, тогда как цикл с вызовами менеджера порождает множество отдельных обращений.

Можно ли добавить свой метод в менеджер перечисления или константы?

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

Итог

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

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