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

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    6793    78    0    

73

Перенос данных 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    180616    348    283    

409

Перенос данных 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    157334    939    306    

475

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

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

38000 руб.

15.12.2021    32217    237    61    

177

Перенос данных 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    60963    76    128    

74

Перенос данных 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    65444    304    83    

243

Перенос данных 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    198555    661    543    

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