diff --git a/src/content/docs/knowledge-base/Администрирование/Утилита ibcmd.exe b/src/content/docs/knowledge-base/Администрирование/Утилита ibcmd.exe
new file mode 100644
index 0000000..7cf2a51
--- /dev/null
+++ b/src/content/docs/knowledge-base/Администрирование/Утилита ibcmd.exe
@@ -0,0 +1,17 @@
+---
+title: Утилита ibcmd.exe
+---
+Утилита **ibcmd.exe** входит в состав поставки сервера 1C
+
+С помощью этой утилиты можно выгрузить информационную базу в .dt без получения монопольного режима. Для этого нужно создать текстовый файл, задать ему расширение .bat. В теле этого файла прописывается строка:
+
+```
+«C:\Program Files\1cv8\{ВЕРСИЯ ПЛАТФОРМЫ}\bin\ibcmd.exe» infobase dump —db-server={ИМЯ СЕРВЕРА} —dbms=MSSQLServer —db-name={ИМЯ БАЗЫ НА СЕРВЕРЕ} —db-user={ИМЯ ПОЛЬЗОВАТЕЛЯ SQL} —db-pwd={ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ SQL} «c:\my_database.dt»
+```
+* **dbms** – тип SQL сервера с базами данных.
+* **db-server** – адрес или доменное имя по которому доступен SQL сервер.
+* **db-name** – имя базы данных на SQL сервере.
+* **db-user** – имя пользователя на SQL сервере, которому доступны необходимые базы данных.
+* **db-pwd** – пароль от этого пользователя.
+* **user** – имя пользователя в 1С от этой базы.
+* **password** – и пароль от него. (ранее программа работала без пользователя 1С) C:\backup\SQL_DB_NAME_date.dt – путь, куда будет выгружена база данных.
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Примеры, сниппеты/HTML-документы/Виджеты.md b/src/content/docs/knowledge-base/Примеры, сниппеты/HTML-документы/Виджеты.md
new file mode 100644
index 0000000..dca7b90
--- /dev/null
+++ b/src/content/docs/knowledge-base/Примеры, сниппеты/HTML-документы/Виджеты.md
@@ -0,0 +1,128 @@
+---
+title: Виджет из HTML-документа
+---
+
+HTML-документ можно использовать для создания нестандартных элементов управления. Ниже приведен пример создания виджетов
+```bsl
+&НаКлиенте
+Функция ТекстHTMLДляВиджета(КоличествоНовых, КоличествоВРаботе, КоличествоЗакрытых, КоличествоВсего)
+
+ ЗаголовокВиджета = "Информация о заявках";
+
+ Текст = СтрШаблон(
+ "
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |",
+ ЗаголовокВиджета,
+ КоличествоНовых,
+ КоличествоВРаботе,
+ КоличествоЗакрытых);
+
+ Возврат Текст;
+
+КонецФункции
+```
+
+В результате получается что-то вроде
+
+
+Для отработки кликов на элементах виджета нужно переопределить событие элемента «ПриНажатии», например:
+```bls
+&НаКлиенте
+Процедура ВиджетПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
+
+ СписокКлассов = СтрРазделить(ДАнныеСобытия.Element.className, " ", Ложь);
+ Если СписокКлассов.Найти("link-opened") <> Неопределено Тогда
+ // Свой обработчик
+ КонецЕсли;
+КонецПроцедуры
+```
+В тексте HTML-класс «link-opened» созданного элемента расположен в следующем блоке
+```html
+
+```
+Соответственно можно создавать произвольные элементы — кнопки, ссылки, параграфы и пр., что допускается HTML+CSS
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход всех строк динамического списка.md b/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход всех строк динамического списка.md
new file mode 100644
index 0000000..74b1264
--- /dev/null
+++ b/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход всех строк динамического списка.md
@@ -0,0 +1,40 @@
+---
+title: Обход всех строк динамического списка
+---
+
+```bsl
+&НаСервере
+Функция ДанныеВсехСтрокДинамическогоСпискаПулНоменклатурыРазмещение()
+
+ //Получаем схема компановки данных (здесь хранится текст запроса)
+ Схема = Элементы.ПулНоменклатурыРазмещение.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
+
+ //Получаем настройки пользователя (отборы, сортировки и т.п.)
+ Настройки = Элементы.ПулНоменклатурыРазмещение.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
+
+ //Выводим динамический список в таблицу значений
+ КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
+ МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
+
+ ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
+ ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
+
+ ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
+ Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки); // Тут таблица значений со строками ДС
+
+ ДанныеСтрок = Новый Массив;
+
+ Для Каждого Строка Из Результат Цикл // Обходим ТЗ
+
+ ДанныеСтроки = ПараметрыЗаполненияСтрокиТабличнойЧастиРазмещение();
+ ЗаполнитьЗначенияСвойств(ДанныеСтроки, Строка);
+ ДанныеСтроки.Количество = Строка.Разместить;
+
+ ДанныеСтрок.Добавить(ДанныеСтроки);
+
+ КонецЦикла;
+
+ Возврат ДанныеСтрок;
+
+КонецФункции
+```
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход выделенных строк динамического списка.md b/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход выделенных строк динамического списка.md
new file mode 100644
index 0000000..93ae7f6
--- /dev/null
+++ b/src/content/docs/knowledge-base/Примеры, сниппеты/Работа с коллекциями/Динамические списки/Обход выделенных строк динамического списка.md
@@ -0,0 +1,13 @@
+---
+title: Обход выделенных строк динамического списка
+---
+
+```bsl
+&НаКлиенте
+ВыделенныеСтроки = Элементы.ПулНоменклатурыРазмещение.ВыделенныеСтроки;
+
+Для Каждого Идентификатор Из ВыделенныеСтроки Цикл
+ Строка = ПулНоменклатурыРазмещение.НайтиПоИдентификатору(Идентификатор);
+ <...>
+КонецЦикла;
+```
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Сниппеты/РазрИмяФайла.md b/src/content/docs/knowledge-base/Примеры, сниппеты/РазрИмяФайла.md
similarity index 100%
rename from src/content/docs/knowledge-base/Сниппеты/РазрИмяФайла.md
rename to src/content/docs/knowledge-base/Примеры, сниппеты/РазрИмяФайла.md
diff --git a/src/content/docs/knowledge-base/Сниппеты/ТабДокВТЗ.md b/src/content/docs/knowledge-base/Примеры, сниппеты/ТабДокВТЗ.md
similarity index 100%
rename from src/content/docs/knowledge-base/Сниппеты/ТабДокВТЗ.md
rename to src/content/docs/knowledge-base/Примеры, сниппеты/ТабДокВТЗ.md
diff --git a/src/content/docs/knowledge-base/Самописные методы/Логирование в массив строк .md b/src/content/docs/knowledge-base/Самописные методы/Логирование в массив строк .md
new file mode 100644
index 0000000..70db4d9
--- /dev/null
+++ b/src/content/docs/knowledge-base/Самописные методы/Логирование в массив строк .md
@@ -0,0 +1,238 @@
+```bsl
+#Область ПрограммныйИнтерфейс
+
+// Процедура - Записать сообщение в лог
+//
+// Параметры:
+// Сообщение - Строка - Тело сообщения
+// УровеньЛогирования - Число - Значение, полученное функциями УровеньЛогирования...()
+// МассивЛогов - Массив Из Строка, Неопределено - Массив, в который будет записан лог. Если Неопределено, тогда создается новый массив
+// ЗаписыватьУровеньОтладка - Булево - Если Ложь, то сообщения с уровнем "Отладка" не будут добавлены в массив. По умолчанию Ложь
+// ВыводБезДополнительнойИнформации - Булево - Если Истина, то не будут выведена информация об уровне отладки и дате события. По умолчанию Ложь
+// МаксимальнаяДлинаТелаСообщения - Число - Если задано, то тело сообщения будет обрезано до указанного числа, если нет - выведено без ограничений. По умолчанию 0.
+//
+Процедура ЗаписатьСообщениеВЛог(Знач Сообщение,
+ УровеньЛогирования,
+ МассивЛогов = Неопределено,
+ РежимОтладки = Ложь,
+ ВыводБезДополнительнойИнформации = Ложь,
+ МаксимальнаяДлинаТелаСообщения = 0) Экспорт
+
+ Если МаксимальнаяДлинаТелаСообщения > 0 Тогда
+ Если СтрДлина(Сообщение) > МаксимальнаяДлинаТелаСообщения Тогда
+ Сообщение = СтрШаблон("%1...", Лев(Сообщение, МаксимальнаяДлинаТелаСообщения - 3));
+ КонецЕсли;
+ КонецЕсли;
+
+ Если МассивЛогов = Неопределено Тогда
+ МассивЛогов = Новый Массив;
+ КонецЕсли;
+
+ Если УровеньЛогирования = УровеньЛогированияОтладка() И Не РежимОтладки Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ВыводБезДополнительнойИнформации Тогда
+ МассивЛогов.Добавить(Сообщение);
+ Иначе
+ ПредставлениеУровняЛога = ПредставлениеУровняЛогирования(УровеньЛогирования);
+ ТекстСообщения = СтрШаблон("%1 - %2", ПредставлениеУровняЛога, Сообщение);
+ МассивЛогов.Добавить(ТекстСообщения);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Добавляет запись вида "[Отладка] 2024-11-10 - <Сообщение>" в массив логов
+//
+// Параметры:
+// Сообщение - Строка - Тело сообщения
+// МассивЛогов - Массив Из Строка -
+// РежимОтладки - Булево - Если Истина, то запись уровня отладка будет добавлена в массив
+//
+Процедура ДобавитьЗаписьУровняОтладка(Сообщение, МассивЛогов, РежимОтладки = Ложь) Экспорт
+ ЗаписатьСообщениеВЛог(Сообщение, УровеньЛогированияОтладка(), МассивЛогов, РежимОтладки, Ложь);
+КонецПроцедуры
+
+// Процедура - Добавляет запись вида "[Информация] 2024-11-10 - <Сообщение>" в массив логов
+//
+// Параметры:
+// Сообщение - Строка - Тело сообщения
+// МассивЛогов - Массив Из Строка -
+//
+Процедура ДобавитьЗаписьУровняИнформация(Сообщение, МассивЛогов) Экспорт
+ ЗаписатьСообщениеВЛог(Сообщение, УровеньЛогированияИнформация(), МассивЛогов, Ложь, Ложь);
+КонецПроцедуры
+
+// Процедура - Добавляет запись вида "[Предупреждение] 2024-11-10 - <Сообщение>" в массив логов
+//
+// Параметры:
+// Сообщение - Строка - Тело сообщения
+// МассивЛогов - Массив Из Строка -
+//
+Процедура ДобавитьЗаписьУровняПредупреждение(Сообщение, МассивЛогов) Экспорт
+ ЗаписатьСообщениеВЛог(Сообщение, УровеньЛогированияПредупреждение(), МассивЛогов, Ложь, Ложь);
+КонецПроцедуры
+
+// Процедура - Добавляет запись вида "[Ошибка] 2024-11-10 - <Сообщение>" в массив логов
+//
+// Параметры:
+// Сообщение - Строка - Тело сообщения
+// МассивЛогов - Массив Из Строка -
+//
+Процедура ДобавитьЗаписьУровняОшибка(Сообщение, МассивЛогов) Экспорт
+ ЗаписатьСообщениеВЛог(Сообщение, УровеньЛогированияОшибка(), МассивЛогов, Ложь, Ложь);
+КонецПроцедуры
+
+// Функция - Массив логов в текст
+//
+// Параметры:
+// МассивЛогов - Массив Из Строка - Массив логов, заполненный с помощью процедур модуля ЛогированиеКлиентСервер
+// ПараметрыВывода - Структура - Параметры, полученные функцией ПараметрыВыводаМассиваЛоговВТекст()
+//
+// Возвращаемое значение:
+// Строка - Логи выполнения в виде строки
+//
+Функция МассивЛоговВТекст(МассивЛогов, ПараметрыВывода) Экспорт
+
+ ВыводитьПрефикс = ПараметрыВывода.ВыводитьПрефикс;
+ ВыводитьЗаписиУровняОтладка = ПараметрыВывода.ВыводитьЗаписиУровняОтладка;
+ ВыводитьЗаписиУровняИнформация = ПараметрыВывода.ВыводитьЗаписиУровняИнформация;
+ ВыводитьЗаписиУровняПредупреждение = ПараметрыВывода.ВыводитьЗаписиУровняПредупреждение;
+ ВыводитьЗаписиУровняОшибка = ПараметрыВывода.ВыводитьЗаписиУровняОшибка;
+ НумероватьСтроки = ПараметрыВывода.НумероватьСтроки;
+
+ ЛогиКВыводу = Новый Массив;
+ Сч = 1;
+ Для Каждого Лог Из МассивЛогов Цикл
+
+ ТекущийУровеньЛога = УровеньЛогированияТекущегоЛога(Лог);
+
+ Если Не ВыводитьЗаписиУровняОтладка И ТекущийУровеньЛога = УровеньЛогированияОтладка() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ВыводитьЗаписиУровняИнформация И ТекущийУровеньЛога = УровеньЛогированияИнформация() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ВыводитьЗаписиУровняПредупреждение И ТекущийУровеньЛога = УровеньЛогированияПредупреждение() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ВыводитьЗаписиУровняОшибка И ТекущийУровеньЛога = УровеньЛогированияОшибка() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ВыводитьПрефикс Тогда
+ УдалитьПрефиксИзЛога(Лог);
+ КонецЕсли;
+
+ Если НумероватьСтроки Тогда
+ ЛогиКВыводу.Добавить(СтрШаблон("%1. %2", Сч, Лог));
+ Иначе
+ ЛогиКВыводу.Добавить(Лог);
+ КонецЕсли;
+
+ Сч = Сч + 1;
+ КонецЦикла;
+
+ Возврат СтрСоединить(ЛогиКВыводу, СтрШаблон("%1%2", Символы.ПС + Символы.ВК, Символы.ПС + Символы.ВК));
+
+КонецФункции
+
+// Функция - Параметры вывода массива логов в текст
+//
+// Возвращаемое значение:
+// Структура - Структура параметров с ключами:
+// * ВыводитьПрефикс - Булево - устанавливает, выводить ли представление уровня логирования.
+// Истина - будет сообщение вида "[Информация] - <Сообщение>"
+// Ложь - будет сообщение вида "<Сообщение>". По умолчанию Истина
+// * ВыводитьЗаписиУровняОтладка - Булево - устанавливает, будут ли выведены записи уровня "Отладка". По умолчанию Истина
+// * ВыводитьЗаписиУровняИнформация - Булево - устанавливает, будут ли выведены записи уровня "Информация". По умолчанию Истина
+// * ВыводитьЗаписиУровняПредупреждение - Булево - устанавливает, будут ли выведены записи уровня "Предупреждение". По умолчанию Истина
+// * ВыводитьЗаписиУровняОшибка - Булево - устанавливает, будут ли выведены записи уровня "Ошибка". По умолчанию Истина
+//
+Функция ПараметрыВыводаМассиваЛоговВТекст() Экспорт
+
+ ПараметрыВывода = Новый Структура;
+ ПараметрыВывода.Вставить("ВыводитьПрефикс", Истина);
+ ПараметрыВывода.Вставить("ВыводитьЗаписиУровняОтладка", Истина);
+ ПараметрыВывода.Вставить("ВыводитьЗаписиУровняИнформация", Истина);
+ ПараметрыВывода.Вставить("ВыводитьЗаписиУровняПредупреждение", Истина);
+ ПараметрыВывода.Вставить("ВыводитьЗаписиУровняОшибка", Истина);
+ ПараметрыВывода.Вставить("НумероватьСтроки", Ложь);
+
+ Возврат ПараметрыВывода;
+
+КонецФункции
+
+#Область УровниЛогирования
+
+Функция ПредставлениеУровняЛогирования(УровеньЛогирования) Экспорт
+
+ Представление = "[Неопределено]";
+
+ Если УровеньЛогирования = УровеньЛогированияОтладка() Тогда
+ Представление = "[Отладка]";
+ ИначеЕсли УровеньЛогирования = УровеньЛогированияИнформация() Тогда
+ Представление = "[Информация]";
+ ИначеЕсли УровеньЛогирования = УровеньЛогированияПредупреждение() Тогда
+ Представление = "[Предупреждение]";
+ ИначеЕсли УровеньЛогирования = УровеньЛогированияОшибка() Тогда
+ Представление = "[Ошибка]";
+ КонецЕсли;
+
+ Возврат Представление;
+
+КонецФункции
+
+Функция УровеньЛогированияОтладка() Экспорт
+ Возврат 4;
+КонецФункции
+
+Функция УровеньЛогированияИнформация() Экспорт
+ Возврат 3;
+КонецФункции
+
+Функция УровеньЛогированияПредупреждение() Экспорт
+ Возврат 2;
+КонецФункции
+
+Функция УровеньЛогированияОшибка() Экспорт
+ Возврат 1;
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция УровеньЛогированияТекущегоЛога(Лог)
+
+ Результат = -1;
+
+ Если СтрНачинаетсяС(Лог, ПредставлениеУровняЛогирования(УровеньЛогированияОтладка())) Тогда
+ Результат = УровеньЛогированияОтладка();
+ ИначеЕсли СтрНачинаетсяС(Лог, ПредставлениеУровняЛогирования(УровеньЛогированияИнформация())) Тогда
+ Результат = УровеньЛогированияИнформация();
+ ИначеЕсли СтрНачинаетсяС(Лог, ПредставлениеУровняЛогирования(УровеньЛогированияПредупреждение())) Тогда
+ Результат = УровеньЛогированияПредупреждение();
+ ИначеЕсли СтрНачинаетсяС(Лог, ПредставлениеУровняЛогирования(УровеньЛогированияОшибка())) Тогда
+ Результат = УровеньЛогированияОшибка();
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+Процедура УдалитьПрефиксИзЛога(Лог)
+
+ УровеньЛогированияЛога = УровеньЛогированияТекущегоЛога(Лог);
+ УдаляемаяПодстрока = СтрШаблон("%1 - ", ПредставлениеУровняЛогирования(УровеньЛогированияЛога));
+ Лог = СтрЗаменить(Лог, УдаляемаяПодстрока, "");
+
+КонецПроцедуры
+
+#КонецОбласти
+```
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Самописные методы/Обращение к пользователю.md b/src/content/docs/knowledge-base/Самописные методы/Обращение к пользователю.md
new file mode 100644
index 0000000..e0c9c40
--- /dev/null
+++ b/src/content/docs/knowledge-base/Самописные методы/Обращение к пользователю.md
@@ -0,0 +1,43 @@
+```bsl
+// Функция - Обращение к пользователю
+//
+// Параметры:
+// Пользователь - СправочникСсылка.Пользователи -
+//
+// Возвращаемое значение:
+// Строка - Возвращает обращение вида "Уважаемый <Фамилия Имя Отчество>" с учетом пола.
+// Если не удается определить пол, возвращается "Уважаемый(ая)...",
+// если не удается распарсить ФИО, вместо <Фамилия Имя Отчество> выводится "пользователь"
+//
+Функция ОбращениеКПользователю(Пользователь)
+
+ Обращение = "Уважаемый(ая)";
+
+ ФИО = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "Наименование", Истина);
+
+ Если Не ЗначениеЗаполнено(ФИО) Тогда
+ ФИО = "пользователь";
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ФИО) Тогда
+
+ ЧастиИмени = СтрРазделить(ФИО, " ", Ложь);
+
+ Если ЧастиИмени.Количество() = 3 Тогда
+
+ Отчество = СокрЛП(ЧастиИмени.Получить(2));
+
+ Если СтрЗаканчиваетсяНа(НРег(Отчество), "вич") Тогда
+ Обращение = "Уважаемый";
+ ИначеЕсли СтрЗаканчиваетсяНа(НРег(Отчество), "вна") Тогда
+ Обращение = "Уважаемая";
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат СтрШаблон("%1 %2!", Обращение, ФИО);
+
+КонецФункции
+```
\ No newline at end of file
diff --git a/src/content/docs/knowledge-base/Самописные методы/Уникальный ключ набора данных.md b/src/content/docs/knowledge-base/Самописные методы/Уникальный ключ набора данных.md
new file mode 100644
index 0000000..27d6c5e
--- /dev/null
+++ b/src/content/docs/knowledge-base/Самописные методы/Уникальный ключ набора данных.md
@@ -0,0 +1,118 @@
+```bsl
+// Функция - Уникальный идентификатор набора ссылок. Ключ записи.
+//
+// Параметры:
+// СписокUUID - Массив Из Ссылка - Массив со ссылками на объекты БД
+// ВозвращатьКакУИД - Булево - определяет, возвращать ли результат как УникальныйИдентификатор. Если Ложь - возвращается строкой
+//
+// Возвращаемое значение:
+// Строка, УникальныйИдентификатор - Ключ записи для некоторого набора ссылок
+//
+Функция УникальныйИдентификаторНабораСсылок(СписокСсылок, ВозвращатьКакУИД = Ложь) Экспорт
+
+ // получаем UUID строкой по ссылкам
+ ЧастиЗапроса = Новый Массив;
+ ЧастьЗапросаВыборка =
+ "ВЫБРАТЬ
+ | ПРЕДСТАВЛЕНИЕ(УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка))
+ |ИЗ
+ | %ИМЯ ТАБЛИЦЫ%
+ |ГДЕ
+ | Ссылка В (&СписокСсылок)
+ |";
+
+ ПерваяСсылка = Истина;
+ Для Каждого Ссылка Из СписокСсылок Цикл
+
+ Если Не ПерваяСсылка Тогда
+ ЧастиЗапроса.Добавить("
+ | ОБЪЕДИНИТЬ ВСЕ
+ |
+ |");
+ КонецЕсли;
+
+ ПолноеИмяМетаданных = Ссылка.Метаданные().ПолноеИмя();
+
+ ЧастиЗапроса.Добавить(СтрЗаменить(ЧастьЗапросаВыборка, "%ИМЯ ТАБЛИЦЫ%", ПолноеИмяМетаданных));
+
+ ПерваяСсылка = Ложь;
+
+ КонецЦикла;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = СтрСоединить(ЧастиЗапроса, "");
+ Запрос.УстановитьПараметр("СписокСсылок", СписокСсылок);
+
+ Возврат УникальныйИдентификаторНабораСтрок(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0), ВозвращатьКакУИД);
+
+КонецФункции
+
+// Функция - Уникальный идентификатор набора строк. Ключ записи.
+//
+// Параметры:
+// СписокUUID - Массив Из Строка - Массив с произвольными строками
+// ВозвращатьКакУИД - Булево - определяет, возвращать ли результат как УникальныйИдентификатор. Если Ложь - возвращается строкой
+//
+// Возвращаемое значение:
+// Строка, УникальныйИдентификатор - Ключ записи для некоторого набора строк
+//
+Функция УникальныйИдентификаторНабораСтрок(СписокСтрок, ВозвращатьКакУИД = Ложь) Экспорт
+
+ СписокДляСортировки = Новый СписокЗначений;
+ СписокДляСортировки.ЗагрузитьЗначения(СписокСтрок);
+ СписокДляСортировки.СортироватьПоЗначению(НаправлениеСортировки.Возр);
+ СписокСтрок = СписокДляСортировки.ВыгрузитьЗначения();
+
+ СтрокаОбщая = СтрСоединить(СписокСтрок, ",");
+
+ Хеширование = Новый ХешированиеДанных(ХешФункция.SHA1);
+ Хеширование.Добавить(СтрокаОбщая);
+
+ ДвоичныеДанные = Хеширование.ХешСумма;
+ Хеш = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(ДвоичныеДанные));
+
+ // Преобразуем хеш в массив байтов (берем первые 16 байтов)
+ МассивБайтов = Новый Массив;
+ Сч = 1;
+ Пока Сч < 32 Цикл
+ Байт = Сред(Хеш, Сч, 2);
+ МассивБайтов.Добавить(Байт);
+ Сч = Сч + 2;
+ КонецЦикла;
+
+ // Версия UUID 5
+ МассивБайтов[6] = СтрШаблон("5%1", Прав(МассивБайтов[6], 1));
+
+ // Вариант RFC 4122
+ ДесятичноеЧисло = ЧислоИзШестнадцатеричнойСтроки(СтрШаблон("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);
+ КонецЕсли;
+
+ Возврат ИтоговыйUUID;
+
+КонецФункции
+```
\ No newline at end of file