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

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

Проверка в 1С, что строка — это УИД (GUID)

Как в 1С проверить, что строка является корректным УИД (GUID): регулярные выражения, функции проверки, типовые ошибки и примеры кода на встроенном языке.

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

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

Формат УИД: что именно проверяем

Строковое представление УИД в 1С строго фиксировано: 36 символов, из которых 32 — шестнадцатеричные цифры (0–9, a–f) и 4 дефиса на позициях 9, 14, 19 и 24. Пример корректного значения: 8b3f4a2c-1d5e-4f6a-9b0c-2d3e4f5a6b7c.

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

Важно понимать: корректный формат не означает, что объект с таким УИД существует в базе. Проверка формата и проверка существования ссылки — две разные задачи, и их нужно решать отдельно.

Проверка через Попытка/Исключение: самый надёжный способ

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

bsl
Функция ЭтоУИД(Строка) Экспорт
	Если Не ЗначениеЗаполнено(Строка) Тогда
		Возврат Ложь;
	КонецЕсли;
	Попытка
		УИД = Новый УникальныйИдентификатор(СокрЛП(Строка));
		Возврат Истина;
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции

Обратите внимание на предварительный СокрЛП: строки из файлов обмена и HTTP-запросов часто содержат пробелы или непечатные символы по краям, и без очистки корректный УИД будет отклонён. Также полезна проверка ЗначениеЗаполнено, чтобы не гонять исключение на пустых значениях.

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

Проверка формата без исключений

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

bsl
Функция ЭтоУИДПоШаблону(Строка) Экспорт
	Строка = НРег(СокрЛП(Строка));
	Если СтрДлина(Строка) <> 36 Тогда
		Возврат Ложь;
	КонецЕсли;
	Шаблон = "0123456789abcdef-";
	Для Поз = 1 По 36 Цикл
		Символ = Сред(Строка, Поз, 1);
		Если СтрНайти(Шаблон, Символ) = 0 Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	Возврат Сред(Строка, 9, 1) = "-" И Сред(Строка, 14, 1) = "-"
		И Сред(Строка, 19, 1) = "-" И Сред(Строка, 24, 1) = "-";
КонецФункции

В свежих версиях платформы (8.3.23 и новее, при включённой совместимости) доступен объект РегулярноеВыражение, с которым проверка сводится к одному шаблону: ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$. Для старых релизов остаётся ручной перебор символов или перехват исключения.

Проверка существования ссылки по УИД в базе

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

bsl
Функция НайтиНоменклатуруПоУИД(СтрокаУИД)
	Если Не ЭтоУИД(СтрокаУИД) Тогда
		Возврат Неопределено;
	КонецЕсли;
	УИД = Новый УникальныйИдентификатор(СтрокаУИД);
	Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Если Запрос.Выполнить().Пустой() Тогда
		Возврат Неопределено;
	КонецЕсли;
	Возврат Ссылка;
КонецФункции

Распространённая практика проверки Ссылка.ПолучитьОбъект() = Неопределено работает, но неоптимальна: платформа вычитывает объект целиком. Лёгкий запрос «ВЫБРАТЬ ПЕРВЫЕ 1» по ссылке выполняется быстрее и не тянет лишние данные. Ещё один признак «битой» ссылки — строковое представление вида «<Объект не найден> (…)», но полагаться на текст представления не стоит, он зависит от локализации платформы.

Получение УИД из ссылки и обратные задачи

Обратное направление — получить строку УИД из существующей ссылки — решается методом УникальныйИдентификатор(): СтрокаУИД = XMLСтрока(Ссылка.УникальныйИдентификатор()) или просто Строка(Ссылка.УникальныйИдентификатор()). Это штатный способ отдать идентификатор во внешнюю систему.

Отдельная ситуация — УИД в составе навигационной ссылки вида e1cib/data/Справочник.Номенклатура?ref=.... Идентификатор там хранится в другом порядке байтов (перестановка групп). Для разбора таких ссылок в типовых конфигурациях есть функции общих модулей (например, работа с навигационными ссылками в БСП), самостоятельно переставлять байты вручную не рекомендуется — легко получить неверный УИД.

Сравнение способов проверки

Попытка/Исключение с Новый УникальныйИдентификатор

Универсально и надёжно, проверку делает платформа. Минус — медленнее при массовой обработке и требует аккуратной обработки исключений.

Проверка по шаблону (длина, символы, дефисы)

Быстро и предсказуемо, подходит для фильтрации больших массивов строк. Не гарантирует семантическую корректность и требует ручной реализации шаблона.

РегулярноеВыражение (8.3.23+)

Компактный и читаемый вариант проверки формата. Недоступен в старых релизах платформы и при пониженном режиме совместимости.

Типичные ошибки при работе с УИД

Типичные ошибки
01
Сравнение УИД как строк без приведения регистра — 'ABC...' и 'abc...' считаются разными, хотя это один идентификатор.
02
Проверка существования объекта через ПолучитьОбъект() в цикле — лишние чтения из базы и падение производительности обмена.
03
Использование УИД из строки без валидации — исключение в неожиданном месте кода и прерывание загрузки пакета целиком.
04
Путаница между УИД ссылки и представлением в навигационной ссылке — другой порядок байтов приводит к поиску несуществующих объектов.
05
Трактовка пустого УИД (все нули) как валидной ссылки — в базе такого объекта нет, а логика обмена ломается.

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

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

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

Валидация строки
Норма

Функция возвращает Истина для корректного GUID и Ложь для произвольного текста, пустой строки и строки с лишними символами

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

Корректный УИД из внешней системы отклоняется — проверьте пробелы, регистр и непечатные символы

Поиск объекта по УИД
Норма

Для существующего объекта возвращается ссылка, для несуществующего — Неопределено без исключений

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

Возвращается ссылка с представлением '<Объект не найден>' — значит, проверка существования не выполнена

Обратное преобразование
Норма

Строка(Ссылка.УникальныйИдентификатор()) совпадает с исходным УИД с точностью до регистра

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

Идентификаторы отличаются — вероятно, перепутан формат навигационной ссылки

FAQ

Чем УИД отличается от уникального идентификатора ссылки?

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

Можно ли проверить УИД запросом к базе?

Напрямую отвалидировать формат строки в запросе нельзя — язык запросов не работает с типом УникальныйИдентификатор как с конструктором. Зато запросом удобно проверять существование ссылки: передать в параметр ссылку, полученную через ПолучитьСсылку, и проверить, вернулась ли строка.

Почему Новый УникальныйИдентификатор выдаёт ошибку на внешне корректной строке?

Чаще всего причина в невидимых символах: пробелах, переводе строки, BOM из файла в кодировке UTF-8. Перед созданием объекта примените СокрЛП, а при чтении из файла убедитесь, что обработаны служебные символы начала документа.

Как сравнить два УИД, пришедших в разном регистре?

Преобразуйте обе строки в объекты УникальныйИдентификатор и сравнивайте их — объекты сравниваются по значению, а не по написанию. Если нужно сравнить именно строки, предварительно приведите обе к одному регистру функцией НРег или ВРег.

Что делать, если из внешней системы пришёл УИД без дефисов?

Некоторые системы передают 32 шестнадцатеричных символа подряд. Такую строку можно нормализовать, вставив дефисы на позиции 9, 14, 19 и 24, после чего проверить стандартным способом. Главное — зафиксировать формат обмена в соглашении с внешней системой, чтобы не гадать при каждой загрузке.

Безопасно ли создавать объект с заранее заданным УИД?

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

Итог

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

Проверка УИД в 1С сводится к двум задачам: валидации формата строки (через Попытка/Исключение или шаблон) и проверке существования ссылки в базе лёгким запросом. Сравнивайте идентификаторы как объекты, а не как строки, и не забывайте про особый формат УИД в навигационных ссылках.