Исходная задача состояла в том, что надо было ввести остатки на начало года по "партиям НДС" в конфигурации "Комплексная автоматизация" и провести все документы по этому регистру. Сложность была в том, что остатки вводились с опозданием и несколько периодов были уже закрыты. Поэтому напрямую перепроводить документы было уже нельзя (из-за возможных изменений сумм себестоимости и т.д.)
Основная идея заключается в том, что движения делаются с помощью алгоритмов проведения самой конфигурации, но в результате (после перепроведения) оставляется изменение движений только по выбранному регистру.
Этот пример может пригодится, например, в аналогичных описываемому случаях ввода остатков по отдельному регистру, либо в случае изменения алгоритма проведения по определенному регистру.
Не претендуя на оригинальность самой идеи отменять транзакцию, тем не менее хочу представить работающий алгоритм (для конфигураций 1С 8.1/8.2). Возможно, кому-то пригодится в работе. Мне он помогал ещё в нескольких случаях.
В примере приводится проведение по регистру накопления "Размещение". Это регистр был добавлен в конфигурацию и не относится к типовым. Алгоритм легко переделать на другой (другие) нужный регистр. Как с любыми операциями с регистрами, и этой операцией тоже следует пользоваться аккуратно )
Текст самих процедур (8.1/8.2)
Процедура ПерепровестиДокументыПоРегистру()
//отбираем все проведенные документы, которые могут делать движения по нужному нам
//регистру (РегистрыНакопления.Размещение)
//за указанный период с Дата1 по Дата2
ИмяРегистра = "Размещение";
ТекстЗапроса = "ВЫБРАТЬ Документы.Ссылка ИЗ (";
Для Каждого Документ Из Метаданные.Документы Цикл
Если Не Документ.Движения.Содержит(Метаданные.РегистрыНакопления[ИмяРегистра]) Тогда
Продолжить;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ " + Документ.Имя + ".Ссылка КАК Ссылка, " +
Документ.Имя + ".Дата КАК Дата ИЗ Документ." + Документ.Имя + " КАК " + Документ.Имя +
" ГДЕ " + Документ.Имя + ".Дата МЕЖДУ &НачПериода И &КонПериода И "
+ Документ.Имя + ".Проведен ОБЪЕДИНИТЬ ВСЕ ";
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + "ВЫБРАТЬ NULL, NULL ) КАК Документы ГДЕ НЕ Документы.Ссылка ЕСТЬ NULL УПОРЯДОЧИТЬ ПО Документы.Дата";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("НачПериода", НачалоДня(Дата1));
Запрос.УстановитьПараметр("КонПериода", КонецДня(Дата2));
Выборка = Запрос.Выполнить().Выбрать();
Сообщить(Выборка.Количество());
Пока Выборка.Следующий() Цикл
ОбработкаПрерыванияПользователя();
ДокСсылка=Выборка.Ссылка;
Сообщить(" "+СокрЛП(ДокСсылка));
ПровестиПоРегистру(ДокСсылка,ИмяРегистра);
КонецЦикла;
КонецПроцедуры
Процедура ПровестиПоРегистру(ДокСсылка, ИмяРегистра)
ДокОбъект = ДокСсылка.ПолучитьОбъект();
НачатьТранзакцию();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
ДокОбъект.Движения[ИмяРегистра].Прочитать();
ТаблицаДвиженийРегистра = ДокОбъект.Движения[ИмяРегистра].Выгрузить();
//здесь отменяем проведение документа, чтобы ничего не изменилось
//в прошлых периодах (по другим регистрам)
ОтменитьТранзакцию();
НаборЗаписей = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокСсылка);
НаборЗаписей.Загрузить(ТаблицаДвиженийРегистра);
НаборЗаписей.Записать();
КонецПроцедуры
Решение похожей задачи (но другим способом) для платформы 7.7 описано в статье "Технологическое перепроведение документов"
ps. (03/03/2012)
Забавно - сегодня обнаружил полный аналог этого алгоритма, описанный ранее на "Инфостарт" - "Перепроведение документов только по выбранным регистрам" .... Похожие идеи витают в воздухе :)