1. Задача сделать обмен между двумя конфигурациями на БСП.
Получил задачу и сразу вопрос "Как это сделать?", спросил у Гугла, спросил у ИТС ... ответа толкового нет. Ведь все же просто, но где нужно поставить волшебную галочку, а где поставить немного кода? Чтобы вы не "Разбили" свою голову, я хочу с вами поделиться небольшим кодом и пошаговым описанием, что нужно сделать.
2. Добавить обмен с одинаковым именем в обе базы.
Условное наименование ОбменСДругойБазой
Добавляем план обмена, чтобы он был виден среди всех планов обменов. (Через расширение)
ОбменДаннымиПовтИсп.СписокПлановОбменаБСП
&ИзменениеИКонтроль("СписокПлановОбменаБСП")
Функция Расш_СписокПлановОбменаБСП() Экспорт
// Возвращаемое значение функции.
СписокПлановОбмена = Новый СписокЗначений;
ПланыОбменаПодсистемы = Новый Массив;
ОбменДаннымиПереопределяемый.ПолучитьПланыОбмена(ПланыОбменаПодсистемы);
Для Каждого ПланОбмена Из ПланыОбменаПодсистемы Цикл
СписокПлановОбмена.Добавить(ПланОбмена.Имя, ПланОбмена.Синоним);
КонецЦикла;
#Вставка
//Добавим свой план обмена
ПОБП = Метаданные.ПланыОбмена.ОбменСДругойБазой;
СписокПлановОбмена.Добавить(ПОБП.Имя, ПОБП.Синоним);
#КонецВставки
Возврат СписокПлановОбмена;
КонецФункции
К Плану обмена надо добавить следующие макеты (зеркально надо добавлять в базу приемник).
- ПравилаОбмена (Текстовый документ)
- ПравилаОбменаКорреспондента (Текстовый документ)
- ПравилаРегистрации (Текстовый документ)
- ПодробнаяИнформация (HTML документ)
В модуль менеджера плана обмена (основной конфигурации, или в расширении) добавляем код
Процедура ПриПолученииНастроек(Настройки) Экспорт
Настройки.ИмяКонфигурацииИсточника = "";
Настройки.НаличиеПравилКонвертацииОбязательно = Истина;
КонецПроцедуры
Добавить форму узла.
В форме добавить запись
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// запишем в регистр "Общие настройки узлов информационных баз" информацию о данной базе
Если текущийОбъект.ЭтотУзел = Ложь тогда
ЗаписьИнф = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СоздатьМенеджерЗаписи();
ЗаписьИнф.УзелИнформационнойБазы = текущийОбъект.ссылка;
ЗаписьИнф.НастройкаЗавершена = истина;
ЗаписьИнф.Префикс = "БП"; //// ОБЯЗАТЕЛЬНО ЗАПОЛНИТЬ
ЗаписьИнф.ПрефиксКорреспондента = "УТ"; // ОБЯЗАТЕЛЬНО ЗАПОЛНИТЬ
ЗаписьИнф.Записать(Истина);
КонецЕсли;
КонецПроцедуры
В ней надо разместить следующие команды
- ЗагрузитьПравила (Что бы загрузить подготовленные правила, без обновления конфигурации)
&НаКлиенте
Процедура ЗагрузитьПравила(Команда)
ОбменДаннымиКлиент.ЗагрузитьПравилаСинхронизацииДанных("ОбменСДругойБазой");
КонецПроцедуры
- НастройкиПодключения (Открыть настройки подключения связанные с этим планом обмена)
&НаКлиенте
Процедура НастройкиПодключения(Команда)
Корреспондент = объект.Ссылка;
ИдентификаторНастройки = "";
Отбор = Новый Структура("Корреспондент", Корреспондент);
ЗначенияЗаполнения = Новый Структура("Корреспондент", Корреспондент);
ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор,
ЗначенияЗаполнения, "НастройкиТранспортаОбменаДанными", Этаформа);
КонецПроцедуры
- ОбновитьСведенияОПравилах (Обновляет сведения и правила зашитые в конфигурации в макетах)
&НаСервере
Процедура ОбновитьСведенияОПравилахНаСервере()
// запишем правила
ЗаписьПравилаОбмена = регистрыСведений.ПравилаДляОбменаДанными.СоздатьМенеджерЗаписи();
ЗаписьПравилаОбмена.ИмяПланаОбмена = "ОбменСДругойБазой";
ЗаписьПравилаОбмена.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов;
ЗаписьПравилаОбмена.ИмяМакетаПравил = "ПравилаОбмена";
ЗаписьПравилаОбмена.ИмяМакетаПравилКорреспондента = "ПравилаОбменаКорреспондента";
ЗаписьПравилаОбмена.ИмяПланаОбменаИзПравил = "";
ЗаписьПравилаОбмена.ИмяФайлаОбработкиДляОтладкиВыгрузки = "";
ЗаписьПравилаОбмена.ИмяФайлаОбработкиДляОтладкиЗагрузки = "";
ЗаписьПравилаОбмена.ИмяФайлаПравил = "";
ЗаписьПравилаОбмена.ИмяФайлаПротоколаОбмена = "";
ЗаписьПравилаОбмена.ИнформацияОПравилах = "";
ЗаписьПравилаОбмена.ИсточникПравил = перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЗаписьПравилаОбмена.НеОстанавливатьПоОшибке = "";
ЗаписьПравилаОбмена.ПравилаXML = "";
ЗаписьПравилаОбмена.ПравилаXMLКорреспондента = "";
ЗаписьПравилаОбмена.ПравилаЗачитанные = "";
ЗаписьПравилаОбмена.ПравилаЗачитанныеКорреспондента = "";
ЗаписьПравилаОбмена.РежимОтладки = Ложь;
ЗаписьПравилаОбмена.РежимОтладкиВыгрузки = Ложь;
ЗаписьПравилаОбмена.РежимОтладкиЗагрузки = Ложь;
ЗаписьПравилаОбмена.РежимПротоколированияОбменаДанными = "";
ЗаписьПравилаОбмена.ИмяМенеджераРегистрации = "";
//ЗаписьПравилаОбмена.ПравилаЗагружены
ЗаписьПравилаОбмена.Записать(Истина);
ЗаписьПравилаОбмена = регистрыСведений.ПравилаДляОбменаДанными.СоздатьМенеджерЗаписи();
ЗаписьПравилаОбмена.ИмяПланаОбмена = "ОбменСДругойБазой";
ЗаписьПравилаОбмена.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов;
ЗаписьПравилаОбмена.ИмяМакетаПравил = "ПравилаРегистрации";
ЗаписьПравилаОбмена.ИмяМакетаПравилКорреспондента = "";
ЗаписьПравилаОбмена.ИмяПланаОбменаИзПравил = "";
ЗаписьПравилаОбмена.ИмяФайлаОбработкиДляОтладкиВыгрузки = "";
ЗаписьПравилаОбмена.ИмяФайлаОбработкиДляОтладкиЗагрузки = "";
ЗаписьПравилаОбмена.ИмяФайлаПравил = "";
ЗаписьПравилаОбмена.ИмяФайлаПротоколаОбмена = "";
ЗаписьПравилаОбмена.ИнформацияОПравилах = "";
ЗаписьПравилаОбмена.ИсточникПравил = перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЗаписьПравилаОбмена.НеОстанавливатьПоОшибке = "";
ЗаписьПравилаОбмена.ПравилаXML = "";
ЗаписьПравилаОбмена.ПравилаXMLКорреспондента = "";
ЗаписьПравилаОбмена.ПравилаЗачитанные = "";
ЗаписьПравилаОбмена.ПравилаЗачитанныеКорреспондента = "";
ЗаписьПравилаОбмена.РежимОтладки = Ложь;
ЗаписьПравилаОбмена.РежимОтладкиВыгрузки = Ложь;
ЗаписьПравилаОбмена.РежимОтладкиЗагрузки = Ложь;
ЗаписьПравилаОбмена.РежимПротоколированияОбменаДанными = "";
ЗаписьПравилаОбмена.ИмяМенеджераРегистрации = "";
//ЗаписьПравилаОбмена.ПравилаЗагружены
ЗаписьПравилаОбмена.Записать(Истина);
////// теперь обработаем правила.
ИсточникПравилКомплекта = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЗаписьПравилКонвертации = РегистрыСведений.ПравилаДляОбменаДанными.СоздатьМенеджерЗаписи();
ЗаписьПравилКонвертации.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов;
ЗаписьПравилКонвертации.ИмяМакетаПравил = "ПравилаОбмена";
ЗаписьПравилКонвертации.ИмяМакетаПравилКорреспондента = "ПравилаОбменаКорреспондента";
ЗаписьПравилКонвертации.ИнформацияОПравилах = "";
//ЗаполнитьЗначенияСвойств(ЗаписьПравилКонвертации, ЭтотОбъект);
ЗаписьПравилКонвертации.ИмяПланаОбмена = "ОбменБухгалтерияПредприятияУИ";
ЗаписьПравилКонвертации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЗаписьПравилРегистрации = РегистрыСведений.ПравилаДляОбменаДанными.СоздатьМенеджерЗаписи();
ЗаписьПравилРегистрации.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов;
ЗаписьПравилРегистрации.ИмяМакетаПравил = "ПравилаРегистрации";
ЗаписьПравилРегистрации.ИнформацияОПравилах = "ПравилаРегистрации";
ЗаписьПравилРегистрации.ИмяФайлаПравил = "";
ЗаписьПравилРегистрации.ИмяПланаОбмена = "ОбменСДругойБазой";
ЗаписьПравилРегистрации.ИсточникПравил = Перечисления.ИсточникиПравилДляОбменаДанными.МакетКонфигурации;
ЗаписьПравилРегистрации.ИмяПланаОбмена = "ОбменСДругойБазой";
СтруктураЗаписейРегистра = Новый Структура();
СтруктураЗаписейРегистра.Вставить("ЗаписьПравилКонвертации", ЗаписьПравилКонвертации);
СтруктураЗаписейРегистра.Вставить("ЗаписьПравилРегистрации", ЗаписьПравилРегистрации);
Отказ = ложь;
ОписаниеОшибки = "";
АдресВременногоХранилища = "";
ИмяФайлаПравил = "";
РегистрыСведений.ПравилаДляОбменаДанными.ЗагрузитьКомплектПравил(Отказ, СтруктураЗаписейРегистра,
ОписаниеОшибки, АдресВременногоХранилища, ИмяФайлаПравил);
Если Не Отказ Тогда
ЗаписьПравилКонвертации.Записать();
ЗаписьПравилРегистрации.Записать();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСведенияОПравилах(Команда)
ОбновитьСведенияОПравилахНаСервере();
КонецПроцедуры
3. Доработать расширение
В расширении захватить план обмена, и документы которые надо регистрировать к обмену.
В плане обмена указать состав объектов к обмену.
Обязательно добавить в обмен регистрСведений.СоответствияОбъектовИнформационныхБаз и в расширение.
4. Убрать процедуру удаления файлов при каждом обмене (так как 1сцы считают что больше никто не пользуется правилами обмена 2.0, то при каждом обновлении правила обмена удаляются) (взял у https://forum.infostart.ru/forum29/topic221697/)
В основной конфигурации в модуле "ОбменДаннымиСервер" в процедуре "УдалитьНеактуальныеЗаписиВРегистреПравилДляОбменаДанными"
закомментировал код
// НаборЗаписей.Записать();
Все, можно настраивать папку и делать первый обмен. Все стандартные инструменты уже будут доступны в этом обмене.
UPD:
Далее нам понадобилось настроить работу правил регистрации. Как это сделать описано тут //infostart.ru/1c/articles/1922737/