Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// 1. Очистка старых движений регистра
// Движения.СвободныеОстатки.Очистить(); - Напоминаю, если проверять через отладчик Движения.СвободныеОстатки
// то там ничего нет, соответсвенно и нечего очищать
Движения.СвободныеОстатки.Записывать = Истина; // Установив у свойсвта ЗАПИСЫВАТЬ ИСТИНА - мы подготовили, что бы он записал наши
Движения.Записать(); // движения. А тут тут же записываем их. Так как между 7 и 8 строкой кода ничего нет.
// она записал пустые движения ( Пустой набор записей), это сделано для того, что бы
// старые движения, проводимого документа очистились. То есть когда мы перепроводим
// документ его предыдущие данные очистились и не влияли на дальнейший код
// ( а именно запрос, так как в запросе мы обращаемся к регистру и не хотим,
// что бы он помнил старые данные документа)
// 2. Установка флага записи движений в конце транзакции
Движения.СвободныеОстатки.Записывать = Истина; // заново возводим это свойство в Истину,
// что бы наши новые данные документа, оказались в регистре
// 3. Получение запросом данных из ТАБЛИЧНОЙ ЧАСТИ документ и соединение их с виртуальной таблицей регистра Остатки
Запрос = Новый Запрос;
Запрос.Текст =
// 1ый пакет, мы берем данные из ТЧ те, которые дальше будем передавать в регистр, предварительно сгруппировав
// К примеру:
// Помидор 10
// Помидор 20
// Груша 10
// После первого пакета будет у нас
// Помидор 30
// Груша 10
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| СУММА(Товары.Количество) КАК Количество
|ПОМЕСТИТЬ ВТ_ТЧ
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////|
// 2ой пакет, мы сгруппированные данные соединяем с виртуальной таблицей Остатки, так что бы он нашел одинаковые поля в 1ой таблице и
// и во 2ой и соединил их в итоге получится
// Помидор 30 40
// Груша 10 5
// где 10 и 5 это остаток из виртуальной таблицы Остатки
|ВЫБРАТЬ
| ПРЕДСТАВЛЕНИЕССЫЛКИ(Товары.Номенклатура) КАК НоменклатураПредставление,
| ВТ_ТЧ.Количество КАК Количество,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
|ИЗ
| ВТ_ТЧ КАК ВТ_ТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| ВТ_ТЧ.Номенклатура КАК Номенклатура
| ИЗ
| ВТ_ТЧ КАК ВТ_ТЧ)) КАК Остатки
| ПО ВТ_ТЧ.Номенклатура = Остатки.Номенклатура";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаТовары = РезультатЗапроса.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
// 4. Проверка на достаточность товаров
Дефицит = ВыборкаТовары.Количество - ВыборкаТовары.Остаток;
Если Дефицит>0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт.";
Сообщение.Сообщить();
КонецЕсли;
// 5. Переход в начало цикла, если нашли товар, у которого Остаток меньше Количества
Если Отказ Тогда // тоже самое - Если Отказ = Истина Тогда
Продолжить;
КонецЕсли;
// 6. Передача данных из запроса в Регистр
Движение = Движения.СвободныеОстатки.ДобавитьРасход();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаТовары.Номенклатура;
Движение.Количество = ВыборкаТовары.Количество;
КонецЦикла;
КонецПроцедуры // <------ Вот тут произодет запись новых движений в базу данных, благодаря Записывать = Истина из 16 строки кода