Введение
Допустим, мы готовим обновление конфигурации. Объекты на полной поддержке- обновляются автоматически, объекты на поддержке с возможностью изменения– необходимо обрабатывать вручную. Перед тем, как вносить изменения в рабочую базу, проведем проверку. Сравним подготовленную (тестовую) конфигурацию с конфигурацией поставщика.
Описание проблемы
Запускаем сравнение конфигураций, видим дерево метаданных. Чтобы найти отличие (в реквизитах или параметрах) между тестовой и эталонной формами объекта, снятого с поддержки - нужно пару раз щелкнуть мышью, затем открыть Отчет о сравнении объектов и там искать разницу. Если объектов для проверки много - скорби умножаются.
Решение проблемы
Как находить ВСЕ различия в один момент ? Из окна сравнения конфигурации откроем контекстное меню, сформируем файл в текстовом формате ОтчетОСравнении.txt для всей конфигурации и сохраним его в отдельный каталог.
В моем случае размер файла 90 Мб. Для анализа файла будем использовать скрипты Bash. Скачать оболочку с сайта https://git-scm.com/download/win. Немного непривычно, но цель оправдывает средства. Для использования Bash нужно с помощью Notepad++ для файла ОтчетОСравнении.txt установить кодировку UTF8.
То же можно сделать командой Bash, имя файла меняется
iconv -f UCS-2LE -t UTF-8 ОтчетОСравнении00.txt > ОтчетОСравнении.txt
Пример 1
Скрипт обработки
cat ОтчетОСравнении.txt \
| egrep '(\*\*\*.*Форма\.)|(<--Реквизит\W)|(<--Колонка реквизита\W)|(<--Параметр\W)' \
| awk -vORS= '{if ($0~"Форма\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep '(<--Реквизит)|(<--Колонка реквизита)|(<--Параметр)' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" > Result.txt
Небольшие пояснения:
Команда cat здесь открывает файл ОтчетОСравнении.txt
Символ "|" в начале строки означает передачу данных от предыдущего оператора к следующему. Внутри скобок и кавычек этот символ означает «ИЛИ».
Символ "\" в конце строки означает, что скрипт продолжается.
Символ «;»в конце строки означает, что закончилась одна команда пакета и начинается следующая.
Символы «\*» «\.» «\n» означают соответственно «*» «.» перевод строки.
Команда egrep здесь оставляет только те строки, которые соответствуют фильтру.
Команда awk здесь убирает переход строки, поднимает строку вверх.
Команда sed здесь вставляет перевод строки перед символами «***» и «- <--», удаляет лишние пробелы.
Если вместо символов "- <--" использовать "- -->", будут показаны удаленные.
Результат работы скрипта записываем в файл Result.txt
Если полученный результат пустой - скорее всего, кодировка файла ОтчетОСравнении.txt не соответствует UTF8.
Пример 2
Если объект (реквизит) на поддержке используется в коде, не находящемся на поддержке, то при изменении имени объекта (реквизита), такой код нужно изменять вручную. Пример кода - модуль, элемент формы - текст запроса динамического списка. Кроме этого, может измениться имя предопределенного элемента.
Скрипт обработки
cat ОтчетОСравнении.txt \
| egrep '(- \*\*\*(Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов)\.)|(Имя...Различаются значения)' \
| awk -vORS= '{if ($0~"\*\*\*(Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов)\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep 'Имя...Различаются значения' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" > Result.txt
Пример 3
Поставщик добавил новые движения для документа:
Скрипт обработки
cat ОтчетОСравнении.txt \
| egrep '(\*\*\*Документ\.)|(\*\*\*Движения)|(- <--Регистр)' \
| awk -vORS= '{if ($0~"\*\*\*Документ\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep '\*\*\*Движения.*<--Регистр' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" > Result.txt
Соберем все скрипты в один супер-пупер мега скрипт.
Echo ".........................................................................................." > Result.txt; \
cat ОтчетОСравнении.txt \
| egrep '(\*\*\*.*Форма\.)|(<--Реквизит\W)|(<--Колонка реквизита\W)|(<--Параметр\W)' \
| awk -vORS= '{if ($0~"Форма\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep '(<--Реквизит)|(<--Колонка реквизита)|(<--Параметр)' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" >> Result.txt; \
Echo ".........................................................................................." >> Result.txt; \
cat ОтчетОСравнении.txt \
| egrep '(- \*\*\*(Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов)\.)|(Имя...Различаются значения)' \
| awk -vORS= '{if ($0~"\*\*\*(Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов)\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep 'Имя...Различаются значения' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" >> Result.txt; \
Echo ".........................................................................................." >> Result.txt; \
cat ОтчетОСравнении.txt \
| egrep '(\*\*\*Документ\.)|(\*\*\*Движения)|(- <--Регистр)' \
| awk -vORS= '{if ($0~"\*\*\*Документ\.") { print "\n"$0;} \
else { print $0; } }' \
| egrep '\*\*\*Движения.*<--Регистр' \
| sed "s/- \*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" >> Result.txt
Какая красота получилась! Мир спасен?
Пример 4
Если поле базы данных содержит данные составного типа, а при обновлении составной тип становится меньше, то ссылки неподходящего типа очищаются, возможна потеря данных. Для анализа "потерянных" типов нужно использовать сравнение конфигурации рабочей базы и конфигурации обновления. Сформируем файл ОтчетОСравнении.txt для нового сравнения, запишем в другой каталог и сменим кодировку.
Информацию об измененных типах можно увидеть при сравнении конфигураций.
Скрипт обработки
cat ОтчетОСравнении.txt \
| egrep '(\*\*\*)|(-->)|(<--)' \
| awk -vORS= '{ if ($0~"(ПланВидовХарактеристик|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов|Реквизит|Измерение|Ресурс|ОпределяемыйТип)\.") \
{ print "\n"$0;} else { print $0; } }' \
| egrep '(\*\*\*)Тип(\W)*(- -->)' \
| sed "s/\*\*\*/\n- \*\*\*/g; s/- <--/\n- <--/g; s/[ \t]//g" > Result.txt
Пример 5.
После установки обновления от поставщика, строки кода наших сотрудников не должны изменяться. Поэтому в файле ОтчетОСравнении конфигурации рабочей базы и конфигурации обновления не должно быть строк, помеченных префиксом. Не забудьте изменить НАШПРЕФИКС на префикс, который используют ваши разработчики.
cat ОтчетОСравнении.txt \
| egrep '(Модуль|Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов|НАШПРЕФИКС)' \
| awk -vORS= '{if ($0~"\*\*\*(ОбщийМодуль|Перечисление|Справочник|Документ|РегистрНакопления|РегистрСведений|Обработка|Отчет|ЖурналДокументов)") \
{ print "\n"$0;} else { print $0; } }' \
| egrep 'Модуль.*НАШПРЕФИКС' \
| sed "s/- Модуль/\n- Модуль/g; s/[ \t]//g" > Result.txt
Заключение
Надеюсь, этот небольшой опус поможет вам при проверке –сравнении конфигураций. Конечно, тема автоматического анализа результатов обновления еще не закрыта. Есть идеи анализировать изменение функций/процедур и еще много разных идей. Буду рад конструктивным предложениям.
Спасибо за внимание !
Обновление январь 2019
При сравнении конфигурации производителя и основной конфигурации можно получить список всех измененных(добавленных) реквизитов справочников, документов и т.д.
cat ОтчетОСравнении.txt \
| egrep '((^..- ((\*\*\*)|(-->))(Справочник|Документ|РегистрНакопления|РегистрСведений))|(Реквизит|Ресурс|Измерение))\.' \
| awk -vORS= '{if ($0~"(^..- ((\*\*\*)|(-->))(Справочник|Документ|РегистрНакопления|РегистрСведений))\.") { print "\n"$0"ENTER"; } else { print $0"ENTER"; } }' \
| egrep '(^..- \*\*\*).*(Реквизит|Ресурс|Измерение)\.' \
| sed "s/ENTER/\n/g" > Result.txt
cat ОтчетОСравнении.txt \
| egrep '((^..- ((\*\*\*)|(-->))(Документ))|(РегистрНакопления|РегистрСведений))\.' \
| awk -vORS= '{if ($0~"(^..- ((\*\*\*)|(-->))(Документ))\.") { print "\n"$0"ENTER"; } \
else { print $0"ENTER"; } }' \
| egrep '(^..- ((\*\*\*)|(-->))).*(РегистрНакопления|РегистрСведений)\.' \
| sed "s/ENTER/\n/g" > Result.txt
Обновление март 2022
Всем привет ! Мне удалось найти методику, которая пригодится всем. Идея очень простая. Если у нас были доработки кода, то после обновления они должны остаться. Сравниваем конфигурацию до обновления со старой конфигурацией поставщика, сравниваем конфигурацию после обновления с новой конфигурацией поставщика. Получаем два файла, которые можно сравнить между собой в интерактивной среде, например Araxis. Если все правильно, то добавленный и измененный нашими программистами код остается без изменения в обоих файлах. Чтобы различий между файлами было меньше, обработаем их скриптом:
#!/bin/bash
printf "" > "result"
iconv -f UCS-2LE -t UTF-8 $1 \
| awk '{ \
if ($0~"\\*\\*\\*Справочная информация") {a=1;} \
else if ($0~"\\*\\*\\*") {a=0;} \
if ($0~" [0-9]{1,6} - [0-9]{1,6}") {} \
else if (a!=1) {gsub("\t","",$0); \
print $0 >> "result"} \
}'
- первая строка - традиционная для bash скриптов
- очищаем файл "result". В конце строки нет слеша, потому что действие не имеет логического продолжения.
- читаем файл - параметр ($1) запуска скрипта, утилитой iconv, изменяем в нем кодировку, передаем содержимое дальше
- начало awk скрипта, каждая строка ($0) файла обрабатывается отдельно. Значение переменной $1 изменено.
- если начинается справочная информация - устанавливаем флаг a=1.
- иначе, начинается другой раздел (символы ***) - устанавливаем флаг a=0
- если строка содержит цифры по шаблону (Например, "Изменено 121 - 135") - пропускаем ее.
- иначе, если флаг a<>1, убираем из строки ($0) табуляцию
- добавляем строку к файлу "result". Любопытно, что оператор printf выдает ошибку, если в строке ($0) есть спец. символы
- завершение awk скрипта. Результат сохранен в файле "result".