Мы сталкиваемся с достаточно распространенной задачей в мире 1С: необходимо обновить расширение конфигурации, которое было получено от поставщика, но при этом мы уже внесли в него свои уникальные доработки. Основная сложность заключается в том, что для расширений формата .cfe не предусмотрен стандартный механизм трехстороннего сравнения и объединения, который мы привыкли использовать для основных конфигураций формата .cf. Это означает, что прямого "обновления конфигурации поставщика" для расширений не существует.
Однако не стоит отчаиваться! Мы разберем несколько подходов к решению этой проблемы, начиная от полностью ручных методов и заканчивая более автоматизированными, которые помогут нам сохранить наши ценные доработки и применить новые изменения от поставщика.
Прежде чем перейти к решениям, давайте выясним причину такого поведения. Платформа 1С изначально разрабатывалась с учетом механизма обновления типовых конфигураций через сравнение с конфигурацией поставщика. Этот механизм позволяет автоматически или полуавтоматически переносить изменения, сохраняя наши доработки. Для расширений же архитектура несколько иная. Расширение – это механизм, который *дополняет* или *изменяет* поведение основной конфигурации, не затрагивая ее исходный код. Оно не имеет собственной "конфигурации поставщика" в том же смысле, что и основная конфигурация. Поэтому и трехстороннее сравнение, где одна база выступает "базовой", вторая – "нашей измененной", а третья – "новой от поставщика", для расширений не реализовано "из коробки" платформы 1С. Это приводит к тому, что при необходимости обновить измененное нами расширение поставщика, нам приходится прибегать к обходным путям. Рассмотрим их подробнее.
Это самый распространенный и, пожалуй, наиболее точный, хотя и трудоемкий, метод. Он требует внимательности и понимания сделанных изменений как нами, так и поставщиком. Мы будем работать с несколькими версиями расширений.
Прежде всего, нам понадобятся три версии расширения:
1. Базовое расширение поставщика (старая версия): Это оригинальное расширение от поставщика, на основе которого мы делали свои доработки. Обозначим его как РасширениеПоставщика_Старое.cfe.
2. Наше доработанное расширение: Это текущая версия расширения, в которую мы внесли свои изменения. Обозначим его как НашеРасширение_Доработанное.cfe.
3. Новое расширение поставщика: Это обновленная версия расширения, которую мы хотим применить. Обозначим его как РасширениеПоставщика_Новое.cfe.
Все эти расширения нам необходимо сохранить в отдельные файлы формата .cfe.
Мы будем выполнять процесс в два этапа, используя встроенный механизм сравнения конфигураций в Конфигураторе 1С.
Сначала нам нужно понять, какие именно изменения мы внесли в расширение поставщика. Для этого мы сравним наше доработанное расширение с базовой версией от поставщика.
1. Запустите Конфигуратор 1С.
2. Откройте любое расширение или конфигурацию (это не имеет значения, так как мы будем сравнивать файлы).
3. В главном меню выберите "Конфигурация" -> "Сравнить конфигурации...".
4. В появившемся окне "Сравнение конфигураций" для "Первой конфигурации" выберите опцию "Файл" и укажите путь к файлу РасширениеПоставщика_Старое.cfe.
5. Для "Второй конфигурации" также выберите "Файл" и укажите путь к файлу НашеРасширение_Доработанное.cfe.
6. Важный момент: Снимите галку "Устанавливать соответствия по именам". Это позволит нам увидеть все различия, даже если объекты были переименованы или имеют разные уникальные идентификаторы.
7. Нажмите "ОК".
Перед нами откроется окно сравнения. Мы увидим все объекты, которые были изменены, добавлены или удалены в нашем доработанном расширении по сравнению с исходным. Внимательно проанализируйте эти изменения и зафиксируйте их. Вы можете выгрузить список различий или просто держать их в уме/заметках. Эти изменения нам нужно будет перенести в новое расширение поставщика.
Теперь, когда мы знаем, что именно мы меняли, нам нужно применить эти изменения к новой версии расширения от поставщика.
1. Откройте в Конфигураторе 1С наше НашеРасширение_Доработанное.cfe (или создайте новое расширение и загрузите туда РасширениеПоставщика_Новое.cfe, если вы хотите начать "с чистого листа").
2. Снова перейдите в "Конфигурация" -> "Сравнить конфигурации...".
3. В качестве "Первой конфигурации" укажите "Файл" и выберите РасширениеПоставщика_Новое.cfe.
4. В качестве "Второй конфигурации" укажите "Файл" и выберите НашеРасширение_Доработанное.cfe.
5. Снимите галку "Устанавливать соответствия по именам".
6. Нажмите "ОК".
Теперь мы видим различия между *новой версией поставщика* и *нашей доработанной старой версией*. Наша задача – вручную перенести те изменения, которые мы определили на Шаге 1, из НашеРасширение_Доработанное.cfe в РасширениеПоставщика_Новое.cfe.
Это означает, что для каждого объекта, который мы меняли, нам придется:
* Сравнить код модулей.
* Сравнить свойства объектов.
* Сравнить макеты, формы и другие части.
В окне сравнения для каждого объекта вы можете выбрать, какую версию оставить или объединить вручную. Мы должны убедиться, что наши доработки корректно интегрированы с изменениями, которые внес поставщик в своей новой версии.
Особое внимание уделим формам. Если мы заимствовали форму из основной конфигурации и доработали ее в расширении, а затем поставщик обновил эту же форму в основной конфигурации, то нам нужно выполнить команду "Расширения" -> "Обновить расширение формы" из командной панели редактора расширяющей формы. Эта команда попытается перенести изменения, сделанные в исходной форме, в нашу расширяющую форму, сохраняя при этом наши доработки.
* Преимущества: Высокая точность, полный контроль над каждым изменением, не требует сторонних инструментов. * Недостатки: Очень трудоемкий, особенно для больших расширений с множеством изменений. Высокий риск человеческой ошибки.
Этот метод призван автоматизировать часть рутинной работы по сравнению, особенно если расширение содержит много текстовых модулей. Он требует выгрузки расширений в файлы и использования сторонних утилит.
Нам необходимо выгрузить все три версии расширений в файлы. Для этого:
1. Загрузите каждое расширение в отдельную информационную базу или временно в основную конфигурацию (неактивное).
2. В Конфигураторе 1С выберите нужное расширение.
3. В меню "Конфигурация" -> "Расширения конфигурации" выберите наше расширение.
4. Нажмите кнопку "Сохранить расширение в файл..." и сохраните каждую из трех версий (РасширениеПоставщика_Старое.cfe, НашеРасширение_Доработанное.cfe, РасширениеПоставщика_Новое.cfe) в отдельные файлы.
Затем нам потребуется специализированный инструмент, который умеет "распаковывать" .cfe файлы в структуру каталогов и файлов, пригодных для текстового сравнения. Например, это может быть утилита v8unpack или аналогичная. Мы распакуем каждый .cfe файл в отдельную папку.
Например, у нас будут папки:
* C:\TEMP\Merge\Base (для РасширениеПоставщика_Старое.cfe)
* C:\TEMP\Merge\Changes (для НашеРасширение_Доработанное.cfe)
* C:\TEMP\Merge\Base2 (для РасширениеПоставщика_Новое.cfe)
Теперь, когда у нас есть распакованные расширения в виде файлов, мы можем использовать сторонние инструменты для трехстороннего сравнения, такие как KDiff3, P4Merge, WinMerge и другие. Эти утилиты позволяют сравнивать три версии файла или каталога и пытаться автоматически объединять изменения.
Рассмотрим пример использования KDiff3 с помощью простого пакетного файла (.bat).
@echo off
echo Starting three-way merge of extensions...
set BASE=C:\TEMP\Merge\Base
set CHANGES=C:\TEMP\Merge\Changes
set BASE2=C:\TEMP\Merge\Base2
set RESULT=C:\TEMP\Merge\Result
:: Проверка существования исходных папок
if not exist "%BASE%" (
echo Error: Base folder not found: %BASE%
pause
exit /b 1
)
if not exist "%CHANGES%" (
echo Error: Changes folder not found: %CHANGES%
pause
exit /b 1
)
if not exist "%BASE2%" (
echo Error: Base2 folder not found: %BASE2%"
pause
exit /b 1
)
:: Создание папки для результата, если её нет
if not exist "%RESULT%" mkdir "%RESULT%"
echo Merging folders:
echo Base : %BASE%
echo Changes: %CHANGES%
echo Base2 : %BASE2%
echo Result : %RESULT%
:: Запуск KDiff3 с ключом --merge --auto и явным указанием путей
:: Убедитесь, что путь к kdiff3.exe указан верно
"C:\Program Files\KDiff3\kdiff3.exe" --merge --auto "%BASE%" "%CHANGES%" "%BASE2%" -o "%RESULT%"
echo.
echo Merge completed. Check the Result folder.
pause
Этот скрипт запускает KDiff3, указывая три исходные папки для сравнения (BASE - старое от поставщика, CHANGES - наше доработанное, BASE2 - новое от поставщика) и целевую папку RESULT, куда будет сохранен результат объединения. Ключ --auto пытается выполнить автоматическое объединение там, где нет конфликтов.
После выполнения скрипта нам нужно будет вручную просмотреть папку RESULT, открыть KDiff3 для файлов, где были конфликты, и разрешить их. Мы также можем настроить KDiff3 (или другую утилиту) для игнорирования незначительных различий, таких как пробелы или символы табуляции, чтобы уменьшить "шум" при сравнении.
* Преимущества: Автоматизирует сравнение и объединение текстовых файлов, ускоряет процесс для больших объемов кода.
* Недостатки: Требует использования сторонних утилит и понимания их работы. Не всегда идеально справляется с нетекстовыми объектами (формы, макеты). После объединения файлов необходимо собрать их обратно в .cfe файл (например, с помощью той же v8unpack или загрузить в Конфигуратор как внешнюю конфигурацию и сохранить как расширение).
Этот метод является более радикальным и может быть полезен, если вы хотите использовать привычные механизмы обновления конфигураций. Существуют инструменты, позволяющие конвертировать расширение .cfe в обычную конфигурацию .cf.
1. Конвертация: Используйте утилиту (например, cfe2cf или другую аналогичную), чтобы конвертировать РасширениеПоставщика_Старое.cfe, НашеРасширение_Доработанное.cfe и РасширениеПоставщика_Новое.cfe в соответствующие файлы .cf.
2. Обновление: После конвертации у нас будут три файла .cf. Теперь мы можем использовать стандартный механизм сравнения и объединения конфигураций в Конфигураторе 1С ("Конфигурация" -> "Сравнить, объединить с конфигурацией из файла..."). Здесь мы можем указать "конфигурацию поставщика" (РасширениеПоставщика_Старое.cf), "основную конфигурацию" (НашеРасширение_Доработанное.cf) и "новую конфигурацию поставщика" (РасширениеПоставщика_Новое.cf).
3. Обратная конвертация: После объединения и получения нужного результата в формате .cf, нам потребуется конвертировать его обратно в .cfe, если мы хотим использовать его как расширение.
* Преимущества: Позволяет использовать привычный и мощный механизм трехстороннего сравнения 1С. * Недостатки: Требует использования дополнительных утилит для конвертации. Процесс конвертации туда-обратно может быть нетривиальным и потенциально вносить свои особенности.
* Регулярное обновление: Старайтесь обновлять расширения поставщика как можно чаще. Чем меньше разница между версиями, тем проще процесс объединения.
* Минимизация своих изменений: По возможности, старайтесь делать свои доработки таким образом, чтобы они минимально пересекались с кодом поставщика. Используйте механизмы расширения, такие как подписки на события, перехват вызовов методов, расширение форм, а не прямое изменение заимствованных объектов.
* Система контроля версий: Используйте систему контроля версий (например, Git) для хранения своих расширений. Это позволит вам отслеживать все изменения, легко откатываться к предыдущим версиям и сравнивать различные ветки разработки. Выгрузка расширений в файлы и их хранение в Git значительно упрощает работу.
* Тестирование: После каждого обновления и объединения обязательно проводите тщательное тестирование расширения в тестовой базе. Убедитесь, что все наши доработки функционируют корректно и новые изменения поставщика не вызвали регрессий.
* Версия совместимости: Обращайте внимание на свойство РежимСовместимости расширения. При обновлении конфигурации или платформы 1С расширение может перестать работать из-за несовместимости версий. Возможно, потребуется адаптировать расширение под новую конфигурацию, обновив свойства расширения и исправив ошибки. Для корректного отключения расширений без их удаления при выполнении обработчиков обновления, режим совместимости расширения должен быть не ниже 8.3.12.
* Назначение расширения: С версии платформы 8.3.10 расширения имеют свойство Назначение (Исправление (патч), Адаптация, Дополнение). Мы должны понимать, какое назначение лучше всего подходит для нашего расширения, и как оно влияет на его поведение и обновление.
Обновление измененных расширений поставщика – это сложная, но решаемая задача. Выбирайте метод, который наиболее подходит для вашей ситуации, исходя из объема изменений, доступных инструментов и уровня ваших навыков. Главное – действовать методично и внимательно, чтобы сохранить все ценные доработки.