Имя: Пароль:
1C
1С v8
План обмена
0 soleg78
 
21.11.12
22:00
Помогите разобраться с планом обмена. Никогда не писал ещё. Интересует сам механизм.
Создал новый план обмена
Обмен односторонний. Обмен не постоянный, по мере необходимости.
в чем вопрос. Например
Есть справочник ФЛ, им его изменения собираюсь выбирать
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
Выгружаю данные в XML файл(структура произвольная)

Допустим выгрузилась одна строка(назовем её первая)

Файл лежит выгруженный. В базе приемнике неизвестно когда его загрузят. Тем временем в базе источнике идут изменения в след элементах справочника ФЛ. Например произошли изменения еще в 3-х элементах.

Тут происходит загрузка XML файла в базу приемник.

таким образом при ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения); хочу что бы выблались последние 3 изменения, так как "первая" уже загружена в базу приемник. Но не могу понять как сообщить базе приемнику о загрузке "первой строчки".

пытался удалить регистрацию ПланыОбмена.УдалитьРегистрациюИзменений(Узел,НомерСообщения);, но удаляет всё, т. е. ничего не выгружает при выгрузке.

Заранее благодарен.
1 Naumov
 
21.11.12
22:04
что мешает отдать все типовому механизму? делаешь двусторонний обмен, просто в ответ ничего не выгружаешь - только сообщение о приеме предыдущего пакета.
2 soleg78
 
21.11.12
22:08
как "отдать все типовому механизму", конфы у меня разные, + обмен по неким условиям, (базы наполнены ФизЛицами, я из обмениваю по коду ДРФО)
3 EvgeniuXP
 
21.11.12
22:10
(0) номер принятого сообщения прими.
4 EvgeniuXP
 
21.11.12
22:10
т.е. нужно получить подтверждение от второго узла и когда первый узнает об этом, он тебе будет выгружать следующие, иначе все старые изменения + новые изменения.
5 servs
 
21.11.12
22:11
(0) по-моему тебе без объекта ЧтениеСообщенияОбмена не обойтись, в СП:
При завершении чтения данный объект модифицирует значение реквизита НомерПринятого соответствующего узла плана обмена в соответствии с номером принятого сообщения.
6 soleg78
 
21.11.12
22:11
(3)Ок, дальше что с ним делать?
7 EvgeniuXP
 
21.11.12
22:16
(6) курс "Обмен данными", автор Митичкин (Волшебник), там всё рассказано.
8 soleg78
 
21.11.12
22:20
(7) Спасибо, но не могли бы Вы мне сказть каким образом удалит регистрацию изменений по предыдущему сообщению?
пробывал ПланыОбмена.УдалитьРегистрациюИзменений(Узел,НомерСообщения);
начинал НомерСообщения с нуля, 1, 2, - результат - удаляет все!
9 soleg78
 
21.11.12
22:23
ПланыОбменаМенеджер (ExchangePlansManager)
УдалитьРегистрациюИзменений (DeleteChangeRecords)
Синтаксис:

УдалитьРегистрациюИзменений(<Узлы>, <Данные>)
Параметры:

<Узлы> (обязательный)

Тип: ПланОбменаСсылка.<Имя плана обмена>; Массив.
Одиночное значение типа ПланОбменаСсылка.<Имя плана обмена> или массив таких значений, показывающие для каких узлов удаляются записи регистрации изменений.
<Данные> (необязательный)

Тип: Метаданные, Неопределено; УдалениеОбъекта; Число; <Данные>.
Значением данного параметра может быть объект метаданных, объект, представляющий данные, хранимые в базе данных, такой как документ, элемент справочника, счет бухгалтерского учета, менеджер записи константы, набор записей регистра и т. п., ссылка на объект базы данных, а также Неопределено.
Если указан объект метаданных, то записи регистрации изменений будут удалены для всех элементов данных, относящихся к указанному объекту метаданных. Объект метаданных должен входить в состав планов обмена всех узлов, указанных в первом параметре.
Если указан УдалениеОбъекта, то удаление записи регистрации изменений выполняется для объекта базы данных, на который "указывает" ссылка, содержащаяся в объекте УдалениеОбъекта.
Если указан объект представляющий данные, хранимые в базе данных, или ссылка, то записи регистрации изменений будут удалены только для указанных данных. Объект метаданных, соответствующий данным должен входить в состав всех планов обмена всех узлов, указанных в первом параметре.
Если указано Неопределено или не указан, то в качестве первого параметра может быть указан только одиночный узел. И в этом случае записи регистрации изменений будут удалены для всех объектов, метаданные которых входят в состав плана обмена, к которому относится узел, указанный в качестве первого параметра.
Если в качестве первого параметра указан одиночный узел, то в параметре может быть указан номер сообщения. В этом случае метод УдалитьРегистрациюИзменений удаляет из всех таблиц регистрации изменений все записи относящиеся к указанному узлу, у которых номер сообщения меньше или равен значению второго параметра.
Значение по умолчанию: Неопределено
Описание:

Удаляет записи регистрации изменений одного или группы элементов данных для одного или нескольких узлов планов обмена.

Доступность:

Сервер, толстый клиент, внешнее соединение.
10 soleg78
 
21.11.12
22:26
или при выборке изменений, выбрать изменения про предыдущему сообщению и УдалитьРегистрациюИзменений(<Узлы>, <Данные>), а в <Данные> -вставить объект выборки предыдущей
11 AlexNew
 
21.11.12
22:27
Конфигурация типовая? Там есть на основе правил обмена. Велосипед зачем?
12 sda553
 
21.11.12
22:28
(8) Механизм следующий
план обмена помечает изменения номерами выгруженных сообщений
номенклатура 1 сообщение ном.100
номенклатура 2 сообщение ном. 101
номенклатура 3 сообщение ном. null
В сообщениях xml в заголовке автоинкрементный указывается номер сообщения, а также номер последнего принятого сооьщения из той базы.
После выгрузки сообщения номер 102 вместо null у номенклатуры 3 встанет 102
Потом придет обратное сообщение из соседней базы, где будет указано что номер принятого 101.
По этому признаку в ПО можно удалить все изменения с номером более или равным 101.
В сообщении 103 выгрузится только номенклатура3
13 soleg78
 
21.11.12
22:34
(12) прочитал пару раз - не совсем понял
вот моя выгрузка
  Запись = Новый ЗаписьXML();
   Запись.ОткрытьФайл(Путь + "выгрузкa.xml");
   Узел = ПланыОбмена.ОбменФЛ_УТП.НайтиПоКоду("УТП");

   ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
   ЗапСообщения.НачатьЗапись(Запись, Узел);
   Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);

   Запись.ЗаписатьНачалоЭлемента("Obmen");
   Запись.ЗаписатьАтрибут("НомерСообщения", Строка(ЗапСообщения.НомерСообщения));    
   
   Пока Выборка.Следующий() Цикл
       Данные = Выборка.Получить();
       Если ТипЗнч(Данные) = Тип("РегистрСведенийНаборЗаписей.ФИОФизЛиц") Тогда
           
           Для Каждого СтрокаТЧ ИЗ Данные Цикл
               Если СтрДлина(СокрЛП(СтрокаТЧ.ФизЛицо.КодПоДРФО))>0 тогда
                   
                   Запись.ЗаписатьНачалоЭлемента("InformationRegisterRecordSet");
                   Запись.ЗаписатьАтрибут("Период", Строка(СтрокаТЧ.Период));
                   Запись.ЗаписатьАтрибут("КодДРФО", СтрокаТЧ.ФизЛицо.КодПоДРФО);
                   Запись.ЗаписатьАтрибут("Фамилия", СтрокаТЧ.Фамилия);
                   Запись.ЗаписатьАтрибут("Имя", СтрокаТЧ.Имя);
                   Запись.ЗаписатьАтрибут("Отчество", СтрокаТЧ.Отчество);
                   Запись.ЗаписатьТекст(Строка(СтрокаТЧ.ФизЛицо));
                   Запись.ЗаписатьКонецЭлемента();
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       
       
   КонецЦикла;

   
   Запись.ЗаписатьКонецЭлемента();
   ЗапСообщения.ЗакончитьЗапись();
   Запись.Закрыть();
14 soleg78
 
21.11.12
22:35
(12)где это? "план обмена помечает изменения номерами выгруженных сообщений"
15 GenV
 
21.11.12
22:38
(2) Это не проблема, если обе поддерживают обмен через обработку ОбменДаннымиXML. В одной создаешь план обмена с авторегистрацией и правилами. Во второй создаешь план обмена с таким же именем и без регистрации. Правила пусты в настройку загрузишь. Обмен будет автоматом.
16 GenV
 
21.11.12
22:40
15+ можно даже через COM-соединение обмениваться
17 soleg78
 
21.11.12
22:42
(16) неа, надо через файл
про (15) что-то не совчем понятно, обе типовые, УПП и УТП, обе поддерживают обмен через обработку ОбменДаннымиXML
18 servs
 
21.11.12
22:44
(14) это происходит неявно, если стоит авторегистрация, или явно, если авторегистрация запрещена, для 2го случая смотри ЭтотОбъект.ОбменДанными.Получатели, события при записи или при удалении
19 soleg78
 
21.11.12
22:45
(18) стоит авторегистрация
20 AlexNew
 
21.11.12
22:47
(19) Я б сначала ИТС прочел, но это не для пацанов.
21 servs
 
21.11.12
22:47
(19) значит в коде нигде ты явно этого не найдешь. Нужно понимать что регистрация происходит при записи объекта или при удалении.
22 servs
 
21.11.12
22:49
(20) в ИТС много воды, что делает чтение неинтересным.
23 soleg78
 
21.11.12
22:49
(20)только юзеры читают Хелп!))))))))
24 sda553
 
21.11.12
22:50

(14) У тебя это происходит вот здесь
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);
25 servs
 
21.11.12
22:51
(24) не п4345ди)))
26 GenV
 
21.11.12
22:52
(17) В типовых есть настройка произвольных обменов данных можно выбрать план , узел, и загрузить правила по которым будет происходить обмен.
27 AlexNew
 
21.11.12
22:53
(21) или не происходит. Читайте типовые.
28 servs
 
21.11.12
22:56
(27) да, Вы правы, ЭтотОбъект.ОбменДанными.Получатели при авторегистрации могут очищаться программно в событиях перед записью или удалением. Это не описывал, т.к. ТС спрашивал о том как присваивается номер сообщения, а не об отмене регистрации.
29 sda553
 
21.11.12
22:56
(25) Ты просто еще в 18 ом посте не понял о чем идет речь. Речь не о регистрации а о моменте когда в изменения ставятся номера сообщений. Так что перечитывай  начиная с 14 снова и не груби старшим
30 servs
 
21.11.12
22:57
(27) Типовые читать - себя не уважать)))
31 EvgeniuXP
 
21.11.12
22:58
(8) мог бы, но все на работе, дома нет...

(11) велосипеда там нет, там все просто.
32 servs
 
21.11.12
22:59
(29) ага, точно, извини.
ТС, в (24) эсдэапятпятьтри прав!
33 soleg78
 
21.11.12
23:15
Пробую это делать через запрос, так там только 0 и 1 в НомерСообщения, а НоменОтправленных сообщений уже больше сотни, ...или это не оно?
34 servs
 
21.11.12
23:24
(33) [НомерОтправленных сообщений уже больше сотни] где этот номер смотришь?
35 soleg78
 
21.11.12
23:26
(34)ну в плане обмена
36 servs
 
21.11.12
23:30
а ты уверен что узел в запросе и в НомерОтправленных один и тот же? Для каждого узла своя нумерация, если я не ошибаюсь.
37 soleg78
 
22.11.12
00:54
(36) как проверить?
38 soleg78
 
22.11.12
01:16
http://soleg1978.narod.ru/obmen.jpg
НомерСообщения только 0 и 1, почему?
39 soleg78
 
22.11.12
01:21
Выполняю этот код
 Запись = Новый ЗаписьXML();
   Запись.ОткрытьФайл(Путь + "выгрузкa.xml");
   Узел = ПланыОбмена.ОбменФЛ_УТП.НайтиПоКоду("УТП");

   ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
   ЗапСообщения.НачатьЗапись(Запись, Узел);
   Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);

   Запись.ЗаписатьНачалоЭлемента("Obmen");
   Запись.ЗаписатьАтрибут("НомерСообщения", Строка(ЗапСообщения.НомерСообщения));    
   
   Пока Выборка.Следующий() Цикл
       Данные = Выборка.Получить();
       Если ТипЗнч(Данные) = Тип("РегистрСведенийНаборЗаписей.ФИОФизЛиц") Тогда
           
           Для Каждого СтрокаТЧ ИЗ Данные Цикл
               Если СтрДлина(СокрЛП(СтрокаТЧ.ФизЛицо.КодПоДРФО))>0 тогда
                   
                   Запись.ЗаписатьНачалоЭлемента("InformationRegisterRecordSet");
                   Запись.ЗаписатьАтрибут("Период", Строка(СтрокаТЧ.Период));
                   Запись.ЗаписатьАтрибут("КодДРФО", СтрокаТЧ.ФизЛицо.КодПоДРФО);
                   Запись.ЗаписатьАтрибут("Фамилия", СтрокаТЧ.Фамилия);
                   Запись.ЗаписатьАтрибут("Имя", СтрокаТЧ.Имя);
                   Запись.ЗаписатьАтрибут("Отчество", СтрокаТЧ.Отчество);
                   Запись.ЗаписатьТекст(Строка(СтрокаТЧ.ФизЛицо));
                   Запись.ЗаписатьКонецЭлемента();
               КонецЕсли;
           КонецЦикла;
       КонецЕсли;
       
       
   КонецЦикла;

   
   Запись.ЗаписатьКонецЭлемента();
   ЗапСообщения.ЗакончитьЗапись();
   Запись.Закрыть();


и результат такой
40 soleg78
 
22.11.12
01:22
41 sda553
 
22.11.12
01:44
Здесь номер сообщения, это конкретно номер сообщения из (12) т.е. в данном случае три записи регистра с test5 зарегистрировано изменение в узел  УТП, которое было на момент отправки сообщения номер 1.
После этого было отправлено еще 12 сообщений в этот узел.
Принято 2 сообщения из этого узла.
Но видимо ни в одном из принятых сообщений нет подтверждения что тот узел прочитал хоть какое то из 13ти сообщений, поэтому эти записи с номером 1 еще не зачищены.
Я понятно объяснил?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.