Как устроены менеджеры объектов 1С 8.3 и когда их вызывать в коде

· 9 мин

Содержание

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

Где применяется менеджер объекта: в серверном коде, в модулях объектов и в общих модулях, а ещё в собственном модуле менеджера, куда кладут процедуры, которые относятся ко всему виду, а не к одному экземпляру. Как он работает и чем отличается от объекта и ссылки — ниже, с примерами для 1С:Предприятие 8.3.

Менеджер, объект и ссылка: в чём разница

Новичков путают три похожих понятия. На примере справочника «Номенклатура» разница такая:

ЧтоТипКак получитьДля чего
МенеджерСправочникМенеджер.НоменклатураСправочники.НоменклатураСоздать, найти, выбрать, получить форму
СсылкаСправочникСсылка.НоменклатураНайтиПоКоду(), реквизит другого объектаХранить и передавать «указатель» на элемент, читать реквизиты
ОбъектСправочникОбъект.НоменклатураСсылка.ПолучитьОбъект(), СоздатьЭлемент()Изменить реквизиты и записать

Аналогия простая. Менеджер — это картотека целиком. Ссылка — номер карточки. Объект — карточка, вынутая из ящика для правки.

Отсюда главные правила:

  • 📂 Менеджер один на вид объекта. Он существует всегда, пока работает сеанс.
  • 🔗 Ссылок и объектов столько, сколько записей в базе.
  • ✏️ Записать изменения можно только через объект: Объект.Записать(). У менеджера метода Записать() нет (исключение — константы, о них ниже).
  • ⚡ Ссылка не хранит данные в памяти, а объект загружает запись целиком, со всеми табличными частями. Это дорого.

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

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

У каждой ветки дерева конфигурации есть своё свойство глобального контекста — коллекция менеджеров. Обращение к ней по имени объекта и даёт менеджер.

КоллекцияПример обращенияТип менеджера
СправочникиСправочники.КонтрагентыСправочникМенеджер
ДокументыДокументы.РеализацияТоваровУслугДокументМенеджер
ПеречисленияПеречисления.ВидыОперацийПеречислениеМенеджер
КонстантыКонстанты.ОсновнаяВалютаКонстантаМенеджер
РегистрыСведенийРегистрыСведений.КурсыВалютРегистрСведенийМенеджер
РегистрыНакопленияРегистрыНакопления.<Имя>РегистрНакопленияМенеджер
РегистрыБухгалтерииРегистрыБухгалтерии.ХозрасчетныйРегистрБухгалтерииМенеджер
ПланыСчетовПланыСчетов.ХозрасчетныйПланСчетовМенеджер
ПланыВидовХарактеристикПланыВидовХарактеристик.<Имя>ПланВидовХарактеристикМенеджер
ПланыОбменаПланыОбмена.<Имя>ПланОбменаМенеджер
Отчеты, ОбработкиОбработки.<Имя>ОтчетМенеджер, ОбработкаМенеджер
БизнесПроцессы, ЗадачиЗадачи.<Имя>БизнесПроцессМенеджер, ЗадачаМенеджер

Ещё есть менеджеры журналов документов, регистров расчёта, планов видов расчёта, последовательностей. Набор методов у каждого свой: у регистра накопления есть Остатки(), у справочника его нет и быть не может.

Имена справочников и регистров в примерах этой таблицы зависят от конфигурации. Хозрасчетный и КурсыВалют есть в Бухгалтерии предприятия, в другой базе имена будут свои — смотрите дерево метаданных в Конфигураторе.

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

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

Справочники и планы видов характеристик

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

Документы

  • СоздатьДокумент() — новый документ.
  • НайтиПоНомеру(Номер, ДатаИнтервала) — номер документа уникален в пределах периодичности, поэтому вторым параметром передают дату из нужного интервала.
  • Выбрать(ДатаНачала, ДатаОкончания) — выборка документов за период.

Регистры

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

Перечисления и константы

У менеджера перечисления нет методов поиска: значения берут как свойства — Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо. Менеджер константы умеет читать и писать сразу: Константы.ОсновнаяВалюта.Получить() и Константы.ОсновнаяВалюта.Установить(Значение).

Отчёты и обработки

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

Как получить менеджер объекта в коде

Прямое обращение по имени

Самый частый и самый быстрый способ — написать имя прямо в коде:

НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = "Бумага офисная А4";
НоваяНоменклатура.Записать();

Плюс — проверка при синтаксическом контроле. Если объекта с таким именем нет, Конфигуратор сообщит об ошибке ещё до запуска.

По имени в строке

Когда вид объекта становится известен только во время работы, к коллекции обращаются через квадратные скобки:

ИмяСправочника = "Контрагенты";
Менеджер = Справочники[ИмяСправочника];
Ссылка = Менеджер.НайтиПоКоду("00-000001");

Минус — опечатку в строке компилятор не поймает. Ошибка всплывёт только при выполнении.

По полному имени объекта метаданных

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

Функция МенеджерПоПолномуИмени(ПолноеИмя)

	Части = СтрРазделить(ПолноеИмя, ".");
	Класс = ВРег(Части[0]);
	Имя = Части[1];

	Если Класс = "СПРАВОЧНИК" Тогда
		Возврат Справочники[Имя];
	ИначеЕсли Класс = "ДОКУМЕНТ" Тогда
		Возврат Документы[Имя];
	ИначеЕсли Класс = "РЕГИСТРСВЕДЕНИЙ" Тогда
		Возврат РегистрыСведений[Имя];
	ИначеЕсли Класс = "РЕГИСТРНАКОПЛЕНИЯ" Тогда
		Возврат РегистрыНакопления[Имя];
	КонецЕсли;

	ВызватьИсключение СтрШаблон("Неизвестный вид объекта: %1", ПолноеИмя);

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

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

Почему менеджер не виден на клиенте

Коллекции Справочники, Документы и остальные доступны на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте их нет. Строка Справочники.Номенклатура.ПустаяСсылка() в процедуре с директивой &НаКлиенте даст ошибку вида Переменная не определена (Справочники).

Что делать на клиенте:

  1. Для предопределённых элементов и значений перечислений — ПредопределенноеЗначение("Перечисление.ВидыОпераций.Поступление").
  2. Для поиска, создания и выборки — вынести код в процедуру формы с директивой &НаСервере или &НаСервереБезКонтекста.
  3. Для повторяющейся логики — общий модуль с флажками «Сервер» и «Вызов сервера».

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

С версии 8.2 у каждого прикладного объекта есть модуль менеджера. Экспортные процедуры и функции из него вызывают через менеджер: Справочники.Номенклатура.ИмяФункции().

Правило выбора модуля простое:

  • 🧩 Логика про один экземпляр (проверить заполнение, обработать перед записью) — модуль объекта.
  • 📚 Логика про весь вид (найти по артикулу, подготовить печать, массово заполнить) — модуль менеджера.
  • 🌐 Логика, которая касается нескольких видов объектов, — общий модуль.

Пример 1. Своя функция поиска в модуле менеджера

В модуле менеджера справочника «Номенклатура»:

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

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Номенклатура.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Артикул = &Артикул
	|	И НЕ Номенклатура.ПометкаУдаления";
	Запрос.УстановитьПараметр("Артикул", Артикул);

	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;

	Возврат ПустаяСсылка();

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

Вызов из любого серверного кода: Товар = Справочники.Номенклатура.НайтиПоАртикулу("А-1205");. Внутри модуля менеджера к методам самого менеджера обращаются без префикса — поэтому ПустаяСсылка() написана без Справочники.Номенклатура.

Пример 2. Курс валюты на дату

Отбор = Новый Структура("Валюта", Валюта);
Данные = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);
Курс = Данные.Курс;
Кратность = Данные.Кратность;

ПолучитьПоследнее() возвращает структуру с ресурсами регистра. Если курса нет, ресурсы будут нулевыми — проверьте Кратность перед делением.

Пример 3. Документ по номеру и дате

Документ = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("0000-000045", Дата(2026, 3, 1));
Если Документ.Пустая() Тогда
	Сообщить("Документ не найден");
КонецЕсли;

Дата здесь задаёт интервал, в котором уникален номер. При годовой периодичности номеров подойдёт любая дата нужного года.

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

Кроме своих функций, модуль менеджера принимает события платформы. Самые полезные:

  • ОбработкаПолученияДанныхВыбора — что показывать в выпадающем списке поля ввода при наборе текста. Через неё делают поиск по артикулу или ИНН прямо в поле.
  • ОбработкаПолученияФормы — подмена открываемой формы по условию.

Менеджеры объектов в типовых конфигурациях

Бухгалтерия предприятия 3.0, ЗУП 3.1, Управление торговлей 11 построены на БСП. Если открыть модуль менеджера почти любого документа, вы увидите одну и ту же разметку областями:

  • ПрограммныйИнтерфейс — экспортные методы, которые можно вызывать снаружи;
  • СлужебныйПрограммныйИнтерфейс — экспортные методы для подсистем БСП;
  • ОбработчикиСобытий — события платформы;
  • СлужебныеПроцедурыИФункции — внутренняя кухня.

Что обычно лежит в модуле менеджера типового документа:

  • 🖨️ процедура ДобавитьКомандыПечати и функции формирования печатных форм;
  • 🔄 обработчики обновления информационной базы, которые переводят данные на новую структуру после обновления релиза;
  • 🧾 подготовка данных для проведения: тексты запросов, по которым потом формируются движения;
  • ✅ функции для подсистемы групповой обработки реквизитов.

Править модуль менеджера типового объекта напрямую — значит снять конфигурацию с полной поддержки и усложнить каждое обновление. Свою логику добавляйте через расширение конфигурации (появились в 8.3.6): в расширении можно заимствовать объект и дополнить его модуль менеджера.

Если нужно понять, откуда берётся печатная форма или кто заполняет реквизит, ищите не только в модуле объекта, но и в модуле менеджера. Глобальный поиск в Конфигураторе — Правка → Глобальный поиск (Ctrl+Shift+F).

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

1. ПолучитьОбъект() ради чтения одного реквизита. Загружается вся запись с табличными частями. Для чтения хватит обращения через ссылку или запроса. Объект нужен только для записи.

2. Выбрать() без отбора в цикле по большой таблице. Обход 200 000 элементов справочника с проверкой условия в коде работает в разы медленнее, чем запрос с условием ГДЕ. Для фильтрации используйте запрос.

3. Поиск по наименованию как по ключу. Наименования не уникальны. НайтиПоНаименованию() вернёт первый попавшийся элемент из нескольких одноимённых — и это не обязательно нужный.

4. Неверный тип кода. Если у справочника строковый код длиной 9, то НайтиПоКоду(45) ничего не найдёт. Передавайте код в том виде, в каком он хранится, с ведущими нулями и префиксом.

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

6. НайтиПоРеквизиту() по реквизиту табличной части. Метод ищет только по реквизитам шапки. Для табличной части нужен запрос.

7. Обращение к менеджеру на клиенте. Ошибка Переменная не определена — признак того, что код с менеджером оказался в клиентской процедуре.

Проверьте себя
Где взять ссылку на элемент справочника по коду?
Что вернёт НайтиПоКоду(), если элемент не найден?
Куда положить функцию «найти товар по артикулу», которую вызывают из разных мест?
Можно ли вызвать Справочники.Номенклатура в процедуре &НаКлиенте тонкого клиента?

Чем заменить менеджер объекта

Менеджер — не единственный способ добраться до данных. Иногда другой инструмент проще и быстрее.

ЗадачаВместо менеджераКогда лучше
Выбрать записи по условиюНовый ЗапросПочти всегда при отборе и соединениях
Прочитать 2–3 реквизита по ссылкеОбщегоНазначения.ЗначенияРеквизитовОбъекта() (БСП)Читает только нужные поля, без загрузки объекта
Получить предопределённое значение на клиентеПредопределенноеЗначение()Клиентский код управляемой формы
Остатки на дату с отбором по нескольким измерениямЗапрос к виртуальной таблице ОстаткиНужны соединения со справочниками
Изменить реквизит одного элементаСсылка.ПолучитьОбъект()Только этот путь, менеджер не пишет данные

Менеджер незаменим там, где нужно создать новый объект, получить форму или макет, вызвать метод модуля менеджера или работать с видом объекта по имени из строки. Для чтения данных пакетом удобнее запрос.

Частые вопросы

Можно ли создать менеджер объекта самому через Новый?
Нет. Менеджеры создаёт платформа для каждого объекта метаданных. Их получают только через коллекции глобального контекста: Справочники, Документы, РегистрыСведений и другие.
Есть ли менеджер у внешней обработки?
Нет. Внешнюю обработку подключают через ВнешниеОбработки.Создать(ИмяФайла) и работают с её объектом. Модуля менеджера у неё нет.
Можно ли из модуля менеджера обратиться к реквизитам объекта?
Напрямую нет: модуль менеджера не связан с конкретным экземпляром. Передайте ссылку или объект параметром функции.
Чем модуль менеджера лучше общего модуля?
Код лежит рядом с объектом и вызывается через его имя: Документы.Счет.Печать(). Так проще найти логику и меньше общих модулей-свалок.
Работают ли менеджеры во внешнем соединении и COM?
Да. Во внешнем соединении доступны те же коллекции: Соединение.Справочники.Номенклатура.НайтиПоКоду("00001"). Экспортные методы модуля менеджера тоже вызываются, если код модуля не закрыт инструкциями препроцессора от внешнего соединения.