// Функция - Уникальный идентификатор набора ссылок. Ключ записи.
// СписокUUID - Массив Из Ссылка - Массив со ссылками на объекты БД
// ВозвращатьКакУИД - Булево - определяет, возвращать ли результат как УникальныйИдентификатор. Если Ложь - возвращается строкой
// Возвращаемое значение:
// Строка, УникальныйИдентификатор - Ключ записи для некоторого набора ссылок
Функция УникальныйИдентификаторНабораСсылок(СписокСсылок, ВозвращатьКакУИД = Ложь) Экспорт
// получаем UUID строкой по ссылкам
ЧастиЗапроса = Новый Массив;
| ПРЕДСТАВЛЕНИЕ(УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка))
| Ссылка В (&СписокСсылок)
Для Каждого Ссылка Из СписокСсылок Цикл
Если Не ПерваяСсылка Тогда
ПолноеИмяМетаданных = Ссылка.Метаданные().ПолноеИмя();
ЧастиЗапроса.Добавить(СтрЗаменить(ЧастьЗапросаВыборка, "%ИМЯ ТАБЛИЦЫ%", ПолноеИмяМетаданных));
Запрос.Текст = СтрСоединить(ЧастиЗапроса, "");
Запрос.УстановитьПараметр("СписокСсылок", СписокСсылок);
Возврат УникальныйИдентификаторНабораСтрок(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0), ВозвращатьКакУИД);
// Функция - Уникальный идентификатор набора строк. Ключ записи.
// СписокUUID - Массив Из Строка - Массив с произвольными строками
// ВозвращатьКакУИД - Булево - определяет, возвращать ли результат как УникальныйИдентификатор. Если Ложь - возвращается строкой
// Возвращаемое значение:
// Строка, УникальныйИдентификатор - Ключ записи для некоторого набора строк
Функция УникальныйИдентификаторНабораСтрок(СписокСтрок, ВозвращатьКакУИД = Ложь) Экспорт
СписокДляСортировки = Новый СписокЗначений;
СписокДляСортировки.ЗагрузитьЗначения(СписокСтрок);
СписокДляСортировки.СортироватьПоЗначению(НаправлениеСортировки.Возр);
СписокСтрок = СписокДляСортировки.ВыгрузитьЗначения();
СтрокаОбщая = СтрСоединить(СписокСтрок, ",");
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA1);
Хеширование.Добавить(СтрокаОбщая);
ДвоичныеДанные = Хеширование.ХешСумма;
Хеш = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ДвоичныеДанные));
// Преобразуем хеш в массив байтов (берем первые 16 байтов)
МассивБайтов = Новый Массив;
МассивБайтов.Добавить(Байт);
МассивБайтов[6] = СтрШаблон("5%1", Прав(МассивБайтов[6], 1));
ДесятичноеЧисло = ЧислоИзШестнадцатеричнойСтроки(СтрШаблон("0x%1", МассивБайтов[8]));
БезДвухБитов = ПобитовоеИ(ДесятичноеЧисло, 63); // обнуляем старшие 2 бита, 63 = 0011 1111
ИтоговыйБайт = ПобитовоеИли(БезДвухБитов, 128); // записываем в старшие 2 бита 10, 128 = 1000 000
СимволыHEX = "0123456789abcdef";
СтаршийРазряд = Сред(СимволыHEX, Цел(ИтоговыйБайт / 16) + 1, 1);
МладшийРазряд = Сред(СимволыHEX, (ИтоговыйБайт % 16) + 1, 1);
МассивБайтов[8] = СтаршийРазряд + МладшийРазряд;
UUIDБезРазделителей = СтрСоединить(МассивБайтов, "");
ИтоговыйUUID = СтрШаблон("%1-%2-%3-%4-%5",
Сред(UUIDБезРазделителей, 1, 8),
Сред(UUIDБезРазделителей, 9, 4),
Сред(UUIDБезРазделителей, 13, 4),
Сред(UUIDБезРазделителей, 17, 4),
Сред(UUIDБезРазделителей, 20, 12));
Если Не СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ИтоговыйUUID) Тогда
ВызватьИсключение "Не удалось получить уникальный идентификатор из входных данных. Строка " + ИтоговыйUUID + " не отвечает требованиям УИД";
Если ВозвращатьКакУИД Тогда
ИтоговыйUUID = Новый УникальныйИдентификатор(ИтоговыйUUID);