Проект

Общее

Профиль

1С Конвертация данных 2 » История » Версия 3

Всеволод Дорофеев, 20.03.2019 06:42

1 1 Всеволод Дорофеев
h1. 1С Конвертация данных 2.0
2 1 Всеволод Дорофеев
3 1 Всеволод Дорофеев
h3. Конвертация данных. ПКО ПослеЗагрузкиОбъекта не срабатывает
4 1 Всеволод Дорофеев
5 1 Всеволод Дорофеев
Обработчики вызываются из правил в конфигурации приемника. Нужно в базу-приемник загрузить правила конвертации объектов из архива содержащего файл CorrespondentExchangeRules.XML(правила конфигурации корреспондента).
6 1 Всеволод Дорофеев
7 1 Всеволод Дорофеев
Дополнительно (не проверено)
8 1 Всеволод Дорофеев
Проверить какой стоит режим совместимости в правилах.
9 1 Всеволод Дорофеев
1.  если 2.0 и ниже тогда код обработчиков после загрузки  в конфигурации в соотв. обработках (см. модуль менеджера плана обмена там прописано название обработок).
10 1 Всеволод Дорофеев
2. если ничего не указано то код обработчиков после загрузки вызывается из правил, которые находятся в конф. приемнике - правила конфигурации корреспондента. Т.е. загружать надо не только в конфигурацию источник, но и в конф. приемник в правила конвертации корреспондента.
11 1 Всеволод Дорофеев
П.С после загрузки правил не забываем перезапускать 1с.
12 2 Всеволод Дорофеев
13 2 Всеволод Дорофеев
h3. Передача документа со строками с уже ранее загруженной номенклатурой (без создания новой)
14 2 Всеволод Дорофеев
15 2 Всеволод Дорофеев
# В ПКС для номенклатуры в обработчике "ПередВыгрузкойСвойства" указываем:
16 2 Всеволод Дорофеев
<pre>
17 2 Всеволод Дорофеев
ВыгрузитьОбъект = ложь; //будет выгружена только ссылка
18 2 Всеволод Дорофеев
</pre>
19 2 Всеволод Дорофеев
# В ПКО в обработчике ПослеЗагрузкиОбъекта проверяем на корректную ссылку  
20 2 Всеволод Дорофеев
<pre>
21 2 Всеволод Дорофеев
Если не Отказ Тогда
22 2 Всеволод Дорофеев
//756
23 2 Всеволод Дорофеев
	МассивСтрок = Новый массив;
24 2 Всеволод Дорофеев
	Для Каждого СтрокаТЧ из Объект.Товары Цикл
25 2 Всеволод Дорофеев
		Если не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура.ВерсияДанных) Тогда // проверка на корректную ссылку!
26 2 Всеволод Дорофеев
			МассивСтрок.Добавить(СтрокаТЧ);
27 2 Всеволод Дорофеев
		КонецЕсли;
28 2 Всеволод Дорофеев
	КонецЦикла;
29 2 Всеволод Дорофеев
	
30 2 Всеволод Дорофеев
	Для Каждого СтрокаДляУдаления из МассивСтрок Цикл
31 2 Всеволод Дорофеев
		Объект.Товары.Удалить(СтрокаДляУдаления);
32 2 Всеволод Дорофеев
	КонецЦикла;
33 2 Всеволод Дорофеев
КонецЕсли;
34 2 Всеволод Дорофеев
</pre>
35 3 Всеволод Дорофеев
36 3 Всеволод Дорофеев
37 3 Всеволод Дорофеев
h3. v8: Инкрементальный экспорт с ипользованием Конвертации Данных v8
38 3 Всеволод Дорофеев
39 3 Всеволод Дорофеев
Описано, как используя конфигурацию "Конвертация Данных" (платформа v8) настроить выгрузку лишь тех данных, которые были изменены со времени последней выгрузки.		Автор статьи: Negro | Редакторы: Макаров
40 3 Всеволод Дорофеев
Последняя редакция №7 от 23.05.08 | История
41 3 Всеволод Дорофеев
URL: http://kb.mista.ru/article.php?id=356	
42 3 Всеволод Дорофеев
43 3 Всеволод Дорофеев
Ключевые слова: конвертация, обмен, данные, выгрузка, экспорт, измененные
44 3 Всеволод Дорофеев
45 3 Всеволод Дорофеев
Бывают задачи, когда нужно наладить обмен данными между конфигурациями разной структуры. УРБД здесь не поможет. Единственно приемлемый по оперативности вариант - использование конфигурации "Конвертация данных" платформы 8.0. Но, увы, выгрузка данных не учитывает, изменялся ли данный объект с момента последней выгрузки или - нет. Выгружает все данные за жестко назначенный период. Иногда это очень большой массив. Хотелось сделать выгрузку инкрементальной. Оказывается это возможно. Нужно лишь сделать следующее:
46 3 Всеволод Дорофеев
47 3 Всеволод Дорофеев
1. Создать в конфигурации План обмена (для рассматриваемого примера - ПланОбмена1).
48 3 Всеволод Дорофеев
2. В режиме 1С:Предприятия завести в план обмена новый узел (для примера узел с кодом "00001").
49 3 Всеволод Дорофеев
3. В правиле выгрузки данных (для примера - для документа Документ1) в качестве способа выгрузки выставить значение "Произвольный алгоритм".
50 3 Всеволод Дорофеев
4. В поле обработчика события "Перед обработкой" вписать код наподобие следующего: 
51 3 Всеволод Дорофеев
52 3 Всеволод Дорофеев
<pre>
53 3 Всеволод Дорофеев
Узел = ПланыОбмена.ПланОбмена1.НайтиПоКоду("00001");
54 3 Всеволод Дорофеев
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, 1);
55 3 Всеволод Дорофеев
ВыборкаДанных = Новый Массив;
56 3 Всеволод Дорофеев
Пока Выборка.Следующий() Цикл
57 3 Всеволод Дорофеев
    Данные = Выборка.Получить();
58 3 Всеволод Дорофеев
    Если Данные.Метаданные().Имя  = "Документ1" Тогда
59 3 Всеволод Дорофеев
        ВыборкаДанных.Добавить(Данные.Ссылка);
60 3 Всеволод Дорофеев
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные.Ссылка);
61 3 Всеволод Дорофеев
    КонецЕсли;
62 3 Всеволод Дорофеев
КонецЦикла;
63 3 Всеволод Дорофеев
</pre>
64 3 Всеволод Дорофеев
65 3 Всеволод Дорофеев
И, собственно, все. На вашей (вернее - моей :) совести остается лишь слепая уверенность в том, что пакет выгруженных данных обязательно дойдет до адресата и без ошибок загрузится в базу. Именно поэтому я спокойненько удаляю сведения о выгружаемом объекте из регистра изменений. Можно конечно сделать пакет подтверждения импорта, но это уже другая история... Т.о. описанное решение является гибридным (конвертация данных + использование планов обмена).
66 3 Всеволод Дорофеев
67 3 Всеволод Дорофеев
А лучше так:
68 3 Всеволод Дорофеев
69 3 Всеволод Дорофеев
В конвертации, в обработчике события "Перед выгрузкой данных" :
70 3 Всеволод Дорофеев
71 3 Всеволод Дорофеев
<pre>
72 3 Всеволод Дорофеев
Узел = ПланыОбмена.ВыгрузкаВПроизводство.НайтиПоКоду("00001");
73 3 Всеволод Дорофеев
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(Узел, 1);
74 3 Всеволод Дорофеев
Выборка=Новый Массив;
75 3 Всеволод Дорофеев
        
76 3 Всеволод Дорофеев
Пока ВыборкаИзменений.Следующий() Цикл
77 3 Всеволод Дорофеев
    Данные=ВыборкаИзменений.Получить();
78 3 Всеволод Дорофеев
    Выборка.Добавить(Данные);
79 3 Всеволод Дорофеев
КонецЦикла;    
80 3 Всеволод Дорофеев
        
81 3 Всеволод Дорофеев
Параметры.Вставить("Выборка",Выборка);
82 3 Всеволод Дорофеев
Параметры.Вставить("Узел",Узел);
83 3 Всеволод Дорофеев
</pre>
84 3 Всеволод Дорофеев
85 3 Всеволод Дорофеев
86 3 Всеволод Дорофеев
87 3 Всеволод Дорофеев
Выборку изменений перевожу в масив, потому что с выборкой почему-то не работает, а с масивом нет проблем.
88 3 Всеволод Дорофеев
89 3 Всеволод Дорофеев
В поле обработчика события "Перед обработкой":
90 3 Всеволод Дорофеев
91 3 Всеволод Дорофеев
<pre>
92 3 Всеволод Дорофеев
Выборка=Параметры.Выборка;
93 3 Всеволод Дорофеев
Узел=Параметры.Узел;
94 3 Всеволод Дорофеев
ВыборкаДанных = Новый Массив;
95 3 Всеволод Дорофеев
Для Каждого ТекВыборка из Выборка Цикл
96 3 Всеволод Дорофеев
    Данные = ТекВыборка;
97 3 Всеволод Дорофеев
    Если  Данные.Метаданные().Имя  = "Документ1" Тогда
98 3 Всеволод Дорофеев
        ВыборкаДанных.Добавить(Данные.Ссылка);
99 3 Всеволод Дорофеев
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Данные.Ссылка);
100 3 Всеволод Дорофеев
    КонецЕсли;
101 3 Всеволод Дорофеев
КонецЦикла;
102 3 Всеволод Дорофеев
</pre>