Почему не сохраняются изменения после использования KDiff3 в 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа программиста 1С часто сопряжена с необходимостью объединения сложных конфигураций, где стандартного механизма сравнения бывает недостаточно. В таких случаях на помощь приходят внешние инструменты, такие как KDiff3. Однако многие специалисты сталкиваются с досадной проблемой: после кропотливой работы в окне KDiff3 и нажатия кнопки «Сохранить», изменения в самой 1С не отображаются. Кажется, что программа проигнорировала все правки.

В этой статье мы подробно разберем, как именно происходит взаимодействие 1С с внешними утилитами, проанализируем возможные причины потери данных и выясним, какие настройки необходимо проверить, чтобы ваша работа не пропадала зря.

Механизм взаимодействия 1С и KDiff3

Для начала рассмотрим, как 1С «общается» с внешним диффом. Когда вы инициируете сравнение через внешнюю программу, платформа не передает код напрямую «из памяти в память». Процесс выглядит следующим образом:

  1. 1С выгружает три (или две) версии модуля во временные файлы в системную папку Temp.
  2. Запускается исполняемый файл kdiff3.exe, которому в качестве аргументов передаются пути к этим временным файлам.
  3. Вы вносите правки в KDiff3 и нажимаете «Сохранить». В этот момент KDiff3 записывает результат в еще один временный файл (файл результата).
  4. После закрытия окна KDiff3 управление возвращается в 1С.
  5. Важный момент: 1С считывает измененный временный файл и помечает модуль в дереве сравнения как «измененный вручную».

Разберем подробнее, на каких этапах эта цепочка может разорваться.

Настройка параметров запуска внешней программы

Проанализируем самую частую причину: неправильно заданные аргументы командной строки. Если 1С не передаст KDiff3 путь, куда нужно сохранить результат, то даже при успешном сохранении внутри KDiff3, платформа просто не узнает, откуда забрать обновленный текст.

Пройдем по шагам в настройки 1С: Сервис — Параметры — Сравнение/Объединение (или через шестеренку в окне сравнения). Рассмотрим правильный шаблон аргументов для трехстороннего объединения:

kdiff3.exe %base %mine %theirs -o %ans

Здесь крайне важны следующие параметры:

Если в настройках вашей 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, возможны технические блокировки. Разберем, как это происходит:

  1. 1С создает файлы и передает права на них процессу KDiff3.
  2. Антивирус может посчитать подозрительным быстрое создание и изменение текстовых файлов сторонним процессом и заблокировать доступ к файлу на долю секунды.
  3. Если 1С попытается считать файл сразу после закрытия окна KDiff3, а файл еще заблокирован антивирусом или самим процессом KDiff3, который не успел завершиться, платформа «выплюнет» ошибку или просто не увидит изменений.

В этом случае рекомендуется использовать стационарную (не портативную) версию KDiff3 и добавить папку с временными файлами 1С в исключения антивируса.

Работа через контекстное меню vs Шестеренка

Обратим внимание на разницу в способах вызова. Как отмечалось в обсуждении, вызов сравнения через контекстное меню модуля и вызов через «шестеренку» в строке объединения могут вести себя по-разному в зависимости от настроек. Рассмотрим подробнее:

Если в настройках 1С (Параметры) жестко не указано «Использовать внешнюю программу всегда», то при обычном двойном клике на модуле откроется стандартное окно сравнения 1С. Чтобы гарантированно применить результат объединения сторонней утилитой, необходимо использовать именно кнопку вызова внешней программы в окне объединения конфигураций. Это гарантирует, что 1С подготовила %ans файл и ждет его заполнения.

Заключение и итоговый алгоритм

Подведем итог. Чтобы изменения из KDiff3 стабильно попадали в 1С, придерживайтесь следующего алгоритма:

  1. Проверьте настройки в 1С: убедитесь, что в строке запуска указан параметр -o %ans.
  2. В окне сравнения/объединения вызывайте KDiff3 специальной кнопкой (с изображением шестеренки или через выбор внешней программы).
  3. В KDiff3 обязательно разрешите все конфликты (используйте кнопки A, B, C для выбора версий строк).
  4. Нажмите «Сохранить» в KDiff3 и закройте программу.
  5. Убедитесь, что в окне 1С модуль пометился как готовый к объединению.
  6. Нажмите кнопку «Выполнить» в окне 1С для окончательной фиксации изменений в конфигурации.

Соблюдение этого порядка действий исключает большинство проблем, связанных с «пропаданием» кода при использовании внешних инструментов мерджа.

← На главную