v8: Порционная выгрузка данных в УРБДЧасто возникает потребность порционной выгрузки данных, когда в пакете нужно отправлять не все элементы, а только, например, по 500 элементов. | | Автор статьи: Neco | Редакторы: Последняя редакция №2 от 29.08.06 | История URL: http://kb.mista.ru/article.php?id=348 | |
Ключевые слова: Порционная, выгрузка УРБД
Нужно выгрузить 500 элементов, а остальные перерегистрировать для следующего пакета. Для этого воспользуемся методикой обмена данными через XML сериализацию.
Создадим процедуру записи данных и внесем такой код:
КоличествоВыгружаемыхЭлементов = 500; // можно устанавливать через константу
// Создаем объект записи XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// Создаем новое сообщение
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
// Для сокращения размера файла сообщения записываем соответствие пространств имен
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data");
НомерСообщения = ЗаписьСообщения.НомерСообщения;
// Получаем выборку изменённых данных
Счетчик = 0;
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
ОбработкаПрерыванияПользователя();
Данные = ВыборкаИзменений.Получить();
Если Счетчик = КоличествоВыгружаемыхЭлементов Тогда
// регестрируем для следующего номера
ПланыОбмена.ЗарегистрироватьИзменения(Ссылка,Данные);
Продолжить;
КонецЕсли;
Счетчик = Счетчик + 1;
// Записываем данные в сообщение
ЗаписатьДанные(ЗаписьXML, Данные);
Если Счетчик = КоличествоВыгружаемыхЭлементов Тогда
// Завершаем запись сообщения
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
КонецЕсли;
КонецЦикла;
// Завершаем запись сообщения
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Процедура чтения:
// Создаем объект чтения XML
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
// Загрузка из найденного файла
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
НомерСообщения = ЧтениеСообщения.НомерСообщения;
// Удаляем регистрацию изменений для узла отправителя сообщения
// по номеру принятого сообщения, полученного из сообщения
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);
// Читаем данные из сообщения пока это возможно
Счетчик = 0;
Пока ВозможностьЧтенияДанных(ЧтениеXML) Цикл
ОбработкаПрерыванияПользователя();
// Читаем очередное значение
Данные = ПрочитатьДанные(ЧтениеXML);
Счетчик = Счетчик + 1;
Состояние("Загрузка данных: " + Строка(Счетчик));
Попытка
// Запись перенесенных данных
Данные.Записать();
Исключение
Сообщить("- Не удалось записать данные: " + ВывестиДанные(Данные,Ложь),СтатусСообщения.Важное);
КонецПопытки;
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
Идея всех "телодвижений" проста. Сначало, при записи в файл, проверяем количество выгружаемых элементов и когда достигаем заданного количества начинаем регистрировать данные уже на следующий номер пакета.
Конечно, данная методика не гарантирует того что данные будут перегружаться в целости и сохранности, а также того, что пакеты будут иметь одинаковый размер. Но, можно контроллировать список элементов которые мы выгружаем занося их в таблицу значений, на этапе обхода в цикле: "Пока ВыборкаИзменений.Следующий() Цикл" и далее уже работать с таблицой выгружаемых элементов, а остальные перерегистрировать для последующей выгрузки.
Полезные ссылки в книге знаний:
Книга знаний: УРБД на v8 за четыре шага.;
Книга знаний: v8: Выборочная миграция данных в УРБД;
Книга знаний: Альтернативное создание начального образа в УРБД;
|