Обработка работает в конфигурации "Автоматизированная проверка конфигураций " версия 1.1.12.26 (c более ранними работать не будет).
Как пользоваться конфигурацией читайте здесь. В публикации будут описана только работа с обработкой.
Подготовительный этап:
- В регистре "Особенности" в измерении "Объект" хранится путь до проверяемого объекта, если в конфигурации есть форма с именем "ПоддержкаИОбслуживание" и команда с таким же именем, особенности формы игнорируются. Для исправления нужно изменить процедуру " АктуализироватьОсобенности" в модуле документа " ПроверкаВерсии " (1С обещала исправить в следующем релизе). Код приведен в конце статьи.
Инструкция по работе с обработкой:
Параметры обработки (англоязычный вариант используется в пакетном запуске):
- "Путь к базе / Base" (обязательный) - путь к файловой базе 1с, которую хотите проверить,
- "Путь к словарю / Vocabulary" - путь к словарю, где хранится слова-исключения для проверки орфографических ошибок (формат файла совпадает с форматом, который использует конфигурация при выгрузке регистра "ВерныеСлова"),
- "Путь к особенностям / Specificity" - путь к файлу с особенностями (формат отличается от принятого в конфигурации из-за ошибки с сохранением поля "Уточнение" и для уменьшения размера),
- "Путь к требованиям / Requirements" и "Путь к требованиям исключениям / IgnoreRequirements" - путь к файлам с описанием требований, которые хотим чтобы проверялись. Формат файла - текстовый файл, кодировка UTF8 с наименованием требования, разделитель перевод строки. Сначала программа пытается прочитать требования, если их нет, то читает все требования за исключением требований-исключений и требований, в которых есть этап "ВыполнитьПлатформеннуюПроверкуКонфигурации",
- "Путь к платформе / Path" - путь к папке, где лежит 1cv8.exe, если не указывать, то использует версию платформы, в которой запущена конфигурации "Автоматизированная проверка конфигураций".
- "Путь к объектам / Object" - путь к файлу с указанием объектов, которые нужно проверять. Формат файла - текстовый файл, кодировка UTF8, разделитель перевод строки, нужно писать строки следующего вида "cf/DataProcessors/ЖурналРегистрации", программа берет только имя объекта, т.е. ЖурналРегистрации.
- "Путь к объектам исключениям / IgnoreObject" - путь к файлу с указанием объектов, которые проверять не надо. Формат файла - текстовый файл, кодировка ANSI, разделитель перевод строки, писать нужно имя объекта как оно выводится при платформенной проверки конфигурации, например "Обработка.Запросник2_0".
- Report - путь до отчета, который получается после проверки. В интерактивном режиме параметр отсутствует.
Для создания файла с особенностями нужно заполнить регистр "Особенности" как с помощью средств конфигурации так и с помощью кнопки "Добавить особенность" на закладке "Добавление особенностей". После заполнения нужно нажать кнопку "Сохранить особенности в файл"
Для пакетного запуска нужно в командной строке указать запуск 1с в режиме предприятия в толстом клиенте с открытием обработки RunnerAcc.epf и с передачей параметров запуска (формат: имя параметра = значение, разделитель точка с запятой), например: "C:\Program Files (x86)\1cv8\8.3.8.2137\bin\1cv8.exe" ENTERPRISE /IBConnectionString File=ACC /RunModeOrdinaryApplication /Execute "RunnerAcc.epf" /C "Base=base;Report=Report.html"
Для вывода отчета в Jenkins используется плагин HTML Publisher plugin, в резульатет получится отчет в html .
P.S. Публикация получилось немного скомканной, поэтому пишите в комментариях не очевидные вещи. Обработка писалась для себя, поэтому если будет интерес и потребуется доработка, готов поправить.
P.P.S. Патч процедуры в тексте статьи не хотел приводить, но Инфостарт запрещает делать файлы бесплатными для скачивания, поэтому пришлось добавить.
Процедура АктуализироватьОсобенности(НайденныеОшибки)
ЗапросПоОсобенностям = Новый Запрос;
ЗапросПоОсобенностям.Текст = "
|ВЫБРАТЬ
| Особенности.*
|ИЗ
| РегистрСведений.Особенности КАК Особенности
|ГДЕ
| Особенности.Конфигурация = &Конфигурация";
ЗапросПоОсобенностям.УстановитьПараметр("Конфигурация", Конфигурация);
ТаблицаОсобенностей = ЗапросПоОсобенностям.Выполнить().Выгрузить();
КоличествоОсобенностей = ТаблицаОсобенностей.Количество();
Если КоличествоОсобенностей = 0 Тогда
Возврат;
КонецЕсли;
МассивНеактуальныхОсобенностей = Новый Массив;
ЗапросПоОбъектам = Новый Запрос;
ЗапросПоОбъектам.Текст = "
|ВЫБРАТЬ
| СтруктураКонфигурации.Ссылка КАК Ссылка,
| СтруктураКонфигурации.Путь КАК Путь
|ИЗ
| Справочник.СтруктураКонфигурации КАК СтруктураКонфигурации
|ГДЕ
| СтруктураКонфигурации.Владелец = &Владелец
| И СтруктураКонфигурации.Путь В(&Путь)";
ЗапросПоОбъектам.УстановитьПараметр("Владелец", Версия);
ЗапросПоОбъектам.УстановитьПараметр("Путь", ТаблицаОсобенностей.ВыгрузитьКолонку("Объект"));
ТаблицаОбъектов = ЗапросПоОбъектам.Выполнить().Выгрузить();
ТаблицаОбъектов.Индексы.Добавить("Путь");
СтруктураОтбораПоПути = Новый Структура("Путь");
Для Каждого Особенность Из ТаблицаОсобенностей Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
Ошибка = Особенность.Ошибка;
// Проверяем, что ошибка особенности есть в выбранных требованиях, если нет, то оставляем особенность.
Если НЕ МассивСодержитЗаписьОшибки(ОбнаруживаемыеОшибки, Ошибка) Тогда
Продолжить;
КонецЕсли;
// Если данные о платформенной проверке не собраны, то оставляем особенность по платформенной проверке.
Если МассивСодержитЗаписьОшибки(ОшибкиПлатформеннойПроверки, Ошибка) Тогда
Продолжить;
КонецЕсли;
Уточнение = Особенность.Уточнение;
ОсобенностьАктуальна = Ложь;
// Ищем все объекты в таблице по одному пути, т.к. путь может совпадать, например, для формы и команды.
СтруктураОтбораПоПути.Вставить("Путь", Особенность.Объект);
МассивОбъектов = ТаблицаОбъектов.НайтиСтроки(СтруктураОтбораПоПути);
Для Каждого ЭлементОбъекта Из МассивОбъектов Цикл
Отбор = Новый Структура;
Отбор.Вставить("Ошибка", Ошибка);
Отбор.Вставить("Объект", ЭлементОбъекта.Ссылка);
Отбор.Вставить("Уточнение", Уточнение);
ОшибкиСОбщимиОсобенностями = НайденныеОшибки.НайтиСтроки(Отбор);
Если ОшибкиСОбщимиОсобенностями.Количество() > 0 Тогда
ОсобенностьАктуальна = Истина;
Прервать;
КонецЕсли;
// Уточнение в найденных ошибках может быть сокращено, повторяем поиск.
Отбор.Вставить("Уточнение", СокрЛП(Уточнение));
ОшибкиСОбщимиОсобенностями = НайденныеОшибки.НайтиСтроки(Отбор);
Если ОшибкиСОбщимиОсобенностями.Количество() > 0 Тогда
ОсобенностьАктуальна = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
// Если особенность не актуальна, то добавим ее в массив для удаления особенностей.
Если НЕ ОсобенностьАктуальна Тогда
МассивНеактуальныхОсобенностей.Добавить(Особенность);
КонецЕсли;
КонецЦикла;
// Если нет неактуальных особенностей, то выходим.
Если МассивНеактуальныхОсобенностей.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Для Каждого Особенность Из МассивНеактуальныхОсобенностей Цикл
ТаблицаОсобенностей.Удалить(Особенность);
КонецЦикла;
НаборЗаписейОсобенностей = РегистрыСведений.Особенности.СоздатьНаборЗаписей();
НаборЗаписейОсобенностей.Отбор.Конфигурация.Установить(Конфигурация);
НаборЗаписейОсобенностей.Загрузить(ТаблицаОсобенностей);
НаборЗаписейОсобенностей.Записать();
КонецПроцедуры