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

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

Как в 1С преобразовать строку в ссылку

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

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

Универсальной функции «строка в ссылку» во встроенном языке 1С нет. Вместо этого используется несколько подходов: метод ПолучитьСсылку() менеджера объекта, поиск по реквизитам, функция ЗначениеВСтрокуВнутр() / ЗначениеИзСтрокиВнутр() и разбор навигационных ссылок. Каждый способ имеет свои условия применения и ограничения.

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

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

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

Вторая типичная ситуация — строка содержит код элемента справочника или номер документа. Это происходит при загрузке из Excel, CSV или текстовых файлов, где ссылочные данные представлены «человеческими» идентификаторами. Здесь преобразование выполняется поиском в базе.

Третий вариант — строка во внутреннем формате 1С, полученная функцией ЗначениеВСтрокуВнутр(). Она выглядит как фигурные скобки с набором служебных данных и распознаётся только платформой. Наконец, строка может быть навигационной ссылкой вида e1cib/data/Справочник.Номенклатура?ref=..., которую пользователь скопировал из программы.

36 символов с дефисамиGUID

Подходит метод ПолучитьСсылку() с УникальныйИдентификатор

Цифры или короткий текстКод или наименование

Используйте НайтиПоКоду() или НайтиПоНаименованию()

Фигурные скобки со служебными даннымиВнутренний формат 1С

Применяйте ЗначениеИзСтрокиВнутр()

Начинается с e1cib/data/Навигационная ссылка

Извлеките параметр ref и декодируйте шестнадцатеричное представление GUID

Преобразование GUID в ссылку через ПолучитьСсылку

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

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

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

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

Ключевая особенность: ПолучитьСсылку() не обращается к базе данных и не проверяет существование объекта. Метод просто формирует значение ссылки из идентификатора. Если объекта с таким GUID в базе нет, вы получите «битую» ссылку, которая при обращении к данным выдаст ошибку или текст «Объект не найден».

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

Безопасное получение ссылки по GUID
  1. 1
    Создайте УникальныйИдентификатор из строки внутри Попытка/Исключение — строка может оказаться некорректной
  2. 2
    Вызовите ПолучитьСсылку() у менеджера нужного типа объекта
  3. 3
    Проверьте существование: СсылкаНаЭлемент.ПолучитьОбъект() <> Неопределено или запросом по ссылке
  4. 4
    Если объект не найден — решите, создавать новый элемент с этим GUID или сообщить об ошибке
  5. 5
    При массовой загрузке оборачивайте обработку каждой строки в отдельную Попытку, чтобы одна ошибка не прервала весь процесс

Проверка существования объекта по ссылке

Самый быстрый способ проверки — запрос. Он не вычитывает объект целиком и работает быстрее, чем ПолучитьОбъект():

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";

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

ОбъектСуществует = Не Запрос.Выполнить().Пустой();

Альтернатива без запроса — конструкция СсылкаНаЭлемент.ПолучитьОбъект(). Если объект существует, вернётся объект; если нет — Неопределено. Минус подхода в том, что данные объекта полностью вычитываются с сервера, что заметно медленнее при массовых проверках.

Ещё один приём — проверка реквизита Предопределенный или любого другого поля через точку: при обращении к реквизитам несуществующей ссылки платформа вернёт ошибку либо значение не будет получено. Этот способ менее читаем, и полагаться на него как на основной не стоит.

Создание объекта с заданным GUID

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

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

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

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

НовыйЭлемент.Наименование = "Загруженный элемент";

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

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

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

Поиск ссылки по коду, наименованию и реквизитам

Если строка содержит не GUID, а код или наименование, ссылку получают поиском. У менеджеров справочников и планов есть готовые методы: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(). У документов — НайтиПоНомеру() с обязательным указанием даты интервала поиска.

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

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

// элемент не найден — создать или сообщить

КонецЕсли;

Методы поиска возвращают пустую ссылку, если объект не найден, — проверяйте это через Пустая() или ЗначениеЗаполнено(). Для НайтиПоКоду() учитывайте длину кода и лидирующие нули: строка «123» не найдёт элемент с кодом «000000123», если код текстовый. Для документов НайтиПоНомеру(Номер, Дата) ищет только в пределах периодичности нумерации от указанной даты.

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

Выбор метода поиска

НайтиПоКоду()

Быстрый поиск по индексированному полю. Подходит, когда код уникален и формат строки точно совпадает с хранимым

НайтиПоНаименованию()

Риск дублей и несовпадений из-за пробелов. Используйте только при гарантированной уникальности наименований

НайтиПоРеквизиту()

Поиск по ИНН, артикулу и другим полям. Требует, чтобы реквизит был проиндексирован, иначе поиск будет медленным

Запрос с условиями

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

Строки внутреннего формата и навигационные ссылки

Функция ЗначениеВСтрокуВнутр() сериализует любое значение, включая ссылку, в строку внутреннего формата. Обратное преобразование выполняет ЗначениеИзСтрокиВнутр():

Строка = ЗначениеВСтрокуВнутр(СсылкаНаЭлемент);   // ссылка -> строка

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

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

Навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=80e10050568bdcb711e... содержит GUID в шестнадцатеричном виде с переставленными байтами. Чтобы получить из неё ссылку, извлеките часть после ref= и преобразуйте в стандартный GUID с учётом порядка байтов, либо используйте готовые функции из типовых общих модулей, если они есть в конфигурации.

Типичные ошибки и их последствия

Самая распространённая ошибка — отсутствие проверки существования объекта после ПолучитьСсылку(). Результат — битые ссылки в документах и регистрах, которые потом приходится вычищать обработками. Вторая частая проблема — несовпадение формата кода при поиске: лидирующие нули, пробелы, разная длина строки.

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

Наконец, при массовой загрузке забывают про транзакции и обработку исключений. Одна некорректная строка GUID в середине файла прерывает всю загрузку, а часть данных уже записана. Оборачивайте итерации в Попытка/Исключение и логируйте проблемные строки.

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

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

Можно ли преобразовать строку в ссылку, не зная тип объекта?

Напрямую нет — ссылка всегда типизирована. Если тип неизвестен, его нужно передать отдельно (например, имя вида справочника в той же строке или соседнем поле) и затем через Справочники[ИмяВида].ПолучитьСсылку() создать ссылку программно.

Чем ПолучитьСсылку() отличается от НайтиПоКоду()?

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

Как восстановить объект, если ссылка битая, но GUID известен?

Создайте новый элемент и вызовите УстановитьСсылкуНового() со ссылкой, построенной из сохранённого GUID, затем заполните данные и запишите. Все реквизиты, ссылавшиеся на битую ссылку, после этого снова станут рабочими.

Можно ли преобразовать строку в ссылку в запросе?

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

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

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

Работает ли ЗначениеИзСтрокиВнутр() между разными базами?

Да, строка внутреннего формата переносима между базами, но ссылка сохранит тот же GUID. Если в целевой базе объекта с таким идентификатором нет, ссылка будет битой — проверка существования по-прежнему обязательна.

Итог

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

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