При разработке прикладных решений на платформе 1С:Предприятие программисты регулярно сталкиваются с типом данных УникальныйИдентификатор (UUID/GUID). Он используется для однозначной идентификации ссылочных объектов в базе данных. Однако в процессе написания кода — например, при проверке заполнения реквизитов, очистке значений, выгрузке данных в сторонние системы или написании универсальных обработок — возникает необходимость получить именно пустой уникальный идентификатор (состоящий из одних нулей: 00000000-0000-0000-0000-000000000000).
В этой статье мы подробно разберем, как решить эту задачу красиво, быстро и профессионально. Мы рассмотрим различные подходы — от классических вариантов до продвинутых способов с использованием встроенных библиотек и сериализации данных, а также проанализируем их влияние на производительность системы.
Прежде чем перейти к программным методам, давайте кратко выясним причины, по которым разработчику может потребоваться инициализировать или использовать пустое значение типа УникальныйИдентификатор:
УникальныйИдентификатор, хранящийся в базе данных или полученный из внешнего источника (например, при интеграции через REST API).Выполнить, где запрещено или невозможно менять метаданные и добавлять собственные общие модули.Теперь детально изучим все доступные способы получения такого значения в среде 1С.
Самый очевидный и известный способ — это создание объекта напрямую через конструктор с передачей строкового представления пустого идентификатора:
ПустойУИД = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
Преимущества: Этот метод является абсолютным лидером по производительности. Платформа мгновенно создает объект в памяти без каких-либо дополнительных вычислений.
Недостатки: Писать вручную 32 нуля и 4 дефиса крайне неудобно, легко ошибиться в их количестве. Кроме того, такая конструкция загромождает код "магическими строками". Чтобы упростить себе жизнь, разработчики часто используют шаблоны автозамены в Конфигураторе (через меню "Сервис — Шаблоны текста" или комбинацию клавиш Ctrl+Q), настроив шаблон для быстрого вывода этой строки.
Если мы хотим избежать написания длинной строки с нулями и получить красивый однострочный вызов, который можно использовать непосредственно внутри выражений, мы можем прибегнуть к механизму приведения типов платформы:
ПустойУИД = Новый ОписаниеТипов("УникальныйИдентификатор").ПривестиЗначение();
Как это работает: Мы конструируем новый объект ОписаниеТипов для нужного нам типа данных. Метод ПривестиЗначение() без параметров возвращает значение по умолчанию для этого типа. Для уникального идентификатора значением по умолчанию как раз и является пустой GUID.
Преимущества: Код выглядит профессионально, легко читается и не содержит жестко закодированных строк с нулями.
Недостатки: Этот способ работает значительно медленнее классического конструктора (примерно в 10–15 раз), так как создание объекта ОписаниеТипов требует от платформы определенных вычислительных ресурсов. Не рекомендуется использовать этот метод внутри высоконагруженных циклов.
Если вы ведете разработку в современной типовой конфигурации 1С (например, 1С:Бухгалтерия, 1С:ERP, 1С:УТ), то в вашей системе гарантированно присутствует Библиотека Стандартных Подсистем. Разработчики БСП уже позаботились об этой проблеме и добавили готовые функции в общие модули.
Для получения пустого идентификатора достаточно вызвать функцию:
ПустойУИД = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор();
Преимущества: Соответствие стандартам разработки фирмы "1С", отличная читаемость кода, оптимальная производительность (внутри модуля БСП значение кэшируется или возвращается быстрым способом).
Недостатки: Способ не является универсальным, если вы пишете код для старых ("самописных") конфигураций или внешних обработок, запускаемых в изолированных базах без БСП.
Любая пустая ссылка в 1С на уровне СУБД физически представляет собой набор бинарных нулей. Следовательно, ее уникальный идентификатор всегда будет пустым. Мы можем извлечь его программно:
ПустойУИД = Справочники.Валюты.ПустаяСсылка().УникальныйИдентификатор();
Если мы хотим сделать этот метод более универсальным (на случай, если справочника "Валюты" в конфигурации нет), можно обратиться к метаданным динамически:
ИмяСправочника = Метаданные.Справочники[0].Имя;
ПустойУИД = Справочники[ИмяСправочника].ПустаяСсылка().УникальныйИдентификатор();
Преимущества: Динамический вариант работает в любой конфигурации, где есть хотя бы один справочник, без необходимости хардкодить строку с нулями.
Недостатки: Избыточная сложность кода. Динамический вариант не сработает в абсолютно пустой конфигурации без единого объекта метаданных. Также обращение к метаданным снижает скорость выполнения операции.
Для любителей элегантных системных решений существует способ, использующий механизмы XML-сериализации и фабрику XDTO. Платформа 1С умеет конструировать типы данных на основе их схем:
ПустойУИД = XDTOFactory.Create(XDTOFactory.Type("http://v8.1c.ru/8.1/data/core", "UUID")).Value;
Преимущества: Работает полностью на уровне платформы без обращения к метаданным конкретной конфигурации или вызова тяжелых конструкторов описания типов.
Недостатки: Громоздкая запись, которую сложно запомнить наизусть.
Еще один любопытный способ, использующий платформенные механизмы преобразования типов данных в XML-формат:
ПустойУИД = XMLValue(Тип("УникальныйИдентификатор"), "00000000-0000-0000-0000-000000000000");
Хотя здесь нам все еще требуется передавать строку с нулями, этот метод наглядно демонстрирует возможности платформы по работе с типами данных и часто применяется в универсальных правилах обмена (например, в Конвертации Данных).
Давайте проанализируем скорость работы описанных методов, чтобы понять, какой из них лучше применять в различных ситуациях. Мы провели замеры времени выполнения для 100 000 итераций:
Подводя итог нашему совместному анализу, мы можем выработать простые правила выбора оптимального решения:
ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(). Это сделает ваш код чистым, понятным другим разработчикам и защищенным от ошибок.Новый ОписаниеТипов("УникальныйИдентификатор").ПривестиЗначение().