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

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

1С: как из строки сделать ссылку на объект

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

Задача «из строки сделать ссылку» возникает в 1С постоянно: при загрузке данных из Excel и CSV, обмене с внешними системами, обработке штрихкодов, парсинге файлов. Под строкой обычно понимается либо текстовое представление объекта (наименование, код, номер документа), либо уникальный идентификатор (GUID), либо внутреннее строковое представление ссылки, полученное через ЗначениеВСтрокуВнутр().

Универсальной функции «СтрокаВСсылку()» во встроенном языке нет — способ преобразования зависит от того, что именно содержится в строке. Ниже разобраны все рабочие варианты: поиск по наименованию и коду, восстановление ссылки из GUID, из внутреннего представления, а также поиск документов по номеру. Для каждого способа приведены условия применения, примеры кода и ограничения.

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

Определяем, что именно лежит в строке

Прежде чем писать код, посмотрите на содержимое строки. От этого зависит весь дальнейший алгоритм. Типовые варианты:

  • GUID — строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890», 36 символов с дефисами. Так выглядит уникальный идентификатор ссылки, его часто передают внешние системы и веб-сервисы.
  • Внутреннее представление — длинная строка в фигурных скобках, полученная функцией ЗначениеВСтрокуВнутр() при выгрузке.
  • Наименование или код — обычный текст: «ООО Ромашка», «000000123».
  • Номер документа — строка с номером, который нужно сопоставить с документом конкретного вида.
Маршрут решения

Как выбрать способ преобразования

Строка похожа на GUID (36 символов с дефисами)Используйте УникальныйИдентификатор + ПолучитьСсылку()
Строка получена через ЗначениеВСтрокуВнутрИспользуйте ЗначениеИзСтрокиВнутр()
В строке наименование элемента справочникаИспользуйте НайтиПоНаименованию()
В строке код элемента или штрихкодИспользуйте НайтиПоКоду() или поиск по реквизиту через запрос
В строке номер документаИспользуйте Документы.ВидДокумента.НайтиПоНомеру()

Ссылка из GUID: ПолучитьСсылку и УникальныйИдентификатор

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

СтрокаGUID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);

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

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

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

КонецЕсли;

Обратный путь — получить строку из существующей ссылки:

СтрокаGUID = Строка(Ссылка.УникальныйИдентификатор());

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

Восстановление ссылки из внутреннего представления

Если строка была получена функцией ЗначениеВСтрокуВнутр(Ссылка) (например, при выгрузке в текстовый файл или передаче между базами), обратное преобразование выполняется парной функцией:

СтрокаВнутр = "{""СправочникСсылка.Номенклатура"",""a1b2c3d4-e5f6-7890-abcd-ef1234567890""}";

Ссылка = ЗначениеИзСтрокиВнутр(СтрокаВнутр);

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

Поиск элемента справочника по наименованию или коду

Когда в строке — человекочитаемое значение, ссылку получают поиском. Для справочников есть два штатных метода.

Поиск по наименованию

СтрокаПоиска = "ООО ""Ромашка""";

Ссылка = Справочники.Контрагенты.НайтиПоНаименованию(СтрокаПоиска, Истина);

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

// Элемент не найден: создать новый или сообщить об ошибке

КонецЕсли;

Второй параметр Истина включает поиск по точному соответствию. Без него метод ищет по началу наименования и может вернуть не тот элемент. Учтите: если в базе несколько элементов с одинаковым наименованием, метод вернёт только первый найденный — для критичных загрузок надёжнее искать по коду или по сочетанию реквизитов запросом.

Поиск по коду

СтрокаКода = "000000123";

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

Для справочников с числовым кодом строка автоматически приводится к числу. Если код строковый и ведущие нули значимы, передавайте строку в том же формате, в каком код хранится в базе. Третий параметр позволяет искать в пределах родителя (для иерархических справочников) или владельца (для подчинённых).

Поиск по произвольному реквизиту запросом

Штрихкоды, ИНН, артикулы хранятся в реквизитах, и штатных методов поиска по ним нет. Используйте запрос:

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

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

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

| Контрагенты.Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.ИНН = &ИНН";

Запрос.УстановитьПараметр("ИНН", СтрокаИНН);

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

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

Ссылка = Выборка.Ссылка;

КонецЕсли;

Поиск документа по номеру

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

НомерСтрокой = "0000-001234";

ДатаПоиска = Дата(2026, 1, 1);

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

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

// Документ с таким номером в указанном периоде не найден

КонецЕсли;

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

Типовой порядок загрузки ссылки из строки
  1. 1
    Определите формат строки: GUID, внутреннее представление, наименование, код или номер
  2. 2
    Выберите соответствующий метод: ПолучитьСсылку, ЗначениеИзСтрокиВнутр, НайтиПоНаименованию, НайтиПоКоду, НайтиПоНомеру
  3. 3
    Выполните поиск и проверьте результат: Ссылка.Пустая() или ПолучитьОбъект() = Неопределено
  4. 4
    При отсутствии объекта решите: создать новый элемент или зафиксировать ошибку загрузки
  5. 5
    Запишите результат в журнал загрузки для контроля нераспознанных строк

Проверка результата и обработка ошибок

Любое преобразование строки в ссылку может закончиться неудачей, и это нужно обрабатывать явно. Два разных признака «пустоты»:

  • Ссылка.Пустая() — поиск не нашёл объект, возвращена пустая ссылка данного типа.
  • Ссылка.ПолучитьОбъект() = Неопределено — ссылка сконструирована (например, из GUID), но объекта в базе нет. Это «битая ссылка».

Дополнительно полезно проверять тип полученного значения, особенно при использовании ЗначениеИзСтрокиВнутр(), где тип заранее неизвестен:

Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.Номенклатура") Тогда

// Работаем с номенклатурой

КонецЕсли;

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

Производительность при массовой обработке

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

Также избегайте вызова ПолучитьОбъект() только ради проверки существования в массовом цикле — это чтение всего объекта. Для проверки используйте запрос вида ВЫБРАТЬ Ссылка ИЗ Справочник... ГДЕ Ссылка = &Ссылка, который читает минимум данных.

Итог

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

Способ преобразования строки в ссылку выбирается по формату строки: GUID — через ПолучитьСсылку с УникальныйИдентификатор, внутреннее представление — через ЗначениеИзСтрокиВнутр, наименование и код — через НайтиПоНаименованию и НайтиПоКоду, номер документа — через НайтиПоНомеру с указанием периода. Результат всегда проверяйте: Пустая() для поиска, ПолучитьОбъект() = Неопределено для битых ссылок.

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

Можно ли преобразовать строку вида «Номенклатура.Товар1» в ссылку одной командой?

Нет, штатной функции разбора такого текстового представления нет. Нужно программно выделить имя объекта метаданных и значение поиска, затем вызвать соответствующий метод поиска. Либо используйте ЗначениеВСтрокуВнутр/ЗначениеИзСтрокиВнутр, если формируете строки сами.

Почему ПолучитьСсылку по GUID возвращает ссылку, но объекта нет?

Метод ПолучитьСсылку не обращается к данным объекта — он просто конструирует ссылку из идентификатора. Если элемент с таким GUID удалён или никогда не существовал в этой базе, вы получите «битую» ссылку. Проверяйте существование через ПолучитьОбъект() = Неопределено или запросом.

Как найти ссылку, если известны только часть наименования?

Используйте запрос с оператором ПОДОБНО: «ГДЕ Наименование ПОДОБНО ""%"" + &Строка + ""%""». Учтите, что такой запрос может вернуть несколько элементов — обрабатывайте выборку и при необходимости уточняйте критерии поиска.

Работает ли ЗначениеИзСтрокиВнутр между разными конфигурациями?

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

Как из ссылки получить строку для передачи во внешнюю систему?

Самый распространённый вариант — Строка(Ссылка.УникальныйИдентификатор()): GUID однозначно идентифицирует объект и легко передаётся через HTTP, JSON и XML. Дополнительно передавайте тип объекта, чтобы принимающая сторона знала, к какому справочнику или документу относится идентификатор.

Что делать, если по строке объект не найден при загрузке?

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