diff --git a/README.md b/README.md
index f6ca445..cffa6ae 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@
- `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`.
- `РазборОтчетОбработокРасширений` - раскладывает средствами платформы файлы внешних отчетов, обработок и расширений на исходные файлы. [См. подробнее](/docs/РазборОтчетОбработокРасширений.md)
- `СинхронизацияОбъектовМетаданныхИФайлов` - анализирует наличие файлов и объектов конфигурации. Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`).
+- `СортировкаПравРолей` - упорядочивает по имени объекты в файле описания прав роли.
- `СортировкаСостава` - сортирует описания состава конфигурации и некоторых объектов метаданных. [См. подробнее](/docs/СортировкаСостава.md)
- `УдалениеДублейМетаданных` - удаляет дубли объектов метаданных в файле описания конфигурации (могут образоваться при объединениях). Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`)..
- `УдалениеЛишнихКонцевыхПробелов` - удаляет лишние пробелы и табы в конце не пустых строк в файлах модулей.
diff --git a/features/ИнтерактивнаяНастройка.feature b/features/ИнтерактивнаяНастройка.feature
index 70aaa43..2ccaf36 100644
--- a/features/ИнтерактивнаяНастройка.feature
+++ b/features/ИнтерактивнаяНастройка.feature
@@ -41,6 +41,7 @@ y
y
y
y
+y
local
n
"""
diff --git a/features/Конфигурирование.feature b/features/Конфигурирование.feature
index b82c05e..9040eda 100644
--- a/features/Конфигурирование.feature
+++ b/features/Конфигурирование.feature
@@ -36,7 +36,7 @@
И Вывод команды "oscript" содержит "precommit4onec v24.05"
И Вывод команды "oscript" содержит "Установленные настройки: Базовые настройки"
И Вывод команды "oscript" содержит "КаталогЛокальныхСценариев ="
- И Вывод команды "oscript" содержит "ГлобальныеСценарии = ВставкаКопирайтов.os,ДобавлениеПробеловПередКлючевымиСловами.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ОтключениеРазрешенияИзменятьФорму.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиИнструкцийПрепроцессора.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаСостава.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os"
+ И Вывод команды "oscript" содержит "ГлобальныеСценарии = ВставкаКопирайтов.os,ДобавлениеПробеловПередКлючевымиСловами.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ОтключениеРазрешенияИзменятьФорму.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиИнструкцийПрепроцессора.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаПравРолей.os,СортировкаСостава.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os"
И Вывод команды "oscript" содержит "ОтключенныеСценарии ="
И Вывод команды "oscript" содержит "НастройкиСценариев = Соответствие"
И Вывод команды "oscript" содержит "ОтключениеПолнотекстовогоПоиска = Соответствие"
diff --git a/src/Модули/ТипыФайлов.os b/src/Модули/ТипыФайлов.os
index fbf1f54..c0bbccd 100644
--- a/src/Модули/ТипыФайлов.os
+++ b/src/Модули/ТипыФайлов.os
@@ -271,6 +271,10 @@
Возврат ЭтоФайлОписанияМетаданныхEDT(Файл) И ПутьСодержитКаталог(Файл, "functionaloptions");
КонецФункции
+Функция ЭтоФайлПравРоли(Файл) Экспорт
+ Возврат СтрСравнить(Файл.Имя, "Rights.xml") = 0 ИЛИ СтрСравнить(Файл.Имя, "Rights.rights") = 0;
+КонецФункции
+
Функция ЭтоМодульМенеджера(Файл) Экспорт
Возврат СтрСравнить(Файл.Имя, "ManagerModule.bsl") = 0;
КонецФункции
diff --git a/src/СценарииОбработки/СортировкаПравРолей.os b/src/СценарииОбработки/СортировкаПравРолей.os
new file mode 100644
index 0000000..235f628
--- /dev/null
+++ b/src/СценарииОбработки/СортировкаПравРолей.os
@@ -0,0 +1,307 @@
+//////////////////////////////////////////////////////////////////////////////////
+//
+// Служебный модуль с реализацией сценария обработки файлов <СортировкаПравРолей>
+//
+//////////////////////////////////////////////////////////////////////////////////
+
+#Область Переменные
+
+// Глобальные переменные для хранения объектов регулярных выражений
+Перем ВыражениеВсеОбъекты;
+Перем ВыражениеМассивОбъектов;
+Перем ВыражениеИмяОбъекта;
+Перем ВыражениеПраваОбъекта;
+Перем ВыражениеМассивПрав;
+Перем ВыражениеЗначениеПрава;
+
+#КонецОбласти
+
+// Возвращает имя сценария обработки файлов
+//
+// Возвращаемое значение:
+// Строка - Имя текущего сценария обработки файлов
+Функция ИмяСценария() Экспорт
+ Возврат "СортировкаПравРолей";
+КонецФункции
+
+// Выполняет обработку файла
+//
+// Параметры:
+// АнализируемыйФайл - Файл - Файл из журнала git для анализа
+// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
+// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
+// * Лог - Объект - Текущий лог
+// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
+// * КаталогРепозитория - Строка - Адрес каталога репозитория
+// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
+// и которые необходимо дообработать
+//
+// Возвращаемое значение:
+// Булево - Признак выполненной обработки файла
+//
+// BSLLS:UnusedParameters-off API
+Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
+// BSLLS:UnusedParameters-on
+ ФайлОбработан = Ложь;
+ Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлПравРоли(АнализируемыйФайл) Тогда
+ НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
+ ПолноеИмяФайла = АнализируемыйФайл.ПолноеИмя;
+ ДополнительныеПараметры.Лог.Информация("Обработка файла '%1' по сценарию '%2'", ПолноеИмяФайла, ИмяСценария());
+
+ ФайлОбработан = СортироватьПрава(ПолноеИмяФайла);
+ Если ФайлОбработан Тогда
+ ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(ПолноеИмяФайла);
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ФайлОбработан;
+КонецФункции
+
+Функция СортироватьПрава(ПолноеИмяФайла)
+ ФайлИзменился = Ложь;
+ СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПолноеИмяФайла);
+
+ Выражение = РегулярноеВыражениеВсеОбъекты();
+ Совпадения = Выражение.НайтиСовпадения(СодержимоеФайла);
+ Если Совпадения.Количество() > 0 Тогда
+ Для Каждого Совпадение Из Совпадения Цикл
+ ВсеОбъекты = Совпадение.Значение;
+ СодержимоеФайла = СтрЗаменить(СодержимоеФайла, ВсеОбъекты, СтрокаЗаменыВсеОбъекты());
+
+ ТаблицаОбъектов = СформироватьТаблицуОбъектов(ВсеОбъекты);
+ Если ТаблицаОбъектов.Количество() > 0 Тогда
+ СтрокаЗамены = ТаблицаОбъектовСтрокой(ТаблицаОбъектов);
+ СодержимоеФайла = СтрЗаменить(СодержимоеФайла, СтрокаЗаменыВсеОбъекты(), СтрокаЗамены);
+ ФайлИзменился = Истина;
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
+ Если ФайлИзменился Тогда
+ ФайловыеОперации.ЗаписатьТекстФайла(ПолноеИмяФайла, СодержимоеФайла);
+ КонецЕсли;
+
+ Возврат Истина;
+КонецФункции
+
+Функция СформироватьТаблицуОбъектов(ВсеОбъекты)
+ ТаблицаОбъектов = НоваяТаблицаОбъектов();
+ МассивОбъектов = МассивОбъектовФайла(ВсеОбъекты);
+ Для Каждого ЗаписьОбъекта Из МассивОбъектов Цикл
+ ДобавитьЗаписьВТаблицуОбъектов(ТаблицаОбъектов, ЗаписьОбъекта);
+ КонецЦикла;
+
+ Возврат ТаблицаОбъектов;
+КонецФункции
+
+Функция МассивОбъектовФайла(ВсеОбъекты)
+ Выражение = РегулярноеВыражениеМассивОбъектов();
+ МассивОбъектов = Выражение.НайтиСовпадения(ВсеОбъекты);
+
+ Результат = Новый Массив;
+ Для Каждого ЗаписьОбъекта Из МассивОбъектов Цикл
+ Результат.Добавить(ЗаписьОбъекта.Значение);
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+Процедура ДобавитьЗаписьВТаблицуОбъектов(ТаблицаОбъектов, ТекстОбъекта)
+ ОписаниеОбъекта = ОписаниеОбъекта(ТекстОбъекта);
+ СтрокаОбъекта = ТаблицаОбъектов.Найти(ОписаниеОбъекта.Имя, "Имя");
+ Если СтрокаОбъекта = Неопределено Тогда
+ СтрокаОбъекта = ТаблицаОбъектов.Добавить();
+ СтрокаОбъекта.Имя = ОписаниеОбъекта.Имя;
+ СтрокаОбъекта.Объект = ОписаниеОбъекта.Объект;
+ СтрокаОбъекта.Права = НоваяТаблицаПрав();
+ КонецЕсли;
+
+ Для Каждого СтрокаТЧ Из ОписаниеОбъекта.Права Цикл
+ СтрокаПрава = СтрокаОбъекта.Права.Найти(СтрокаТЧ.Имя, "Имя");
+ Если СтрокаПрава = Неопределено Тогда
+ СтрокаПрава = СтрокаОбъекта.Права.Добавить();
+ СтрокаПрава.Имя = СтрокаТЧ.Имя;
+ СтрокаПрава.Текст = СтрокаТЧ.Текст;
+ КонецЕсли;
+ СтрокаПрава.Значение = СтрокаТЧ.Значение;
+ КонецЦикла;
+КонецПроцедуры
+
+Функция ОписаниеОбъекта(ТекстОбъекта)
+ Описание = Новый Структура("Имя, Объект, Права");
+ Описание.Имя = ИмяОбъекта(ТекстОбъекта);
+
+ ВсеПрава = ПраваОбъекта(ТекстОбъекта);
+ Описание.Объект = СтрЗаменить(ТекстОбъекта, ВсеПрава, СтрокаЗаменыВсеПрава());
+
+ Описание.Права = СформироватьТаблицуПрав(ВсеПрава);
+
+ Возврат Описание;
+КонецФункции
+
+Функция СформироватьТаблицуПрав(ВсеПрава)
+ ТаблицаПрав = НоваяТаблицаПрав();
+
+ Выражение = РегулярноеВыражениеМассивПрав();
+ Совпадения = Выражение.НайтиСовпадения(ВсеПрава);
+ Для Каждого Совпадение Из Совпадения Цикл
+ НоваяСтрока = ТаблицаПрав.Добавить();
+ НоваяСтрока.Имя = ИмяОбъекта(Совпадение.Значение);
+ НоваяСтрока.Значение = ЗначениеПрава(Совпадение.Значение);
+ НоваяСтрока.Текст = ?(ПустаяСтрока(НоваяСтрока.Значение), Совпадение.Значение,
+ ЗаменитьЗначениеПраваШаблоном(Совпадение.Значение, НоваяСтрока.Значение));
+ КонецЦикла;
+
+ Возврат ТаблицаПрав;
+КонецФункции
+
+Функция ТаблицаОбъектовСтрокой(ТаблицаОбъектов)
+ МассивСтрок = Новый Массив;
+ ТаблицаОбъектов.Сортировать("Имя");
+ Для Каждого СтрокаТЧ Из ТаблицаОбъектов Цикл
+ СтрокаТЧ.Права.Сортировать("Имя");
+
+ МассивПрав = Новый Массив;
+ Для Каждого СтрокаПрава Из СтрокаТЧ.Права Цикл
+ Право = СтрЗаменить(СтрокаПрава.Текст, СтрокаЗаменыЗначение(), СтрокаПрава.Значение);
+ МассивПрав.Добавить(Право);
+ КонецЦикла;
+
+ Если МассивПрав.Количество() > 0 Тогда
+ СтрокаОбъекта = СтрЗаменить(СтрокаТЧ.Объект, СтрокаЗаменыВсеПрава(), СтрСоединить(МассивПрав, Символы.ПС));
+ МассивСтрок.Добавить(СтрокаОбъекта);
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат СтрСоединить(МассивСтрок, Символы.ПС);
+КонецФункции
+
+Функция ИмяОбъекта(Объект)
+ Результат = "";
+
+ Выражение = РегулярноеВыражениеИмяОбъекта();
+ Совпадения = Выражение.НайтиСовпадения(Объект);
+ Для Каждого Совпадение Из Совпадения Цикл
+ Если Совпадение.Группы.Количество() > 1 Тогда
+ Результат = Совпадение.Группы[1].Значение;
+ КонецЕсли;
+
+ Прервать;
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+Функция ПраваОбъекта(Объект)
+ Результат = "";
+
+ Выражение = РегулярноеВыражениеПраваОбъекта();
+ Совпадения = Выражение.НайтиСовпадения(Объект);
+ Для Каждого Совпадение Из Совпадения Цикл
+ Результат = Совпадение.Значение;
+ Прервать;
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+Функция ЗначениеПрава(Объект)
+ Результат = "";
+
+ Выражение = РегулярноеВыражениеЗначениеПрава();
+ Совпадения = Выражение.НайтиСовпадения(Объект);
+ Для Каждого Совпадение Из Совпадения Цикл
+ Если Совпадение.Группы.Количество() > 1 Тогда
+ Результат = Совпадение.Группы[1].Значение;
+ КонецЕсли;
+
+ Прервать;
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+Функция ЗаменитьЗначениеПраваШаблоном(ТекстПрава, Значение)
+ СтрокаПоиска = СтрШаблон("%1", Значение);
+ СтрокаЗамены = СтрШаблон("%1", СтрокаЗаменыЗначение());
+
+ Возврат СтрЗаменить(ТекстПрава, СтрокаПоиска, СтрокаЗамены);
+КонецФункции
+
+Функция РегулярноеВыражениеВсеОбъекты()
+ Если ВыражениеВсеОбъекты = Неопределено Тогда
+ ВыражениеВсеОбъекты = РегулярныеВыражения.Создать("\B.*");
+ КонецЕсли;
+
+ Возврат ВыражениеВсеОбъекты;
+КонецФункции
+
+Функция РегулярноеВыражениеМассивОбъектов()
+ Если ВыражениеМассивОбъектов = Неопределено Тогда
+ ВыражениеМассивОбъектов = РегулярныеВыражения.Создать("\B.*");
+ КонецЕсли;
+
+ Возврат ВыражениеМассивОбъектов;
+КонецФункции
+
+Функция РегулярноеВыражениеИмяОбъекта()
+ Если ВыражениеИмяОбъекта = Неопределено Тогда
+ ВыражениеИмяОбъекта = РегулярныеВыражения.Создать("([\w\.]+)");
+ КонецЕсли;
+
+ Возврат ВыражениеИмяОбъекта;
+КонецФункции
+
+Функция РегулярноеВыражениеПраваОбъекта()
+ Если ВыражениеПраваОбъекта = Неопределено Тогда
+ ВыражениеПраваОбъекта = РегулярныеВыражения.Создать("\B.*[\w\W]+");
+ КонецЕсли;
+
+ Возврат ВыражениеПраваОбъекта;
+КонецФункции
+
+Функция РегулярноеВыражениеМассивПрав()
+ Если ВыражениеМассивПрав = Неопределено Тогда
+ ВыражениеМассивПрав = РегулярныеВыражения.Создать("\B.*[\w\W]+?");
+ КонецЕсли;
+
+ Возврат ВыражениеМассивПрав;
+КонецФункции
+
+Функция РегулярноеВыражениеЗначениеПрава()
+ Если ВыражениеЗначениеПрава = Неопределено Тогда
+ ВыражениеЗначениеПрава = РегулярныеВыражения.Создать("([\w]+)");
+ КонецЕсли;
+
+ Возврат ВыражениеЗначениеПрава;
+КонецФункции
+
+Функция СтрокаЗаменыВсеОбъекты()
+ Возврат "";
+КонецФункции
+
+Функция СтрокаЗаменыВсеПрава()
+ Возврат "";
+КонецФункции
+
+Функция СтрокаЗаменыЗначение()
+ Возврат "";
+КонецФункции
+
+Функция НоваяТаблицаОбъектов()
+ ТаблицаОбъектов = Новый ТаблицаЗначений;
+ ТаблицаОбъектов.Колонки.Добавить("Имя");
+ ТаблицаОбъектов.Колонки.Добавить("Объект");
+ ТаблицаОбъектов.Колонки.Добавить("Права");
+
+ Возврат ТаблицаОбъектов;
+КонецФункции
+
+Функция НоваяТаблицаПрав()
+ ТаблицаПрав = Новый ТаблицаЗначений;
+ ТаблицаПрав.Колонки.Добавить("Имя");
+ ТаблицаПрав.Колонки.Добавить("Значение");
+ ТаблицаПрав.Колонки.Добавить("Текст");
+
+ Возврат ТаблицаПрав;
+КонецФункции
diff --git a/tests/fixtures/СортировкаПравРолей/v8config.json b/tests/fixtures/СортировкаПравРолей/v8config.json
new file mode 100644
index 0000000..88954b7
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/v8config.json
@@ -0,0 +1,47 @@
+{
+ "Precommt4onecСценарии": {
+ "ИспользоватьСценарииРепозитория": false,
+ "КаталогЛокальныхСценариев": "",
+ "ГлобальныеСценарии": [
+ "ВставкаКопирайтов.os",
+ "ДобавлениеПробеловПередКлючевымиСловами.os",
+ "ЗапретИспользованияПерейти.os",
+ "ИсправлениеНеКаноническогоНаписания.os",
+ "КорректировкаXMLФорм.os",
+ "ОбработкаЮнитТестов.os",
+ "ОтключениеПолнотекстовогоПоиска.os",
+ "ОтключениеРазрешенияИзменятьФорму.os",
+ "ПроверкаДублейПроцедурИФункций.os",
+ "ПроверкаКорректностиИнструкцийПрепроцессора.os",
+ "ПроверкаКорректностиОбластей.os",
+ "ПроверкаНецензурныхСлов.os",
+ "РазборОбычныхФормНаИсходники.os",
+ "РазборОтчетовОбработокРасширений.os",
+ "СинхронизацияОбъектовМетаданныхИФайлов.os",
+ "СортировкаСостава.os",
+ "УдалениеДублейМетаданных.os",
+ "УдалениеЛишнихКонцевыхПробелов.os",
+ "УдалениеЛишнихПустыхСтрок.os"
+ ],
+ "ОтключенныеСценарии": [],
+ "НастройкиСценариев": {
+ "ВставкаКопирайтов": {
+ "ИгнорироватьМодулиОбъектовПоставки": true,
+ "ПутьКФайлуКопирайта": "COPYRIGHT",
+ "ИсключаемыеТэги": [
+ "// IMPORT"
+ ]
+ },
+ "ОтключениеПолнотекстовогоПоиска": {
+ "МетаданныеДляИсключения": {}
+ },
+ "ПроверкаНецензурныхСлов": {
+ "ФайлСНецензурнымиСловами": "НецензурныеСлова.txt"
+ },
+ "РазборОтчетовОбработокРасширений": {
+ "ИспользоватьНастройкиПоУмолчанию": true,
+ "ВерсияПлатформы": ""
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/Configurator/Администратор/Rights.xml b/tests/fixtures/СортировкаПравРолей/До/Configurator/Администратор/Rights.xml
new file mode 100644
index 0000000..89b75cd
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/Configurator/Администратор/Rights.xml
@@ -0,0 +1,2971 @@
+
+
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/Configurator/Пользователь/Rights.xml b/tests/fixtures/СортировкаПравРолей/До/Configurator/Пользователь/Rights.xml
new file mode 100644
index 0000000..9d496de
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/Configurator/Пользователь/Rights.xml
@@ -0,0 +1,2251 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/Configurator/ПраваНаРеквизиты/Rights.xml b/tests/fixtures/СортировкаПравРолей/До/Configurator/ПраваНаРеквизиты/Rights.xml
new file mode 100644
index 0000000..2f66d8b
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/Configurator/ПраваНаРеквизиты/Rights.xml
@@ -0,0 +1,206 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/Configurator/РольБезПрав/Rights.xml b/tests/fixtures/СортировкаПравРолей/До/Configurator/РольБезПрав/Rights.xml
new file mode 100644
index 0000000..d716334
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/Configurator/РольБезПрав/Rights.xml
@@ -0,0 +1,6 @@
+
+
+ false
+ true
+ false
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/Configurator/РольРасширения/Rights.xml b/tests/fixtures/СортировкаПравРолей/До/Configurator/РольРасширения/Rights.xml
new file mode 100644
index 0000000..afe39ad
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/Configurator/РольРасширения/Rights.xml
@@ -0,0 +1,212 @@
+
+
+ false
+ false
+ false
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/До/EDT/Администратор/Rights.rights b/tests/fixtures/СортировкаПравРолей/До/EDT/Администратор/Rights.rights
new file mode 100644
index 0000000..6029ca7
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/EDT/Администратор/Rights.rights
@@ -0,0 +1,2974 @@
+
+
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/До/EDT/Пользователь/Rights.rights b/tests/fixtures/СортировкаПравРолей/До/EDT/Пользователь/Rights.rights
new file mode 100644
index 0000000..c9add04
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/EDT/Пользователь/Rights.rights
@@ -0,0 +1,2251 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/До/EDT/ПраваНаРеквизиты/Rights.rights b/tests/fixtures/СортировкаПравРолей/До/EDT/ПраваНаРеквизиты/Rights.rights
new file mode 100644
index 0000000..aa82424
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/EDT/ПраваНаРеквизиты/Rights.rights
@@ -0,0 +1,206 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/До/EDT/РольБезПрав/Rights.rights b/tests/fixtures/СортировкаПравРолей/До/EDT/РольБезПрав/Rights.rights
new file mode 100644
index 0000000..d0fe0a7
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/EDT/РольБезПрав/Rights.rights
@@ -0,0 +1,6 @@
+
+
+ false
+ true
+ false
+
diff --git a/tests/fixtures/СортировкаПравРолей/До/EDT/РольРасширения/Rights.rights b/tests/fixtures/СортировкаПравРолей/До/EDT/РольРасширения/Rights.rights
new file mode 100644
index 0000000..af126bf
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/До/EDT/РольРасширения/Rights.rights
@@ -0,0 +1,212 @@
+
+
+ false
+ true
+ false
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/После/Configurator/Администратор/Rights.xml b/tests/fixtures/СортировкаПравРолей/После/Configurator/Администратор/Rights.xml
new file mode 100644
index 0000000..a27008f
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/Configurator/Администратор/Rights.xml
@@ -0,0 +1,2971 @@
+
+
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/После/Configurator/Пользователь/Rights.xml b/tests/fixtures/СортировкаПравРолей/После/Configurator/Пользователь/Rights.xml
new file mode 100644
index 0000000..7cd9635
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/Configurator/Пользователь/Rights.xml
@@ -0,0 +1,2251 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/После/Configurator/ПраваНаРеквизиты/Rights.xml b/tests/fixtures/СортировкаПравРолей/После/Configurator/ПраваНаРеквизиты/Rights.xml
new file mode 100644
index 0000000..8691c0d
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/Configurator/ПраваНаРеквизиты/Rights.xml
@@ -0,0 +1,206 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/После/Configurator/РольБезПрав/Rights.xml b/tests/fixtures/СортировкаПравРолей/После/Configurator/РольБезПрав/Rights.xml
new file mode 100644
index 0000000..d716334
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/Configurator/РольБезПрав/Rights.xml
@@ -0,0 +1,6 @@
+
+
+ false
+ true
+ false
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/После/Configurator/РольРасширения/Rights.xml b/tests/fixtures/СортировкаПравРолей/После/Configurator/РольРасширения/Rights.xml
new file mode 100644
index 0000000..6e5f07f
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/Configurator/РольРасширения/Rights.xml
@@ -0,0 +1,212 @@
+
+
+ false
+ false
+ false
+
+
+
\ No newline at end of file
diff --git a/tests/fixtures/СортировкаПравРолей/После/EDT/Администратор/Rights.rights b/tests/fixtures/СортировкаПравРолей/После/EDT/Администратор/Rights.rights
new file mode 100644
index 0000000..c825960
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/EDT/Администратор/Rights.rights
@@ -0,0 +1,2974 @@
+
+
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/После/EDT/Пользователь/Rights.rights b/tests/fixtures/СортировкаПравРолей/После/EDT/Пользователь/Rights.rights
new file mode 100644
index 0000000..8df236e
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/EDT/Пользователь/Rights.rights
@@ -0,0 +1,2251 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/После/EDT/ПраваНаРеквизиты/Rights.rights b/tests/fixtures/СортировкаПравРолей/После/EDT/ПраваНаРеквизиты/Rights.rights
new file mode 100644
index 0000000..e8a4e1c
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/EDT/ПраваНаРеквизиты/Rights.rights
@@ -0,0 +1,206 @@
+
+
+ false
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/fixtures/СортировкаПравРолей/После/EDT/РольБезПрав/Rights.rights b/tests/fixtures/СортировкаПравРолей/После/EDT/РольБезПрав/Rights.rights
new file mode 100644
index 0000000..d0fe0a7
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/EDT/РольБезПрав/Rights.rights
@@ -0,0 +1,6 @@
+
+
+ false
+ true
+ false
+
diff --git a/tests/fixtures/СортировкаПравРолей/После/EDT/РольРасширения/Rights.rights b/tests/fixtures/СортировкаПравРолей/После/EDT/РольРасширения/Rights.rights
new file mode 100644
index 0000000..995a12e
--- /dev/null
+++ b/tests/fixtures/СортировкаПравРолей/После/EDT/РольРасширения/Rights.rights
@@ -0,0 +1,212 @@
+
+
+ false
+ true
+ false
+
+
+
diff --git a/tests/ТестНастройкиРепозитория.os b/tests/ТестНастройкиРепозитория.os
index 5b0a544..f48fcda 100644
--- a/tests/ТестНастройкиРепозитория.os
+++ b/tests/ТестНастройкиРепозитория.os
@@ -101,6 +101,7 @@
ОжидаемыеСценарии.Добавить("РазборОбычныхФормНаИсходники.os");
ОжидаемыеСценарии.Добавить("РазборОтчетовОбработокРасширений.os");
ОжидаемыеСценарии.Добавить("СинхронизацияОбъектовМетаданныхИФайлов.os");
+ ОжидаемыеСценарии.Добавить("СортировкаПравРолей.os");
ОжидаемыеСценарии.Добавить("СортировкаСостава.os");
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев();
diff --git a/tests/ТестПроверкаСценариевОбработки.os b/tests/ТестПроверкаСценариевОбработки.os
index d52f511..3035605 100644
--- a/tests/ТестПроверкаСценариевОбработки.os
+++ b/tests/ТестПроверкаСценариевОбработки.os
@@ -41,6 +41,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийВставкиКопирайтовНеОбновляетКопирайтВФайлахПоставки");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийЗапретаИспользованияПерейтиНеСрабатываетНаСтроку");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийКорректировкаXMLФормУчитываетСвязьФормРасширенийСФормамиКонфигурации");
+ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийСортировкаПравРолейИзменяетПорядокОбъектов");
Возврат ВсеТесты;
@@ -596,6 +597,47 @@
#КонецОбласти
+#Область СортировкаПравРолей
+
+Процедура ТестДолжен_ПроверитьЧтоСценарийСортировкаПравРолейИзменяетПорядокОбъектов() Экспорт
+ ОбрабатываемыеФайлы = Новый Массив;
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("Configurator/Администратор/Rights.xml"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("Configurator/Пользователь/Rights.xml"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("Configurator/ПраваНаРеквизиты/Rights.xml"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("Configurator/РольБезПрав/Rights.xml"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("Configurator/РольРасширения/Rights.xml"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("EDT/Администратор/Rights.rights"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("EDT/Пользователь/Rights.rights"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("EDT/ПраваНаРеквизиты/Rights.rights"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("EDT/РольБезПрав/Rights.rights"));
+ ОбрабатываемыеФайлы.Добавить(ФайловыеОперации.НормализоватьРазделители("EDT/РольРасширения/Rights.rights"));
+
+ ОбъектСценария = ПолучитьСценарий("СортировкаПравРолей.os");
+
+ ВременныйКаталог = ПолучитьИмяВременногоФайла();
+ Фикстура = Фикстура("СортировкаПравРолей");
+ СоздатьКаталог(ВременныйКаталог);
+ СкопироватьКаталог(Фикстура, ВременныйКаталог);
+
+ Настройки = ПолучитьДополнительныеНастройки(ВременныйКаталог);
+ ПутьККаталогуДо = ОбъединитьПути(ВременныйКаталог, "До");
+ ПутьККаталогуПосле = ОбъединитьПути(ВременныйКаталог, "После");
+
+ Для Каждого ПутьКФайлу Из ОбрабатываемыеФайлы Цикл
+ Файл = Новый Файл(ОбъединитьПути(ПутьККаталогуДо, ПутьКФайлу));
+ Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
+ Ожидаем.Что(Результат, "Файл прав не был обработан").Равно(Истина);
+
+ СодержимоеФайла = СокрЛП(ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя));
+ СодержимоеЭталон = СокрЛП(ФайловыеОперации.ПрочитатьТекстФайла(ОбъединитьПути(ПутьККаталогуПосле, ПутьКФайлу)));
+ Ожидаем.Что(СодержимоеФайла, СтрШаблон("Файл прав %1 был обработан некорректно", ПутьКФайлу)).Равно(СодержимоеЭталон);
+ КонецЦикла;
+
+ МенеджерВременныхФайлов.УдалитьФайл(ВременныйКаталог);
+КонецПроцедуры
+
+#КонецОбласти
+
#Область Служебные
Процедура ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, ТекстИсключения)
diff --git a/v8config.json b/v8config.json
index 95042a4..fb288ed 100644
--- a/v8config.json
+++ b/v8config.json
@@ -18,6 +18,7 @@
"РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os",
"СинхронизацияОбъектовМетаданныхИФайлов.os",
+ "СортировкаПравРолей.os",
"СортировкаСостава.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",