Работа с уникальными идентификаторами в платформе 1С:Предприятие 8.3 является фундаментальной задачей для любого разработчика. Понимание того, как генерировать, извлекать и использовать УИД внутри запросов, критически важно при построении сложных механизмов обмена данными, ведении регистров сведений или реализации распределенных информационных баз.

В этой статье мы детально разберем синтаксические конструкции языка запросов, позволяющие формировать уникальные значения непосредственно на стороне СУБД или движка 1С. Вы узнаете о различиях между псевдополями таблиц и встроенными функциями языка, а также о том, как избежать распространенных ошибок при работе с типом данных УникальныйИдентификатор.

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

Понятие УИД и его роль в архитектуре 1С

В контексте платформы 1С:Предприятие термин УИД чаще всего относится к полю УникальныйИдентификатор (или UID), которое автоматически присваивается каждой записи в регистрах сведений, накопления, бухгалтерии и расчета. Это поле гарантирует глобальную уникальность строки в рамках конкретного регистра.

Однако, говоря о получении УИД в запросе, разработчики могут подразумевать две разные сущности. Первая — это технический идентификатор записи регистра, необходимый для последующего удаления или модификации конкретной строки движений. Вторая — это генерация нового GUID (Globally Unique Identifier) для использования в качестве ключа во временных таблицах или при создании новых объектов.

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

⚠️ Внимание: Поле УникальныйИдентификатор недоступно для выборки из обычных справочников или документов в прямом виде через стандартный механизм ссылок. Ссылка на объект сама по себе является уникальным идентификатором в рамках базы, но имеет другую внутреннюю структуру хранения.

Платформа использует тип данных УникальныйИдентификатор для обеспечения целостности данных при синхронизации между узлами распределенной информационной базы (РИБ). Именно поэтому значение этого поля никогда не должно формироваться вручную путем конкатенации строк, если вы хотите гарантировать отсутствие коллизий.

Получение УИД записей регистров с помощью псевдополей

Самый частый сценарий, когда требуется получить УИД в запросе — это работа с регистрами. Каждая запись в регистре имеет скрытое поле, которое программист может явно указать в секции ВЫБРАТЬ. Это позволяет получить технический ключ записи для дальнейшей обработки.

Для доступа к этому значению используется ключевое слово УникальныйИдентификатор. Оно является псевдополем, которое движок запросов транслирует в соответствующее физическое поле таблицы в базе данных. Синтаксис предельно прост и не требует подключения дополнительных библиотек.

Рассмотрим пример выборки из регистра сведений. В данном случае мы получаем не только измерение и ресурс, но и системный идентификатор строки. Это часто необходимо при реализации механизмов "запись-удаление" или при сложной фильтрации дублей.

ВЫБРАТЬ

РегистрСведений.ЦеныНоменклатуры.УникальныйИдентификатор КАК УИД,

РегистрСведений.ЦеныНоменклатуры.Номенклатура,

РегистрСведений.ЦеныНоменклатуры.Цена

ИЗ

РегистрСведений.ЦеныНоменклатуры

Обратите внимание, что псевдополе УникальныйИдентификатор доступно только для запросов к таблицам регистров. Попытка выбрать это поле из виртуальной таблицы среза или из обычного справочника приведет к ошибке синтаксиса или логической ошибке выполнения.

💡

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

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

Генерация нового УИД функцией УИД()

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

Функция УИД() не принимает аргументов. Она гарантирует высокую степень уникальности результата, что делает её идеальным инструментом для заполнения ключевых полей во временных таблицах или при формировании пакетов данных для внешней интеграции.

Частой ошибкой новичков является попытка использовать эту функцию в условиях соединения (ЛЕВОЕ СОЕДИНЕНИЕ ... ПО). Поскольку функция вызывается для каждой обрабатываемой строки, значение будет меняться, что сделает условие соединения невыполнимым или бессмысленным.

  • 🚀 Функция УИД() выполняется на стороне сервера 1С и не зависит от конкретной СУБД (MSSQL, PostgreSQL, Oracle).
  • 🔄 Каждое обращение к функции генерирует новое, отличное от предыдущих значение.
  • ⚡ Использование функции в SELECT не влияет на производительность выборки данных из основных таблиц.

Пример использования функции для создания временного ключа:

ВЫБРАТЬ

УИД() КАК ВременныйКлюч,

Справочник.Номенклатура.Ссылка

ИЗ

Справочник.Номенклатура

Такой подход часто применяется при выгрузке данных в формат, требующий наличия уникального ключа, которого нет в исходной конфигурации. Например, при подготовке данных для загрузки в CRM-систему или на маркетплейс.

📊 Какой метод генерации УИД вы используете чаще?
Функция УИД() в запросе
Генерация в коде 1С перед запросом
Использование последовательностей
Не использую УИД

Сравнение методов получения идентификаторов

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

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

В то же время, функция УИД() создает новое значение "на лету". Оно не сохраняется в базе данных автоматически, если вы не запишете его явно в таблицу. Это инструмент для временных операций или инициализации новых сущностей.

Характеристика Псевдополе УникальныйИдентификатор Функция УИД()
Источник данных Физическое поле таблицы регистра Генератор случайных чисел платформы
Уникальность Гарантирована в рамках регистра Вероятностная (практически 100%)
Область применения Чтение, обновление, удаление записей Создание новых ключей, временные таблицы
Доступность Только регистры Любой контекст запроса

При проектировании сложных отчетов часто приходится комбинировать оба подхода. Например, вы выбираете существующие УИД записей для анализа, и одновременно генерируете новые УИД для группировки этих записей во временном наборе данных.

⚠️ Внимание: Не пытайтесь присваивать значение УникальныйИдентификатор вручную через запрос вида ОБНОВИТЬ ... УСТАНОВИТЬ УникальныйИдентификатор = .... Для регистров это поле управляется системой, и прямая модификация может привести к нарушению ссылочной целостности и ошибкам при проведении документов.

Работа с УИД в временных таблицах

Временные таблицы в 1С часто используются как буфер для сложной обработки данных. При создании такой таблицы важно правильно определить тип колонки, которая будет хранить уникальный идентификатор. Тип должен быть строго определен как УникальныйИдентификатор.

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

Синтаксис создания временной таблицы с полем УИД выглядит следующим образом:

ВЫБРАТЬ

УИД() КАК ИдентификаторСтроки,

РегистрСведений.РабочееВремя.Период,

РегистрСведений.РабочееВремя.Сотрудник

ПОМЕСТИТЬ ВТ_Время

ИЗ

РегистрСведений.РабочееВремя КАК РегистрСведений.РабочееВремя

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

Особенности хранения УИД в временных таблицах

Временные таблицы хранятся в памяти сервера (или в специальной служебной базе TempDB в зависимости от настроек кластера). Тип УникальныйИдентификатор занимает 16 байт. При большом объеме данных (миллионы строк) использование этого типа может увеличить потребление оперативной памяти по сравнению с числовыми ключами, однако это редко становится узким местом в типовых задачах.

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

Типичные ошибки и способы их устранения

Разработчики часто сталкиваются с проблемами при работе с уникальными идентификаторами из-за непонимания области видимости псевдополей. Самая распространенная ошибка — попытка выбрать УникальныйИдентификатор из таблицы, которая не является таблицей регистра.

Например, при запросе к виртуальной таблице РегистрНакопления.Обороты поле УИД недоступно, так как эта таблица является агрегированной и не содержит физических строк с уникальными идентификаторами в привычном понимании. В таких случаях нужно обращаться к основной таблице регистра.

Еще одна частая проблема возникает при использовании УИД в условиях отбора. Поскольку тип данных специфичен, важно корректно передавать параметры из кода 1С в текст запроса. Переменная типа УникальныйИдентификатор должна быть явно объявлена и заполнена перед выполнением запроса.

  • ❌ Ошибка: Выборка псевдополя из справочника или документа.
  • ❌ Ошибка: Использование функции УИД() в условии соединения (JOIN).
  • ❌ Ошибка: Попытка ручного изменения УИД существующей записи регистра.

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

⚠️ Внимание: Интерфейс и возможности языка запросов могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие 8.3. Всегда сверяйте синтаксис встроенных функций с актуальной документацией для вашей конкретной версии релиза, особенно если вы работаете с устаревшими конфигурациями или облачными версиями сервиса.

💡

Псевдополе УникальныйИдентификатор — это "адрес" записи в регистре. Функция УИД() — это инструмент для создания новых уникальных меток. Не путайте их назначение.

Часто задаваемые вопросы (FAQ)

Можно ли получить УИД обычного справочника в запросе?

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

Влияет ли использование УИД на производительность запроса?

Выборка псевдополя УникальныйИдентификатор из регистра практически не влияет на производительность, так как это поле индексируется по умолчанию. Однако генерация миллионов новых УИД функцией УИД() в цикле или в большом запросе может создать нагрузку на процессор сервера приложений.

Как правильно передать УИД из 1С в параметр запроса?

В коде 1С создайте переменную типа УникальныйИдентификатор (например, НовыйУИД = УникальныйИдентификатор()). В тексте запроса используйте параметр (например, &ПараметрУИД). Перед выполнением установите значение: Запрос.УстановитьПараметр("ПараметрУИД", НовыйУИД).

Можно ли использовать УИД для соединения таблиц?

Да, это допустимо и часто используется для соединения временной таблицы с основным регистром. Однако соединение по полю, заполненному функцией УИД() "на лету" в обоих таблицах, бессмысленно, так как значения не совпадут. Соединять нужно по сохраненным значениям.

☑️ Проверка перед использованием УИД

Выполнено: 0 / 4