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