При разработке прикладных решений на платформе 1С:Предприятие разработчики часто сталкиваются с типом данных УникальныйИдентификатор. Возникает закономерный вопрос: что является значением по умолчанию (пустым значением) для данного типа, как его правильно инициализировать, проверить на заполненность и почему использование идентификаторов для связи объектов не всегда является оптимальным решением. Разберем эти вопросы подробно.
В платформе 1С:Предприятие незаполненный реквизит типа УникальныйИдентификатор не равен значению Неопределено (если только это не реквизит составного типа). Пустой идентификатор представляет собой полноценный объект типа УникальныйИдентификатор, состоящий из 32 шестнадцатеричных нулей, разделенных дефисами.
Его строковое представление имеет строго фиксированный вид: 00000000-0000-0000-0000-000000000000.
Конструктор Новый УникальныйИдентификатор() без переданных параметров генерирует совершенно новый псевдослучайный GUID (версии 4), поэтому использовать его для получения пустого значения нельзя.
Рассмотрим основные способы программного получения нулевого идентификатора в коде 1С:
Передаем в конструктор строку из 32 нулей в стандартном формате 8-4-4-4-12:
ПустойИдентификатор = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
Важно помнить, что конструктор крайне чувствителен к формату. Если передать строку неверной длины или с нарушением расстановки дефисов, платформа вызовет исключение «Неверный формат строки для УникальногоИдентификатора».
У любого ссылочного метаданного пустая ссылка возвращает нулевой GUID:
ПустойИдентификатор = Документы.РеализацияТоваровУслуг.ПустаяСсылка().УникальныйИдентификатор();
Для универсальных механизмов сериализации и обмена данными можно использовать функцию XMLЗначение:
ПустойИдентификатор = XMLЗначение(Тип("УникальныйИдентификатор"), "00000000-0000-0000-0000-000000000000");
Выясним, как наиболее надежно проверить, заполнен ли реквизит типа УникальныйИдентификатор. На практике встречаются различные подходы, но платформенный метод является самым быстрым и безопасным.
Штатная функция платформы ЗначениеЗаполнено() полностью поддерживает тип УникальныйИдентификатор. Если идентификатор равен 00000000-0000-0000-0000-000000000000, функция вернет Ложь, а для любого другого значения — Истина:
Если Не ЗначениеЗаполнено(ТекущийУИД) Тогда
// Идентификатор не заполнен (пустой)
Сообщить("Уникальный идентификатор пуст");
КонецЕсли;
Сравнение строкового представления идентификатора с нулевой строкой через Строка(ТекущийУИД) = "00000000-0000-0000-0000-000000000000" избыточно и работает медленнее, чем вызов ЗначениеЗаполнено().
По умолчанию колонка табличной части или поле формы с типом УникальныйИдентификатор при отсутствии значения отображает строку нулей. Чтобы скрыть эти данные от пользователя и сделать интерфейс аккуратным, настроим Условное оформление формы:
Объект.ЭтапыГрафикаОплаты.ИдентификаторРеализации — Не Заполнено."".Проанализируем типовую задачу: попытку связать строку табличной части одного документа (например, ЗаказКлиента) с другим документом (например, РеализацияТоваровУслуг) путем записи GUID реализации в реквизит строки заказа.
Такой подход несет серьезные архитектурные риски:
УникальныйИдентификатор. При поиске ссылок на удаляемый объект (через штатное удаление помеченных объектов) система не найдет использование GUID в строках табличных частей, что приведет к появлению «битых» связей.УникальныйИдентификатор. Чтобы получить данные связанного документа, придется выполнять сложные обходные манипуляции.Для правильной организации связей между документами и строками табличных частей используем штатные механизмы 1С:
ДокументСсылка.РеализацияТоваровУслуг. Это обеспечивает автоматический контроль ссылочной целостности, корректное отображение в отчете «Структура подчиненности» и возможность легкого разыменования полей в запросах.Заказ, РасчетныйДокумент и КлючСтроки (или КлючСвязи). Это исключает блокировки исходного документа и обеспечивает высокую масштабируемость системы.