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

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

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

См. также

SALE! 20%

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27180 руб.

12.06.2017    156734    936    306    

474

НДС 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. Решение встраивает необходимые изменения в перечисления и документы, включая торговые операции и печатные формы.

10000 руб.

16.12.2025    5348    71    0    

65

Перенос данных 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    180250    345    282    

406

SALE! 10%

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

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

38000 34200 руб.

15.12.2021    31779    229    61    

173

SALE! 10%

Перенос данных 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 34200 руб.

23.07.2020    64468    303    81    

243

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

58000 руб.

15.04.2019    81203    218    169    

157

Перенос данных 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, почту.

13550 руб.

18.02.2016    198091    654    543    

557

Перенос данных 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    36796    32    56    

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