Как присвоить уникальный идентификатор 1с элементу
Перейти к содержимому

Как присвоить уникальный идентификатор 1с элементу

  • автор:

Как задать уникальный идентификатор для нового элемента справочника

СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
УстановитьСсылкуНового (SetNewObjectRef)
Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Параметры:
<Ссылка> (обязательный)
Тип: СправочникСсылка. Ссылка, которая будет назначена при записи нового объекта.

Вопрос: как создать эту ссылку? Или здесь задается уникальный идентификатор?

Примерно так
Процедура СоздатьНовыйОбъектПоСсылкеНажатие(Элемент)
// Вставить содержимое обработчика.

Если СтрДлина(СокрЛП(GUID)) <> 32 Тогда
Предупреждение(«Длина GUID ссылки должна быть равна 32 знакам»);
Возврат;
КонецЕсли;

Если ТипБитойСсылки = Неопределено Тогда
Предупреждение(«Тип ссылки не задан»);
Возврат;
КонецЕсли;

МетаОбъект = Метаданные.НайтиПоТипу(ТипБитойСсылки.Типы()[0]);
ПолноеИмяОбъекта = МетаОбъект.ПолноеИмя();
ТипОбъекта = Лев(ПолноеИмяОбъекта,Найти(ПолноеИмяОбъекта,».»)-1);
ИмяОбъекта = МетаОбъект.Имя;
UUID = Новый УникальныйИдентификатор(ПолучитьUUIDПоУникальномуИдентификатору(GUID));

Если ТипОбъекта = «Справочник» Тогда
НоваяСсылка = Справочники[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Справочники[ИмяОбъекта].СоздатьЭлемент();
ИначеЕсли ТипОбъекта = «Документ» Тогда
НоваяСсылка = Документы[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Документы[ИмяОбъекта].СоздатьДокумент();
ИначеЕсли ТипОбъекта = «ПланВидовХарактеристик» Тогда
НоваяСсылка = ПланыВидовХарактеристик[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыВидовХарактеристик[ИмяОбъекта].СоздатьЭлемент();
ИначеЕсли ТипОбъекта = «ПланСчетов» Тогда
НоваяСсылка = ПланыСчетов[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыСчетов[ИмяОбъекта].СоздатьСчет();
ИначеЕсли ТипОбъекта = «ПланВидовРасчета» Тогда
НоваяСсылка = ПланыВидовРасчета[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыВидовРасчета[ИмяОбъекта].СоздатьВидРасчета();
ИначеЕсли ТипОбъекта = «ПланОбмена» Тогда
НоваяСсылка = ПланыОбмена[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыОбмена[ИмяОбъекта].СоздатьУзел();
ИначеЕсли ТипОбъекта = «БизнесПроцесс» Тогда
НоваяСсылка = БизнесПроцессы[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = БизнесПроцессы[ИмяОбъекта].СоздатьБизнесПроцесс();
ИначеЕсли ТипОбъекта = «Задача» Тогда
НоваяСсылка = Задачи[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Задачи[ИмяОбъекта].СоздатьЗадачу();
Иначе
Предупреждение(«Неизвестный тип объекта»);
Возврат;
КонецЕсли;

Если НоваяСсылка.ПолучитьОбъект() <> Неопределено Тогда
Предупреждение(«Объект с такой ссылкой существует и не может быть создан»);
Возврат;
КонецЕсли;

Попытка
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.ПолучитьФорму().Открыть();
Исключение
Предупреждение(«Ошибка создания новой ссылки»);
КонецПопытки;

Программирование 1С 8.х для начинающих

  • Вы здесь:  
  • Уникальный идентификатор

Конфигурация

Уникальный идентификатор

  •  Печать 
  • E-mail

Уникальный идентификатор (GUID)

Если Вам встречались в базе записи «<Объект не найден>», то значит настала пора познакомитсья с Уникальным идентификатором .

Уникальный идентификатор — это уникальный набор символов который характерезует экземпляр метаданных объектного типа в 1С(Напрмимер, элемент справочника или документ). По сути ссылка и является уникальным идентификатором, причем даже у разных видов объектов он не может быть похож. Выглядит он примерно так:

de80b7c8-aa22-11dc-a0f4-0011d85708ff

Т.е. это набор из 32 шестнадцатеричных цифр разделенных дефисами.

Надпись <Объект не найден> появляется в базе когда есть ссылка(уникальный идентификатор) на объект, а объекта в базе нет. Такое может возникнуть или при удалении объектов без проврки ссылочной целостности или при обмене между базами.

Разберем для примера надпись: <Объект не найден> (36:9c4e0022642fda9811e10393c0d776fd)

Для начала узнаем какой тип объекта был удален, для этого используем метод ПолучитьСтруктуруХраненияБазыДанных(), он возвращает таблицу значений(по умолчанию в формате SDBL) где указано соответсвие внутренних идентификаторов и объектов метаданных.

Например можно написать такой код:

В ней мы находим идентификатор который в конце содержит 36 (цифры до двоеточия), но только не в составе числа( Document2836 ), а точное соответсвие. В нашем случае это следующая строка:

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

Значит удаленный элемент был элементом справочника «Номенклатура».

Как Вы заметили внутри скобок находится тип объекта и уникальный идентификатор строкой.

Теперь мы можем на одной из архивных копий найти удаленный элемент, добавив дефисы в имеющуюся у нас строку идентификтора:

Зная все значения полей мы можем вручную или с помощью обработок воссоздать удаленный элемент, но у них будет одно главное отличие — разные Уникальные идентификаторы. А если мы хотим восстановить элемент, то и идентификатор нужно восстановить тот же. Для этого нужно использовать метод «УстановитьСсылкуНового«, например так:

УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»

Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.

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

  1. При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
  2. При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
    Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.

Как узнать ссылку на объект до его записи

  1. Сгенерировать уникальный идентификатор объекта.
  2. Зарезервировать ссылку по уникальному идентификатору
  3. Установить зарезервированную ссылку для нового объекта.

//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;

//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;

//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;

После этого объект можно записать. Будет установлена заранее известная ссылка.

Особенности получения ссылок на новые объекты при обмене данными

Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:

При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.

Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.

Код будет выглядеть так:

ОригиналыПолучены = ПараметрыОбъекта [ "ОригиналыПолучены" ] ;

Если ОригиналыПолучены Тогда

//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;

МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;

//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;

МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;

Не запоминать выгруженные объекты при установке ссылки нового

ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.

УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария

а как быть если нужно создать с тем же УИД, как и в исходной базе, как этот самый УИД получить?

УИД объекта можно получить с помощью функции УникальныйИдентификатор()
Чтобы задать объекту конкретный УИД нужно сделать так:

Новый_UID = Новый УникальныйИдентификатор(«1014270d-d794-11df-825c-001517542b78»);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый _UID);
НашаНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НашаНоменклатура.УстановитьСсылкуНового(НоваяСсылка);

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

Только при обмене не обязательно делать одинаковые УИД в базах. Сопоставление объектов происходит через регистр сведений Соответствия объектов информационных баз.

УИД или уникальный идентификатор

УИД это определенное значение, однозначно идентифицирующее объект ссылочного типа данных, другими словами, это и есть ссылка уникальная в рамках одной конкретно взятой таблицы, например у справочника номенклатура. УИД есть у любого объекта имеющего ссылочный тип данных, из синтаксис помощника следует, что УИД имеет следующий вид: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где Х — символы обозначающие шестнадцатеричное число. Прочитать какой текущий уникальный идентификатор существует у ссылки можно с помощью метода УникальныйИдентификатор() например:

Использование своего УИД при создании объекта

Изменить УИД у существующего объекта, штатными средствами встроенного языка нельзя. Зато можно при создании нового объекта указать свой УИД. Для этого нужно сделать несколько действий:

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *