Untitled
plain_text
2 months ago
9.2 kB
1
Indexable
Never
Процедура ОбработкаПроведенияОУ(Отказ) СтруктураОтбора = Новый Структура("Валюта", Валюта); КурсВалюты = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, СтруктураОтбора).Курс; Если КурсВалюты = 0 Тогда КурсВалюты = 1; КонецЕсли; Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина; Движения.ОстаткиНоменклатуры.Записывать = Истина; Запрос = Новый Запрос; МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ вт_СписокНоменклатуры |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | вт_СписокНоменклатуры.Номенклатура КАК Номенклатура, | вт_СписокНоменклатуры.Номенклатура.Представление КАК НоменклатураПредставление, | вт_СписокНоменклатуры.Количество КАК Количество, | вт_СписокНоменклатуры.Сумма КАК Сумма |ИЗ | вт_СписокНоменклатуры КАК вт_СписокНоменклатуры"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаТЧ = Результат.Выбрать(); Пока ВыборкаТЧ.Следующий() Цикл Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаТЧ.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаТЧ.Количество; Движение.Сумма = ВыборкаТЧ.Сумма * КурсВалюты; КонецЦикла; Движения.Записать(); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = "ВЫБРАТЬ | ОстаткиНоменклатурыОстатки.Номенклатура.Представление КАК НоменклатураПредставление, | -ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Превышение |ИЗ | РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &ГраницаОстатков, | Номенклатура В | (ВЫБРАТЬ | вт_СписокНоменклатуры.Номенклатура КАК Номенклатура | ИЗ | вт_СписокНоменклатуры КАК вт_СписокНоменклатуры)) КАК ОстаткиНоменклатурыОстатки |ГДЕ | ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("ГраницаОстатков", Новый Граница(МоментВремени(), ВидГраницы.Включая)); РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл Отказ = истина; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = СтрШаблон("Недостаточно номенклатуры %1 в количестве %2", Выборка.НоменклатураПредставление, Выборка.Превышение); Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Не отказ Тогда Движения.Взаиморасчеты.Записывать = Истина; Движения.Взаиморасчеты.Записать(); // отражаем долг покупателя Движение = Движения.Взаиморасчеты.ДобавитьПриход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Движение.Сумма = СуммаПоДокументу; Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент); ЭлементБлокировки.УстановитьЗначение("Накладная", Документы.РасходнаяНакладная.ПустаяСсылка()); Блокировка.Заблокировать(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВзаиморасчетыОстатки.Контрагент КАК Контрагент, | ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | РегистрНакопления.Взаиморасчеты.Остатки( | &МоментВремени, | Контрагент = &Контрагент | И Накладная = &Аванс) КАК ВзаиморасчетыОстатки"; Запрос.УстановитьПараметр("Аванс", Документы.РасходнаяНакладная.ПустаяСсылка()); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда Данные = РезультатЗапроса.Выбрать(); Данные.Следующий(); Аванс = Данные.СуммаОстаток; СуммаДокументаВРублях = СуммаПоДокументу * КурсВалюты; СписываемСАванса = Мин(Аванс, СуммаДокументаВРублях); //списываем с аванса Движение = Движения.Взаиморасчеты.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Движение.Сумма = СписываемСАванса; // гасим долг Движение = Движения.Взаиморасчеты.ДобавитьРасход(); Движение.Период = Дата; Движение.Контрагент = Контрагент; Движение.Накладная = Ссылка; Если СписываемСАванса = СуммаДокументаВРублях Тогда Движение.Сумма = СуммаПоДокументу; Иначе Движение.Сумма = СписываемСАванса / КурсВалюты; КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры