Untitled
unknown
plain_text
2 years ago
10 kB
4
Indexable
Процедура ОбработкаПроведенияОУ(Отказ) // Определение текущего метода списания себестоимости МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания; Если Не ЗначениеЗаполнено(МетодСписания) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не заполнен метод списания учетной политики"; Сообщение.Сообщить(); Отказ = Истина; Возврат; КонецЕсли; // ДВИЖЕНИЯ ПО РЕГИСТРУ ОСТАТКИ НОМЕНКЛАТУРЫ (СТАРАЯ МЕТОДИКА ПРОВЕДЕНИЯ) И РЕГИСТРУ ПРОДАЖИ Движения.ОстаткиНоменклатуры.Записать(); Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; // Установка блокировки данных в регистре Остатки номенклатуры по номенклатурам табличной части Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); // Запрос получения данных для формирования движений Запрос = Новый Запрос; ТекстЗапроса = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ВТ_ТабЧасть |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТабЧасть.Номенклатура КАК Номенклатура, | ВЫБОР | КОГДА ВТ_ТабЧасть.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар) | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ЭтоТовар, | ВТ_ТабЧасть.Номенклатура.Представление, | ВТ_ТабЧасть.Количество КАК КоличествоВДокументе, | ВТ_ТабЧасть.Сумма КАК СуммаВДокументе, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаВРубляхОстаток, 0) КАК СуммаВРубляхОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаВВалютеОстаток, 0) КАК СуммаВВалютеОстаток |ИЗ | ВТ_ТабЧасть КАК ВТ_ТабЧасть | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ_ТабЧасть.Номенклатура | ИЗ | ВТ_ТабЧасть КАК ВТ_ТабЧасть)) КАК ОстаткиНоменклатурыОстатки | ПО ВТ_ТабЧасть.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени УБЫВ |ИТОГИ | МАКСИМУМ(КоличествоВДокументе), | МАКСИМУМ(СуммаВДокументе), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Если МетодСписания = Перечисления.МетодыСписания.ФИФО Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "УБЫВ", ""); КонецЕсли; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); // Обход результатов запроса ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл СтоимостьВРублях = 0; // для накопления списанной стоимости для помещения в регистр продаж СтоимостьВВалюте = 0; // для накопления списанной стоимости в валюте для помещения в регистр продаж Если ВыборкаНоменклатура.ЭтоТовар Тогда // Контроль наличия номенклатуры Превышение = ВыборкаНоменклатура.КоличествоВДокументе - ВыборкаНоменклатура.КоличествоОстаток; Если Превышение > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = СтрШаблон("Превышение остатка по номенклатуре %1 в количестве %2", ВыборкаНоменклатура.НоменклатураПредставление, Превышение); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ОсталосьСписать = ВыборкаНоменклатура.КоличествоВДокументе; ВыборкаДетальные = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальные.Следующий() И ОсталосьСписать <> 0 Цикл // Движение по регистру Остатки номенклатуры Списываем = Мин (ВыборкаДетальные.КоличествоОстаток, ОсталосьСписать); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальные.Номенклатура; Движение.Партия = ВыборкаДетальные.Партия; Движение.Количество = Списываем; Движение.СуммаВРублях = Списываем / ВыборкаДетальные.КоличествоОстаток * ВыборкаДетальные.СуммаВРубляхОстаток; Движение.СуммаВВалюте = Списываем / ВыборкаДетальные.КоличествоОстаток * ВыборкаДетальные.СуммаВВалютеОстаток; ОсталосьСписать = ОсталосьСписать - Списываем; СтоимостьВРублях = СтоимостьВРублях + Движение.СуммаВРублях; СтоимостьВВалюте = СтоимостьВВалюте + Движение.СуммаВВалюте; КонецЦикла; КонецЕсли; // Движение по регистру Продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура; Движение.Количество = ВыборкаНоменклатура.КоличествоВДокументе; Движение.ВыручкаВРублях = ВыборкаНоменклатура.СуммаВДокументе; Движение.ВыручкаВВалюте = ?(КурсДоллара = 0, 0, ВыборкаНоменклатура.СуммаВДокументе / КурсДоллара); Движение.СтоимостьВРублях = СтоимостьВРублях; Движение.СтоимостьВВалюте = СтоимостьВВалюте; КонецЦикла; КонецПроцедуры
Editor is loading...