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