Недавно понадобилось разработать механизм, который сторнирует любые документы в «1С: Управление торговлей 11.2». Было решено использовать типовой документ «Корректировка регистров», а сами документы корректировки формировать автоматически на основании движений сторнируемого документа. В результате была написана обработка, которая делает универсальное сторнирование.
При использовании кода следует учесть, что алгоритм сторнирования предельно упрощён: все числовые величины в движениях просто берутся с обратным знаком. Адаптируйте код для своих случаев.
Также не используются транзакции и явные управляемые блокировки при чтении движений регистров. В реальных системах это может потребоваться.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
&НаСервереБезКонтекста Процедура СторнироватьТаблицу(Таблица) Для каждого ТекСтрока Из Таблица Цикл ТекСтрока["Активность"] = Истина; Для каждого ТекКолонка Из Таблица.Колонки Цикл Если ТекКолонка.Имя="НомерСтроки" или ТекКолонка.Имя="КодСтроки" Тогда Продолжить; КонецЕсли; Если НЕ ТекКолонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда Продолжить; КонецЕсли; ТекСтрока[ТекКолонка.Имя] = - ТекСтрока[ТекКолонка.Имя]; КонецЦикла; КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Процедура СторнироватьНаСервере(ДокументСсылка) ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); ДокументКорректировка = Документы.КорректировкаРегистров.СоздатьДокумент(); ДокументКорректировка.Дата = ТекущаяДатаСеанса(); МетаданныеДвижений = ДокументОбъект.Метаданные().Движения; Для каждого ТаблицаДвижений Из МетаданныеДвижений Цикл ИмяТаблицы = ТаблицаДвижений.Имя; ДокументОбъект.Движения[ИмяТаблицы].Прочитать(); Если ДокументОбъект.Движения[ИмяТаблицы].Количество()>0 Тогда ДокументКорректировка.ТаблицаРегистров.Добавить().Имя = ИмяТаблицы; ТаблицаДвиженийВыгруженная = ДокументОбъект.Движения[ИмяТаблицы].Выгрузить(); СторнироватьТаблицу(ТаблицаДвиженийВыгруженная); ДокументКорректировка.Движения[ИмяТаблицы].Загрузить(ТаблицаДвиженийВыгруженная); КонецЕсли; КонецЦикла; ДокументКорректировка.Записать(); Сообщить(ДокументКорректировка.Ссылка); КонецПроцедуры &НаКлиенте Процедура Сторнировать(Команда) СторнироватьНаСервере(ДокументСсылка); КонецПроцедуры |
Поделиться