diff --git a/lib.config b/lib.config
index a5de465..93e9d01 100644
--- a/lib.config
+++ b/lib.config
@@ -2,6 +2,7 @@
+
\ No newline at end of file
diff --git a/readme.md b/readme.md
index 1b2dd1b..6f96eae 100644
--- a/readme.md
+++ b/readme.md
@@ -88,6 +88,8 @@
- Процедура ВыгрузитьРасширениеВФайл(Знач ПутьФайлРасширения, Знач ИмяРасширения)
- Процедура ЗагрузитьРасширениеИзФайлов(Знач КаталогЗагрузки, Знач ИмяРасширения = "–AllExtensions", Знач ПутьКСпискуФайловЗагрузки = "", Знач ФорматВыгрузки = "", Знач ОбновитьФайлВерсий = Истина)
- Процедура ВыгрузитьРасширениеВФайлы(Знач КаталогВыгрузки, Знач ИмяРасширения = "–AllExtensions", Знач ФорматВыгрузки = "", Знач ТолькоИзмененные = Ложь, Знач ПутьКФайлуВерсийДляСравнения = "")
+- Процедура ПолучитьОтчетОСравненииКонфигурацииСФайлом(Знач ПутьКФайлуКонфигурации, Знач ПутьКОтчету, Знач ТипОтчета = Неопределено, Знач ФорматОтчета = "txt", Знач ИмяРасширения = "")
+- Функция КонфигурацияИФайлИдентичны(Знач ПутьКФайлуКонфигурации, Знач ИмяРасширения = "")
### Вспомогательные и настроечные функции
diff --git a/src/v8runner.os b/src/v8runner.os
index 6471264..4820b02 100644
--- a/src/v8runner.os
+++ b/src/v8runner.os
@@ -1545,6 +1545,152 @@
КонецФункции // ИсключениеПриОшибкеВыполненияКоманды() Экспорт
+// Формирует отчёт о сравнении основной конфигурации\конфигурации расширения в файл.
+//
+// Параметры:
+// ПутьКФайлуКонфигурации - Строка - Путь к файлу cf/cfe с которым необходимо произвести сравнение
+// ПутьКОтчету - Строка - Путь в который необходимо записать отчёт
+// ТипОтчета - ТипыОтчетовОСравнении - Тип отчёта о сравнении полный или краткий
+// ФорматОтчета - Строка - Формат файла отчета. Возмодные значения: txt, mxl
+// ИмяРасширения - Строка - Имя расширения конфигурации
+//
+Процедура ПолучитьОтчетОСравненииКонфигурацииСФайлом(
+ Знач ПутьКФайлуКонфигурации,
+ Знач ПутьКОтчету,
+ Знач ТипОтчета = Неопределено,
+ Знач ФорматОтчета = "txt",
+ Знач ИмяРасширения = "") Экспорт
+
+ Если ТипОтчета = Неопределено Тогда
+ ТипОтчета = ТипыОтчетовОСравнении.Полный;
+ КонецЕсли;
+
+ ПараметрыЗапуска = СтандартныеПараметрыЗапускаКонфигуратора();
+ ПараметрыЗапуска.Добавить("/CompareCfg");
+ Если ЗначениеЗаполнено(ИмяРасширения) Тогда
+ ПараметрыЗапуска.Добавить("-FirstConfigurationType ExtensionConfiguration");
+ Если ИспользуемаяВерсияПлатформыСтаршеИлиРавна("8.3.12") Тогда
+ ПараметрыЗапуска.Добавить(СтрШаблон("-FirstName %1", ИмяРасширения));
+ Иначе
+ ПараметрыЗапуска.Добавить(СтрШаблон("-FirstConfigurationKey %1", ИмяРасширения));
+ КонецЕсли;
+ Иначе
+ ПараметрыЗапуска.Добавить("-FirstConfigurationType MainConfiguration");
+ КонецЕсли;
+
+ ПараметрыЗапуска.Добавить("-SecondConfigurationType File");
+
+ Если ИспользуемаяВерсияПлатформыСтаршеИлиРавна("8.3.12") Тогда
+ ПараметрыЗапуска.Добавить("-SecondFile ");
+ Иначе
+ ПараметрыЗапуска.Добавить("-SecondConfigurationKey ");
+ КонецЕсли;
+
+ ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуКонфигурации));
+
+ ПараметрыЗапуска.Добавить("-ReportType ");
+ ПараметрыЗапуска.Добавить(ФорматОтчета);
+
+ ПараметрыЗапуска.Добавить("-ReportFormat ");
+ ПараметрыЗапуска.Добавить(ТипОтчета);
+
+ ПараметрыЗапуска.Добавить("-ReportFile ");
+ ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКОтчету));
+
+ ВыполнитьКоманду(ПараметрыЗапуска);
+
+КонецПроцедуры
+
+// Функция проверяет что основная конфигурация\конфигурация расширения идентична с файлом
+//
+// Параметры:
+// ПутьКФайлуКонфигурации - Строка - Путь к файлу cf/cfe с которым необходимо произвести сравнение
+// ИмяРасширения - Строка - Имя расширения конфигурации
+//
+// Возвращаемое значение:
+// Булево - Истина - конфигурации идентичны.
+//
+Функция КонфигурацияИФайлИдентичны(Знач ПутьКФайлуКонфигурации, Знач ИмяРасширения = "") Экспорт
+
+ ЭталонОтчетаБезИзменений = НСтр(
+ "ru = '
+ |***- Объект изменен
+ |-->- Объект присутствует только в %1 конфигурации
+ |<--- Объект присутствует только в файле
+ |^- Порядок объекта изменен'
+ |;
+ |en = '
+ |***- Object changed
+ |-->- Object available only in the %1
+ |<--- Object available only in the file
+ |^- Object order changed'",
+ мКонтекстКоманды.КодЯзыкаСеанса
+ );
+
+ Если ЗначениеЗаполнено(ИмяРасширения) Тогда
+ СтрокаДополнения = НСтр("ru = 'расширении'; en = 'configuration extension'", мКонтекстКоманды.КодЯзыкаСеанса);
+ Иначе
+ СтрокаДополнения = НСтр("ru = 'основной'; en = 'main configuration'", мКонтекстКоманды.КодЯзыкаСеанса);
+ КонецЕсли;
+
+ ОтчетБезИзменений = СтрШаблон(
+ ЭталонОтчетаБезИзменений,
+ СтрокаДополнения
+ );
+
+ Лог.Отладка("Сформировал эталон отчета о сравнении: " + ОтчетБезИзменений);
+
+ ПутьКФайлуОтчета = ПолучитьИмяВременногоФайла(".txt");
+
+ Лог.Отладка("Формирую отчет о сравнении конфигураций");
+
+ ПолучитьОтчетОСравненииКонфигурацииСФайлом(
+ ПутьКФайлуКонфигурации,
+ ПутьКФайлуОтчета,
+ ТипыОтчетовОСравнении.Краткий,
+ "txt",
+ ИмяРасширения
+ );
+
+ ФайлОтчета = Новый Файл(ПутьКФайлуОтчета);
+
+ Если ФайлОтчета.Существует() Тогда
+
+ Лог.Отладка("Нашёл файл отчета о сранении. Читаю файл.");
+
+ ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуОтчета);
+ СтрокаТекста = ЧтениеТекста.ПрочитатьСтроку();
+ Отчет = "";
+
+ Пока СтрокаТекста <> Неопределено Цикл
+
+ Если Не ПустаяСтрока(СтрокаТекста) Тогда
+ Отчет = Отчет + Символы.ПС + СокрЛП(СтрокаТекста);
+ КонецЕсли;
+
+ СтрокаТекста = ЧтениеТекста.ПрочитатьСтроку();
+ КонецЦикла;
+
+ ЧтениеТекста.Закрыть();
+
+ Лог.Отладка("Прочитал файл отчета о сравнении: " + Отчет);
+
+ Попытка
+ Лог.Отладка("Удаляю файл отчёта 1С");
+ УдалитьФайлы(ФайлОтчета.ПолноеИмя);
+ Исключение
+ Лог.Предупреждение("Не удалось удалить файл отчёта: " + ОписаниеОшибки());
+ КонецПопытки;
+
+ Возврат Отчет = ОтчетБезИзменений;
+
+ Иначе
+ Лог.Ошибка("Не сформирован файл сравнения конфигураций");
+ КонецЕсли;
+
+ Возврат Ложь;
+
+КонецФункции
//////////////////////////////////////////////////////////////////////////////////
// Служебные процедуры
diff --git "a/src/\320\242\320\270\320\277\321\213\320\236\321\202\321\207\320\265\321\202\320\276\320\262\320\236\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\270.os" "b/src/\320\242\320\270\320\277\321\213\320\236\321\202\321\207\320\265\321\202\320\276\320\262\320\236\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\270.os"
new file mode 100644
index 0000000..1ca072c
--- /dev/null
+++ "b/src/\320\242\320\270\320\277\321\213\320\236\321\202\321\207\320\265\321\202\320\276\320\262\320\236\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\270.os"
@@ -0,0 +1,7 @@
+Перем Краткий Экспорт;
+Перем Полный Экспорт;
+
+///////////////////////////////////////////////////////////////
+
+Краткий = "Brief";
+Полный = "Full";
diff --git a/tests/v8runner-test.os b/tests/v8runner-test.os
index 7d66264..3819a73 100644
--- a/tests/v8runner-test.os
+++ b/tests/v8runner-test.os
@@ -28,7 +28,11 @@
СписокТестов.Добавить("ТестДолжен_ПроверитьСозданиеФайловПоставки");
СписокТестов.Добавить("ТестДолжен_ПроверитьФормированиеФайлаОтчетПоВерсиямХранилища");
СписокТестов.Добавить("ТестДолжен_СкопироватьПользователейИзХранилища");
- СписокТестов.Добавить("ТестДолжен_ОставитьФайлИнформации");
+ СписокТестов.Добавить("ТестДолжен_ПроверитьФормированиеФайлаОтчетаОСравненииОсновнойКонфигурацииСФайлом");
+ СписокТестов.Добавить("ТестДолжен_ПроверитьОсновнаяКонфигурацияИдентичнаФайлу");
+ СписокТестов.Добавить("ТестДолжен_ПроверитьФормированиеФайлаОтчетаОСравненииКонфигурацииРасширенияСФайлом");
+ СписокТестов.Добавить("ТестДолжен_ПроверитьКонфигурацияРасширенияИдентичнаФайлу");
+ СписокТестов.Добавить("ТестДолжен_ОставитьФайлИнформации");
Возврат СписокТестов;
@@ -381,6 +385,136 @@
КонецПроцедуры
+Процедура ТестДолжен_ПроверитьФормированиеФайлаОтчетаОСравненииОсновнойКонфигурацииСФайлом() Экспорт
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+
+ УправлениеКонфигуратором.КаталогСборки(ВременныйКаталог);
+ ПутьКФайлуОтчета = ПолучитьИмяВременногоФайла("txt");
+
+ ФайлКонфигурации = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cf");
+
+ УправлениеКонфигуратором.ЗагрузитьКонфигурациюИзФайла(ФайлКонфигурации);
+
+ УправлениеКонфигуратором.ПолучитьОтчетОСравненииКонфигурацииСФайлом(
+ ФайлКонфигурации,
+ ПутьКФайлуОтчета
+ );
+
+ ФайлОтчетаСуществует = ФС.ФайлСуществует(ПутьКФайлуОтчета);
+
+ ВременныеФайлы.УдалитьФайл( ПутьКФайлуОтчета );
+ ВременныеФайлы.УдалитьФайл( ВременныйКаталог );
+ УправлениеКонфигуратором.УдалитьВременнуюБазу();
+
+ Утверждения.ПроверитьИстину(
+ Не ФС.ФайлСуществует(УправлениеКонфигуратором.ФайлИнформации()),
+ "Внутренний файл информации не должен существовать"
+ );
+
+ Утверждения.ПроверитьИстину(
+ ФайлОтчетаСуществует,
+ "Отчет о сравнении конфигурации с файлом должен существовать"
+ );
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьОсновнаяКонфигурацияИдентичнаФайлу() Экспорт
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+
+ УправлениеКонфигуратором.КаталогСборки(ВременныйКаталог);
+
+ ФайлКонфигурации = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cf");
+
+ УправлениеКонфигуратором.ЗагрузитьКонфигурациюИзФайла(ФайлКонфигурации);
+
+ КонфигурацииИдентичны = УправлениеКонфигуратором.КонфигурацияИФайлИдентичны(
+ ФайлКонфигурации
+ );
+
+ УправлениеКонфигуратором.УдалитьВременнуюБазу();
+ УдалитьФайлы(ВременныйКаталог);
+
+ Утверждения.ПроверитьИстину(КонфигурацииИдентичны, "Конфигурации отличаются");
+ Утверждения.ПроверитьИстину(
+ Не ФС.ФайлСуществует(УправлениеКонфигуратором.ФайлИнформации()),
+ "Внутренний файл информации не должен существовать"
+ );
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьФормированиеФайлаОтчетаОСравненииКонфигурацииРасширенияСФайлом() Экспорт
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+
+ УправлениеКонфигуратором.КаталогСборки(ВременныйКаталог);
+ ПутьКФайлуОтчета = ПолучитьИмяВременногоФайла("txt");
+
+ ФайлКонфигурации = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cf");
+ ФайлРасширения = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cfe");
+
+ ИмяРасширения = "Test_Extension";
+
+ УправлениеКонфигуратором.ЗагрузитьКонфигурациюИзФайла(ФайлКонфигурации);
+ УправлениеКонфигуратором.ЗагрузитьРасширениеИзФайла(ФайлРасширения, ИмяРасширения);
+
+ УправлениеКонфигуратором.ПолучитьОтчетОСравненииКонфигурацииСФайлом(
+ ФайлРасширения,
+ ПутьКФайлуОтчета,
+ ,
+ ,
+ ИмяРасширения
+ );
+
+ ФайлОтчетаСуществует = ФС.ФайлСуществует(ПутьКФайлуОтчета);
+
+ ВременныеФайлы.УдалитьФайл( ПутьКФайлуОтчета );
+ ВременныеФайлы.УдалитьФайл( ВременныйКаталог );
+ УправлениеКонфигуратором.УдалитьВременнуюБазу();
+
+ Утверждения.ПроверитьИстину(
+ Не ФС.ФайлСуществует(УправлениеКонфигуратором.ФайлИнформации()),
+ "Внутренний файл информации не должен существовать"
+ );
+
+ Утверждения.ПроверитьИстину(
+ ФайлОтчетаСуществует,
+ "Отчет о сравнении конфигурации с файлом должен существовать"
+ );
+
+КонецПроцедуры
+
+Процедура ТестДолжен_ПроверитьКонфигурацияРасширенияИдентичнаФайлу() Экспорт
+
+ ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
+
+ УправлениеКонфигуратором.КаталогСборки(ВременныйКаталог);
+
+ ФайлКонфигурации = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cf");
+ ФайлРасширения = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "1.0", "1Cv8.cfe");
+
+ ИмяРасширения = "Test_Extension";
+
+ УправлениеКонфигуратором.ЗагрузитьКонфигурациюИзФайла(ФайлКонфигурации);
+ УправлениеКонфигуратором.ЗагрузитьРасширениеИзФайла(ФайлРасширения, ИмяРасширения);
+
+ КонфигурацииИдентичны = УправлениеКонфигуратором.КонфигурацияИФайлИдентичны(
+ ФайлРасширения,
+ ИмяРасширения
+ );
+
+ УправлениеКонфигуратором.УдалитьВременнуюБазу();
+ ВременныеФайлы.УдалитьФайл(ВременныйКаталог);
+
+ Утверждения.ПроверитьИстину(КонфигурацииИдентичны, "Конфигурации отличаются");
+ Утверждения.ПроверитьИстину(
+ Не ФС.ФайлСуществует(УправлениеКонфигуратором.ФайлИнформации()),
+ "Внутренний файл информации не должен существовать"
+ );
+
+КонецПроцедуры
+
Функция ХранилищеКонфигурацииСуществует(Знач ПапкаХранилища)
Возврат ФС.ФайлСуществует( ОбъединитьПути(ПапкаХранилища, "1cv8ddb.1CD"));
КонецФункции