Этюд: Ручное восстановление таблицы из бэкапа

12.07.12

Задачи пользователя - Корректировка данных

У меня случилась неприятность – в личной базе данных полетела колонка с текстом в таблице, где хранились сообщения, накопленные в почтовой переписке за 5 лет. После запуска CHDBFL текст сообщений исчез во всей таблице, в каждой ее записи!

Всё остальное не пострадало. Я решил не восстанавливать базу из архива (с потерей последних нескольких дней), а ручками перенести тексты из бэкапа. Об этом этюд. Он будет полезен в плане демонстрации ручных навыков работы с XML.

Структура данных

Сообщения хранились в документе пимСообщение. В нем было всего две колонки для текста сообщения:

  • В колонке text хранился обычный текст сообщения
  • В колонке texth хранился текст сообщения в виде HTML, RTF и в других вариантах, в общем случае в виде Структуры, упакованной в ХранилищеЗначения.

Соответственно, нужно было восстановить только два этих поля.

Сообщений было 500 000. Стандартная ВыгрузкаЗагрузкаДанныхЧерезXML от 1С не справилась, написала – не хватает памяти.

Перенести нужно было быстро. Поэтому решил писать свой код, а не муторно искать готовое решение.

Код работает быстро, т.к. не загромождает память. Просто выполняет выгрузку, чтение и запись.

Код выполняю непосредственно в консоли кода.

Выгрузка в XML

Код по выгрузке выглядит так:

З = Новый Запрос("ВЫБРАТЬ Ссылка, ШаблонСообщения ИЗ Документ.пимСообщение");
Выборка = З.Выполнить().Выбрать();
ИмяФайла = "R:\1.xml";

ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(ИмяФайла, "windows-1251");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("items");

Сч = 0;
Пока Выборка.Следующий() Цикл
    Сч = Сч + 1;
    Если Сч % 100 = 0 Тогда
        Состояние("" + Сч + " из " + Выборка.Количество());
    КонецЕсли;
 
    ЗаписьXML.ЗаписатьНачалоЭлемента("item");

    ЗаписьXML.ЗаписатьНачалоЭлемента("link");
    ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуВнутр(Выборка.Ссылка));
    ЗаписьXML.ЗаписатьКонецЭлемента();

    Попытка
        Значение = Выборка.Ссылка.Текст;
        ЗаписьXML.ЗаписатьНачалоЭлемента("text");
        ЗаписьXML.ЗаписатьТекст(Значение);
        ЗаписьXML.ЗаписатьКонецЭлемента();
    Исключение
    КонецПопытки;

    Попытка
        Значение = ЗначениеВСтрокуВнутр(Выборка.Ссылка.ТекстХран);
        ЗаписьXML.ЗаписатьНачалоЭлемента("texth");
        ЗаписьXML.ЗаписатьТекст(Значение);
        ЗаписьXML.ЗаписатьКонецЭлемента();
    Исключение
    КонецПопытки;

    ЗаписьXML.ЗаписатьКонецЭлемента();

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.Закрыть();

Загрузка из XML

Код по загрузке выглядит так:

ЧтениеXML = Новый ЧтениеXML();
ИмяФайла = "R:\1.xml";
ЧтениеXML.ОткрытьФайл(ИмяФайла);

Сч = 0;
ТекОбъект = Неопределено;
Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        //Сообщить("" + ЧтениеXML.ТипУзла + ":" + ЧтениеXML.Имя );
        Если ЧтениеXML.Имя = "item" Тогда
            Сч = Сч + 1;
            Если Сч % 100 = 0 Тогда
                Состояние(Сч);
            КонецЕсли;
            Если ТекОбъект <> Неопределено Тогда
                ТекОбъект.Записать();
                //Сообщить(ТекОбъект);
            КонецЕсли;
            ТекОбъект = Неопределено;

        ИначеЕсли ЧтениеXML.Имя = "link" Тогда
            ЧтениеXML.Прочитать();
            ТекСсылка = ЗначениеИзСтрокиВнутр(ЧтениеXML.Значение);
            ТекОбъект = ТекСсылка.ПолучитьОБъект();
        ИначеЕсли ЧтениеXML.Имя = "text" Тогда
            ЧтениеXML.Прочитать();
            Если ТекОбъект <> Неопределено Тогда
                ТекОбъект.Текст = ЧтениеXML.Значение;
            КонецЕсли;
        ИначеЕсли ЧтениеXML.Имя = "texth" Тогда
            ЧтениеXML.Прочитать();
            ТекЗначение = ЗначениеИзСтрокиВнутр(ЧтениеXML.Значение);
            //Сообщить("" + ТекОбъект + "" + ТекЗначение);
            Если ТекОбъект <> Неопределено Тогда
                ТекОбъект.ТекстХран = ТекЗначение;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Если ТекОбъект <> Неопределено Тогда
    ТекОбъект.Записать();
    //Сообщить(ТекОбъект);
КонецЕсли;

ЧтениеXML.Закрыть();

Вступайте в нашу телеграмм-группу Инфостарт

См. также

НДС 22% Учетные задачи ККМ Файловый обмен (TXT, XML, DBF), FTP 1С 8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Бухгалтерский учет Налоговый учет НДС Платные (руб)

Готовое обновление для конфигурации 1С:Управление торговлей 10.3, 1С:Комплексная автоматизация 1.1 , 1С:Управление производственным предприятием 1.3 обеспечивающее полную поддержку новой ставки НДС 22%. Для 1С:УТ 10.3 реализована поддержка печати чеков ККМ, а также Правила обмена с 1С:БП 3.0. Решение встраивает необходимые изменения в перечисления и документы, включая торговые операции и печатные формы.

12200 руб.

16.12.2025    7311    81    0    

75

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    186516    349    283    

411

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

22650 руб.

12.06.2017    157952    945    317    

476

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.264.x) и БП 3.0 (3.0.192.x). Правила подходят для версии ПРОФ и КОРП.

38000 руб.

15.12.2021    32580    242    61    

182

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.25.x).

38000 руб.

23.07.2020    66082    308    84    

247

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    61354    77    128    

76

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Платные (руб)

Перенос данных из ЗУП 3 в ЗУП 3 | из ЗУП 3 в КА 2 | из ЗУП 3 в ERP | Оперативно обновляется при выходе новых релизов 1С | Готовые правила конвертации (КД 2) для перехода с "ЗУП 3" на "УП ред. 3" / "КА, ред. 2" / "ERP, ред. 2" |Переносится нормативно-справочная информация и документы с движениями

55200 руб.

11.01.2021    37214    33    56    

35

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16531 руб.

18.02.2016    199670    662    543    

559
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. frc 12.07.12 14:40 Сейчас в теме
А о чем статья? как блоками выгрузить данные в xml, т.к. "типовой" механизм, как всегда, не справился с объемом данных?
4. fixin 4330 12.07.12 14:53 Сейчас в теме
(1) КЭП! ;-) именно. Ключевое слово - ЭТЮД. Слова-синонимы - мастер-класс, кейс и т.п.
2. frc 12.07.12 14:41 Сейчас в теме
И Сергей, есть же раскраска кода... Воспользуйтесь, не побрезгуйте :)
3. fixin 4330 12.07.12 14:52 Сейчас в теме
(2) воспользовался, не побрезговал, но он почему то весь код после раскраски вытянул в одну строку.
я запарился и оставил как есть.
Брал отсюда: http://www.oscomp.ru/1Color.php
5. VasMart 18.07.12 14:29 Сейчас в теме
"Зачем нам готовое когда мы сами программисты?"
6. fixin 4330 18.07.12 14:40 Сейчас в теме
(5) готовое что?
jONES1979; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация