Имя: Пароль:
1C
1С v8
Как реализовать выгрузку данных через план обмена за определенный период?
, ,
0 DoctorRoza
 
29.08.12
11:46
Коллеги, подскажите пожалуйста. Есть УТ 10.3 и БП 2.0, типовые. Между ними настроен обмен данными с помощью плана обмена. Клиент требует реализовать обмен, чтобы пользователь мог устанавливать период за какой нужно выгружать документы. Сталкиваюсь с обменом впервые, для меня это темный лес. Залез в обр. Регистрация изменений для обмена, авторегистрация для всех документов стоит - Запретить, но документов для обмена зарегистрированно от сотен до нескольких десятков тюсяч. Чтобы понимать, что от мены требуют по сути, нужно понять принципы работы механизмов. Вот и интересуюсь, скиньте ссылки, чтобы почитать про регистрацию, ее суть или подскажите куда копать?
1 pumbaEO
 
29.08.12
11:50
Тут только поможет ковыряние в обработке ОбменДаннымиXML, там где получают измененные объекты и сверять дату.

Справочники тоже по периоду? Регистры непереодические тоже?
2 DoctorRoza
 
29.08.12
11:52
Только документы ..
3 DoctorRoza
 
29.08.12
11:55
В Ут я нашел место в коде где идет проверка по дате, но документов при обработке слишком много. Получается, что зарегистрированно, то и обрабатывается. Вот и хочу понять, как это почистить и как управлять это регистрацией
4 PowerBoy
 
29.08.12
11:59
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)


Проверяешь тип на документ, смотришь его дату - игноришь.
5 DoctorRoza
 
29.08.12
12:03
PowerBoy .. спасибо, сейчас проверю ..
6 Kashemir
 
29.08.12
12:06
Пример регистрации документов за период


   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("НачПериода", НачПериода);
   Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
   ЦБ = EWG_Кл_Серв_Внш.ЦентральныйУзелБУ_Обмен();
   
   НомерТекущейКоллекцииДокументов = 0;
   
   ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Метаданные.Документы.Количество();
   ЭлементыФормы.Индикатор2.МаксимальноеЗначение = 100;
   
   Для каждого МетаДок Из Метаданные.Документы Цикл
       
       
       ЭлементыФормы.Индикатор2.МаксимальноеЗначение = 100;
       НомерТекущейКоллекцииДокументов = НомерТекущейКоллекцииДокументов + 1;
       ЭлементыФормы.Индикатор1.Значение = НомерТекущейКоллекцииДокументов;
       Состояние("Получение документов вида " + МетаДок.Имя + " (" + НомерТекущейКоллекцииДокументов + "/" + Метаданные.Документы.Количество() + ")");
       ЭлементыФормы.ВидДокументов.Заголовок = "(" + НомерТекущейКоллекцииДокументов + "/" + Метаданные.Документы.Количество() + ")" + МетаДок.Имя;
       МассивНаборов = Новый Массив;
       Для каждого Движ из МетаДок.Движения ЦИкл
           Если Метаданные.ПланыОбмена.БУ_обмен.Состав.Содержит(Движ) Тогда
               ЕСли Метаданные.РегистрыНакопления.Содержит(Движ) Тогда
                   МассивНаборов.Добавить(РегистрыНакопления[Движ].СоздатьНаборЗаписей());
                   
               ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Движ)  Тогда
                   МассивНаборов.Добавить(РегистрыБухгалтерии[Движ].СоздатьНаборЗаписей());
                                               
               ИначеЕсли  Метаданные.РегистрыСведений.Содержит(Движ) Тогда
                   МассивНаборов.Добавить(РегистрыСведений[Движ].СоздатьНаборЗаписей());
                   
               ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движ) Тогда
                   МассивНаборов.Добавить(РегистрыРасчета[Движ].СоздатьНаборЗаписей());
               КонецЕсли;
           КонецЕсли;
       КОнецЦикла;
       
       
       
       Если  Метаданные.ПланыОбмена.БУ_обмен.Состав.Содержит(МетаДок) Тогда
           Запрос.Текст = "ВЫБРАТЬ
                          |    Док.Ссылка
                          |ИЗ
                          |    Документ." + МетаДок.Имя+ " КАК Док
                          |ГДЕ
                          |    Док.Дата МЕЖДУ &НачПериода И &КонПериода";
           
           
           Выборка = Запрос.Выполнить().Выбрать();              
           ЭлементыФормы.Индикатор2.МаксимальноеЗначение = Выборка.Количество();
           НомерДок = 0;
           ЭлементыФормы.ВидДокументов.Заголовок = "(" + НомерТекущейКоллекцииДокументов + "/" + Метаданные.Документы.Количество() + ")" + МетаДок.Имя + " (" +Выборка.Количество() + ")";
           Пока Выборка.Следующий() Цикл
               НомерДок = НомерДок + 1;
               ЭлементыФормы.Индикатор2.Значение = НомерДок;
               Состояние("Документ  (" + НомерДок +  "/" + Выборка.Количество() + ") коллекции документов вида " + МетаДок.Имя + " (" + НомерТекущейКоллекцииДокументов + "/" + Метаданные.Документы.Количество() + ")");
               ПланыОбмена.ЗарегистрироватьИзменения(ЦБ,Выборка.Ссылка);
               
               Для каждого Набор из МассивНаборов Цикл
                   Набор.Отбор.Регистратор.Установить(Выборка.Ссылка);        
                   ПланыОбмена.ЗарегистрироватьИзменения(ЦБ,Набор);
               КонецЦикла;
           КОнецЦИкла;
       КонецЕсли;
   КонецЦикла;
   
   
   ЭлементыФормы.Индикатор2.МаксимальноеЗначение = 100;
   ЭлементыФормы.Индикатор2.Значение = 100;
   ЭлементыФормы.ВидДокументов.Заголовок = "";
7 DoctorRoza
 
29.08.12
12:12
Скажите ,по умолчанию ведь все документы регистрируются?
8 Kashemir
 
29.08.12
12:12
+(6) Без лишнего так:

   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("НачПериода", НачПериода);
   Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
   ЦБ = ОпределяемУзелРегистрации();
   Для каждого МетаДок Из Метаданные.Документы Цикл
       Если  Метаданные.ПланыОбмена.БУ_обмен.Состав.Содержит(МетаДок) Тогда
           МассивНаборов = Новый Массив;
           Для каждого Движ из МетаДок.Движения ЦИкл
               Если Метаданные.ПланыОбмена.БУ_обмен.Состав.Содержит(Движ) Тогда
                   ЕСли Метаданные.РегистрыНакопления.Содержит(Движ) Тогда
                       МассивНаборов.Добавить(РегистрыНакопления[Движ].СоздатьНаборЗаписей());
                   ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Движ)  Тогда
                       МассивНаборов.Добавить(РегистрыБухгалтерии[Движ].СоздатьНаборЗаписей());
                   ИначеЕсли  Метаданные.РегистрыСведений.Содержит(Движ) Тогда
                       МассивНаборов.Добавить(РегистрыСведений[Движ].СоздатьНаборЗаписей());
                   ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движ) Тогда
                       МассивНаборов.Добавить(РегистрыРасчета[Движ].СоздатьНаборЗаписей());
                   КонецЕсли;
               КонецЕсли;
           КОнецЦикла;
           Запрос.Текст = "ВЫБРАТЬ
                          |    Док.Ссылка
                          |ИЗ
                          |    Документ." + МетаДок.Имя+ " КАК Док
                          |ГДЕ
                          |    Док.Дата МЕЖДУ &НачПериода И &КонПериода";
           
           Выборка = Запрос.Выполнить().Выбрать();              
           Пока Выборка.Следующий() Цикл
               ПланыОбмена.ЗарегистрироватьИзменения(ЦБ,Выборка.Ссылка);
               Для каждого Набор из МассивНаборов Цикл
                   Набор.Отбор.Регистратор.Установить(Выборка.Ссылка);        
                   ПланыОбмена.ЗарегистрироватьИзменения(ЦБ,Набор);
               КонецЦикла;
           КОнецЦИкла;
       КонецЕсли;
   КонецЦикла;
9 Kashemir
 
29.08.12
12:13
(7) Регистрируются по умолчанию только если стоит "Авторегистрации".
10 DoctorRoza
 
29.08.12
12:13
и регистрация удаляестя после загрузки в приемник?
11 DoctorRoza
 
29.08.12
12:13
и регистрация удаляестя после загрузки в приемник ..
12 DoctorRoza
 
29.08.12
12:15
Спасибо за код .. буду разбираться ..
13 Kashemir
 
29.08.12
12:16
(10) Нет - при отправке в таблице регистрации лишь фиксируется номер пакета отправки. При обратном приеме из узла отправки приходит подтверждение с номером того пакета, который был принят. Все существующие записи регистрации на этом узел с номером пакета меньше либо равного принятого очищаются. Номер пакета NULL не очищается - это признак свежезарегистрированных данных еще ни разу не отправленных.
14 Kashemir
 
29.08.12
12:20
(12) Увидел ошибку в коде - при создании наборов Движ.Имя нужно использовать
15 DoctorRoza
 
29.08.12
12:21
(13) у меня сейчас зарегистрированно большое количество документов для отправки. Если вручную удалю обработкой Регистрация изменений для обмена те, что в нужный период не попадают - это правильное действие с моей стороны?
16 Kashemir
 
29.08.12
12:22
(15) Технически - да сколько угодно. Главное чтобы пользователи потом не жаловались на отсутствие обновленных данных в базе приемнике.
17 Sammo
 
29.08.12
12:23
+13 в общем случае сразу после обмена зарегистрированное изменение может удаляться на уровне кода. Используется для систем, которые не должны получать подтверждения.

(15) Хм. Я бы не стал. Т.к. если зарегистрированы, значит в них что-то изменилось. Есть риск потерять изменения
18 Kashemir
 
29.08.12
12:24
(17) Для таких смелых действией надо иметь 100% гарантию что каждый пакет дойдет до адреса.
19 DoctorRoza
 
29.08.12
12:27
Извините за навязчивость, но еще вопрос. Какой мой порядок действий:
1. Удалить все документы из регистрации;
2. Провести нужные документы за нужный период или начиная с какой-либо даты;
20 Kashemir
 
29.08.12
12:28
(19) Проводить то зачем ?
21 DoctorRoza
 
29.08.12
12:29
А как же я их зарегистрирую для обмена?
22 Kashemir
 
29.08.12
12:29
(19) Когда документы будешь снимать с регистрации - не забудь и их движения почистить.
23 Kashemir
 
29.08.12
12:29
(21) Как ты думаешь что делает код в (6) и в (8) ?
24 DoctorRoza
 
29.08.12
12:33
(23) согласен .. тоже верно .. посчитал, что перепроводка все сделает без дополнительного вмешательства
25 Kashemir
 
29.08.12
12:35
(24) Это метод лечения головной боли гильотиной. Предлагаю все же принять таблетку :)
26 DoctorRoza
 
29.08.12
12:39
(25) еще вопрос, подскажите, что делать со справочниками? Их много зарегистрированно и удалять их думаю неверно. Если какой-нибудь элемент измениться, он зарегистрируется для отправки в приемник?
27 Kashemir
 
29.08.12
12:41
(26) Справочники по механике ничем не отличаются от документов. Те же таблицы регистрации по ссылке.
28 DoctorRoza
 
29.08.12
12:44
(27) спасибо за помощь .. буду разбираться .. спасибо .. :)
29 Мигрень
 
29.08.12
12:49
КО сообщает: на Инфостарте лежит куча обработок для управления регистрацией