Как задать уникальный идентификатор для нового элемента справочника
СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
УстановитьСсылкуНового (SetNewObjectRef)
Синтаксис:
УстановитьСсылкуНового(<Ссылка>)
Параметры:
<Ссылка> (обязательный)
Тип: СправочникСсылка. Ссылка, которая будет назначена при записи нового объекта.
Вопрос: как создать эту ссылку? Или здесь задается уникальный идентификатор?
Примерно так
Процедура СоздатьНовыйОбъектПоСсылкеНажатие(Элемент)
// Вставить содержимое обработчика.
Если СтрДлина(СокрЛП(GUID)) <> 32 Тогда
Предупреждение(«Длина GUID ссылки должна быть равна 32 знакам»);
Возврат;
КонецЕсли;
Если ТипБитойСсылки = Неопределено Тогда
Предупреждение(«Тип ссылки не задан»);
Возврат;
КонецЕсли;
МетаОбъект = Метаданные.НайтиПоТипу(ТипБитойСсылки.Типы()[0]);
ПолноеИмяОбъекта = МетаОбъект.ПолноеИмя();
ТипОбъекта = Лев(ПолноеИмяОбъекта,Найти(ПолноеИмяОбъекта,».»)-1);
ИмяОбъекта = МетаОбъект.Имя;
UUID = Новый УникальныйИдентификатор(ПолучитьUUIDПоУникальномуИдентификатору(GUID));
Если ТипОбъекта = «Справочник» Тогда
НоваяСсылка = Справочники[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Справочники[ИмяОбъекта].СоздатьЭлемент();
ИначеЕсли ТипОбъекта = «Документ» Тогда
НоваяСсылка = Документы[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Документы[ИмяОбъекта].СоздатьДокумент();
ИначеЕсли ТипОбъекта = «ПланВидовХарактеристик» Тогда
НоваяСсылка = ПланыВидовХарактеристик[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыВидовХарактеристик[ИмяОбъекта].СоздатьЭлемент();
ИначеЕсли ТипОбъекта = «ПланСчетов» Тогда
НоваяСсылка = ПланыСчетов[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыСчетов[ИмяОбъекта].СоздатьСчет();
ИначеЕсли ТипОбъекта = «ПланВидовРасчета» Тогда
НоваяСсылка = ПланыВидовРасчета[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыВидовРасчета[ИмяОбъекта].СоздатьВидРасчета();
ИначеЕсли ТипОбъекта = «ПланОбмена» Тогда
НоваяСсылка = ПланыОбмена[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = ПланыОбмена[ИмяОбъекта].СоздатьУзел();
ИначеЕсли ТипОбъекта = «БизнесПроцесс» Тогда
НоваяСсылка = БизнесПроцессы[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = БизнесПроцессы[ИмяОбъекта].СоздатьБизнесПроцесс();
ИначеЕсли ТипОбъекта = «Задача» Тогда
НоваяСсылка = Задачи[ИмяОбъекта].ПолучитьСсылку(UUID);
НовыйОбъект = Задачи[ИмяОбъекта].СоздатьЗадачу();
Иначе
Предупреждение(«Неизвестный тип объекта»);
Возврат;
КонецЕсли;
Если НоваяСсылка.ПолучитьОбъект() <> Неопределено Тогда
Предупреждение(«Объект с такой ссылкой существует и не может быть создан»);
Возврат;
КонецЕсли;
Попытка
НовыйОбъект.УстановитьСсылкуНового(НоваяСсылка);
НовыйОбъект.ПолучитьФорму().Открыть();
Исключение
Предупреждение(«Ошибка создания новой ссылки»);
КонецПопытки;
Программирование 1С 8.х для начинающих
- Вы здесь:
- Уникальный идентификатор
Конфигурация
Уникальный идентификатор
- Печать
Уникальный идентификатор (GUID)
Если Вам встречались в базе записи «<Объект не найден>», то значит настала пора познакомитсья с Уникальным идентификатором .
Уникальный идентификатор — это уникальный набор символов который характерезует экземпляр метаданных объектного типа в 1С(Напрмимер, элемент справочника или документ). По сути ссылка и является уникальным идентификатором, причем даже у разных видов объектов он не может быть похож. Выглядит он примерно так:
de80b7c8-aa22-11dc-a0f4-0011d85708ff
Т.е. это набор из 32 шестнадцатеричных цифр разделенных дефисами.
Надпись <Объект не найден> появляется в базе когда есть ссылка(уникальный идентификатор) на объект, а объекта в базе нет. Такое может возникнуть или при удалении объектов без проврки ссылочной целостности или при обмене между базами.
Разберем для примера надпись: <Объект не найден> (36:9c4e0022642fda9811e10393c0d776fd)
Для начала узнаем какой тип объекта был удален, для этого используем метод ПолучитьСтруктуруХраненияБазыДанных(), он возвращает таблицу значений(по умолчанию в формате SDBL) где указано соответсвие внутренних идентификаторов и объектов метаданных.
Например можно написать такой код:
В ней мы находим идентификатор который в конце содержит 36 (цифры до двоеточия), но только не в составе числа( Document2836 ), а точное соответсвие. В нашем случае это следующая строка:
Reference36 | Справочник.Номенклатура |
Значит удаленный элемент был элементом справочника «Номенклатура».
Как Вы заметили внутри скобок находится тип объекта и уникальный идентификатор строкой.
Теперь мы можем на одной из архивных копий найти удаленный элемент, добавив дефисы в имеющуюся у нас строку идентификтора:
Зная все значения полей мы можем вручную или с помощью обработок воссоздать удаленный элемент, но у них будет одно главное отличие — разные Уникальные идентификаторы. А если мы хотим восстановить элемент, то и идентификатор нужно восстановить тот же. Для этого нужно использовать метод «УстановитьСсылкуНового«, например так:
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи»
Многие знают, что любому объекту ссылочного типа в 1С ссылка присваивается при записи в базу данных. То есть, если объект новый, то реквизит Ссылка у него пустой. Кстати, это один из способов узнать, работает пользователь с новым, только что созданным объектом, или же открыл уже существующий.
При записи объекта устанавливается случайная ссылка, так что предугадать ее у вас вряд ли получится. Тем не менее, существуют ситуации, когда полезно и даже необходимо знать ссылку на объект еще до записи этого объекта в базу. Приведем несколько примеров:
- При обмене данными необходимо программно создать некоторые записи в регистрах, включающие ссылку на объект обмена. При этом в базе-источнике таких регистров нет. Пример такой задачи мы подробно рассмотрим ниже.
- При оптимизации работы программного кода. Например, нужно программно создать контрагента, его договор и установить этот договор как Основной. Если идти классическим путем, то нужно сначала создать и записать элемент справочника Контрагенты, пройдя при этом все процедуры записи (а это может занять значительное время). Далее, нужно создать элемент справочника ДоговорыКонтрагентов, установив в качестве Владельца ссылку на контрагента. И наконец, получив заново объект элемента справочника Контрагенты, заполнить там реквизит ОсновнойДоговор и записать его, пройдя заново все процедуры записи.
Эту процедуру можно ускорить, зная заранее ссылку на еще не созданный ДоговорКонтрагента. В этом случае уже не требуется два раза получать и записывать Контрагента.
Как узнать ссылку на объект до его записи
- Сгенерировать уникальный идентификатор объекта.
- Зарезервировать ссылку по уникальному идентификатору
- Установить зарезервированную ссылку для нового объекта.
//Создаем уникальный идентификатор
УИД = новый УникальныйИдентификатор ;
//Создаем ссылку по этому идентификатору. Для этого нужно знать тип объекта
НоваяСсылка = Справочники . Контрагенты . ПолучитьСсылку ( УИД ) ;
//Устанавливаем ссылку для нового объекта
СправочникОбъект . УстановитьСсылкуНового ( НоваяСсылка ) ;
После этого объект можно записать. Будет установлена заранее известная ссылка.
Особенности получения ссылок на новые объекты при обмене данными
Рассмотрим, как получить ссылку на незаписанный объект на примере следующей задачи:
При обмене данными между двумя базами передается документ приобретения товаров. В базе источнике есть реквизит с типом Булево, показывающий получение оригиналов документов от поставщика. В базе-приемнике отметка о получении оригиналов реализована через регистр сведений с измерением — ссылкой на документ и ресурсом — ссылкой на перечисление.
Для решения этой задачи будет использоваться обработчик ПослеЗагрузки в правилах конвертации документа приобретения. Реквизит ОригиналыПолучены будет передаваться в виде параметра.
Код будет выглядеть так:
ОригиналыПолучены = ПараметрыОбъекта [ "ОригиналыПолучены" ] ;
Если ОригиналыПолучены Тогда
//Если записывается новый объект, создадим его ссылку
//В противном случае используем найденную
Если НЕ ОбъектНайден Тогда
СсылкаДокумента = Документы . ПоступлениеТоваровУслуг . ПолучитьСсылку ( новый УникальныйИдентификатор ) ;
Объект . УстановитьСсылкуНового ( СсылкаДокумента ) ;
Иначе
СсылкаДокумента = Ссылка ;
КонецЕсли ;
МЗ = РегистрыСведений . СтатусыДокументов . СоздатьМенеджерЗаписи ( ) ;
МЗ . Организация = Объект . Организация ;
//Устанавливаем в записи регистра сведений ссылку, полученную для еще не записанного объекта
МЗ . Документ = СсылкаДокумента ;
МЗ . Статус = Перечисления . СтатусыДокументовПоступления . ОригиналПолучен ;
МЗ . Записать ( ) ;
КонецЕсли ;
ВАЖНО. Если в обмене участвуют другие объекты, имеющие ссылки на наш документ приобретения товаров (например, счета-фактуры), то в них вы скорее всего получите <Объект не найден>, т.к. мы заменили ссылку на документ. Для того чтобы этого избежать, нужно в правилах конвертации документа на вкладке Настройки установить флаг Не запоминать выгруженные объекты. При использовании этого флага система не будет сохранять документы в специальной таблице кеширования, а каждый раз будет подбирать ссылку этого объекта заново, уже с учетом внесенных нами изменений.
УстановитьСсылкуНового() или «как узнать ссылку на объект до записи» : 2 комментария
а как быть если нужно создать с тем же УИД, как и в исходной базе, как этот самый УИД получить?
УИД объекта можно получить с помощью функции УникальныйИдентификатор()
Чтобы задать объекту конкретный УИД нужно сделать так:
Новый_UID = Новый УникальныйИдентификатор(«1014270d-d794-11df-825c-001517542b78»);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый _UID);
НашаНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НашаНоменклатура.УстановитьСсылкуНового(НоваяСсылка);
Если нужно заменить УИД уже существующего объекта, то все равно создают новый объект — копию существующего, а потом выполняют поиск и замену ссылок по всей базе. Есть такая обработка даже. Если этого не сделать, получите везде вместо ссылки на объект с новым УИД .
Только при обмене не обязательно делать одинаковые УИД в базах. Сопоставление объектов происходит через регистр сведений Соответствия объектов информационных баз.
УИД или уникальный идентификатор
УИД это определенное значение, однозначно идентифицирующее объект ссылочного типа данных, другими словами, это и есть ссылка уникальная в рамках одной конкретно взятой таблицы, например у справочника номенклатура. УИД есть у любого объекта имеющего ссылочный тип данных, из синтаксис помощника следует, что УИД имеет следующий вид: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где Х — символы обозначающие шестнадцатеричное число. Прочитать какой текущий уникальный идентификатор существует у ссылки можно с помощью метода УникальныйИдентификатор() например:
Использование своего УИД при создании объекта
Изменить УИД у существующего объекта, штатными средствами встроенного языка нельзя. Зато можно при создании нового объекта указать свой УИД. Для этого нужно сделать несколько действий:
Подсказка. Если мы создаем УИД из конкретно взятой строки, то мы можем получить УИД существующего объекта и следовательно в шаге два получить не новую ссылку, а вполне себе существующую. В таком случае при записи объекта полученного в шаге три, система сообщит о том, что не может записать объект с неуникальной ссылкой. Зато получение ссылки по строковому идентификтору, очень удобно использовать при синхронизации между разнородными системами(не 1С) или между разными базами.