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