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

