Разработка и Конфигурация · 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. Это самый простой и надёжный способ валидации, потому что проверку выполняет сама платформа — без риска ошибиться в собственной логике разбора строки.
Функция ЭтоУИД(Строка) Экспорт
Если Не ЗначениеЗаполнено(Строка) Тогда
Возврат Ложь;
КонецЕсли;
Попытка
УИД = Новый УникальныйИдентификатор(СокрЛП(Строка));
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункцииОбратите внимание на предварительный СокрЛП: строки из файлов обмена и HTTP-запросов часто содержат пробелы или непечатные символы по краям, и без очистки корректный УИД будет отклонён. Также полезна проверка ЗначениеЗаполнено, чтобы не гонять исключение на пустых значениях.
Минус подхода — производительность при массовой проверке: генерация исключений в цикле на сотнях тысяч строк заметно медленнее, чем проверка по шаблону. Для разовой валидации и загрузки небольших пакетов разница несущественна.
Проверка формата без исключений
Если нужно быстро отфильтровать строки по шаблону (например, при разборе большого файла), используйте проверку длины и состава символов. В типовых конфигурациях часто встречается ручная проверка через функции работы со строками.
Функция ЭтоУИДПоШаблону(Строка) Экспорт
Строка = НРег(СокрЛП(Строка));
Если СтрДлина(Строка) <> 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}$. Для старых релизов остаётся ручной перебор символов или перехват исключения.
Проверка существования ссылки по УИД в базе
Частая задача обмена: по строке УИД найти объект в базе и понять, существует ли он. Для этого сначала валидируют строку, затем получают ссылку методом ПолучитьСсылку соответствующего менеджера и проверяют её заполненность.
Функция НайтиНоменклатуруПоУИД(СтрокаУИД)
Если Не ЭтоУИД(СтрокаУИД) Тогда
Возврат Неопределено;
КонецЕсли;
УИД = Новый УникальныйИдентификатор(СтрокаУИД);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Ссылка;
КонецФункцииРаспространённая практика проверки Ссылка.ПолучитьОбъект() = Неопределено работает, но неоптимальна: платформа вычитывает объект целиком. Лёгкий запрос «ВЫБРАТЬ ПЕРВЫЕ 1» по ссылке выполняется быстрее и не тянет лишние данные. Ещё один признак «битой» ссылки — строковое представление вида «<Объект не найден> (…)», но полагаться на текст представления не стоит, он зависит от локализации платформы.
Получение УИД из ссылки и обратные задачи
Обратное направление — получить строку УИД из существующей ссылки — решается методом УникальныйИдентификатор(): СтрокаУИД = XMLСтрока(Ссылка.УникальныйИдентификатор()) или просто Строка(Ссылка.УникальныйИдентификатор()). Это штатный способ отдать идентификатор во внешнюю систему.
Отдельная ситуация — УИД в составе навигационной ссылки вида e1cib/data/Справочник.Номенклатура?ref=.... Идентификатор там хранится в другом порядке байтов (перестановка групп). Для разбора таких ссылок в типовых конфигурациях есть функции общих модулей (например, работа с навигационными ссылками в БСП), самостоятельно переставлять байты вручную не рекомендуется — легко получить неверный УИД.
Сравнение способов проверки
Универсально и надёжно, проверку делает платформа. Минус — медленнее при массовой обработке и требует аккуратной обработки исключений.
Быстро и предсказуемо, подходит для фильтрации больших массивов строк. Не гарантирует семантическую корректность и требует ручной реализации шаблона.
Компактный и читаемый вариант проверки формата. Недоступен в старых релизах платформы и при пониженном режиме совместимости.
Типичные ошибки при работе с УИД
Отдельно стоит упомянуть хранение УИД в реквизитах типа «Строка». Это допустимо для журналов обмена, но при поиске по такому реквизиту учитывайте регистр и возможные пробелы — индекс по строковому полю не спасёт от логических расхождений в написании.
Как проверить результат
Функция возвращает Истина для корректного GUID и Ложь для произвольного текста, пустой строки и строки с лишними символами
Корректный УИД из внешней системы отклоняется — проверьте пробелы, регистр и непечатные символы
Для существующего объекта возвращается ссылка, для несуществующего — Неопределено без исключений
Возвращается ссылка с представлением '<Объект не найден>' — значит, проверка существования не выполнена
Строка(Ссылка.УникальныйИдентификатор()) совпадает с исходным УИД с точностью до регистра
Идентификаторы отличаются — вероятно, перепутан формат навигационной ссылки
FAQ
Чем УИД отличается от уникального идентификатора ссылки?
В контексте 1С это одно и то же: у каждой ссылки на объект базы есть уникальный идентификатор типа УникальныйИдентификатор, который и называют УИД или GUID. Отличие терминов проявляется только в том, что GUID — общепринятое название формата, а УИД — жаргонизм в среде 1С.
Можно ли проверить УИД запросом к базе?
Напрямую отвалидировать формат строки в запросе нельзя — язык запросов не работает с типом УникальныйИдентификатор как с конструктором. Зато запросом удобно проверять существование ссылки: передать в параметр ссылку, полученную через ПолучитьСсылку, и проверить, вернулась ли строка.
Почему Новый УникальныйИдентификатор выдаёт ошибку на внешне корректной строке?
Чаще всего причина в невидимых символах: пробелах, переводе строки, BOM из файла в кодировке UTF-8. Перед созданием объекта примените СокрЛП, а при чтении из файла убедитесь, что обработаны служебные символы начала документа.
Как сравнить два УИД, пришедших в разном регистре?
Преобразуйте обе строки в объекты УникальныйИдентификатор и сравнивайте их — объекты сравниваются по значению, а не по написанию. Если нужно сравнить именно строки, предварительно приведите обе к одному регистру функцией НРег или ВРег.
Что делать, если из внешней системы пришёл УИД без дефисов?
Некоторые системы передают 32 шестнадцатеричных символа подряд. Такую строку можно нормализовать, вставив дефисы на позиции 9, 14, 19 и 24, после чего проверить стандартным способом. Главное — зафиксировать формат обмена в соглашении с внешней системой, чтобы не гадать при каждой загрузке.
Безопасно ли создавать объект с заранее заданным УИД?
Да, это штатный механизм синхронизации: ПолучитьСсылку(УИД), затем СоздатьЭлемент и установка ссылки через УстановитьСсылкуНового. Но делать это нужно только в логике обмена и в транзакции, иначе при сбоях появятся объекты-дубли или конфликты идентификаторов.
Что важно запомнить
Проверка УИД в 1С сводится к двум задачам: валидации формата строки (через Попытка/Исключение или шаблон) и проверке существования ссылки в базе лёгким запросом. Сравнивайте идентификаторы как объекты, а не как строки, и не забывайте про особый формат УИД в навигационных ссылках.