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

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

Как получить ссылку на созданный элемент справочника 1С

Способы получить ссылку на элемент справочника 1С: СоздатьЭлемент, Записать, НайтиПоКоду, НайтиПоНаименованию. Примеры кода, ошибки и проверка результата.

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

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

Ниже разобраны основные способы получения ссылки: при создании элемента, при поиске существующего, через уникальный идентификатор и через запрос. Для каждого способа приведены условия применения, примеры кода и типичные ошибки.

Создание элемента и получение ссылки после записи

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

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

НовыйЭлемент.Артикул = "АРТ-001";

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

СсылкаНаЭлемент = НовыйЭлемент.Ссылка;

После выполнения Записать() переменная НовыйЭлемент.Ссылка содержит полноценную ссылку типа СправочникСсылка.Номенклатура. Её можно присваивать реквизитам документов, передавать в параметры запросов и возвращать из функции.

Если элемент подчинён другому справочнику или находится в иерархии, перед записью обязательно заполните Владелец или Родитель. Без этого запись либо завершится ошибкой, либо элемент попадёт в корень списка, что нарушит логику учёта.

Порядок действий при создании элемента
  1. 1
    Вызовите Справочники.ИмяСправочника.СоздатьЭлемент()
  2. 2
    Заполните обязательные реквизиты: Наименование, Родитель, Владелец
  3. 3
    Вызовите метод Записать()
  4. 4
    Получите ссылку из свойства Ссылка записанного объекта
  5. 5
    Проверьте, что ссылка не пустая, перед дальнейшим использованием

Получение ссылки до записи: метод ПолучитьСсылкуНового

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

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();

НоваяСсылка = Справочники.Контрагенты.ПолучитьСсылку(Новый УникальныйИдентификатор);

НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);

НовыйЭлемент.Наименование = "Новый контрагент";

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

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

Поиск существующего элемента: НайтиПоКоду и НайтиПоНаименованию

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

СсылкаНайденная = Справочники.Номенклатура.НайтиПоКоду("0000123");

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

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

КонецЕсли;

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

Для поиска по произвольному реквизиту используйте НайтиПоРеквизиту("Артикул", "АРТ-001"). Учтите: метод вернёт первый попавшийся элемент, поэтому реквизит поиска должен быть уникальным по смыслу, иначе возможно получение «не той» ссылки.

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

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

Если известен GUID элемента — например, он пришёл из внешней системы при обмене — ссылку получают методом ПолучитьСсылку(). Это основной способ сопоставления объектов при интеграциях.

Идентификатор = Новый УникальныйИдентификатор("b3f4a2c1-...");

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

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

Обратное действие — получить строковое представление GUID из ссылки — выполняется через XMLСтрока(Ссылка) или Строка(Ссылка.УникальныйИдентификатор()). Это нужно при выгрузке данных во внешние системы.

Получение ссылки через запрос

Когда критерии поиска сложные — несколько условий, отбор по табличной части, соединения с другими таблицами — используйте запрос. Результат запроса по полю Ссылка и будет готовой ссылкой на элемент.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Артикул = &Артикул

| И НЕ Номенклатура.ПометкаУдаления";

Запрос.УстановитьПараметр("Артикул", "АРТ-001");

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

Если Выборка.Следующий() Тогда

СсылкаНаЭлемент = Выборка.Ссылка;

КонецЕсли;

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

Сравнение способов получения ссылки

Записать() + свойство Ссылка

Для новых элементов. Самый простой путь, но требует полной записи объекта

НайтиПоКоду / НайтиПоНаименованию

Быстрый поиск существующего элемента. Ограничение: работает только по кодам и наименованию, может вернуть помеченный на удаление элемент

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

Для обменов и интеграций. Не проверяет существование элемента — требуется дополнительная проверка

Запрос

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

Проверка результата и работа с пустой ссылкой

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

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

ВызватьИсключение "Элемент справочника не найден и не создан";

КонецЕсли;

Признак корректного результата: ссылка не пустая, элемент открывается в форме, запрос по этой ссылке возвращает заполненные реквизиты. Если запрос по ссылке возвращает пустой результат — это «битая» ссылка, элемент физически отсутствует в базе.

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

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

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

Ссылка после Записать()
Норма

Ссылка не пустая, элемент открывается в форме справочника

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

Ссылка пустая — запись не выполнена, ищите ошибку в обработчиках или обязательных реквизитах

Результат НайтиПоКоду
Норма

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

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

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

Ссылка по GUID из обмена
Норма

Запрос по ссылке возвращает данные элемента

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

Запрос пуст — битая ссылка, элемент в базе отсутствует

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

Можно ли получить ссылку на элемент без его записи в базу?

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

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

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

Почему НайтиПоНаименованию возвращает не тот элемент?

Наименования не уникальны: метод возвращает первый найденный элемент с точным совпадением строки. Если в справочнике есть дубли или помеченные на удаление элементы с тем же названием, результат непредсказуем. Используйте поиск по уникальному реквизиту или запрос с отбором по пометке удаления.

Как проверить, что ссылка не «битая»?

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

Можно ли получить ссылку на группу справочника?

Да, группа создаётся методом СоздатьГруппу() вместо СоздатьЭлемент(), а поиск групп выполняется теми же НайтиПоКоду() и НайтиПоНаименованию(). После записи группы её ссылка используется в реквизите Родитель при создании подчинённых элементов.

Что делать, если Записать() вызывает ошибку?

Проверьте заполнение обязательных реквизитов (Владелец, Родитель для иерархических справочников), права текущего пользователя на добавление элементов и обработчики событий ПередЗаписью в конфигурации — они могут отменять запись. Текст исключения обычно указывает конкретную причину отказа.

Итог

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

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