Автоматизация бизнеса

Установка, настройка, внедрение и сопровождение любых конфигураций на платформе 1С:Предприятие.

Тел: 8(985)141-74-63 Дмитрий.   
ICQ:     552-608-881
e-mail: info@programmist1c.ru

Оплата после выполнения работы.

  •   Удаленный админ
  •   Карта сайта
  •   Контакты


  • Поиск
     

    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.Закрыть();
    


    Идея всех "телодвижений" проста. Сначало, при записи в файл, проверяем количество выгружаемых элементов и когда достигаем заданного количества начинаем регистрировать данные уже на следующий номер пакета.
    Конечно, данная методика не гарантирует того что данные будут перегружаться в целости и сохранности, а также того, что пакеты будут иметь одинаковый размер. Но, можно контроллировать список элементов которые мы выгружаем занося их в таблицу значений, на этапе обхода в цикле: "Пока ВыборкаИзменений.Следующий() Цикл" и далее уже работать с таблицой выгружаемых элементов, а остальные перерегистрировать для последующей выгрузки.
    21.02.18 | 10:31


    30.11.16 | 20:25


    28.11.16 | 09:22


    26.11.16 | 08:19


    22.11.16 | 20:17


    19.11.16 | 10:14


    18.11.16 | 20:09




    Внедрение 1С Автоматизация 1С Доработка 1С Сопровождение 1С Обслуживание 1С Программирование 1С 8 Hастройка 1С Карта сайта Контакты