Разработка и Конфигурация · 10 мин
1С: как из менеджера объекта обратиться к объекту
Как в 1С через менеджер объекта (СправочникиМенеджер, ДокументыМенеджер) получить ссылку, объект и пустую ссылку. Разбор методов с примерами кода, ошибками и FAQ.
В языке 1С доступ к прикладным объектам (справочникам, документам, планам счетов и т.д.) организован через менеджеры объектов. Менеджер — это программный объект, который возвращается свойствами глобального контекста вида Справочники.Номенклатура или Документы.РеализацияТоваровУслуг. Через менеджер нельзя изменить данные напрямую, но с его помощью можно получить ссылку, создать объект, найти элемент по коду или наименованию.
Разработчики часто путают три сущности: менеджер объекта, ссылку и объект. Ссылка — это лёгкий идентификатор записи в базе, объект — полноценная структура данных в памяти, которую можно изменять и записывать. Менеджер — «фабрика», которая выдаёт и то, и другое. Понимание этой тройки — ключ к корректному коду без лишних обращений к базе.
Ниже разобраны основные методы менеджера: ПолучитьСсылку(), НайтиПоКоду(), НайтиПоНаименованию(), СоздатьЭлемент(), ПустаяСсылка(), а также типовые сценарии, ошибки и ограничения.
Как устроена связка «менеджер — ссылка — объект»
Когда вы пишете Справочники.Номенклатура, вы получаете объект типа «СправочникМенеджер.Номенклатура». У него нет реквизитов конкретного элемента справочника — только методы работы с коллекцией в целом. Попытка обратиться к реквизиту через менеджер (Справочники.Номенклатура.Артикул) — типичная ошибка новичка, которая приводит к ошибке исполнения.
Ссылку вы получаете из менеджера методами поиска или из реквизитов других объектов. Ссылка позволяет читать реквизиты «через точку» без явной загрузки объекта: Ссылка.Наименование. Это удобно для чтения, но каждое такое обращение в цикле — отдельный запрос к базе.
Объект получают вызовом Ссылка.ПолучитьОбъект() или методами создания менеджера (СоздатьЭлемент(), СоздатьДокумент()). Только через объект можно изменять данные и записывать их методом Записать().
Основные методы менеджера объекта
Набор методов зависит от вида объекта, но ядро одинаково для ссылочных типов:
НайтиПоКоду(Код)— ищет элемент по коду, возвращает ссылку или пустую ссылку;НайтиПоНаименованию(Наименование, ТочноеСоответствие)— поиск по наименованию;НайтиПоРеквизиту(ИмяРеквизита, Значение)— поиск по значению реквизита;ПолучитьСсылку(УникальныйИдентификатор)— ссылка по GUID, в том числе на ещё не существующий объект;ПустаяСсылка()— пустая ссылка для сравнений и инициализации;СоздатьЭлемент()/СоздатьДокумент()— новый объект в памяти;Выбрать()— выборка ссылок для перебора.
Менеджер = Справочники.Номенклатура;
СсылкаПоКоду = Менеджер.НайтиПоКоду("000000123");
Если СсылкаПоКоду.Пустая() Тогда
// элемент не найден — создаём новый
НовыйЭлемент = Менеджер.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовая позиция";
НовыйЭлемент.Записать();
КонецЕсли;
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ 3х2.5", Истина);
Если Не Ссылка.Пустая() Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Обновлено программно";
Объект.Записать();
КонецЕсли;Как получить объект из ссылки и изменить данные
Менеджер сам по себе не даёт доступа к данным элемента. Стандартный сценарий изменения выглядит так: получить ссылку через менеджер, затем вызвать ПолучитьОбъект(), изменить реквизиты и записать.
СсылкаДок = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", ТекущаяДатаСеанса());
Если Не СсылкаДок.Пустая() Тогда
ДокОбъект = СсылкаДок.ПолучитьОбъект();
ДокОбъект.Комментарий = "Скорректировано";
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Важно: ПолучитьОбъект() загружает объект целиком, включая табличные части. Для массовой обработки это дорого — если нужно только прочитать реквизиты, используйте запрос или обращение через ссылку, а не загрузку объекта.
Получение ссылки по уникальному идентификатору
Метод ПолучитьСсылку() работает иначе, чем методы поиска: он не обращается к базе и не проверяет существование элемента, а просто формирует ссылку из переданного GUID. Это полезно при обмене данными, когда идентификатор известен заранее.
УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
// объекта с таким GUID в базе нет — битая ссылка
КонецЕсли;
Проверка существования объекта через ПолучитьОбъект() = Неопределено — распространённый приём для поиска «битых» ссылок. Альтернатива — запросом проверить наличие записи по ссылке, что быстрее при массовой проверке.
Создание нового элемента через менеджер
Для создания используются методы менеджера: СоздатьЭлемент() у справочников и планов, СоздатьДокумент() у документов, СоздатьГруппу() для групп иерархических справочников. Метод возвращает объект в памяти — в базе запись появится только после Записать().
НовыйДок = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.Контрагент = СсылкаКонтрагент;
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНоменклатура;
НоваяСтрока.Количество = 10;
НовыйДок.Записать();
Если элементу нужен заранее известный GUID (например, при синхронизации), сначала получите ссылку через ПолучитьСсылку(УИД), затем вызовите у нового объекта УстановитьСсылкуНового(Ссылка) до записи.
- 1Получите менеджер: Справочники.Номенклатура
- 2Найдите ссылку: НайтиПоКоду() или НайтиПоНаименованию()
- 3Проверьте результат: Если Не Ссылка.Пустая()
- 4Получите объект: Объект = Ссылка.ПолучитьОбъект()
- 5Измените реквизиты и вызовите Объект.Записать()
- 6Проверьте результат в базе или через повторное чтение
Типичные ошибки при работе с менеджером объекта
Первая группа ошибок — путаница сущностей: попытка прочитать реквизит через менеджер или записать ссылку как объект. Ссылка не имеет метода Записать() — запись выполняет только объект.
Вторая группа — пропуск проверки результата поиска. Методы НайтиПоКоду() и НайтиПоНаименованию() при отсутствии элемента возвращают пустую ссылку, а не Неопределено. Вызов ПолучитьОбъект() у пустой ссылки вернёт Неопределено, и последующее обращение к реквизиту вызовет ошибку.
Третья группа — неэффективность: обращение к реквизитам через точку от ссылки внутри цикла порождает N запросов к базе. Для чтения данных множества элементов используйте запрос с выборкой полей.
Когда менеджер недоступен: ограничения и альтернативы
На клиенте в управляемом приложении методы создания и изменения (СоздатьЭлемент(), ПолучитьОбъект()) недоступны — они работают только на сервере. Поэтому код модификации данных выносят в серверные процедуры общих модулей с признаком «Сервер» или в серверные процедуры формы.
Для чтения без загрузки объекта альтернативой служит запрос: он быстрее и позволяет получать только нужные поля. Для перебора всех элементов менеджер предоставляет метод Выбрать(), который возвращает выборку ссылок — но и здесь для массовых операций запрос предпочтительнее.
Сравнение подходов
Простой код для единичных операций; не подходит для массовой обработки из-за обращений к базе на каждый вызов
Оптимален для чтения и отбора множества элементов; не позволяет изменять данные напрямую
Единственный способ изменения данных; требует серверного контекста и аккуратности с транзакциями
Что важно запомнить
Менеджер объекта — это точка входа к данным вида Справочники.Имя или Документы.Имя. Он выдаёт ссылки (поиск, ПолучитьСсылку) и объекты (СоздатьЭлемент, СоздатьДокумент). Изменять данные можно только через объект, полученный вызовом Ссылка.ПолучитьОбъект(), с обязательной проверкой пустой ссылки и вызовом Записать().
Частые вопросы
Чем ссылка отличается от объекта в 1С?
Ссылка — это идентификатор записи в базе, лёгкий и пригодный для хранения в реквизитах. Объект — полная копия данных в памяти с табличными частями, которую можно изменять и записывать. Через ссылку данные только читаются, через объект — читаются и изменяются.
Что вернёт НайтиПоНаименованию(), если элементов с таким наименованием несколько?
Метод вернёт ссылку на один из найденных элементов — какой именно, не гарантируется. Если наименования могут дублироваться, надёжнее искать по коду, уникальному реквизиту или использовать запрос с отбором.
Можно ли вызвать ПолучитьОбъект() на тонком клиенте?
Нет, метод доступен только на сервере. В управляемых формах код с ПолучитьОбъект() размещают в серверных процедурах (директива &НаСервере) или в серверных общих модулях.
Как проверить, существует ли элемент по ссылке, полученной через ПолучитьСсылку()?
Вызовите Ссылка.ПолучитьОбъект(): если вернулось Неопределено — записи с таким идентификатором в базе нет. Для массовой проверки быстрее выполнить запрос с условием по ссылке.
Зачем нужен метод ПустаяСсылка(), если можно сравнить с Неопределено?
Пустая ссылка и Неопределено — разные значения. Пустая ссылка имеет конкретный тип (например, СправочникСсылка.Номенклатура) и корректно сравнивается со ссылками этого типа, тогда как Неопределено означает отсутствие значения вообще и в сравнениях ссылок применять его не следует.