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

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

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

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

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

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

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

Что считается пустым уникальным идентификатором в 1С

Пустой GUID — это идентификатор, все байты которого равны нулю. В строковом представлении он выглядит как 00000000-0000-0000-0000-000000000000. Именно это значение платформа использует как «значение по умолчанию» для переменных типа УникальныйИдентификатор, если им не присвоено другое значение.

Важно не путать три разные ситуации. Первая — переменная типа УникальныйИдентификатор содержит нулевой GUID. Вторая — ссылка на объект базы данных пустая (объект не выбран). Третья — переменная вообще не имеет типа идентификатора, например содержит Неопределено или строку. Каждая ситуация требует своей проверки, и смешивать их нельзя.

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

Базовый способ: сравнение с пустым GUID

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

bsl
ПустойГУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
Если МойИдентификатор = ПустойГУИД Тогда
	// идентификатор пустой
КонецЕсли;

Чтобы не создавать эталонное значение при каждом вызове, его выносят в отдельную функцию общего модуля. Это удобно, когда проверка выполняется в цикле при обработке тысяч строк загружаемых данных.

Альтернатива — сравнение строкового представления: Строка(МойИдентификатор) = "00000000-0000-0000-0000-000000000000". Такой вариант работает, но медленнее и менее читаем, поэтому его используют только когда переменная изначально хранится как строка и тип не гарантирован.

Универсальная функция проверки для общего модуля

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

Функция ИдентификаторПустой(ЗначениеПроверки) Экспорт

Если ТипЗнч(ЗначениеПроверки) <> Тип("УникальныйИдентификатор") Тогда

Возврат Истина;

КонецЕсли;

Возврат ЗначениеПроверки = Новый УникальныйИдентификатор(

"00000000-0000-0000-0000-000000000000");

КонецФункции

Такая функция безопасно обрабатывает Неопределено, NULL, строки и числа: вместо падения с ошибкой сравнения типов она просто вернёт Истина. Это особенно полезно в обработках обмена, где состав входящих полей не контролируется вашей конфигурацией.

Если логика требует различать «не тот тип» и «пустой GUID», функцию дорабатывают: возвращают структуру с двумя признаками или вызывают исключение при неверном типе. Выбор зависит от того, является ли неверный тип штатной ситуацией или признаком ошибки интеграции.

Проверка пустой ссылки объекта вместо идентификатора

Частая ситуация: разработчик получает ссылку на объект и хочет понять, «пустая» она или нет. Здесь сравнение GUID не нужно вовсе — у ссылочных типов есть штатные средства проверки.

bsl
Если СсылкаНаОбъект.Пустая() Тогда
	// ссылка пустая, объект не выбран
КонецЕсли;

Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
	// аналогичная проверка через универсальную функцию
КонецЕсли;

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

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

Как выбрать способ проверки в разных сценариях

Маршрут решения

Как выбрать действие

Переменная гарантированно имеет тип УникальныйИдентификаторСравните напрямую с Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")
Тип переменной неизвестен (данные из файла или веб-сервиса)Сначала проверьте ТипЗнч, затем сравнивайте с нулевым GUID
Нужно проверить, выбран ли объект в реквизитеИспользуйте Ссылка.Пустая() или ЗначениеЗаполнено()
Идентификатор пришёл строкойПреобразуйте в тип через Новый УникальныйИдентификатор(Строка) с проверкой формата, затем сравните
Нужно узнать, существует ли объект с таким GUIDПолучите ссылку через ПолучитьСсылку() и проверьте существование запросом

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

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

Типичные ошибки при проверке идентификатора

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

Отдельно стоит сказать про функцию ЗначениеЗаполнено(). Она корректно работает со ссылками, строками, числами и датами, но для типа УникальныйИдентификатор её применение — спорная практика: поведение не документировано как основной способ проверки, и читатель кода может неверно истолковать намерение. Явное сравнение с нулевым GUID понятнее и надёжнее.

Ещё одна ошибка — хранение идентификаторов в реквизитах типа «Строка(36)» с последующим лексическим сравнением. Строковое сравнение GUID не совпадает с их порядком как двоичных значений, что ломает логику упорядочивания при синхронизации. Если реквизит хранит идентификатор, используйте тип УникальныйИдентификатор.

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

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

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

Переменная без присвоения значения
Норма

Сравнение с нулевым GUID возвращает Истина

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

Возвращает Ложь — значит, где-то выполняется скрытое присвоение

Идентификатор из внешней строки
Норма

После преобразования тип — УникальныйИдентификатор, сравнение работает без исключений

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

Возникает исключение — строка не в формате GUID

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

Ссылка.Пустая() возвращает Истина, GUID равен нулевому

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

Пустая() = Ложь, но объект не читается — это битая ссылка

Ссылка, созданная через ПолучитьСсылку
Норма

Запрос подтверждает существование объекта

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

GUID непустой, но запрос не находит объект

Быстрая отладка выполняется через окно «Вычислить выражение» в конфигураторе: остановитесь в точке останова, вычислите переменную, затем выражение Переменная = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"). Это покажет и тип значения, и результат сравнения без изменения кода.

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

Итог

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

Пустой GUID проверяется сравнением с Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"). Пустая ссылка — через Пустая() или ЗначениеЗаполнено(). Непустой идентификатор не гарантирует существование объекта в базе.

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

Можно ли проверить идентификатор на пустоту через ЗначениеЗаполнено()?

Технически функция примет такое значение, но для типа УникальныйИдентификатор это не рекомендуемый путь: поведение менее очевидно для читающего код, а в составных типах результат может отличаться от ожидаемого. Явное сравнение с нулевым GUID однозначнее и не зависит от трактовки платформой.

Как проверить строку, что это корректный GUID, а не пустое значение?

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

Чем отличается пустой GUID от пустой ссылки?

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

Почему сравнение идентификатора со строкой "00000000-..." не работает?

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

Как проверить на пустоту идентификатор в запросе?

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

Нужно ли проверять идентификатор на пустоту перед записью нового объекта?

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