Уверенное обновление

Публикация № 1095079

Администрирование - Сервисные утилиты

58
Уверенное обновление. Анализ файла ОтчетОСравнении.txt. Bash

Введение

Допустим, мы готовим обновление конфигурации. Объекты на полной поддержке- обновляются автоматически, объекты на поддержке  с возможностью изменения– необходимо обрабатывать вручную. Перед тем, как вносить изменения в рабочую базу, проведем проверку. Сравним подготовленную (тестовую) конфигурацию с конфигурацией поставщика.

Описание проблемы

Запускаем сравнение конфигураций, видим дерево метаданных. Чтобы найти отличие (в реквизитах или параметрах) между тестовой и эталонной формами объекта, снятого с поддержки - нужно пару раз щелкнуть мышью, затем открыть Отчет о сравнении объектов и там искать разницу. Если объектов для проверки много - скорби умножаются.

Решение проблемы

Как находить ВСЕ различия в один момент ? Из окна сравнения конфигурации откроем контекстное меню, сформируем файл в текстовом формате ОтчетОСравнении.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

 Заключение

Надеюсь, этот небольшой опус поможет вам при проверке –сравнении конфигураций. Конечно, тема автоматического анализа результатов обновления еще не закрыта. Есть идеи анализировать изменение функций/процедур и еще много разных идей. Буду рад конструктивным предложениям.

Спасибо за внимание !

58

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Maxisussr 18.07.19 13:21 Сейчас в теме
(0)
После 1С:Эксперта "заболел" регулярками?
4. vasilev2015 1363 18.07.19 13:44 Сейчас в теме
(1) да, это заразно.
starik-2005; +1 Ответить
2. VmvLer 18.07.19 13:22 Сейчас в теме
в Notepad++ можно писать макросы, зачем тогда скрипт?

думаю для того чтобы написать макрос и ничего не качать
cleaner_it; +1 Ответить
8. vasilev2015 1363 18.07.19 15:41 Сейчас в теме
(2) Здравствуйте !

Выкладывайте макрос. Плюс заочно.
3. acanta 60 18.07.19 13:42 Сейчас в теме
Спасибо, добрый человек.
5. capitan 1221 18.07.19 13:46 Сейчас в теме
6. DmitryKSL 151 18.07.19 14:55 Сейчас в теме
Может я чего-то не понимаю, но судя по скриншоту не применен фильтр "дважды измененные". Зачем такой геморрой себе придумывать?
gudim1979; +1 Ответить
7. vasilev2015 1363 18.07.19 15:40 Сейчас в теме
(6) Здравствуйте !

Как правило, при обновлении я использую этот фильтр.

Но если искать разницу между двумя конфигурациями по предложенной методике, то такой фильтр не нужен:

1. Расхождение между формами могло появиться в предыдущем обновлении,
в результате прыжка через несколько релизов.

2. Список дважды измененных объектов тоже может быть большим. Работает команда программистов.
За всеми не уследить, а в результате работы скрипта получается несколько строк. Проще контролировать.
9. user953800 18.07.19 22:10 Сейчас в теме
"супер-пупер мега скрипт" сохранен в кодировке utf-8 (re.sh)
При запуске получаю ошибки:
awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
awk: cmd. line:1: warning: escape sequence `\*' treated as plain `*'
awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
awk: cmd. line:1: warning: escape sequence `\*' treated as plain `*'
awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
10. user953800 18.07.19 22:49 Сейчас в теме
(9) Подправил в строках awk, поставив двойной \\
11. vasilev2015 1363 19.07.19 08:01 Сейчас в теме
(9, 10) Здравствуйте !

я ввожу скрипт в командную строку консоли, у меня те же сообщения,

но это правильно: символами \* и \. я обозначил звездочку и точку.

С двумя косыми сообщения пропали, результат работы остался неизменным ?

Главное, чтобы файл ОтчетОСравнении.txt был в кодировке utf8.

Интересно: какой результат у вас выдает скрипт ?
12. user953800 19.07.19 10:48 Сейчас в теме
(11) Добрый день. Написал в личку.
13. vasilev2015 1363 19.07.19 11:06 Сейчас в теме
(12) Спасибо, мне интересно. В движениях показаны добавленные регистры с локальным префиксом. Это немного странно: если в окне сравнения рабочая конфигурация слева, а конфигурация поставщика справа - то должны показываться добавленные типовые регистры, они без префикса. Чтобы результат стал чище, вместо символов - <-- в скрипте по движениям давайте использовать - <--Регистр (внесу правку в статью). Попробуйте - пришлите результат в личку.
14. user953800 19.07.19 11:08 Сейчас в теме
(13) Только вечером, т.к. все действия были на личном компьютере.
15. vasilev2015 1363 19.07.19 11:12 Сейчас в теме
(14) и еще в файле ОтчетОСравнении.txt посмотрите пожалуйста

ключевые слова Имя - Различаются значения
и ключевые слова <--Реквизит, <--Колонка реквизита, <--Параметр

маловероятно что различий нет
16. user953800 19.07.19 11:41 Сейчас в теме
(15) Таких ключевых полей в отчете нет. Отчет - итог сравнения с конф поставщика в базе, а не конф поставщика обновленной.
Вот такие слова только встречаются:
- ***Реквизит -
- ***Параметр -
- ***Колонка реквизита - 

Ну и добавленные нетиповые реквизиты:
- -->Справочник.Контрагенты.Реквизит
17. vasilev2015 1363 19.07.19 11:57 Сейчас в теме
(16) приложил пример добавления реквизита на форму.
Прикрепленные файлы:
18. user953800 19.07.19 12:04 Сейчас в теме
(17) вот у меня в отчете добавленный реквизит
Очень может быть, что результат без этих строк, т.к. я неправильно в скрипте поменял эти стрелки...
Прикрепленные файлы:
19. vasilev2015 1363 19.07.19 12:36 Сейчас в теме
(18) на картинке не реквизит, а элемент формы. я такие случаи пробовал искать, но не удалось сформулировать скрипт корректно.

Если префикс "т_" является префиксом разработки, и поскольку добавлен элемент с префиксом разработки -

значит последовательность сравнения конфигураций должна быть другая.

Слева основная конфигурация, справа - конфигурация производителя (как на картинке в статье).
20. user953800 19.07.19 13:15 Сейчас в теме
(19) Первая строка - как раз добавленный реквизит. И потом он же выведен на форму.
Сравнение конф так и производилось. Первая - основная, вторая - поставщика.
21. vasilev2015 1363 19.07.19 13:18 Сейчас в теме
(20) сообразил: т_ЦФО это реквизит объекта и он добавлен на форму как элемент.
Скрипт из статьи находит только добавленные реквизиты формы и параметры формы.
Реквизиты объекта как правило, успешно добавляются при обновлении.
А элементы формы я не смог описать в скрипте.
user953800; +1 Ответить
22. AlX0id 22.07.19 08:17 Сейчас в теме
Какая красота получилась! Мир спасен?

До той поры, пока 1сники не нарисуют лишнюю запятую в отчете о сравнении..
23. vasilev2015 1363 22.07.19 08:22 Сейчас в теме
(22) Здравствуйте !

Автор придерживается тех же взглядов.

Поэтому фраза с вопросом и не в конце статьи, а между третьим и четвертым примером.
24. kosmo0 81 25.07.19 09:09 Сейчас в теме
У меня методика обновления измененной конфы примерно следующая.
1. Делаю краткий отчет о сравнении текущей рабочей конфигурации и текущей типовой конфигурации. Получаем список объектов которые были изменены.
2. Делаю краткий отчет о сравнении текущей типовой конфигурации и новой типовой конфигурации. Получаем список измененных объектов в типовой конфигурации.
3. Сравниваем список объектов из 1 и 2. Объекты присутствующие в обоих списках требуют контроля при обновлении. А убрав из списка 2 совпадающие объекты, получаем объекты которые обновляем на автомате (тупо ставим галочку при обновлении).

Конечно есть масса особенностей и граблей.
- Порядок объектов. В большинстве случаев абсолютно не критично (но может создать большой размер файла о сравнении). Теоретически можно почистить от этой информации файл сравнения. Если у изменяемого объекта меняется ТОЛЬКО порядок, то можно убрать и сам объект из файла о сравнении.
НО, наблюдаем потенциальную граблю - изменение порядка реквизитов (измерений, ресурсов для регистров) для документов (справочников, регистров и проч.). Если есть обмены в которых просто передаются объекты, то обмен может встать пока новая конфигурация не будет загружена в передающий и принимающий узел. То есть, если вдруг используется при приеме данных Объект = ПрочитатьXML() и хотябы порядок реквизитов не совпадает - объект не будет принят.
- Случай когда указывается что форма (обычная) отличается от формы в типовой конфигурации, хотя на самом деле это не так (и в ряде случаев можно обновлять ее просто заменив на форму из типовой). Как это получается. Изменили тип ревизита объекта и он выводится на данной форме (например в справочнике увеличили длину кода и сравнение будет показывать различия по элементу формы который выводит код).
- Случай когда при обновлении вроде на затрагиваются измененные процедуры и функции, а просто добавляются пара новых процедур. И можно не напрягая мозг просто добавить новые модули.
Возможные грабли - было процедура Расчет() в которой вы внесли изменения, а тут добавилась процедура Расчет2019() которая будет применяться с 01.01.2019. Если в новую процедуру не внести ваши изменения, то у пользователей могут возникнуть вопросы.

Ну и другие нюансы. Хотя, с развитием платформы в сторону Расширений, это все теряет актуальность. И если вдруг кому-то помог - буду рад.
WellMaster; acanta; +2 Ответить
25. vasilev2015 1363 25.07.19 10:26 Сейчас в теме
(24) Здравствуйте !

Чем отличается пункт (3) от списка дваждыизмененных объектов, который формируется штатно ?
26. kosmo0 81 01.08.19 13:05 Сейчас в теме
(25) Однажды, когда начинал заниматься обновлением, заметил что окно обновления почему-то не выделило объект который необходимо обновить. С тех пор не надеюсь на это окно. Хотя, возможно, платформа была устаревшая.
27. vasilev2015 1363 03.08.19 08:54 Сейчас в теме
(26) Здравствуйте !

За полгода постоянных обновлений только один раз у меня было что-то подобное.
Поэтому я считаю, что типовой механизм очень надежный.
28. kosmo0 81 08.08.19 08:46 Сейчас в теме
(27) Заметил один раз? Если полгода сравнений типового механизма с другой методикой - это одно. А если только заметил один раз - это другое. Вполне вероятно что не заметил еще раз 5 или 10.

Кроме того, имхо, не считаю надежным механизм, который работает непредсказуемо. Опять же, здесь как с бекапами - лучше сейчас потратить лишних полчаса, чем потом разгребать последствия полнедели без сна.
29. kosmo0 81 12.08.19 09:42 Сейчас в теме
(27) Пожалуйста пример. Обновление УПП с 1.3.124.1 на 1.3.124.2.
Изменений кот наплакал. Но по дефолту общий модуль ИнтеграцияЕГАИССлужебныйКлиент не становится на обновление, хотя он в нашей конфе не изменялся. Можно заметить отличающийся квадратик в левой части, но у меня различающихся объектов порядка 10000, поэтому все просматривать весьма утомительно.

Плюс маленькая засада для юных падованов - дважды измененные объекты никак не выделяются на общей картине (смотреть на ветку Документы). И если начинающий специалист по обновлениям не знает куда смотреть то он может упустить это.
Прикрепленные файлы:
30. vasilev2015 1363 12.08.19 10:27 Сейчас в теме
(29) Здравствуйте !

Похвально, что Вы так скурпулезно подходите к обновлению.

Вы анализируете файл ОтчетОСравнении.txt регулярками или другими средствами ?
31. kosmo0 81 15.08.19 10:59 Сейчас в теме
(30) Здравствуйте.

Уровень скурпулезность работы зависит от сложности решения потенциальных проблем. Одно дело база на 5 человек. Другое дело база на 100 человек. И совсем отдельный случай когда база с филиалами по всей стране работает 24/7 и когда 1 час простоя это многмилионные убытки. У меня примерно второй вариант.

У меня для анализа 1с-обработка. На обычных формах и внутри мракобесие (делал одну функцию, со временем прикручивал доп. функционал, короче бардак, но работает).
Упрощенно - два отчета о сравнении (вид - краткий, текстовый), а) между стврой и новой типовой конфой и б)между текущей и типовой конфой нормализуются и сравниваются между собой. Получаем список дважды измененных объектов (получается это быстрее чем при процессе обновления (ну у меня точно), можно распечатать (и видеть не только в момент обновления), можно примерно оценить сложность обновления - как много дважды измененных и как много среди них форм (обновление дважды измененых обычных форм самая сложная проблема (когда элементы форм начинают появляться, исчезать).
Нормализация - приведение к виду "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента".
Плюс учет разных граблей. Учитывать или нет изменение порядка. Отслеживать изменение в наименовании и прочее.

Если изменений достаточно много, то самый простой контроль. Отчет о сравнении (опять же вид краткий текстовый) между старой и новой ТИПОВЫМИ конфигурациями должен совпадать с отчетом о сравнении между предыдущей и обновленной рабочей конфигурациями.
Также должны совпадать отчеты о сравнении между рабочей и типовой конфигурациями до и после обновления. Это если нет ваших изменений в рабочую конфигурацию.

Опять же повторюсь - на перспективу смотрите на расширения конфигурации.
А если изменений много то воспользуйтесь услугой по обновлению. Если не вру - фирма ИжТиСи, пару лет назад прайс был 12К рублей за год.
32. vasilev2015 1363 15.08.19 11:25 Сейчас в теме
(31) Здравствуйте !

Когда руководитель предложил мне делать обновления - я тоже его связал с ИжТиСи.
Они составили нам смету - догнать один год стоит около 1 млн, длительность обновления - три месяца.
Но три месяца - это долго ))) - поэтому решили делать самостоятельно.
Оставьте свое сообщение