Разработка и Конфигурация · 11 мин
Как в 1С преобразовать строку в ссылку
Как в 1С преобразовать строку в ссылку: ПолучитьСсылку из GUID, поиск по коду и наименованию, ЗначениеВСтрокуВнутр, обработка битых ссылок и типичные ошибки.
Задача преобразования строки в ссылку возникает при обмене данными, загрузке файлов, интеграции с внешними системами и восстановлении битых ссылок. В строке может храниться уникальный идентификатор объекта (GUID), код или наименование элемента справочника, номер документа — и от того, что именно содержит строка, зависит выбор метода.
Универсальной функции «строка в ссылку» во встроенном языке 1С нет. Вместо этого используется несколько подходов: метод ПолучитьСсылку() менеджера объекта, поиск по реквизитам, функция ЗначениеВСтрокуВнутр() / ЗначениеИзСтрокиВнутр() и разбор навигационных ссылок. Каждый способ имеет свои условия применения и ограничения.
Важно понимать: ссылка в 1С — это не просто идентификатор, а типизированное значение, привязанное к конкретному виду объекта метаданных (справочнику, документу, плану счетов и т.д.). Поэтому перед преобразованием нужно знать, к какому типу относится искомый объект.
Определите, что именно хранится в строке
Прежде чем писать код, выясните формат исходной строки. От этого зависит весь алгоритм. Самый частый случай — уникальный идентификатор в виде 36 символов с дефисами, например a1b2c3d4-e5f6-7890-abcd-ef1234567890. Так выглядит GUID при выгрузке через планы обмена, веб-сервисы или функцию ЗначениеВСтрокуВнутр().
Вторая типичная ситуация — строка содержит код элемента справочника или номер документа. Это происходит при загрузке из Excel, CSV или текстовых файлов, где ссылочные данные представлены «человеческими» идентификаторами. Здесь преобразование выполняется поиском в базе.
Третий вариант — строка во внутреннем формате 1С, полученная функцией ЗначениеВСтрокуВнутр(). Она выглядит как фигурные скобки с набором служебных данных и распознаётся только платформой. Наконец, строка может быть навигационной ссылкой вида e1cib/data/Справочник.Номенклатура?ref=..., которую пользователь скопировал из программы.
Подходит метод ПолучитьСсылку() с УникальныйИдентификатор
Используйте НайтиПоКоду() или НайтиПоНаименованию()
Применяйте ЗначениеИзСтрокиВнутр()
Извлеките параметр ref и декодируйте шестнадцатеричное представление GUID
Преобразование GUID в ссылку через ПолучитьСсылку
Основной и самый надёжный способ — метод ПолучитьСсылку(), доступный у менеджера любого ссылочного объекта. Сначала строка преобразуется в значение типа УникальныйИдентификатор, затем из него создаётся ссылка нужного типа.
СтрокаGUID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Ключевая особенность: ПолучитьСсылку() не обращается к базе данных и не проверяет существование объекта. Метод просто формирует значение ссылки из идентификатора. Если объекта с таким GUID в базе нет, вы получите «битую» ссылку, которая при обращении к данным выдаст ошибку или текст «Объект не найден».
Поэтому после получения ссылки рекомендуется проверить её существование. Для этого используется проверка через запрос или попытка получить объект с обработкой результата.
- 1Создайте УникальныйИдентификатор из строки внутри Попытка/Исключение — строка может оказаться некорректной
- 2Вызовите ПолучитьСсылку() у менеджера нужного типа объекта
- 3Проверьте существование: СсылкаНаЭлемент.ПолучитьОбъект() <> Неопределено или запросом по ссылке
- 4Если объект не найден — решите, создавать новый элемент с этим GUID или сообщить об ошибке
- 5При массовой загрузке оборачивайте обработку каждой строки в отдельную Попытку, чтобы одна ошибка не прервала весь процесс
Проверка существования объекта по ссылке
Самый быстрый способ проверки — запрос. Он не вычитывает объект целиком и работает быстрее, чем ПолучитьОбъект():
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлемент);
ОбъектСуществует = Не Запрос.Выполнить().Пустой();
Альтернатива без запроса — конструкция СсылкаНаЭлемент.ПолучитьОбъект(). Если объект существует, вернётся объект; если нет — Неопределено. Минус подхода в том, что данные объекта полностью вычитываются с сервера, что заметно медленнее при массовых проверках.
Ещё один приём — проверка реквизита Предопределенный или любого другого поля через точку: при обращении к реквизитам несуществующей ссылки платформа вернёт ошибку либо значение не будет получено. Этот способ менее читаем, и полагаться на него как на основной не стоит.
Создание объекта с заданным GUID
При синхронизации между базами часто требуется не просто найти объект, а создать его с тем же идентификатором, что в базе-источнике. Для этого служит метод УстановитьСсылкуНового():
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
НовыйЭлемент.Наименование = "Загруженный элемент";
НовыйЭлемент.Записать();
После вызова УстановитьСсылкуНового() новый объект при записи получит указанный GUID. Это стандартный механизм, на котором построены планы обмена и типовые механизмы синхронизации. Без вызова этого метода платформа сгенерирует новый случайный идентификатор.
Учтите ограничение: УстановитьСсылкуНового() можно вызвать только для нового, ещё не записанного объекта. Изменить GUID уже существующего элемента штатными средствами нельзя.
Поиск ссылки по коду, наименованию и реквизитам
Если строка содержит не GUID, а код или наименование, ссылку получают поиском. У менеджеров справочников и планов есть готовые методы: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(). У документов — НайтиПоНомеру() с обязательным указанием даты интервала поиска.
СсылкаНаЭлемент = Справочники.Контрагенты.НайтиПоКоду("000001234");
Если СсылкаНаЭлемент.Пустая() Тогда
// элемент не найден — создать или сообщить
КонецЕсли;
Методы поиска возвращают пустую ссылку, если объект не найден, — проверяйте это через Пустая() или ЗначениеЗаполнено(). Для НайтиПоКоду() учитывайте длину кода и лидирующие нули: строка «123» не найдёт элемент с кодом «000000123», если код текстовый. Для документов НайтиПоНомеру(Номер, Дата) ищет только в пределах периодичности нумерации от указанной даты.
Поиск по наименованию выполняется на точное совпадение и не учитывает регистр в зависимости от настроек СУБД. Если наименования могут дублироваться, метод вернёт первый найденный элемент — для надёжной идентификации лучше использовать уникальный реквизит, например ИНН для контрагентов, через НайтиПоРеквизиту().
Выбор метода поиска
Быстрый поиск по индексированному полю. Подходит, когда код уникален и формат строки точно совпадает с хранимым
Риск дублей и несовпадений из-за пробелов. Используйте только при гарантированной уникальности наименований
Поиск по ИНН, артикулу и другим полям. Требует, чтобы реквизит был проиндексирован, иначе поиск будет медленным
Гибкий вариант для сложных критериев, но требует больше кода и аккуратности с параметрами
Строки внутреннего формата и навигационные ссылки
Функция ЗначениеВСтрокуВнутр() сериализует любое значение, включая ссылку, в строку внутреннего формата. Обратное преобразование выполняет ЗначениеИзСтрокиВнутр():
Строка = ЗначениеВСтрокуВнутр(СсылкаНаЭлемент); // ссылка -> строка
ВосстановленнаяСсылка = ЗначениеИзСтрокиВнутр(Строка); // строка -> ссылка
Этот способ удобен для передачи ссылок между сеансами и хранения в текстовых полях, но формат закрытый: строку может прочитать только платформа 1С, и её нельзя сформировать вручную во внешней системе. Для интеграции с внешними системами используйте GUID.
Навигационная ссылка вида e1cib/data/Справочник.Номенклатура?ref=80e10050568bdcb711e... содержит GUID в шестнадцатеричном виде с переставленными байтами. Чтобы получить из неё ссылку, извлеките часть после ref= и преобразуйте в стандартный GUID с учётом порядка байтов, либо используйте готовые функции из типовых общих модулей, если они есть в конфигурации.
Типичные ошибки и их последствия
Самая распространённая ошибка — отсутствие проверки существования объекта после ПолучитьСсылку(). Результат — битые ссылки в документах и регистрах, которые потом приходится вычищать обработками. Вторая частая проблема — несовпадение формата кода при поиске: лидирующие нули, пробелы, разная длина строки.
Третья ошибка — использование ПолучитьСсылку() в запросе вместо параметра-ссылки. В запросах сравнивайте поле Ссылка с параметром, содержащим уже готовую ссылку, а не пытайтесь преобразовывать строки внутри текста запроса — язык запросов таких преобразований не поддерживает.
Наконец, при массовой загрузке забывают про транзакции и обработку исключений. Одна некорректная строка GUID в середине файла прерывает всю загрузку, а часть данных уже записана. Оборачивайте итерации в Попытка/Исключение и логируйте проблемные строки.
Частые вопросы
Можно ли преобразовать строку в ссылку, не зная тип объекта?
Напрямую нет — ссылка всегда типизирована. Если тип неизвестен, его нужно передать отдельно (например, имя вида справочника в той же строке или соседнем поле) и затем через Справочники[ИмяВида].ПолучитьСсылку() создать ссылку программно.
Чем ПолучитьСсылку() отличается от НайтиПоКоду()?
ПолучитьСсылку() формирует ссылку из GUID без обращения к базе и не гарантирует существование объекта. НайтиПоКоду() выполняет реальный поиск в базе и возвращает либо существующую ссылку, либо пустую ссылку.
Как восстановить объект, если ссылка битая, но GUID известен?
Создайте новый элемент и вызовите УстановитьСсылкуНового() со ссылкой, построенной из сохранённого GUID, затем заполните данные и запишите. Все реквизиты, ссылавшиеся на битую ссылку, после этого снова станут рабочими.
Можно ли преобразовать строку в ссылку в запросе?
Нет, язык запросов не поддерживает преобразование строки в ссылку. Преобразуйте строку в ссылку средствами встроенного языка и передайте результат в запрос через параметр.
Что вернёт НайтиПоНаименованию, если элементов с таким наименованием несколько?
Метод вернёт ссылку на один из найденных элементов, как правило первый по порядку обхода. Какой именно — не гарантируется. При возможности дублей используйте поиск по уникальному реквизиту или запрос с дополнительными условиями.
Работает ли ЗначениеИзСтрокиВнутр() между разными базами?
Да, строка внутреннего формата переносима между базами, но ссылка сохранит тот же GUID. Если в целевой базе объекта с таким идентификатором нет, ссылка будет битой — проверка существования по-прежнему обязательна.
Что важно запомнить
Выбор метода зависит от содержимого строки: GUID — ПолучитьСсылку(), код или наименование — методы поиска, внутренний формат — ЗначениеИзСтрокиВнутр(). ПолучитьСсылку() не проверяет существование объекта, поэтому всегда контролируйте результат перед записью. Для синхронизации создавайте объекты с заданным GUID через УстановитьСсылкуНового().