Разработка и Конфигурация · 12 мин
Как присвоить уникальный идентификатор в 1С
Как присвоить уникальный идентификатор в 1С: автонумерация, GUID, функция Новый УникальныйИдентификатор, настройка кодов справочников и проверка уникальности.
Уникальный идентификатор в 1С — это значение, которое однозначно отличает один объект базы от другого: элемент справочника, документ, запись регистра. Платформа умеет генерировать такие идентификаторы автоматически, но на практике часто требуется присвоить их вручную: при обмене данными между базами, при загрузке из внешних файлов, при интеграции с сайтом или при программном создании объектов.
Ошибка в работе с идентификаторами приводит к серьёзным последствиям: дублированию элементов, потере связей между документами, рассинхронизации при обмене. Поэтому важно понимать, какие механизмы уникальности есть в платформе, когда достаточно стандартной нумерации, а когда нужен GUID, и как проверить результат.
Ниже разобраны основные способы присвоения уникальных идентификаторов: автонумерация кодов и номеров, работа с GUID через встроенный язык, установка ссылки при загрузке данных и контроль уникальности. Примеры кода приведены для управляемых форм и подходят для большинства современных конфигураций.
Какие виды уникальных идентификаторов есть в 1С
В платформе 1С:Предприятие существует несколько уровней уникальности, и их часто путают. Первый уровень — код справочника или номер документа. Это видимый пользователю реквизит, который заполняется автоматически или вручную и обычно уникален в пределах вида объекта. Второй уровень — внутренняя ссылка (GUID), глобально уникальный идентификатор, который платформа присваивает каждому объекту при записи. Именно ссылка используется для связей между объектами.
Третий уровень — уникальный идентификатор записи регистра сведений или строки табличной части внутри объекта. Он нужен реже, но важен при программной работе с коллекциями. Понимание этой иерархии помогает выбрать правильный инструмент: для пользовательской нумерации достаточно кодов, для обмена между базами нужен GUID.
Автоматическая нумерация кодов и номеров
Самый простой способ обеспечить уникальность — доверить её платформе. В конфигураторе у справочников и документов есть свойство «Автонумерация»: если оно включено, при создании нового объекта платформа сама подставляет следующий код или номер. Дополнительно включается «Контроль уникальности», который не даст записать объект с уже существующим кодом.
Для справочников настройки находятся на закладке «Нумерация» в свойствах объекта метаданных: там задаётся длина кода, тип (число или строка), периодичность и признак автонумерации. Для документов аналогично настраивается номер. В типовых конфигурациях эти механизмы уже включены, и пользователю обычно ничего присваивать вручную не нужно.
Строковые коды с лидирующими нулями (например, «000000125») обеспечивают правильную сортировку и удобны при поиске. Если код числовой, платформа ведёт отдельный счётчик. При переносе данных между базами счётчики могут расходиться, поэтому после загрузки стоит обновить нумерацию обработкой или вручную создать тестовый элемент, чтобы платформа пересчитала следующий номер.
Присвоение GUID программно
Когда объект создаётся встроенным языком, платформа автоматически формирует для него новую ссылку. Однако иногда требуется сгенерировать идентификатор заранее — например, чтобы записать его во внешнюю систему до сохранения объекта. Для этого используется конструктор Новый УникальныйИдентификатор(), который возвращает новый GUID.
Полученный идентификатор можно преобразовать в строку методом Строка() или простым присвоением строковой переменной — так его удобно передавать в веб-сервисы, файлы обмена и другие базы. Обратное преобразование выполняется конструктором Новый УникальныйИдентификатор(СтрокаGUID).
НовыйGUID = Новый УникальныйИдентификатор();
СтрокаGUID = Строка(НовыйGUID); // "b794a2c1-..."
// Создание ссылки с заданным GUID
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйGUID);
НовыйЭлемент.УстановитьСсылкуНового(НоваяСсылка);
НовыйЭлемент.Наименование = "Новый товар";
НовыйЭлемент.Записать();Ключевой метод здесь — УстановитьСсылкуНового(). Он присваивает ещё не записанному объекту конкретную ссылку с заданным GUID. Это незаменимо при синхронизации: внешняя система передаёт идентификатор, и объект в 1С создаётся именно с ним, а не со случайным. Без этого метода связь между системами пришлось бы хранить в отдельном регистре соответствий.
Установка ссылки при загрузке данных
Типовой сценарий: из файла или по HTTP загружается список товаров, у каждого есть внешний идентификатор. Правильная последовательность такая: сначала по GUID ищется существующая ссылка методом ПолучитьСсылку(Идентификатор), затем проверяется, существует ли объект с такой ссылкой в базе. Если существует — объект обновляется, если нет — создаётся новый с установкой этой ссылки.
Проверка существования выполняется через метод ПолучитьОбъект(): если он возвращает Неопределено, объекта с такой ссылкой нет. Это надёжнее, чем поиск по коду или наименованию, которые могут совпадать у разных элементов. Альтернатива — запрос к базе по ссылке, что быстрее при пакетной обработке больших объёмов.
- 1Получите строку идентификатора из источника данных и преобразуйте её: Новый УникальныйИдентификатор(СтрокаGUID)
- 2Сформируйте ссылку: Справочники.Номенклатура.ПолучитьСсылку(GUID)
- 3Проверьте существование: Ссылка.ПолучитьОбъект() — если Неопределено, объекта нет
- 4Если объект есть — откройте его объект и измените реквизиты; если нет — создайте новый элемент и вызовите УстановитьСсылкуНового(Ссылка)
- 5Запишите объект и при необходимости зафиксируйте соответствие в журнале обмена
При массовой загрузке оборачивайте запись в транзакцию разумного размера: одна гигантская транзакция на десятки тысяч элементов может привести к блокировкам и переполнению журнала. Практичный подход — фиксировать каждые несколько сотен объектов, а при ошибке откатывать только текущую порцию, чтобы не потерять всю загрузку.
Уникальность реквизитов и собственные идентификаторы
Иногда уникальным должен быть не код, а произвольный реквизит: артикул, ИНН контрагента, штрихкод. Стандартный контроль уникальности платформы на такие реквизиты не распространяется, поэтому используются другие механизмы. Самый надёжный — хранение значения в измерении регистра сведений: платформа сама не даст создать две записи с одинаковым измерением, и нарушение вызовет исключение.
Второй вариант — программная проверка перед записью в обработчике ПередЗаписью или ОбработкаПроверкиЗаполнения: запросом ищется объект с таким же значением реквизита, исключая текущий, и при нахождении выводится сообщение об ошибке. Минус подхода — теоретическая возможность гонки при одновременной записи двумя пользователями, поэтому для критичных данных предпочтителен регистр сведений.
Если нужен человекочитаемый уникальный номер по собственному правилу (например, с префиксом филиала), используются подписки на событие ПриУстановкеНовогоКода или ПриУстановкеНовогоНомера. В обработчике формируется нужное значение и присваивается параметру, после чего стандартная нумерация не срабатывает. В типовых конфигурациях для этого есть общий механизм префиксации.
Сравнение способов обеспечить уникальность
Подходит для пользовательской нумерации внутри одной базы. Не работает для связи между базами и не контролирует произвольные реквизиты.
Стандарт для обмена и интеграций. Требует аккуратности: GUID должен приходить из доверенного источника, иначе возможны коллизии при повторной загрузке.
Надёжный контроль уникальности произвольных значений (артикулов, ИНН) на уровне СУБД. Требует дополнительного объекта метаданных.
Просто в реализации, но не защищает от одновременной записи двумя сеансами. Годится для некритичных данных.
Проверка результата и типичные ошибки
После присвоения идентификатора результат нужно проверить. Для GUID — убедиться, что объект записался именно с той ссылкой, которую вы установили: сравните Строка(Ссылка.УникальныйИдентификатор()) с исходной строкой. Для кодов — откройте список объектов и проверьте, что новый элемент получил ожидаемый номер и сортировка работает корректно.
Как проверить результат
Строка(Ссылка.УникальныйИдентификатор()) совпадает с переданным из внешней системы GUID
GUID отличается — значит, УстановитьСсылкуНового не вызывался или был вызван после записи
Объект находится по ссылке и обновляется, дублей не создаётся
Создаётся второй элемент — проверка существования не работает
Новый объект получает код больше максимального существующего
Присваивается уже занятый код, возникает ошибка уникальности
Практические рекомендации и ограничения
Если задача сводится к обмену между двумя базами 1С, не изобретайте собственную схему идентификаторов: типовые планы обмена и формат EnterpriseData уже опираются на GUID и решают задачу соответствия объектов. Собственная разработка оправдана, когда вторая сторона — не 1С и формат обмена фиксирован внешней системой.
Помните об ограничениях: GUID нельзя изменить у уже записанного объекта, ссылку нельзя «переиспользовать» после удаления объекта без риска получить битые связи, а строковое представление GUID зависит от порядка байт при выгрузке в некоторые форматы — при интеграции сверяйте формат с документацией внешней системы. При сомнениях проверяйте поведение на копии базы.
Что важно запомнить
Для пользовательской нумерации достаточно автонумерации и контроля уникальности кодов. Для связи между базами и интеграций используйте GUID: конструктор Новый УникальныйИдентификатор() и метод УстановитьСсылкуНового() до записи объекта. Уникальность произвольных реквизитов надёжнее всего обеспечивает регистр сведений. Любые массовые операции с идентификаторами выполняйте после резервного копирования.
Частые вопросы
Как узнать GUID элемента справочника в пользовательском режиме?
Штатной кнопки в интерфейсе обычно нет. Проще всего открыть элемент через внешнюю обработку или выполнить в консоли кода выражение Строка(Ссылка.УникальныйИдентификатор()). Также GUID виден в адресной строке при получении навигационной ссылки на объект через команду «Получить ссылку».
Можно ли присвоить объекту GUID, который уже использовался удалённым объектом?
Технически да, через УстановитьСсылкуНового с тем же значением. Но делать это не рекомендуется: старые ссылки на удалённый объект в других документах и регистрах «оживут» и начнут указывать на новый элемент, что исказит данные.
Почему при обмене создаются дубли элементов, хотя GUID передаются?
Чаще всего причина в том, что поиск выполняется не по ссылке, а по коду или наименованию, либо строка GUID искажается при передаче (другой регистр букв, иной порядок байт в формате). Проверьте, что на принимающей стороне строка преобразуется через Новый УникальныйИдентификатор(Строка) и поиск идёт методом ПолучитьСсылку.
Что делать, если после загрузки новые элементы получают уже занятые коды?
Счётчик автонумерации не знает о загруженных вручную кодах. Создайте элемент интерактивно — платформа обычно пересчитает следующий номер, либо используйте стандартную обработку обновления нумерации, если она есть в конфигурации. Для строковых кодов проверьте, что длина кода позволяет продолжить серию.
Можно ли сделать уникальным сочетание нескольких реквизитов?
Да, через регистр сведений с несколькими измерениями: уникальность контролируется по комбинации всех измерений. Программная проверка запросом тоже возможна — в условии запроса перечисляются все реквизиты, но она не защищает от одновременной записи в разных сеансах.
Отличается ли работа с идентификаторами в файловой и клиент-серверной базе?
Механизмы встроенного языка одинаковы. Различия проявляются в конкурентной работе: в клиент-серверном варианте выше риск гонок при программных проверках уникальности, поэтому там особенно важно использовать механизмы с контролем на уровне СУБД — регистры сведений и контроль уникальности кодов.