• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Контроль остатков.

  • Автор темы Greml1N
  • Дата начала
G

Greml1N

Всем привет. Тут столкнулся с популярной проблемой. Но чёткого решения не нашёл. В УТ при неоперативном проведении документов не учитывается контроль остатков. Т.е спокойной можно уйти в минус. Как решить эту проблему ?
 
D

Darlock

проверить запрос получения остатков при проведении документа. Параметр должен быть "МоментВремени".
 
G

Greml1N

В итоге была написано функция имеющая вид: Работает если товар есть на складе(неважно хватает или нет,считает и выдаёт недостаток)

Для каждого Движение из ДвиженияТоварыНаСкладах цикл
ТекНоменклатура=Движение.Номенклатура;
ТекСклад=Склад;

ТекКол=Движение.Количество;

Запрос = Новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура
| И ТоварыНаСкладахОстатки.Склад = &Склад";

Запрос.УстановитьПараметр("Номенклатура",ТекНоменклатура);
Запрос.УстановитьПараметр("Склад",ТекСклад);
Результат=Запрос.Выполнить();
ВыборкаТоваров=Результат.Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл

//Контроль нехватки
Выборка=ВыборкаТоваров.Остаток;
Нехватка=ВыборкаТоваров.Остаток-ТекКол;
Если

//Выборка=Неопределено
нехватка<0

Тогда
;
Сообщить("Нехватает товара" +" "+ ТекНоменклатура +" "+ "Количеством" +" "+ Нехватка);

возврат Истина ;
иначе
возврат Ложь;

КонецЕсли;

КонецЦикла;
КонецЦикла;

Проблемы теперь в том что не идёт проверка если товара нет на складе.Выборка=Неопределено не получается,даже не знаю почему. Подскажите как можно осуществить проверку товара которого нету на складе.
 
P

puh14

А ты результат на количество строк проверяй.
 
D

Darlock

А если еще и дублирующие строки есть в табличной части?
 
Д

Дайнеко

Классика, она такова:
Код:
ОстКоличества = 0;
ВыборкаТоваров=Результат.Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл
ОстКоличества = ВыборкаТоваров.Остаток;
КонецЦикла


// А здесь уже Контроль нехватки
Если
КонецЕсли;

Надо инициализировать переменную до цикла
 
U

User1C

Вот тебе рабочий код с проверкой на остаток и т.д.

Код:
ТаблЗн = Новый ТаблицаЗначений;
ТаблЗн.Колонки.Добавить("ВидДвижения");
ТаблЗн.Колонки.Добавить("Период");
ТаблЗн.Колонки.Добавить("Номенклатура");
ТаблЗн.Колонки.Добавить("Контрагент");
ТаблЗн.Колонки.Добавить("Количество");

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	Номенклатура,
|	Списание.Контрагент,
|	СУММА(Количество) КАК Количество
|	
|ПОМЕСТИТЬ ДокТовары
|
|ИЗ
|	Документ.СписаниеТоваров.Товары КАК Списание
|ГДЕ
|	Списание.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
|	Номенклатура,
|	Списание.Контрагент
|;
|
|ВЫБРАТЬ
|	ДокТовары.Номенклатура,
|	ДокТовары.Контрагент,
|	ДокТовары.Количество,	
|	ЕСТЬNULL(Остатки.КоличествоОстаток,0) КАК Остаток
|	
|ИЗ ДокТовары КАК ДокТовары
|
|	ЛЕВОЕ СОЕДИНЕНИЕ
|	РегистрНакопления.РегистрПриход.Остатки(&МоментВремени,Номенклатура В(
|																		ВЫБРАТЬ РАЗЛИЧНЫЕ
|																			ДокТовары.Номенклатура
|																		ИЗ
|																			ДокТовары КАК ДокТовары)) КАК Остатки
|	ПО
|	(ДокТовары.Номенклатура = Остатки.Номенклатура)
|	И
|	(ДокТовары.Контрагент = Остатки.Контрагент)
|	
|УПОРЯДОЧИТЬ ПО
|	ДокТовары.Номенклатура
|	
|ИТОГИ
|	МИНИМУМ(Количество),
|	СУММА(Остаток)
|ПО
|	ДокТовары.Номенклатура
|
|		
|		
|";
Запрос.УстановитьПараметр("МоментВремени",МоментВремени());	 //Момент времени документа
Запрос.УстановитьПараметр("Ссылка",	Ссылка);	 //Ссылка на документ
РезультатЗапроса = Запрос.Выполнить();	

ВыборкаИтогОбщий = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаИтогОбщий.Следующий()=1 Цикл

Выборка = ВыборкаИтогОбщий.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий()=1 Цикл

Если Выборка.Количество>Выборка.Остаток Тогда
Сообщить("Не хватает товара "	+ 
Выборка.Номенклатура		+
",из необходимых "			+
Выборка.Количество			+ 
" за " + Выборка.Контрагент+
" в остатках имеется только " + 
Выборка.Остаток);

Отказ = Истина;	
КонецЕсли; 

Стр = ТаблЗн.Добавить();
ЗаполнитьЗначенияСвойств(Стр,Выборка,"Номенклатура,Контрагент,Количество");
КонецЦикла;

Если Отказ=Истина Тогда
Продолжить;
КонецЕсли; 

КонецЦикла; 

ТаблЗн.ЗаполнитьЗначения(Дата,"Период"); //Заполним Колонку период датой проведения
ТаблЗн.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход,"ВидДвижения");	

Движения.РегистрПриход.Загрузить(ТаблЗн);
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!