v8: Порционная выгрузка данных в УРБД
Часто возникает потребность порционной выгрузки данных, когда в пакете нужно отправлять не все элементы, а только, например, по 500 элементов. | Автор статьи: Neco | Редакторы: Последняя редакция №2 от 29.08.06 |
Ключевые слова: Порционная, выгрузка УРБД
Нужно выгрузить 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.Закрыть();
Идея всех "телодвижений" проста. Сначало, при записи в файл, проверяем количество выгружаемых элементов и когда достигаем заданного количества начинаем регистрировать данные уже на следующий номер пакета.
Конечно, данная методика не гарантирует того что данные будут перегружаться в целости и сохранности, а также того, что пакеты будут иметь одинаковый размер. Но, можно контроллировать список элементов которые мы выгружаем занося их в таблицу значений, на этапе обхода в цикле: "Пока ВыборкаИзменений.Следующий() Цикл" и далее уже работать с таблицой выгружаемых элементов, а остальные перерегистрировать для последующей выгрузки.