Расширения и РИБ. Что может пойти (пойдет) не так?
Интеграция - Перенос данных 1C
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
На протяжении всей своей профессиональной деятельности я старался избегать совместного использования расширений и РИБ, потому как работа обоих механизмов по большому счету скрыта за платформой и рано или поздно можно упереться во что-нибудь непредсказуемое. Но появилась задача, в которой база БП с десятками расширений были предоставлены в качестве "Дано:" и тут мои приключения начались.
Проблема №1: начальный образ не создается
При создании начального образа из формы узла плана обмена платформа останавливается с ошибкой:

Подробно показывает, что падает сам платформенный метод. БСП вызывает его в фоновом задании через ДлительныеОперации:
{ОбщийМодуль.РаботаСФайламиСлужебный.Модуль}: ПланыОбмена.СоздатьНачальныйОбраз(Параметры.Узел, СтрокаСоединения);
{(1)}: РаботаСФайламиСлужебный.СоздатьФайловыйНачальныйОбразНаСервере(Параметры[0], Параметры[1])
{ОбщийМодуль.ДлительныеОперации.Модуль}: ОбщегоНазначения.ВыполнитьМетодКонфигурации(...)
...
Ошибка при вызове метода контекста (СоздатьНачальныйОбраз)
Изменяющие данные — это расширения со своими объектами данных или с реквизитами, добавленными к типовым объектам. Программно их показывает Расширение.ИзменяетСтруктуруДанных(). Исправления, отчеты и печатные формы обычно к ним не относятся, так что под проверку попадает лишь часть списка — у меня четыре из десятков.
Может показаться, что чтобы решить проблему, достаточно тыкнуть галку ИспользуетсяВРаспределеннойИнформационнойБазе в списке расширений для каждого расширения, и это бы сработало, если бы в плане обмена конфигурации тоже стояла галка Включать расширения конфигурации. Но в типовой БП, а также во всем семействе УТ, ERP, КА в плане обмена для РИБ эта галочка не стоит. Снимать конфигурацию с замка ради этой галки не хотелось и пришлось копаться дальше.

Проверка касается только расширений, подключенных в сеансе. Неактивное расширение в сеанс не подключается, поэтому если на время создания образа снять «Активно» со всех расширений, меняющих данные, платформа образ создает.
- В главной базе найти расширения, у которых
ИзменяетСтруктуруДанных()= Истина. - Снять у них «Активно». Данные расширений при этом не удаляются, структуры хранения остаются в базе.
- Перезапустить сеанс: признак действует со следующего запуска. На время отключения функциональность этих расширений недоступна всем пользователям, поэтому работу лучше планировать на нерабочее время.
- Создать начальный образ узла. Ошибки больше нет.
- Проверить обмен: главная база с неактивными расширениями и узел без расширений обмениваются без ошибок.
- Вернуть «Активно» в главной базе, добавить те же расширения в узел из файлов
.cfe, выгруженных из главной базы.
Расширения в узел в этой схеме по РИБ не приходят, их нужно держать синхронными вручную. И далее поджидает новая проблема.
Проблема №2: расхождение расширений при одинаковых расширениях
После включения расширений в главной базе и загрузки их в узел обмен стал проходить с ошибкой о расхождении расширений, меняющих структуру данных. При этом файлы расширений были те же, и хеш-суммы каждого расширения в обеих базах совпадали.

Такая ошибка стала выдаваться в каждом узле при обмене. Если все расширения отключить - ошибки нет. Если включить в каждой базе только одно (и одинаковое) расширение, меняющее данные - ошибки нет. Если хотя бы два - ошибка возвращается.
Расхождение видно прямо в сообщениях обмена. В заголовке данных каждая сторона пишет свертки своей конфигурации и набора расширений. Сообщение из главной базы:
<v8de:Config xmlns:v8md="http://v8.1c.ru/metadata/2005/08">
<v8de:Version>216.0</v8de:Version>
<v8de:Digest1>00000000000000000000000000000000</v8de:Digest1>
<v8de:Digest2 v2="5fe3caf5c32ff36c6d45d63a34709a3a"
Extensions="df4bd1c943df824222cfb0b77d74a447b568018c">c8efcd6d962e020951e23b28114bb876</v8de:Digest2>
</v8de:Config>
И ответное сообщение из узла:
<v8de:Digest2 v2="5fe3caf5c32ff36c6d45d63a34709a3a"
Extensions="7d49be08dd72613ea7401f136ea2dd025ab3e402">c8efcd6d962e020951e23b28114bb876</v8de:Digest2>
- Значение
Digest2и атрибутv2— свертки самой конфигурации, они совпадают. - Атрибут
Extensions— свертка набора расширений, 40 шестнадцатеричных символов. Он разный, и именно он делает узлы несовместимыми.
Поиск причин
Стал сравнивать всю имеющуюся информацию о расширениях в разных базах. Благо в наше время за счет ИИ можно сэкономить кучу времени делегировав подобные вещи ему. Накидав обработку по работе с расширениями и предоставив уважаемому клоду из неё информацию, выяснилось, что единственная разница между расширениями в двух базах - это порядок следования расширений.
Порядок следования расширений — это порядок их добавления в базу, он же порядок применения. В таком порядке их возвращает РасширенияКонфигурации.Получить() и показывает типовая форма управления расширениями. Новое расширение всегда встает в конец, обновление существующего его позицию не меняет, а переставить расширения нельзя ни в интерфейсе, ни кодом.
| База | Порядок расширений, меняющих данные | Прочие отличия от главной базы | Extensions | Обмен |
|---|---|---|---|---|
| Главная | А → Б → В → Г | — | df4bd1c9… | — |
| Тестовый узел №1 | А → Б → В → Г | Другой порядок расширений не меняющих данные | df4bd1c9… | Работает |
| Тестовый узел №2 | В → А → Б → Г | Другой порядок расширений меняющих данные | 7d49be08… | Не работает |
Из таблицы видно:
- лишнее исправление и перестановка расширений без данных ключ не меняют;
- перестановка расширений с данными — меняет, даже при одинаковых хеш-суммах каждого из них.
Решение
Удалить в узле расширения, меняющие данные, и добавить их заново в том же порядке, что и в главной базе. После этого Extensions в сообщениях совпал и обмен заработал.
- В узле снять «Активно» у расширений, стоящих не на своем месте, и у всех расширений с данными после них. Активное расширение с данными платформа удалить не даст.
- Удалить эти расширения. Их данные в узле будут потеряны!!!
- Добавить их по одному в порядке главной базы и перезапустить сеансы.
- Выполнить обмен и сравнить
Extensionsв сообщениях обеих сторон.
П.С. В моем случае в миграции добавленных расширениями данных не было необходимости на этапе создания узла, поэтому такой вариант мне подошел. Как решить этот вопрос без доработки типовой конфигурации мне неизвестно. =(
Во вложении оставил обработку, которую использовал для перегрузки расширений между базами (с сохранением порядка) и массовой установки галочек (активность, использование в РИБ) для расширений. Может, кому пригодится.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия КОРП, редакция 3.0, релизы 3.0.206.19
Вступайте в нашу телеграмм-группу Инфостарт