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

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

1С: как из менеджера объекта обратиться к объекту

Как в 1С через менеджер объекта (СправочникиМенеджер, ДокументыМенеджер) получить ссылку, объект и пустую ссылку. Разбор методов с примерами кода, ошибками и FAQ.

В языке 1С доступ к прикладным объектам (справочникам, документам, планам счетов и т.д.) организован через менеджеры объектов. Менеджер — это программный объект, который возвращается свойствами глобального контекста вида Справочники.Номенклатура или Документы.РеализацияТоваровУслуг. Через менеджер нельзя изменить данные напрямую, но с его помощью можно получить ссылку, создать объект, найти элемент по коду или наименованию.

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

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

Как устроена связка «менеджер — ссылка — объект»

Когда вы пишете Справочники.Номенклатура, вы получаете объект типа «СправочникМенеджер.Номенклатура». У него нет реквизитов конкретного элемента справочника — только методы работы с коллекцией в целом. Попытка обратиться к реквизиту через менеджер (Справочники.Номенклатура.Артикул) — типичная ошибка новичка, которая приводит к ошибке исполнения.

Ссылку вы получаете из менеджера методами поиска или из реквизитов других объектов. Ссылка позволяет читать реквизиты «через точку» без явной загрузки объекта: Ссылка.Наименование. Это удобно для чтения, но каждое такое обращение в цикле — отдельный запрос к базе.

Объект получают вызовом Ссылка.ПолучитьОбъект() или методами создания менеджера (СоздатьЭлемент(), СоздатьДокумент()). Только через объект можно изменять данные и записывать их методом Записать().

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

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

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

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

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

// элемент не найден — создаём новый

НовыйЭлемент = Менеджер.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Тестовая позиция";

НовыйЭлемент.Записать();

КонецЕсли;

bsl
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Кабель ВВГ 3х2.5", Истина);
Если Не Ссылка.Пустая() Тогда
    Объект = Ссылка.ПолучитьОбъект();
    Объект.Комментарий = "Обновлено программно";
    Объект.Записать();
КонецЕсли;

Как получить объект из ссылки и изменить данные

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

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

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

ДокОбъект = СсылкаДок.ПолучитьОбъект();

ДокОбъект.Комментарий = "Скорректировано";

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

КонецЕсли;

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

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

Метод ПолучитьСсылку() работает иначе, чем методы поиска: он не обращается к базе и не проверяет существование элемента, а просто формирует ссылку из переданного GUID. Это полезно при обмене данными, когда идентификатор известен заранее.

УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда

// объекта с таким GUID в базе нет — битая ссылка

КонецЕсли;

Проверка существования объекта через ПолучитьОбъект() = Неопределено — распространённый приём для поиска «битых» ссылок. Альтернатива — запросом проверить наличие записи по ссылке, что быстрее при массовой проверке.

Создание нового элемента через менеджер

Для создания используются методы менеджера: СоздатьЭлемент() у справочников и планов, СоздатьДокумент() у документов, СоздатьГруппу() для групп иерархических справочников. Метод возвращает объект в памяти — в базе запись появится только после Записать().

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

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

НовыйДок.Контрагент = СсылкаКонтрагент;

НоваяСтрока = НовыйДок.Товары.Добавить();

НоваяСтрока.Номенклатура = СсылкаНоменклатура;

НоваяСтрока.Количество = 10;

НовыйДок.Записать();

Если элементу нужен заранее известный GUID (например, при синхронизации), сначала получите ссылку через ПолучитьСсылку(УИД), затем вызовите у нового объекта УстановитьСсылкуНового(Ссылка) до записи.

Порядок действий: изменить элемент справочника
  1. 1
    Получите менеджер: Справочники.Номенклатура
  2. 2
    Найдите ссылку: НайтиПоКоду() или НайтиПоНаименованию()
  3. 3
    Проверьте результат: Если Не Ссылка.Пустая()
  4. 4
    Получите объект: Объект = Ссылка.ПолучитьОбъект()
  5. 5
    Измените реквизиты и вызовите Объект.Записать()
  6. 6
    Проверьте результат в базе или через повторное чтение

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

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

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

Третья группа — неэффективность: обращение к реквизитам через точку от ссылки внутри цикла порождает N запросов к базе. Для чтения данных множества элементов используйте запрос с выборкой полей.

Типичные ошибки
01
Обращение к реквизиту через менеджер (Справочники.Номенклатура.Артикул) — ошибка исполнения, менеджер не хранит данные элемента
02
Отсутствие проверки Ссылка.Пустая() после поиска — обращение к Неопределено и падение кода
03
Вызов Ссылка.Записать() — у ссылки нет такого метода, нужен ПолучитьОбъект()
04
Чтение реквизитов через точку в цикле — запрос к базе на каждую итерацию
05
Забытый Записать() после изменений объекта — данные теряются без сообщения

Когда менеджер недоступен: ограничения и альтернативы

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

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

Сравнение подходов

Методы менеджера (НайтиПоКоду, СоздатьЭлемент)

Простой код для единичных операций; не подходит для массовой обработки из-за обращений к базе на каждый вызов

Запрос к данным

Оптимален для чтения и отбора множества элементов; не позволяет изменять данные напрямую

ПолучитьОбъект() + Записать()

Единственный способ изменения данных; требует серверного контекста и аккуратности с транзакциями

Итог

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

Менеджер объекта — это точка входа к данным вида Справочники.Имя или Документы.Имя. Он выдаёт ссылки (поиск, ПолучитьСсылку) и объекты (СоздатьЭлемент, СоздатьДокумент). Изменять данные можно только через объект, полученный вызовом Ссылка.ПолучитьОбъект(), с обязательной проверкой пустой ссылки и вызовом Записать().

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

Чем ссылка отличается от объекта в 1С?

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

Что вернёт НайтиПоНаименованию(), если элементов с таким наименованием несколько?

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

Можно ли вызвать ПолучитьОбъект() на тонком клиенте?

Нет, метод доступен только на сервере. В управляемых формах код с ПолучитьОбъект() размещают в серверных процедурах (директива &НаСервере) или в серверных общих модулях.

Как проверить, существует ли элемент по ссылке, полученной через ПолучитьСсылку()?

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

Зачем нужен метод ПустаяСсылка(), если можно сравнить с Неопределено?

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