Введение
О контроле корректности обновления коротко, но емко, написано в статье
Как убедиться в том, что измененная типовая конфигурация 1С обновлена успешно.
Там же приведен макрос для Notepad++, алгоритм которого я и взял за основу для настройки KDiff3.
Ссылку на статью я подглядел в публикации Обновление измененной типовой конфигурации 1С на платформе 8.3. Чек-лист и тайминг. Спасибо автору!
Также в несколько строк и не очень внятно (размыто по тексту) об этом сказано на ИТС в Приложении 2 стандарта Технология разветвленной разработки конфигураций.
О процессе собственно обновления конфигураций на поддержке я нашел только:
- Обновление измененной типовой конфигурации 1С на платформе 8.3. Чек-лист и тайминг (уже упоминавшаяся выше)
- Технология обновления нетиповых конфигураций 1С:Предприятия 8 (редакция 12.04.2012)
Настройка KDiff3
Перейдем к делу, детали позже.
Если KDiff3 еще не установлена, дистрибутив находится здесь. Последняя версия на момент публикации 0.9.98.
Процесс установки тривиален, на этом останавливаться не будем.
Запускаем KDiff3, в диалоге выбора файлов просто жмем ОК.
Переходим к настройкам:
1. Settings – Configure KDiff3…
2. Переходим на вкладку Diff
3. И в поле Preprocessor command вводим такой текст:
sed 's/^\([ \x09]*\xD0\x9E\xD0\xB1\xD1\x8A\xD0\xB5\xD0\xBA\xD1\x82\x20\xD0\xBF\xD1\x80\xD0\xB8\xD1\x81\xD1\x83\xD1\x82\xD1\x81\xD1\x82\xD0\xB2\xD1\x83\xD0\xB5\xD1\x82\x20\xD1\x82\xD0\xBE\xD0\xBB\xD1\x8C\xD0\xBA\xD0\xBE\x20\xD0\xB2.\+ \xD0\xBA\xD0\xBE\xD0\xBD\xD1\x84\xD0\xB8\xD0\xB3\xD1\x83\xD1\x80\xD0\xB0\xD1\x86\xD0\xB8\xD0\xB8:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/;s/^\([ \x09]*\xD0\x98\xD0\xB7\xD0\xBC\xD0\xB5\xD0\xBD\xD0\xB5\xD0\xBD\xD0\xBE:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/'
4. Жмем Ok. Готово.
Проверяем.
Введем с левой стороны такой текст (надо просто скопипастить):
А с правой – такой:
В результате должно получиться так:
Для сравнения, так было без этих настроек:
Как видно, ненужные нам номера строк заменены на символы ‘N’.
Но если вдруг случилось, что такой же текст встречается в коде, то он останется как есть.
Как это работает
Для любознательных.
Разберем подробно Preprocessor command:
sed 's/^\([ \x09]*\xD0\x9E\xD0\xB1\xD1\x8A\xD0\xB5\xD0\xBA\xD1\x82\x20\xD0\xBF\xD1\x80\xD0\xB8\xD1\x81\xD1\x83\xD1\x82\xD1\x81\xD1\x82\xD0\xB2\xD1\x83\xD0\xB5\xD1\x82\x20\xD1\x82\xD0\xBE\xD0\xBB\xD1\x8C\xD0\xBA\xD0\xBE\x20\xD0\xB2.\+ \xD0\xBA\xD0\xBE\xD0\xBD\xD1\x84\xD0\xB8\xD0\xB3\xD1\x83\xD1\x80\xD0\xB0\xD1\x86\xD0\xB8\xD0\xB8:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/;s/^\([ \x09]*\xD0\x98\xD0\xB7\xD0\xBC\xD0\xB5\xD0\xBD\xD0\xB5\xD0\xBD\xD0\xBE:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/'
Как сказано в документации, файлы, которые мы передаем KDiff3, перед сравнением проходят через препроцессор.
Препроцессор – это внешняя команда, указанная в настройке Preprocessor command.
В данном случае такой внешней командой является утилита sed.exe. Она расположена там же, где и исполняемый файл KDiff3 (у меня в C:\Program Files\KDiff3\bin\).
Т.е. первая часть Preprocessor command – это вызов утилиты sed.exe.
Утилита вызывается с командой s. Синтаксис этой команды: 's/regexp/replacement/flags'. Подробнее здесь.
В каждой строке исходного файла утилита ищет фрагменты, соответствующие выражению regexp, и если находит, то заменяет их по правилам, указанным в replacement. Флаги flags мы здесь не используем.
Различные примеры использования команды есть в документации KDiff3.
Пойдем дальше.
Фрагменты вида \xD0\x9E – как вы наверное догадались, это символы кириллицы в кодировке UTF8.
Если бы утилита sed понимала кириллицу, то команда была бы такой:
sed 's/^\([ \x09]*Объект присутствует только в.\+ конфигурации:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/;s/^\([ \x09]*Изменено:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/'
Теперь, когда буков стало меньше, дальше разобраться будет проще.
Утилита sed может принимать несколько команд. Отдельные команды разделяются символом ';'. Команды выполняются последовательно. Выход предыдущей является входом для следующей (но в данном случае мы эту возможность не используем).
В нашем случае по очереди выполняются две команды:
sed 's/^\([ \x09]*Объект присутствует только в.\+ конфигурации:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/'
sed 's/^\([ \x09]*Изменено:\) [0123456789]\+ - [0123456789]\+$/\1 N - N/'
Разберем только первую. Вторая построена аналогично, и она чуть проще.
Наше выражение regexp (один из вариантов синтаксиса описан здесь) состоит из следующих элементов:
^ – начало строки;
[ \x09]* – 0 или более символов пробела или табуляции в любом сочетании;
.\+ – 1 или более любых символов;
[0123456789]\+ – 1 или более числовых символов в любом сочетании;
$ – конец строки.
Остальные фрагменты представляют сами себя.
Некоторые части выражения regexp могут быть взяты в скобки \(, \). То, что между этими скобками, становится самостоятельным подвыражением. А исходный текст, найденный с помощью такого подвыражения, запоминается как обратная ссылка. Каждой паре скобок соответствует отдельная обратная ссылка. Обратные ссылки нумеруются в порядке следования подвыражений слева направо, начиная с 1.
Обратные ссылки можно использовать в выражении replacement, обращаясь к ним по номерам: \1, \2 и т.д.
Таким образом, мы ищем такие строки, которые:
- начинаются с нуля или более пробелов или табуляций,
- вслед за которыми следует текст "Объект присутствует только в",
- далее 0 или более любых символов, пока не встретим
- фрагмент " конфигурации:",
- далее пробел, число, пробел, '-', пробел, число,
- и на этом строка обязательно должна закончиться.
При этом мы запоминаем текст от начала строки до символа ':' как обратную ссылку номер 1.
Если такая строка найдена, она будет заменена в соответствии с выражением replacement: \1 N - N.
Здесь все значительно проще.
Мы подставляем обратную ссылку номер 1, т.е. исходную строку до символа ':', и добавляем текст " N - N".
На этом всё!
Надеюсь, моя статья будет полезна.
Использованные материалы
- Как убедиться в том, что измененная типовая конфигурация 1С обновлена успешно
- The KDiff3 Handbook. Preprocessor Commands
- sed, a stream editor. The s Command
- sed, a stream editor. Overview of basic regular expression syntax
- UTF-8 encoding table and Unicode characters page with code points U+0400 to U+04FF
- URL кодирование и декодирование строк