Функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР(UUID)

Язык запросов

Синтаксис и применение Функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР(UUID) в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

Функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР(UUID)

УникальныйИдентификатор(<Выражение>)

Функция позволяет получить уникальный идентификатор переданной ссылки.

Выражение - Выражение, результатом вычисления которого является ссылочное значение (кроме ссылки на таблицы внешних источников данных).

Возвращаемое значение:
Зависит от параметра функции:

NULL - NULL.

Неопределено либо пустая ссылка - пустой уникальный идентификатор (типа УникальныйИдентификатор).

Для значения с типом ссылки - значение типа УникальныйИдентификатор.

Для других типов (включая входящие в составной тип) - формируется ошибка времени выполнения.

см. также: Функции языка запросов

Практические примеры

УНИКАЛЬНЫЙИДЕНТИФИКАТОР: различить ссылку, пустой адрес, Неопределено и NULL

Один запрос без ИЗ вычисляет пять разных результатов по нативному контракту; отдельный UUID(7) демонстрирует именно границу времени выполнения, не служит заменой проверки успеха.

Где и как запускать

Полный серверный общий модуль УчебныйЯзык новой собственной конфигурации УчебныеСсылки85 на 8.5.1.1343. Запросы в 1С здесь не запускались; Python — только модель фиксированных данных. Прикладные объекты не читаются и не записываются.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. Создайте НОВУЮ отдельную пустую учебную информационную базу на платформе 8.5.1.1343, не копию рабочего приложения. Конфигурация: Имя=УчебныеСсылки85. Режим совместимости не должен включать ограничения старой версии. Не подключайте расширения и внешние обработчики; не создавайте записи прикладных объектов.

  7. Конфигуратор → Справочники → создать УчебныеАдресаты85. Иерархический=Нет; Владельцы пусты; собственные Реквизиты и Табличные части пусты; Предопределенные данные пусты. Оставьте все модули объекта/менеджера пустыми. Стандартные поля платформы не удаляются и в опыте не читаются.

  8. Конфигуратор → Документы → создать УчебнаяЗаявка85. Проведение=Запретить; собственные Реквизиты, Табличные части и Движения пусты. Все модули объекта/менеджера пусты; подписок и обработчиков нет. ПолучитьСсылку не создаёт документ-объект и не записывает его.

  9. Конфигуратор → Перечисления → создать УчебныйСтатус85 → Значения: ровно План и Готов, с такими именами, не только синонимами. Никаких иных перечислений, справочников, документов, регистров, подписок, общих реквизитов, планов, бизнес-процессов и задач в собственном стенде не создавайте.

  10. Основной код этого урока целиком заменяет модуль УчебныйЯзык: это один самостоятельный полный серверный общий модуль со всеми помощниками на его уровне. Для каждого следующего урока заменяйте этот модуль целиком; не склеивайте три экспортные процедуры с одинаковым именем.

  11. В отдельной новой внешней обработке УчебныйПускUUID85 создайте управляемую форму Форма и команду Выполнить; назначьте команде одноимённое действие и добавьте кнопку. Все остальные модули пусты. Полный отдельный модуль формы:

    &НаКлиенте
    Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт ссылочных значений завершён без записи");
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()
    УчебныйЯзык.ВыполнитьПример();
    КонецПроцедуры

  12. Обновление новой собственной учебной конфигурации и ручной запуск делает читатель; здесь конфигурация, база и 1С не запускались. Guard читает только перечисленные свойства схемы и версию; он не проверяет тексты пустых модулей, расширения, предопределённые элементы или наличие записей. Это отдельные обязательные условия ручной подготовки.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойСтендСсылок();
    UUIDАдресата = Новый УникальныйИдентификатор("11111111-1111-1111-1111-111111111111");
    UUIDЗаявки = Новый УникальныйИдентификатор("22222222-2222-2222-2222-222222222222");
    Адресат = Справочники.УчебныеАдресаты85.ПолучитьСсылку(UUIDАдресата);
    Заявка = Документы.УчебнаяЗаявка85.ПолучитьСсылку(UUIDЗаявки);
    Если ТипЗнч(Адресат) <> Тип("СправочникСсылка.УчебныеАдресаты85")
        Или ТипЗнч(Заявка) <> Тип("ДокументСсылка.УчебнаяЗаявка85") Тогда
        ВызватьИсключение "Не совпали типы двух собственных ссылочных значений";
    КонецЕсли;
    Если Адресат.УникальныйИдентификатор() <> UUIDАдресата Или Заявка.УникальныйИдентификатор() <> UUIDЗаявки Тогда
        ВызватьИсключение "Собственные ссылки не сохранили заданные идентификаторы";
    КонецЕсли;
    ПустойАдресат = Справочники.УчебныеАдресаты85.ПустаяСсылка();
    ПустойUUID = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
    Если ТипЗнч(ПустойАдресат) <> Тип("СправочникСсылка.УчебныеАдресаты85") Тогда
        ВызватьИсключение "Нужна именно собственная пустая ссылка";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
        |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&Адресат) КАК UUIDАдресата,
        |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&Заявка) КАК UUIDЗаявки,
        |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&ПустойАдресат) КАК UUIDПустойСсылки,
        |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&Отсутствует) КАК UUIDНеопределено,
        |    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(NULL) КАК UUIDNull";
    Запрос.УстановитьПараметр("Адресат", Адресат);
    Запрос.УстановитьПараметр("Заявка", Заявка);
    Запрос.УстановитьПараметр("ПустойАдресат", ПустойАдресат);
    Запрос.УстановитьПараметр("Отсутствует", Неопределено);
    Ожидания = Новый Массив;
    Ожидания.Добавить(Новый Структура("UUIDАдресата,UUIDЗаявки,UUIDПустойСсылки,UUIDНеопределено,UUIDNull", UUIDАдресата, UUIDЗаявки, ПустойUUID, ПустойUUID, Null));
    Поля = Новый Массив;
    Поля.Добавить("UUIDАдресата");
    Поля.Добавить("UUIDЗаявки");
    Поля.Добавить("UUIDПустойСсылки");
    Поля.Добавить("UUIDНеопределено");
    Поля.Добавить("UUIDNull");
    Таблица = Запрос.Выполнить().Выгрузить();
    ПроверитьСвоюПолнуюТаблицу(Таблица, Ожидания, Поля);
    ПлохойЗапрос = Новый Запрос;
    ПлохойЗапрос.Текст = "ВЫБРАТЬ УНИКАЛЬНЫЙИДЕНТИФИКАТОР(7) КАК НеПодходит";
    ОжидаемаяОшибка = Ложь;
    Попытка
        ПлохойЗапрос.Выполнить();
    Исключение
        ОжидаемаяОшибка = Истина;
        Сообщить("Ручной опыт UUID(7): фактическая ошибка выполнения. " + ОписаниеОшибки());
    КонецПопытки;
    Если Не ОжидаемаяОшибка Тогда
        ВызватьИсключение "Ожидалась нативная ошибка UUID от числа 7";
    КонецЕсли;
    ПовторнаяТаблица = Запрос.Выполнить().Выгрузить();
    ПроверитьСвоюПолнуюТаблицу(ПовторнаяТаблица, Ожидания, Поля);
    ПроверитьСвоюПолнуюТаблицу(Таблица, Ожидания, Поля);
    Если Адресат.УникальныйИдентификатор() <> UUIDАдресата Или Заявка.УникальныйИдентификатор() <> UUIDЗаявки Тогда
        ВызватьИсключение "Неизменяемые собственные ссылочные параметры изменились";
    КонецЕсли;
    Сообщить("Проверены четыре типизированных UUID и один Null; исходный успешный результат сохранён");
КонецПроцедуры

Процедура ПроверитьСвойСтендСсылок()
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 1 Или Метаданные.Перечисления.Количество() <> 1 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен именно собственный минимальный стенд УчебныеСсылки85";
    КонецЕсли;
    МетаАдресат = Метаданные.Справочники.Найти("УчебныеАдресаты85");
    МетаЗаявка = Метаданные.Документы.Найти("УчебнаяЗаявка85");
    МетаСтатус = Метаданные.Перечисления.Найти("УчебныйСтатус85");
    Если МетаАдресат = Неопределено Или МетаЗаявка = Неопределено Или МетаСтатус = Неопределено Тогда
        ВызватьИсключение "Не найдены три собственных объекта метаданных";
    КонецЕсли;
    Если МетаАдресат.Иерархический Или МетаАдресат.Владельцы.Количество() <> 0
        Или МетаАдресат.Реквизиты.Количество() <> 0 Или МетаАдресат.ТабличныеЧасти.Количество() <> 0 Тогда
        ВызватьИсключение "Свой справочник должен быть неиерархическим, без владельцев и собственных полей";
    КонецЕсли;
    Если МетаЗаявка.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить
        Или МетаЗаявка.Реквизиты.Количество() <> 0 Или МетаЗаявка.ТабличныеЧасти.Количество() <> 0
        Или МетаЗаявка.Движения.Количество() <> 0 Тогда
        ВызватьИсключение "Свой документ должен быть без проведения, движений и собственных полей";
    КонецЕсли;
    Если МетаСтатус.ЗначенияПеречисления.Количество() <> 2
        Или МетаСтатус.ЗначенияПеречисления.Найти("План") = Неопределено
        Или МетаСтатус.ЗначенияПеречисления.Найти("Готов") = Неопределено Тогда
        ВызватьИсключение "Свой статус должен иметь ровно два значения План и Готов";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоюПолнуюТаблицу(Таблица, Ожидания, Поля)
    Если Таблица.Колонки.Количество() <> Поля.Количество() Или Таблица.Количество() <> Ожидания.Количество() Тогда
        ВызватьИсключение "Не совпали все размеры собственного результата";
    КонецЕсли;
    Для Каждого ИмяПоля Из Поля Цикл
        Если Таблица.Колонки.Найти(ИмяПоля) = Неопределено Тогда
            ВызватьИсключение "Не найдена собственная ожидаемая колонка " + ИмяПоля;
        КонецЕсли;
    КонецЦикла;
    Если Ожидания.Количество() > 0 Тогда
        Для Индекс = 0 По Ожидания.Количество() - 1 Цикл
            Для Каждого ИмяПоля Из Поля Цикл
                Если Не Ожидания[Индекс].Свойство(ИмяПоля, Ожидаемое) Тогда
                    ВызватьИсключение "Не найдено собственное ожидаемое поле " + ИмяПоля;
                КонецЕсли;
                Колонка = Таблица.Колонки.Найти(ИмяПоля);
                ИндексКолонки = Таблица.Колонки.Индекс(Колонка);
                Фактическое = Таблица[Индекс].Получить(ИндексКолонки);
                Если ТипЗнч(Фактическое) <> ТипЗнч(Ожидаемое) Тогда
                    ВызватьИсключение "Не совпал точный тип поля " + ИмяПоля;
                КонецЕсли;
                Если ТипЗнч(Ожидаемое) <> Тип("Null") Тогда
                    Если Фактическое <> Ожидаемое Тогда
                        ВызватьИсключение "Не совпало собственное значение поля " + ИмяПоля;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
УчебныйПускUUID85.Форма

Новая собственная внешняя обработка УчебныйПускUUID85 → Управляемая форма Форма → Модуль

Отдельный полный модуль формы; клиент вызывает серверную процедуру без контекста, та вызывает УчебныйЯзык.ВыполнитьПример(). Не объединять с общим модулем.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт ссылочных значений завершён без записи");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныйЯзык.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Создать только описанный новый стенд. Guard проверяет свою схему до любых ссылочных значений; весь код размещается в серверном общем модуле.

  2. Сформировать собственные адреса справочника и документа из двух фиксированных UUID настоящими ПолучитьСсылку. Проверить типы и исходные идентификаторы без чтения объектов.

  3. Получить собственную пустую ссылку справочника и отдельно создать нулевой UUID из точной строки 00000000-0000-0000-0000-000000000000. Пустая ссылка и нулевой UUID — разные типы.

  4. Четыре неизменяемых параметра передаются УстановитьПараметр: два адреса, пустой адрес и Неопределено. NULL в пятом выражении — литерал языка запроса, не строка и не отсутствующий параметр.

  5. Запрос без ИЗ возвращает одну строку из пяти выражений. Для двух заполненных ссылочных значений UUID — заданный идентификатор независимо от наличия записи по адресу.

  6. Native отдельно фиксирует: NULL возвращает NULL; Неопределено и пустая ссылка возвращают пустой УникальныйИдентификатор; обычное ссылочное значение возвращает УникальныйИдентификатор.

  7. Проверить все имена пяти колонок и одну полную строку. Первые четыре значения имеют точный тип УникальныйИдентификатор и равны своим UUID-объектам; последнее имеет точный тип Null. Не сравнивать Null обычным равенством.

  8. Намеренно плохой запрос UUID(7) создаётся и получает текст до локального catch. Защищённый участок содержит только ПлохойЗапрос.Выполнить(); ни подготовка, ни проверка успешного результата туда не попадают.

  9. Нативная причина ошибки: число не является разрешённым ссылочным/пустым значением. Фактическое ОписаниеОшибки показывается только при будущей ручной ошибке выполнения; конкретный локализованный текст не угадывается.

  10. После catch отдельно проверить флаг ожидаемой ошибки. Если запрос неожиданно выполнился, возбуждается ошибка вне catch; такая проверка не может быть проглочена как ожидаемый отказ.

  11. Повторить хороший запрос с теми же параметрами и проверить все пять полей новой и старой таблиц. Ссылочные параметры не переназначаются; проверить их исходные UUID снова.

  12. Временные таблицы и их менеджер этому запросу не нужны; нет фиктивного Закрыть у Запрос. Полный отдельный запуск формы дан в подготовке.

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

  1. Единственная строка: UUIDАдресата=11111111-1111-1111-1111-111111111111, UUIDЗаявки=22222222-2222-2222-2222-222222222222, UUIDПустойСсылки=нулевой UUID, UUIDНеопределено=нулевой UUID, UUIDNull=Null.

  2. Первые четыре поля строго УникальныйИдентификатор, пятое строго Null. Нулевой UUID не подменяется строкой, Null или Неопределено.

  3. UUID(7) должен породить ошибку времени выполнения при будущем ручном опыте. Обычные ошибки схемы, конструктора, хорошего запроса и проверки не ловятся этим catch.

  4. Повторный полный результат и исходная таблица остаются одинаковыми по всем значениям и типам; собственные адреса сохраняют фиксированные UUID.

Ожидаемый результат

Полный опыт отделяет пять нативных ветвей UUID и намеренную недопустимую числовую ветвь, не маскируя ошибки правильного запроса.

На что обратить внимание

  1. Native исключает ссылки на таблицы внешних источников данных. Здесь используются только собственные СправочникСсылка и ДокументСсылка, не такие внешние ссылки.

  2. Для иных типов, включая входящие в составной тип, native обещает ошибку времени выполнения. UUID не преобразует строку GUID в ссылку; BSL-конструктор UUID и функция языка запроса — разные операции.

  3. ПолучитьСсылку формирует адрес из идентификатора, не доказывает существование объекта. Не читаются ни Наименование, ни Номер, ни ПолучитьОбъект.

  4. Python моделирует только фиксированные данные/ожидания и запрет числового входа. Здесь запрос и BSL не запускались, а статический тест не является фактической ошибкой 1С.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.