Цитата(Анна Команкова @ 05.07.15, 15:36) необходимо зарегистрироваться для просмотра ссылки
Извините, а Вы не могли бы объяснить, что такое Левое соединение?
Запрос формирует табличку ТоварТЧ КоличествоТЧ КоличествоОстаток
ЛевоеСоединение в данном случае значит: Выбрать все записи с табличной части и к ним присоединить количествоОстаток из регистра ТМЦ, по условию, что ТоварТЧ = Товар в регистре (Строка в Запросе
| ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
)
Цитата
Остатки из временной таблицы переносятся в остатки регистра накопления ТМЦОстатки или что((?
Не переносятся, а присоединяются. Как описано выше.
Если я правильно вас понял. УчЦена в документе расходной это та цена по которой этот товар закупили. А УчСумма соответсвенно стоимость по которой закупили. То получиться чтото вроде этого
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ,
| СУММА(РасходнаяНакладнаяТЧРасхНакл.Количество) КАК Количество
|ПОМЕСТИТЬ ТоварыДок
|ИЗ
| Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл
|ГДЕ
| РасходнаяНакладнаяТЧРасхНакл.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыДок.ТМЦ,
| ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ТоварыДок.Количество,
| ЕСТЬNULL(ТМЦОстатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| ТоварыДок КАК ТоварыДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки(
| &Дата,
| ТМЦ В
| (ВЫБРАТЬ
| ТоварыДок.ТМЦ
| ИЗ
| ТоварыДок КАК ТоварыДок)) КАК ТМЦОстатки
| ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Результат = Запрос.Выполнить();
ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл
Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда
Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе");
Отказ = Истина;
КонецЕсли;
ТоварВТЧ = ТЧРасхНакл.Найти(ВыборкаИзЗапроса.ТМЦ);
УчЦена = ВыборкаИзЗапроса.СуммаОстаток/ВыборкаИзЗапроса.КоличествоОстаток;
ТоварВТЧ.УчЦена = УчЦена;
ТоварВТЧ.УчСумма = ВыборкаИзЗапроса.СуммаОстаток;
КонецЦикла;
Если Не Отказ Тогда
Записать();
КонецЕсли;
КонецПроцедуры
Да, лучше как предложил Logist
Заполнять Перед записью лучше. Тогда так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ,
| СУММА(РасходнаяНакладнаяТЧРасхНакл.Количество) КАК Количество
|ПОМЕСТИТЬ ТоварыДок
|ИЗ
| Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл
|ГДЕ
| РасходнаяНакладнаяТЧРасхНакл.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыДок.ТМЦ,
| ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ТоварыДок.Количество
|ИЗ
| ТоварыДок КАК ТоварыДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки(
| &Дата,
| ТМЦ В
| (ВЫБРАТЬ
| ТоварыДок.ТМЦ
| ИЗ
| ТоварыДок КАК ТоварыДок)) КАК ТМЦОстатки
| ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Результат = Запрос.Выполнить();
ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл
Если ВыборкаИзЗапроса.Количество > ВыборкаИзЗапроса.КоличествоОстаток Тогда
Сообщить("Товара "+ВыборкаИзЗапроса.ТМЦ +" не хватает на складе");
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если НЕ(РежимЗаписи = РежимЗаписиДокумента.Проведение) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ
|ПОМЕСТИТЬ ТоварыДок
|ИЗ
| Документ.РасходнаяНакладная.ТЧРасхНакл КАК РасходнаяНакладнаяТЧРасхНакл
|
|СГРУППИРОВАТЬ ПО
| РасходнаяНакладнаяТЧРасхНакл.ТМЦ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыДок.ТМЦ,
| ЕСТЬNULL(ТМЦОстатки.СуммаОстаток, 0) КАК СуммаОстаток,
| ЕСТЬNULL(ТМЦОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| ТоварыДок КАК ТоварыДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТМЦ.Остатки(
| &Дата,
| ТМЦ В
| (ВЫБРАТЬ
| ТоварыДок.ТМЦ
| ИЗ
| ТоварыДок КАК ТоварыДок)
| И Склад = &Склад) КАК ТМЦОстатки
| ПО ТоварыДок.ТМЦ = ТМЦОстатки.ТМЦ";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
ВыборкаИзЗапроса = Результат.Выбрать();
Пока ВыборкаИзЗапроса.Следующий() Цикл
ТоварВТЧ = ТЧРасхНакл.Найти(ВыборкаИзЗапроса.ТМЦ);
Если ВыборкаИзЗапроса.КоличествоОстаток = 0 Тогда
УчЦена = 0;
Иначе
УчЦена = ВыборкаИзЗапроса.СуммаОстаток/ВыборкаИзЗапроса.КоличествоОстаток;
КонецЕсли;
ТоварВТЧ.УчЦена = УчЦена;
ТоварВТЧ.УчСумма = ВыборкаИзЗапроса.СуммаОстаток;
КонецЦикла;
КонецПроцедуры
а в обработке проведения только проверяем остаток