Имя: Пароль:
1C
 
Как обмениваться одним документом планами обмена?
0 MaxS1
 
07.08.06
09:31
Как через планы обмена организовать обмен только одним документом? (можно без регистров).
Загвоздка в том, что если небыло изменений в документах, а, например, внесли новый элемент в справочник номенклатуры, этот элемент попадает в обмен... А нужно лишь то, что относится к документу.
1 Neco
 
07.08.06
09:41
У всех объектов убрать авторегистрацию и регистрировать при записи документа, например регистрация самого документа:

Процедура ПередЗаписью()
 ВыборкаУзлов = ПланыОбмена.Отделения.Выбрать();
 Пока ВыборкаУзлов.Следующий() Цикл
   // тут можно проверить каким узлам данный документ нужен
   Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Отделения.ЭтотУзел() Тогда
     Получатели.Добавить(ВыборкаУзлов.Ссылка);
   КонецЕсли;
 КонецЦикла;
КонецПроцедуры

См. также Книга знаний: v8: УРБД на v8 за четыре шага.;
2 MaxS1
 
07.08.06
09:48
(1) Спасибо, про авторегистрацию я сразу не подумал. Сейчас буду копать дальше ;) А то чуть было не ушел в анализ выгружаемых данных в модуле плана обмена... ;)
3 MaxS1
 
07.08.06
14:34
А как запретить передавать изменения конфигурации?
ps.
пока настраивается обмен  1С-1С, но потом будет 1С-какой-то Делфи софт.
4 France_как франс
 
07.08.06
14:40
(3) лементарно.. создать план обмена, и не устанавливать у него флаг "Распределенная"
5 MaxS1
 
08.08.06
06:15
(1) Допустим научился программно регистрировать документ при его записи. А как поступить с номенклатурой? Как при изменении номенклатуры, а потом при изменении документа узнать о необходимости включения изменений и по номенклатуре?

Пока приходит только такая мысль. Создать еще один план обмена с авторегистрацией(П2) и при записи документа, регистрировать его в плане обмена без авторегистрации(П1) и если номенклатура зарегистрирована в П2, регистрировать её в П1, сбросив регистрацию в П2.
Так?
6 MaxS1
 
08.08.06
07:53
up
Создал в конфигураторе план обмена. А предопределённые узля планов обмена бывают?
7 MaxS1
 
09.08.06
11:44
(5) Тот подход верный?

Как узнать что элемент справочника зарегистрирован в таком-то узле?
Если ДокументОбъект[РеквизитДокумента.Имя].ПолучитьОбъект().ОбменДанными.Получатели.Количество()>0 Тогда // так не выходит всегда =0 ;(

Выб = ПланыОбмена.ВыбратьИзменения(Узел, Узел.НомерОтправленного); // - так, что-ли?
8 MaxS1
 
09.08.06
13:10
(7) ПланыОбмена.ИзменениеЗарегистрировано(Узел, Объект)
9 Херрес
 
09.08.06
13:15
Нужно планом обмена регистрировать изменившиеся документы.
А сами документы выгружать посредством конвертации данных - она позволит выгрузить по ссылкам
10 MaxS1
 
09.08.06
13:34
(9) Конвертацией повторно выгрузятся справочники... Хотя можно в конвертации справочника проверять Если НЕ ИзменениеЗарегистрировано(...) Тогда отказ...

Да, идея интересная, но хочется обойтись только планами обмена...
Тем более, что не всё дерево по ссылкам нужно вытаскивать, а достаточно до первого уровня...
Или написать универсальную функцию в плане обмена, которая рекурсивно по метаданным вытаскивает все ссылки...
11 Херрес
 
09.08.06
13:38
А вообще не очень понятно зачем такое может понадобиться.
12 Херрес
 
09.08.06
13:39
А вот ещё идея (вернее половина идеи)
обработка выгрузка и загрузка XML уже умеет определять какие объекты связаны по ссылкам.
13 MaxS1
 
09.08.06
13:43
Еще нашел как сделать, что можно формировать XML файл:  ЗаписатьXML(ЗаписьXML, ВыборкаОбъект); только нужными данными... Значит (5) неверно, достаточно одного плана обмена.
(12) планируется наладить обмен между 1С и делфи софтом только одним документом с авторегистрацией как положено в планах обмена...
14 MaxS1
 
09.08.06
13:45
(12) как? речь про универсальную загрузку - выгрузку?
15 Херрес
 
09.08.06
13:46
(14) да, которая DtUDXML.epf
16 MaxS1
 
09.08.06
13:57
ВыгрузкаЗагрузкаДанныхXML.epf
17 MaxS1
 
09.08.06
13:58
ой ...
(15) спасибо. на редкость полензный диалог получился ;)
Увидел там рекурсивно вызываемую функцию Процедура ДобавитьВыгружаемыеОбъекты
наверное её приделаю к планам обмена...
18 MaxS1
 
09.08.06
14:31
Пока получилось так, если кому вдруг пригодиться ;) (может и мне пригодиться)

Процедура ЗарегистрироватьДанныеОбъектаДляОбмена(ОбъектДляОбмена,ЗаписьXML)
   
   Для Каждого РеквизитОбъекта Из ОбъектДляОбмена.Метаданные().Реквизиты Цикл
       ОбъектРеквизитИмя = ОбъектДляОбмена[РеквизитОбъекта.Имя];
       Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(ОбъектРеквизитИмя)) Тогда
           Если НЕ (ОбъектРеквизитИмя = Новый(ТипЗнч(ОбъектРеквизитИмя)) ) Тогда // НЕ ЗначениеНеЗаполнено
               ИзмененныйОбъект = ОбъектРеквизитИмя.ПолучитьОбъект();
               Если ПланыОбмена.ИзменениеЗарегистрировано(ЭтотОбъект.Ссылка,ИзмененныйОбъект) Тогда
                   ЗаписатьXML(ЗаписьXML, ИзмененныйОбъект);
               КонецЕсли;
               ЗарегистрироватьДанныеОбъектаДляОбмена(ИзмененныйОбъект,ЗаписьXML);
           КонецЕсли;
       КонецЕсли;    
   КонецЦикла    
   
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ
//

// Процедура записи сообщения с измененными данными
//
Процедура ЗаписатьСообщениеСИзменениями() Экспорт
   
   Сообщить("-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------");
   
   Каталог = КаталогВременныхФайлов();
   // Формируем имя временного файла
   ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" +
   СокрЛП(ПланыОбмена.Склады.ЭтотУзел().Код) + "_" + СокрЛП(Ссылка.Код) + ".xml";
   
   // Создаем объект записи XML
   ЗаписьXML = Новый ЗаписьXML;
   ЗаписьXML.ОткрытьФайл(ИмяФайла);
   ЗаписьXML.ЗаписатьОбъявлениеXML();
   
   // Создаем новое сообщение
   ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
   ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
   Сообщить("    Номер сообщения: " + ЗаписьСообщения.НомерСообщения);
   
   // Получаем выборку изменённых данных
   ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
   Пока ВыборкаИзменений.Следующий() Цикл
       
       ВыборкаОбъект = ВыборкаИзменений.Получить();
       Если ТипЗнч(ВыборкаОбъект) = Тип("ДокументОбъект.ПриходнаяНакладная") Тогда
           ЗарегистрироватьДанныеОбъектаДляОбмена(ВыборкаОбъект,ЗаписьXML);
           // Записываем данные в сообщение
           ЗаписатьXML(ЗаписьXML, ВыборкаОбъект);
       КонецЕсли;
       
   КонецЦикла;
   
   // Завершаем запись сообщения
   ЗаписьСообщения.ЗакончитьЗапись();
   ЗаписьXML.Закрыть();
   
   Сообщить(ИмяФайла);
   Сообщить("-------- Конец выгрузки------------");
   
КонецПроцедуры // ЗаписатьСообщениеСИзменениями()
19 MaxS1
 
09.08.06
14:34
сразу увидел баг :(
ЗарегистрироватьДанныеОбъектаДляОбмена(ИзмененныйОбъект,ЗаписьXML);
нужно перенести ниже. под КонецЕсли, а ИзмененныйОбъект = выше, над Если
20 Херрес
 
09.08.06
14:38
А ещё такое ощущение, что эта конструкция не будет заходить в реквизиты табличных частей
21 MaxS1
 
09.08.06
14:49
(20) Ага, надо будет доработать, или комментарий в код написать, что есть такая фича, т.к. ТЧ в справочниках, учавствующих в обмене у нас нет.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший