Как устроены менеджеры объектов 1С 8.3 и когда их вызывать в коде
Содержание
Менеджер объекта в 1С — это программная «точка входа» в целый вид объектов метаданных: справочник, документ, регистр. Через него не правят конкретную запись, а работают с видом целиком: создают новый элемент (Справочники.Номенклатура.СоздатьЭлемент()), ищут (НайтиПоКоду()), выбирают все записи (Выбрать()), получают пустую ссылку, форму или макет. Каждый прикладной объект конфигурации автоматически получает свой менеджер, разработчику его создавать не нужно.
Где применяется менеджер объекта: в серверном коде, в модулях объектов и в общих модулях, а ещё в собственном модуле менеджера, куда кладут процедуры, которые относятся ко всему виду, а не к одному экземпляру. Как он работает и чем отличается от объекта и ссылки — ниже, с примерами для 1С:Предприятие 8.3.
Менеджер, объект и ссылка: в чём разница
Новичков путают три похожих понятия. На примере справочника «Номенклатура» разница такая:
| Что | Тип | Как получить | Для чего |
|---|---|---|---|
| Менеджер | СправочникМенеджер.Номенклатура | Справочники.Номенклатура | Создать, найти, выбрать, получить форму |
| Ссылка | СправочникСсылка.Номенклатура | НайтиПоКоду(), реквизит другого объекта | Хранить и передавать «указатель» на элемент, читать реквизиты |
| Объект | СправочникОбъект.Номенклатура | Ссылка.ПолучитьОбъект(), СоздатьЭлемент() | Изменить реквизиты и записать |
Аналогия простая. Менеджер — это картотека целиком. Ссылка — номер карточки. Объект — карточка, вынутая из ящика для правки.
Отсюда главные правила:
- 📂 Менеджер один на вид объекта. Он существует всегда, пока работает сеанс.
- 🔗 Ссылок и объектов столько, сколько записей в базе.
- ✏️ Записать изменения можно только через объект:
Объект.Записать(). У менеджера методаЗаписать()нет (исключение — константы, о них ниже). - ⚡ Ссылка не хранит данные в памяти, а объект загружает запись целиком, со всеми табличными частями. Это дорого.
Не путайте менеджер объекта с менеджером записи регистра сведений (СоздатьМенеджерЗаписи()) и с менеджером временных таблиц (Новый МенеджерВременныхТаблиц). Названия похожи, но это разные вещи: первый работает с одной записью регистра, второй хранит временные таблицы запросов.
Какие менеджеры объектов есть в 1С 8.3
У каждой ветки дерева конфигурации есть своё свойство глобального контекста — коллекция менеджеров. Обращение к ней по имени объекта и даёт менеджер.
| Коллекция | Пример обращения | Тип менеджера |
|---|---|---|
Справочники | Справочники.Контрагенты | СправочникМенеджер |
Документы | Документы.РеализацияТоваровУслуг | ДокументМенеджер |
Перечисления | Перечисления.ВидыОпераций | ПеречислениеМенеджер |
Константы | Константы.ОсновнаяВалюта | КонстантаМенеджер |
РегистрыСведений | РегистрыСведений.КурсыВалют | РегистрСведенийМенеджер |
РегистрыНакопления | РегистрыНакопления.<Имя> | РегистрНакопленияМенеджер |
РегистрыБухгалтерии | РегистрыБухгалтерии.Хозрасчетный | РегистрБухгалтерииМенеджер |
ПланыСчетов | ПланыСчетов.Хозрасчетный | ПланСчетовМенеджер |
ПланыВидовХарактеристик | ПланыВидовХарактеристик.<Имя> | ПланВидовХарактеристикМенеджер |
ПланыОбмена | ПланыОбмена.<Имя> | ПланОбменаМенеджер |
Отчеты, Обработки | Обработки.<Имя> | ОтчетМенеджер, ОбработкаМенеджер |
БизнесПроцессы, Задачи | Задачи.<Имя> | БизнесПроцессМенеджер, ЗадачаМенеджер |
Ещё есть менеджеры журналов документов, регистров расчёта, планов видов расчёта, последовательностей. Набор методов у каждого свой: у регистра накопления есть Остатки(), у справочника его нет и быть не может.
Имена справочников и регистров в примерах этой таблицы зависят от конфигурации. Хозрасчетный и КурсыВалют есть в Бухгалтерии предприятия, в другой базе имена будут свои — смотрите дерево метаданных в Конфигураторе.
Основные методы менеджеров объектов по видам
Полный список методов каждого менеджера есть в синтакс-помощнике: откройте Справка → Синтакс-помощник и найдите тип, например «СправочникМенеджер». Ниже — то, чем пользуются каждый день.
Справочники и планы видов характеристик
СоздатьЭлемент()иСоздатьГруппу()— новый объект, ещё не записанный в базу.НайтиПоКоду(Код)— ссылка по коду; если не найдено, возвращает пустую ссылку.НайтиПоНаименованию(Наименование, ТочноеСоответствие)— поиск по наименованию.НайтиПоРеквизиту(ИмяРеквизита, Значение)— поиск по значению реквизита шапки.Выбрать()иВыбратьИерархически()— выборка для обхода записей.ПустаяСсылка()— пустое значение нужного типа.ПолучитьСсылку(УникальныйИдентификатор)— ссылка по GUID, удобна при обменах.ПолучитьФорму(),ПолучитьМакет()— форма и макет объекта.
Документы
СоздатьДокумент()— новый документ.НайтиПоНомеру(Номер, ДатаИнтервала)— номер документа уникален в пределах периодичности, поэтому вторым параметром передают дату из нужного интервала.Выбрать(ДатаНачала, ДатаОкончания)— выборка документов за период.
Регистры
- Регистр сведений
:
СоздатьНаборЗаписей(),СоздатьМенеджерЗаписи(),Получить(),ПолучитьПоследнее(),ПолучитьПервое(),СрезПоследних(). - Регистр накопления:
СоздатьНаборЗаписей(),Остатки(),Обороты(),ВыбратьПоРегистратору().
Перечисления и константы
У менеджера перечисления нет методов поиска: значения берут как свойства — Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо. Менеджер константы умеет читать и писать сразу: Константы.ОсновнаяВалюта.Получить() и Константы.ОсновнаяВалюта.Установить(Значение).
Отчёты и обработки
Главный метод — Создать(). Он возвращает объект отчёта или обработки, у которого затем вызывают экспортные методы модуля объекта.
Как получить менеджер объекта в коде
Прямое обращение по имени
Самый частый и самый быстрый способ — написать имя прямо в коде:
НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НоваяНоменклатура.Наименование = "Бумага офисная А4";
НоваяНоменклатура.Записать();
Плюс — проверка при синтаксическом контроле. Если объекта с таким именем нет, Конфигуратор сообщит об ошибке ещё до запуска.
По имени в строке
Когда вид объекта становится известен только во время работы, к коллекции обращаются через квадратные скобки:
ИмяСправочника = "Контрагенты";
Менеджер = Справочники[ИмяСправочника];
Ссылка = Менеджер.НайтиПоКоду("00-000001");
Минус — опечатку в строке компилятор не поймает. Ошибка всплывёт только при выполнении.
По полному имени объекта метаданных
Полное имя имеет вид Справочник.Номенклатура или Документ.ПоступлениеТоваровУслуг. Для универсального кода (обработки, обмены) пишут функцию разбора:
Функция МенеджерПоПолномуИмени(ПолноеИмя)
Части = СтрРазделить(ПолноеИмя, ".");
Класс = ВРег(Части[0]);
Имя = Части[1];
Если Класс = "СПРАВОЧНИК" Тогда
Возврат Справочники[Имя];
ИначеЕсли Класс = "ДОКУМЕНТ" Тогда
Возврат Документы[Имя];
ИначеЕсли Класс = "РЕГИСТРСВЕДЕНИЙ" Тогда
Возврат РегистрыСведений[Имя];
ИначеЕсли Класс = "РЕГИСТРНАКОПЛЕНИЯ" Тогда
Возврат РегистрыНакопления[Имя];
КонецЕсли;
ВызватьИсключение СтрШаблон("Неизвестный вид объекта: %1", ПолноеИмя);
КонецФункции
Полное имя по ссылке даёт Ссылка.Метаданные().ПолноеИмя(). В типовых конфигурациях на Библиотеке стандартных подсистем (БСП) готовые функции уже есть: ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени() и ОбщегоНазначения.МенеджерОбъектаПоСсылке(). Писать свою в такой конфигурации незачем.
Почему менеджер не виден на клиенте
Коллекции Справочники, Документы и остальные доступны на сервере, в толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте их нет. Строка Справочники.Номенклатура.ПустаяСсылка() в процедуре с директивой &НаКлиенте даст ошибку вида Переменная не определена (Справочники).
Что делать на клиенте:
- Для предопределённых элементов и значений перечислений —
ПредопределенноеЗначение("Перечисление.ВидыОпераций.Поступление"). - Для поиска, создания и выборки — вынести код в процедуру формы с директивой
&НаСервереили&НаСервереБезКонтекста. - Для повторяющейся логики — общий модуль с флажками «Сервер» и «Вызов сервера».
Модуль менеджера и практические примеры
С версии 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"). Экспортные методы модуля менеджера тоже вызываются, если код модуля не закрыт инструкциями препроцессора от внешнего соединения.