Записки программиста 1с

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

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

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

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

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

de80b7c8-aa22-11dc-a0f4-0011d85708ff

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

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

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

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

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

ТЗ = ПолучитьСтруктуруХраненияБазыДанных();
ТЗ.ВыбратьСтроку();

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

Иванов Иван ИвановичСправочник.Сотрудники
Пример элемента справочника сотрудники

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

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

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

ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

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

ВосстанавливаемыйЭлемент =  Справочники.Номенклатура.СоздатьЭлемент();
ГУИД = Новый УникальныйИдентификатор("9c4e0022-642f-da98-11e1-0393c0d776fd");
СсылкаНаУдаленныйЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
ВосстанавливаемыйЭлемент.УстановитьСсылкуНового(СсылкаНаУдаленныйЭлемент);

Уникальный идентификатор широко применяется при передачи данных по Com-соединению. Теперь можно заполнить остальные поля.

1С: Как получить уникальный идентификатор объекта, GUID?

&НаСервере
Процедура Команда1НаСервере()
анкета=Объект.АнкетаАбитуриента;
Если НЕ анкета.Пустая() Тогда
GUID=анкета.УникальныйИдентификатор();
Объект.CUID=GUID;
Сообщить("GUID"+GUID);
конецесли;

КонецПроцедуры

1С: Как получить ссылку по уникальному идентификатору, GUID?

&НаСервере
Процедура ПолучитьПоGUIDНаСервере()
ГУИД = Новый УникальныйИдентификатор(Объект.CUID);

НайденнаяСсылка = Документы.АнкетаАбитуриента.ПолучитьСсылку(ГУИД);
Сообщить("Объект="+НайденнаяСсылка);
КонецПроцедуры

Связь Пользователя Информационной базы с Элементом Справочника пользователи.

Во-первых Для Справочника Сотрудники добавляем реквизит «ПользовательИБ» типом Строка. В Реквизит будем сохранять GUID пользователя информационной базы.

Уникальный идентификатор 1c
Уникальный идентификатор в Реквизите Пользователь ИБ.

Во-вторых напишем обработку заполняющую Реквизит «ПользовательИБ» в Справочнике Пользователи.

&НаСервере
Процедура Команда1НаСервере()
	Название=Объект.Строка;
	ОписаниеПользователяИБ = ПользователиИнформационнойБазы.НайтиПоИмени(Название);//.ТекущийПользователь();//.УникальныйИдентификатор()//..НовоеОписаниеПользователяИБ();
	GUid=ОписаниеПользователяИБ.УникальныйИдентификатор;
	Пользователь=Объект.Пользователь;
	ОбъектП=Пользователь.ПолучитьОбъект();
	ОбъектП.ПоьзовательИБ=GUid;
	ОбъектП.Записать();
	//GUid=ОписаниеПользователяИБ.УникальныйИдентификатор();
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры.

В третьих В документ при создании на сервере добавляем код получающий Элемент справочника Пользователи с использованием GUIDа ТекущегоПользователя

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ОписаниеПользователяИБ=ПользователиИнформационнойБазы.ТекущийПользователь();
GUid=ОписаниеПользователяИБ.УникальныйИдентификатор;
Объект.Отвественный=Справочники.Пользователи.НайтиПоРеквизиту("ПоьзовательИБ", Строка(Guid));
КонецПроцедуры 

Создание сотрудника по GUID

Код создания элемента справочника Сотрудника с проверкой.

Если Не СотрудникПроверка(Строка) Тогда
   ГУИД=Новый УникальныйИдентификатор(Строка.СотрудникСсылка);
   СотрудникСсылка = Справочники.Сотрудники.ПолучитьСсылку(ГУИД);
   СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
   СотрудникОбъект.УстановитьСсылкуНового(СотрудникСсылка);
   СотрудникОбъект.Наименование = Строка.Сотрудник;
   СотрудникОбъект.Преподаватель=Истина;
   СотрудникОбъект.ТипЗанятости=Перечисления.ТипыЗанятости.ОсновноеМестоРаботы;
   СотрудникОбъект.Организация=Справочники.Организации.НайтиПоНаименованию("СПб      ГБПОУ ""АУГСГиП""");
   СотрудникОбъект.Физлицо=ПолучитьФизЛицо(Строка);
   СотрудникОбъект.Записать();
КонецЕсли;

Пример кода для проверки существования сотрудника.

&НаСервере
Функция СотрудникПроверка(Строка)
 Сотрудник=Справочники.Сотрудники.НайтиПоНаименованию(Строка.Сотрудник);
 Если Не Сотрудник.Пустая() Тогда
	Рез=Истина;
 Иначе	
	Рез=Ложь; 

 КонецЕсли;
 Возврат Рез;
Конецфункции

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

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