-
Notifications
You must be signed in to change notification settings - Fork 0
/
Программный модуль документа ЗаказКлиента.bsl
51 lines (43 loc) · 3.45 KB
/
Программный модуль документа ЗаказКлиента.bsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Программный модуль документа ЗаказКлиента.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если НЕ КонтрольОстатков() Тогда
Отказ = Истина;
Сообщить("Недостаточное количество товара!");
Возврат;
КонецЕсли;
ИтогСумма = 0;
Для Каждого ТоварСтрока Из Товары Цикл
ИтогСумма = ИтогСумма + ТоварСтрока.Сумма;
КонецЦикла;
ИтоговаяСумма = ИтогСумма;
КонецПроцедуры
Функция КонтрольОстатков()
Результат = Истина;
СкладТовара = Склад;
// Так как в табличной части могут быть представлены одинаковые номенклатурные позиции несколько раз,
// а нам нужно сравнивать с регистром остатков товаров их общее количество (а не по отдельности),
// то необходимо создать небольшую вспомогательную таблицу, где будем хранить сгруппированное количество.
ВыгрузкаКоличество = Товары.Выгрузить(,"Товар, Количество");
ВыгрузкаКоличество.Свернуть("Товар", "Количество");
Для Каждого СтрокаТЧ Из Товары Цикл
Товар = СтрокаТЧ.Товар;
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Товар);
Отбор.Вставить("Склад", СкладТовара);
// Вместо стандартного реквизита Дата используем метод МоментВремени() = получить актуальное время документа.
// Таким образом, можно проверять остатки даже у документов с неоперативным проведением.
ДанныеИзРегистра = РегистрыНакопления.ОстаткиТоваров.Остатки(МоментВремени(), Отбор, "Номенклатура, Склад");
Если ДанныеИзРегистра.Количество() > 0 Тогда
ОстатокТовара = ДанныеИзРегистра[0].Количество;
Иначе
ОстатокТовара = 0;
КонецЕсли;
// Сравниваем со значением в регистре остатков количество, просуммированное по одинаковым товарным позициям.
СтрокаТовара = ВыгрузкаКоличество.Найти(Товар, "Товар");
ОбщееКоличество = СтрокаТовара.Количество;
Если ОбщееКоличество > ОстатокТовара Тогда
Результат = Ложь;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции