Работа программиста 1С часто сопряжена с необходимостью объединения сложных конфигураций, где стандартного механизма сравнения бывает недостаточно. В таких случаях на помощь приходят внешние инструменты, такие как KDiff3. Однако многие специалисты сталкиваются с досадной проблемой: после кропотливой работы в окне KDiff3 и нажатия кнопки «Сохранить», изменения в самой 1С не отображаются. Кажется, что программа проигнорировала все правки.
В этой статье мы подробно разберем, как именно происходит взаимодействие 1С с внешними утилитами, проанализируем возможные причины потери данных и выясним, какие настройки необходимо проверить, чтобы ваша работа не пропадала зря.
Для начала рассмотрим, как 1С «общается» с внешним диффом. Когда вы инициируете сравнение через внешнюю программу, платформа не передает код напрямую «из памяти в память». Процесс выглядит следующим образом:
Temp.kdiff3.exe, которому в качестве аргументов передаются пути к этим временным файлам.Разберем подробнее, на каких этапах эта цепочка может разорваться.
Проанализируем самую частую причину: неправильно заданные аргументы командной строки. Если 1С не передаст KDiff3 путь, куда нужно сохранить результат, то даже при успешном сохранении внутри KDiff3, платформа просто не узнает, откуда забрать обновленный текст.
Пройдем по шагам в настройки 1С: Сервис — Параметры — Сравнение/Объединение (или через шестеренку в окне сравнения). Рассмотрим правильный шаблон аргументов для трехстороннего объединения:
kdiff3.exe %base %mine %theirs -o %ans
Здесь крайне важны следующие параметры:
%base — базовая конфигурация (общий предок);%mine — ваша текущая конфигурация;%theirs — конфигурация поставщика или новая версия;%ans — самый важный флаг, указывающий на файл-результат (answer), который 1С ожидает прочитать после закрытия программы.Если в настройках вашей 1С отсутствует параметр -o %ans, то KDiff3 откроет файлы в режиме «только чтение» или предложит сохранить результат в произвольное место, о котором 1С ничего не будет знать. В результате в окне сравнения вы увидите старый код.
Выясним причину, почему после закрытия KDiff3 визуально в конфигураторе ничего не меняется. Пользователи часто ожидают, что текст модуля обновится мгновенно, как только они нажали «Сохранить» в KDiff3. Однако в 1С логика работы иная.
Рассмотрим ситуацию: вы закрыли внешнюю программу, и окно сравнения/объединения 1С осталось открытым. Напротив измененного модуля должен появиться признак того, что текст был изменен. Но само применение этих изменений в базу произойдет только после нажатия кнопки «Выполнить» в нижней части основного окна сравнения/объединения.
Если вы закроете окно сравнения/объединения 1С кнопкой «Отмена» или просто крестиком, все результаты работы в KDiff3 будут потеряны, так как они физически находились во временной папке Temp и не были перенесены в основную конфигурацию.
Посмотрим на поведение самого KDiff3. Программа спроектирована так, что она требует явного выбора варианта для каждой конфликтующей строки. Если вы нажали «Сохранить», но в нижней панели KDiff3 остались строки, помеченные как <Merge Conflict> (часто обозначаются знаками вопроса), итоговый файл может оказаться некорректным.
Проанализируем ситуацию: 1С пытается считать файл результата, видит в нем технические метки конфликтов KDiff3 или пустые блоки, и в целях безопасности может проигнорировать такой файл, оставив модуль без изменений. Всегда убеждайтесь, что в KDiff3 в нижней части окна написано «All conflicts resolved» перед тем, как нажать на кнопку сохранения.
Поскольку обмен данными идет через папку %USERPROFILE%\AppData\Local\Temp, возможны технические блокировки. Разберем, как это происходит:
В этом случае рекомендуется использовать стационарную (не портативную) версию KDiff3 и добавить папку с временными файлами 1С в исключения антивируса.
Обратим внимание на разницу в способах вызова. Как отмечалось в обсуждении, вызов сравнения через контекстное меню модуля и вызов через «шестеренку» в строке объединения могут вести себя по-разному в зависимости от настроек. Рассмотрим подробнее:
Если в настройках 1С (Параметры) жестко не указано «Использовать внешнюю программу всегда», то при обычном двойном клике на модуле откроется стандартное окно сравнения 1С. Чтобы гарантированно применить результат объединения сторонней утилитой, необходимо использовать именно кнопку вызова внешней программы в окне объединения конфигураций. Это гарантирует, что 1С подготовила %ans файл и ждет его заполнения.
Подведем итог. Чтобы изменения из KDiff3 стабильно попадали в 1С, придерживайтесь следующего алгоритма:
-o %ans.Соблюдение этого порядка действий исключает большинство проблем, связанных с «пропаданием» кода при использовании внешних инструментов мерджа.