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