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