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

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

Как сравнить ссылку со строкой в 1С

Как правильно сравнить ссылку со строкой в 1С: преобразование через Строка(), УникальныйИдентификатор, XMLСтрока, сравнение в запросах. Примеры кода и типичные ошибки.

В языке 1С ссылка на объект базы данных и строка — это разные типы, и прямое сравнение оператором «=» между ними не работает так, как ожидает разработчик. Выражение вида Если СсылкаНаДокумент = "Поступление товаров" Тогда всегда вернёт Ложь, даже если строка совпадает с представлением объекта. Причина проста: при сравнении разных типов платформа не выполняет неявного преобразования, а результат сравнения несравнимых значений — Ложь.

Корректное решение зависит от того, что именно содержится в строке: человекочитаемое представление объекта (например, «Поступление товаров и услуг 000000001 от 12.03.2026»), уникальный идентификатор GUID или строковое представление внутреннего формата. Для каждого случая существует свой способ преобразования, и выбор неправильного метода — самая частая причина ошибок при обмене данными, загрузке из файлов и интеграции с внешними системами.

Ниже разобраны рабочие способы сравнения: через функцию Строка(), через УникальныйИдентификатор, через XML-представление, а также сравнение ссылок со строковыми значениями в запросах. Отдельно рассмотрены типичные ошибки и способы проверить результат.

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

Встроенный язык 1С строго типизирован при сравнении значений. Ссылка (СправочникСсылка, ДокументСсылка и другие) — это объектный тип, содержащий указатель на запись в базе данных, а строка — примитивный тип. Оператор «=» между ними не вызывает ошибку выполнения, но всегда возвращает Ложь, потому что значения разных несовместимых типов считаются неравными.

Это поведение особенно коварно при отладке: код не падает с исключением, ветка просто никогда не выполняется, и логика обработки молча пропускает нужные записи. Типичный сценарий — обработка загрузки из Excel или CSV, где колонка содержит наименование контрагента, а разработчик пытается сравнить её напрямую со ссылкой справочника «Контрагенты».

Сравнение через представление: функция Строка()

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

Если Строка(СсылкаНаДокумент) = "Поступление товаров и услуг 000000001 от 12.03.2026" Тогда

// объекты совпадают по представлению

КонецЕсли;

У этого способа есть серьёзное ограничение: представление объекта зависит от настроек конфигурации и может меняться. Для документов представление обычно включает вид, номер и дату; для справочников — наименование или код, что определяется свойством «Основное представление» в конфигураторе. Если представление изменится (например, после доработки конфигурации), сравнение перестанет работать.

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

Сравнение по уникальному идентификатору (GUID)

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

Если строка содержит GUID (типично для обменов, веб-сервисов, файлов выгрузки), приведите её к типу УникальныйИдентификатор и сравните со значением метода УникальныйИдентификатор() ссылки:

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

Попытка

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

Исключение

Сообщить("Строка не является корректным GUID");

Возврат;

КонецПопытки;

Если СсылкаНаОбъект.УникальныйИдентификатор() = ИдентификаторИзСтроки Тогда

// это один и тот же объект

КонецЕсли;

Обратное направление тоже допустимо — преобразовать GUID ссылки в строку и сравнить строки. Здесь УникальныйИдентификатор())) = НРег(СтрокаGUID) Тогда

// совпадают

КонецЕсли;

Сравнение ссылки со строкой GUID
  1. 1
    Убедитесь, что строка содержит GUID: 36 символов с дефисами в формате 8-4-4-4-12
  2. 2
    Приведите строку к типу через Новый УникальныйИдентификатор(СтрокаGUID) внутри Попытка/Исключение
  3. 3
    Получите идентификатор ссылки: Ссылка.УникальныйИдентификатор()
  4. 4
    Сравните два значения типа УникальныйИдентификатор оператором =
  5. 5
    При исключении зафиксируйте некорректную строку в журнале, не прерывая всю обработку

Поиск ссылки по строке GUID в базе

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

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

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

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

// объекта с таким GUID в базе нет

КонецЕсли;

Важная тонкость: ПолучитьСсылку() возвращает ссылку всегда, даже если объекта с таким GUID не существует. Проверка на существование делается через попытку получить объект или через запрос. В типовых конфигурациях также доступна функция из общего модуля ОбщегоНазначения.ЗначениеРеквизитаОбъекта или проверка СсылкаСуществует в БСП.

Сравнение через XML-представление

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

СтрокаXML = XMLСтрока(СсылкаНаОбъект);

// результат вида: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

// с учётом контекста типа при обратном преобразовании

Если XMLСтрока(Ссылка1) = XMLСтрока(Ссылка2) Тогда

// ссылки равны

КонецЕсли;

Этот подход удобен при сопоставлении данных из планов обмена и универсальных форматов, где ссылки передаются как строки. Однако для простой проверки «та ли это ссылка» он избыточен — сравнение через УникальныйИдентификатор проще и читабельнее.

Сравнение ссылки со строкой в запросе

В языке запросов прямое сравнение поля-ссылки со строковым параметром также не сработает корректно. Строку нужно либо преобразовать в ссылку до передачи в запрос, либо использовать функцию ПРЕДСТАВЛЕНИЕ() для сравнения по представлению:

// Вариант 1: сравнение по представлению

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) = &СтрокаПредставление

// Вариант 2: поиск по GUID через параметр-ссылку

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

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

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

Способы сравнения ссылки со строкой

Строка(Ссылка)

Подходит для сравнения с представлением при отладке и выводе. Ненадёжно: представление не уникально и зависит от настроек конфигурации

УникальныйИдентификатор

Основной способ для интеграций и обменов. Надёжен, GUID не меняется. Требует обработки ошибок при разборе строки

XMLСтрока / XMLЗначение

Для сериализации и механизмов обмена. Универсально, но избыточно для простых проверок

ПРЕДСТАВЛЕНИЕ в запросе

Когда сравнение нужно внутри запроса по представлению. Медленно на больших таблицах, без использования индексов

Типичные ошибки и как их избежать

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

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

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

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

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

Для контроля в рабочем режиме полезно временно добавить вывод обоих значений рядом: Сообщить("Ссылка: [" + Строка(Ссылка.УникальныйИдентификатор()) + "], строка: [" + СтрокаGUID + "]"). Наглядное сравнение сразу показывает расхождения в регистре, лишние пробелы или не тот формат строки.

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

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

Типы значений перед сравнением
Норма

Оба значения одного типа (УникальныйИдентификатор или Строка)

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

Слева ссылка, справа строка — сравнение всегда ложно

Формат строки GUID
Норма

36 символов, дефисы в позициях 9, 14, 19, 24

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

Лишние пробелы, фигурные скобки, другая длина

Существование объекта по ссылке
Норма

Запрос или ПолучитьОбъект() возвращает данные

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

ПолучитьОбъект() вернул Неопределено — объекта нет

Регистр символов GUID
Норма

Сравнение выполняется после НРег() обеих сторон

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

Прямое строковое сравнение без приведения регистра

Когда какой способ выбрать

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

Если строка приходит из недоверенного источника (файл, HTTP-запрос), обязательно оборачивайте преобразование в Попытка/Исключение и логируйте некорректные значения, не прерывая всю обработку из-за одной битой строки.

Итог

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

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

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

Почему условие «Ссылка = Строка» не вызывает ошибку, но не срабатывает?

Платформа 1С не генерирует исключение при сравнении несовместимых типов оператором «=» — она просто возвращает Ложь. Это сделано для совместимости с универсальным кодом, где типы значений заранее неизвестны. Поэтому такая ошибка обнаруживается только при отладке или анализе логики.

Как сравнить ссылку со строкой, если GUID пришёл в верхнем регистре?

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

Можно ли найти ссылку по наименованию из строки?

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

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

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

Чем отличается Строка(Ссылка) от Строка(Ссылка.УникальныйИдентификатор())?

Первый вариант возвращает представление объекта — то, что видит пользователь (например, наименование или «Документ №1 от даты»). Второй возвращает GUID в виде строки из 36 символов. Для идентификации объекта нужен второй вариант, для отображения пользователю — первый.

Работает ли сравнение ссылок разных видов, например справочника и документа?

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