1C-Code → Как сделать → Как записать движения регистра накопления программно
В обработке проведения документа — через коллекцию Движения. Одна строка решает всё: без Записывать = Истина движения сформируются в памяти и молча пропадут.
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТоварыНаСкладах.Записывать = Истина; // без этой строки движений не будет
Для Каждого Строка Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = Строка.Количество;
КонецЦикла;
КонецПроцедуры
Это самая частая ошибка темы, и она коварна: документ проводится без единого сообщения, в журнале всё хорошо, а в отчётах пусто. Строку ставят ДО заполнения, чтобы не забыть.
Незаполненный период даёт движение на начало времён. Обычно это Дата документа; для нескольких движений разными датами — своя дата у каждого.
Приход и Расход есть там, где остаток имеет смысл. У регистра оборотов вида движения нет вовсе: там просто накапливается сумма за период.
Если движения надо записать не из документа, берут РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(), ставят отбор по регистратору и вызывают Записать(). Обычно это признак того, что что-то делается не тем способом.
Не записывайте движения по одному в цикле через набор записей — это обращение к базе на каждую строку. Коллекция Движения накапливает всё в памяти и пишет одной операцией в конце проведения; так и надо.
Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Обработка проведения документа»: сформировать движения по строкам документа — с той самой строкой «Записывать = Истина», без которой в отчётах будет пусто. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.