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