Книга знаний

1С:Предприятие / v8 / Приемы программирования / Обмен данными, УРБД

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: Выборочная миграция данных в УРБД;
Книга знаний: Альтернативное создание начального образа в УРБД;


Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика