Разработка и Конфигурация · 11 мин
Как проверить уникальный идентификатор на пустоту в 1С
Способы проверки уникального идентификатора на пустоту в 1С: сравнение с пустым GUID, функции, типичные ошибки и примеры кода для разработчика.
Уникальный идентификатор (GUID) в 1С — это 128-битное значение, которое платформа присваивает каждому объекту базы данных: справочнику, документу, плану видов характеристик. При обмене данными, интеграции с внешними системами и поиске объектов по ссылке часто возникает задача определить, заполнен идентификатор или нет. Ошибка в такой проверке приводит к ложным срабатываниям: объект считается несуществующим, хотя он есть, или наоборот.
Главная сложность в том, что у типа «УникальныйИдентификатор» нет встроенного метода «Пустой()», как у строки или числа. Проверка выполняется сравнением с эталонным пустым значением — идентификатором, состоящим из нулей. При этом важно различать пустой идентификатор и пустую ссылку объекта: это разные сущности, и проверяются они по-разному.
Ниже разобраны рабочие способы проверки на встроенном языке 1С, отличия сценариев для идентификатора и ссылки, типичные ошибки и готовые фрагменты кода, которые можно переносить в конфигурацию без доработки.
Что считается пустым уникальным идентификатором в 1С
Пустой GUID — это идентификатор, все байты которого равны нулю. В строковом представлении он выглядит как 00000000-0000-0000-0000-000000000000. Именно это значение платформа использует как «значение по умолчанию» для переменных типа УникальныйИдентификатор, если им не присвоено другое значение.
Важно не путать три разные ситуации. Первая — переменная типа УникальныйИдентификатор содержит нулевой GUID. Вторая — ссылка на объект базы данных пустая (объект не выбран). Третья — переменная вообще не имеет типа идентификатора, например содержит Неопределено или строку. Каждая ситуация требует своей проверки, и смешивать их нельзя.
На практике проверка на пустоту чаще всего нужна при загрузке данных из файлов и веб-сервисов: внешняя система передаёт идентификатор строкой, и перед поиском объекта нужно убедиться, что строка преобразовалась в осмысленное значение, а не в нулевой GUID.
Базовый способ: сравнение с пустым GUID
Самый надёжный метод — прямое сравнение переменной с новым идентификатором, созданным из нулевой строки. Платформа корректно сравнивает два значения типа УникальныйИдентификатор оператором равенства.
ПустойГУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
Если МойИдентификатор = ПустойГУИД Тогда
// идентификатор пустой
КонецЕсли;Чтобы не создавать эталонное значение при каждом вызове, его выносят в отдельную функцию общего модуля. Это удобно, когда проверка выполняется в цикле при обработке тысяч строк загружаемых данных.
Альтернатива — сравнение строкового представления: Строка(МойИдентификатор) = "00000000-0000-0000-0000-000000000000". Такой вариант работает, но медленнее и менее читаем, поэтому его используют только когда переменная изначально хранится как строка и тип не гарантирован.
Универсальная функция проверки для общего модуля
В прикладном коде удобно инкапсулировать проверку в функцию, которая принимает значение любого типа и возвращает Истина, если идентификатор пустой или вовсе не является идентификатором. Это защищает от ошибок при обработке данных из внешних источников.
Функция ИдентификаторПустой(ЗначениеПроверки) Экспорт
Если ТипЗнч(ЗначениеПроверки) <> Тип("УникальныйИдентификатор") Тогда
Возврат Истина;
КонецЕсли;
Возврат ЗначениеПроверки = Новый УникальныйИдентификатор(
"00000000-0000-0000-0000-000000000000");
КонецФункции
Такая функция безопасно обрабатывает Неопределено, NULL, строки и числа: вместо падения с ошибкой сравнения типов она просто вернёт Истина. Это особенно полезно в обработках обмена, где состав входящих полей не контролируется вашей конфигурацией.
Если логика требует различать «не тот тип» и «пустой GUID», функцию дорабатывают: возвращают структуру с двумя признаками или вызывают исключение при неверном типе. Выбор зависит от того, является ли неверный тип штатной ситуацией или признаком ошибки интеграции.
Проверка пустой ссылки объекта вместо идентификатора
Частая ситуация: разработчик получает ссылку на объект и хочет понять, «пустая» она или нет. Здесь сравнение GUID не нужно вовсе — у ссылочных типов есть штатные средства проверки.
Если СсылкаНаОбъект.Пустая() Тогда
// ссылка пустая, объект не выбран
КонецЕсли;
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
// аналогичная проверка через универсальную функцию
КонецЕсли;Метод Пустая() и функция ЗначениеЗаполнено() проверяют именно пустоту ссылки, то есть отсутствие выбранного объекта. При этом пустая ссылка имеет нулевой уникальный идентификатор, поэтому сравнение Ссылка.УникальныйИдентификатор() с нулевым GUID даст тот же результат — но это более длинный и менее очевидный путь.
Обратная ситуация требует внимания: ссылка может быть непустой (у неё есть GUID), но объект в базе отсутствует — например, после получения ссылки методом ПолучитьСсылку(Новый УникальныйИдентификатор(...)) для ещё не записанного или удалённого объекта. Проверка на пустоту здесь не поможет: нужна проверка существования объекта через запрос или попытку обращения к реквизиту с обработкой исключения.
Как выбрать способ проверки в разных сценариях
Как выбрать действие
При загрузке из строки помните об ограничении: конструктор Новый УникальныйИдентификатор(Строка) вызывает исключение, если строка не соответствует формату GUID. Поэтому преобразование оборачивают в Попытка/Исключение либо предварительно проверяют длину и структуру строки.
В запросах сравнение идентификаторов напрямую недоступно в удобной форме — там оперируют ссылками. Если нужно отобрать объекты по списку 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 приведёт к конфликту или невозможности однозначно идентифицировать объект при обмене.