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ДляВиджета(КоличествоНовых, КоличествоВРаботе, КоличествоЗакрытых, КоличествоВсего) + + ЗаголовокВиджета = "Информация о заявках"; + + Текст = СтрШаблон( + " + | + | + | + | + | + | + | Document + | + | + | + | + |
+ |
+ |

%1

+ |
+ |
+ |

Новые

+ |

%2

+ |
+ |
+ |

В работе

+ |

%3

+ |
+ |
+ |

Закрытые

+ |

%4

+ |
+ |
+ |
+ |

Сбросить

+ |
+ |
+ | + | + |", + ЗаголовокВиджета, + КоличествоНовых, + КоличествоВРаботе, + КоличествоЗакрытых); + + Возврат Текст; + +КонецФункции +``` + +В результате получается что-то вроде +![пример виджета.png](https://sinenikolsky.ru/s/QEWSKmHn7HKGJX4/download?path=%2F2025%2F04%2F15&files=c04e4c34-8a25-42a1-bb74-da0929bfa69c.png) + +Для отработки кликов на элементах виджета нужно переопределить событие элемента «ПриНажатии», например: +```bls +&НаКлиенте +Процедура ВиджетПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) + + СписокКлассов = СтрРазделить(ДАнныеСобытия.Element.className, " ", Ложь); + Если СписокКлассов.Найти("link-opened") <> Неопределено Тогда + // Свой обработчик + КонецЕсли; +КонецПроцедуры +``` +В тексте HTML-класс «link-opened» созданного элемента расположен в следующем блоке +```html +
+

Новые

+

%2

+
+``` +Соответственно можно создавать произвольные элементы — кнопки, ссылки, параграфы и пр., что допускается 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