Имя: Пароль:
1C
 
Файловый обмен данными
0 Likons
 
22.07.20
15:01
Добрый день , ув.формумчане )
Пол дня бьюсь над , вроде как , над простою бедою (

Условия :
Есть самописная конфа которая работает с распределенными базами.
Есть план обмена для распределенных ИБ.
Если клацнуть правой кнопкой по узлу - появятся кнопки "записать изменения" и "прочитать изменения".

Если клацнуть , например , на "записать изменения" , то оно формирует файл zip и спрашивает куда его положить.

Цель : хочу сделать кнопку "обмен данными" , что бы оно закидывала эти самые файлики в директорию , из справочника "Настройки обменов" , и соответственно читала их от туда же.

Мои попытки :

&НаСервере
Функция ВыгрузкаИзмененийВФайлОбмена(НастройкаОбмена) Экспорт
    Если Константы.ПереферийнаяБаза.Получить() = Истина тогда
        УзелОбмена = ПланыОбмена.ГлавныйУзел();
    Иначе
        УзелОбмена = ПланыОбмена.Основной.НайтиПоКоду(НастройкаОбмена.КодУзлаОбмена);
    КонецЕсли;
    ФайлСообщенияОбмена = Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+ПланыОбмена.Основной.ЭтотУзел().Код+".xml";
    
    Сообщить("Выгружаю файл " + ФайлСообщенияОбмена + " из базы "+ ПланыОбмена.Основной.ЭтотУзел().Код);
    
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.ОткрытьФайл(ФайлСообщенияОбмена);
    
    
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелОбмена);
    
    Выборка = ПланыОбмена.ВыбратьИзменения(УзелОбмена,ЗаписьСообщения.НомерСообщения);
    
    Пока Выборка.Следующий() Цикл
        Данные = Выборка.Получить();
        ЗаписатьXML(ЗаписьXML,Данные);
    КонецЦикла;
    
    ЗаписьСообщения.ЗакончитьЗапись();
    
КонецФункции

&НаСервере
Функция ЗагрузкаИзмененийИзФайлаОбмена(НастройкаОбмена) Экспорт
    Если Константы.ПереферийнаяБаза.Получить() = Истина тогда
        УзелОбмена = ПланыОбмена.ГлавныйУзел();
    Иначе
        УзелОбмена = ПланыОбмена.Основной.НайтиПоКоду(НастройкаОбмена.КодУзлаОбмена);
    КонецЕсли;
    Сообщить("Загружаю файл " + Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+УзелОбмена.Код+".xml" + " в базу "+ ПланыОбмена.Основной.ЭтотУзел().Код);
    
    Если НЕ РаботаСФайлами.ПроверитьСуществованиеФайла(Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+УзелОбмена.Код+".xml") тогда
        Сообщить("Не найден файл " + Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+УзелОбмена.Код+".xml");
        Возврат неопределено;
    КонецЕсли;
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.ОткрытьФайл(Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+УзелОбмена.Код+".xml");
    
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML,ДопустимыйНомерСообщения.Больший);
    
    Пока ВозможностьЧтенияXML(ЧтениеXML) цикл
        Данные = ПрочитатьXML(ЧтениеXML);
        Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
        Данные.ОбменДанными.Загрузка    = ИСТИНА;
        Данные.Записать();
    КонецЦикла;
    ЧтениеСообщения.ЗакончитьЧтение();
    ЧтениеXML.Закрыть();
    УдалитьФайлы(Строка(НастройкаОбмена.ДирректорияОбмена) + "message_"+УзелОбмена.Код+".xml");
КонецФункции


Этот код , в принципе работает , но есть пара недостатков. Например , таким образом не передается изменения конфигурации , да и файл на выходе в формате xml , он не пакуется в zip.
Подозреваю , что для этого есть какой то штатный способ , о котором я не знаю (
Было бы круто , если кто то подсказал , как вызвать метод , который выполняется , когда я клацаю "записать изменения" по конкретному узлу.
Буду благодарен за любые наводки (
1 Fragster
 
гуру
22.07.20
15:02
Правильное решение - интегрировать БСП и подсистему обмен данными.
2 Likons
 
22.07.20
15:08
(1) Спасибо за ответ ) Сейчас погуглю на этот счет.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн