• +7 (495) 241-10-64 (Москва)
  • +7 (3852) 59-50-96 (Барнаул)
  • ogroup77

19.01.2017

Быстрый бэкап изменяемых данных

Хочу поделиться способом восстановления большого массива измененных данных, который мне удалось применить. Решение простое но не очень очевидное для меня.

Допустим, вам необходимо изменить элементы справочника Характеристика номенклатуры. Их очень много, вы их отбираете каким-нибудь запросом в консоли:

ВЫБРАТЬ
                ЦеныНоменклатурыСрезПоследних.Характеристика,
                ЦеныНоменклатурыСрезПоследних.Цена,
                ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение КАК ЦенаКакСвойство
ИЗ
                РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &Видцены) КАК ЦеныНоменклатурыСрезПоследних
                               ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиНоменклатурыДополнительныеРеквизиты
                               ПО ЦеныНоменклатурыСрезПоследних.Характеристика = ХарактеристикиНоменклатурыДополнительныеРеквизиты.Ссылка
                                               И (ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство = &Свойство)
ГДЕ
                ЦеныНоменклатурыСрезПоследних.Цена = (ВЫРАЗИТЬ(ХарактеристикиНоменклатурыДополнительныеРеквизиты.Значение КАК ЧИСЛО(15, 2)))

 

И пишете обработку, которая по этому запросу поменяет значения реквизитов в этих элементах. Как обеспечить откат в случае ошибки обработки?

Очень просто. В консоли запросов вы (предварительно!) сохраняете таблицу результата в формате mxl:

Бакуп 1

И спокойно выполняете свою обработку изменив и перезаписав 100500 характеристик номенклатуры.

Внезапно вы выясняете что изменили неправильно. Что делать?

Дело в том, что в mxl вы сохранили не только строковые значения, но и ссылки на объекты, которые хранятся в расшифровке. Поэтому пишем простой код получающий из mxl непосредственно объекты, сохраненные в расшировках полей mxl. В моем случае это выглядело так:

ТоСамоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Старая цена (хар.)",ложь);
                ТабДок = Новый ТабличныйДокумент;
                ТабДок.Прочитать("C:\ бакуп.mxl");
                Для  ш = 2 по 2354 цикл
                               Область = табдок.Область(ш,1,ш,1);
                               сообщить(область.Расшифровка);
                               сообщить(ТипЗнч(область.Расшифровка));//убеждаемся, что там действительно ссылки
                               Цена = Число(стрзаменить(табдок.Область(ш,2,ш,2).Текст," ",""));
                               Сообщить(Цена);
                               Об = Область.Расшифровка.ПолучитьОбъект();
                               Для каждого о из об.ДополнительныеРеквизиты Цикл
                                               Если о.Свойство = ТоСамоеСвойство Тогда
                                                               о.Значение = Число(Цена);
                                                               Прервать;
                                               КонецЕсли;
                               КонецЦикла;
                               Об.записать();
                Конеццикла;

 

Может для кого-то это будет очевидно, но для меня это было новым и неожиданным решением. Надеюсь поможет кому-то еще.

Да хранит вас Нуралиев!