Списание со склада

1. user1068267 15.10.18 22:53 Сейчас в теме
Нужно сделать так, чтобы при попытке списать со склада товар, которого там нет, выводилась ошибка. Код выдает ошибку на списание любого товара, вне зависимости есть он на складе или нет, и выводит ее 4 раза подряд. Может кто-нибудь помочь решить проблему?

Запрос = Новый Запрос;  
 Запрос.Текст =   
   "ВЫБРАТЬ
  |	СкладСИЗОстатки.СИЗ
  |ИЗ
  |	РегистрНакопления.СкладСИЗ.Остатки КАК СкладСИЗОстатки"
       ;
	   РезультатЗапроса = Запрос.Выполнить();    
 ТаблицаЗначений = Новый ТаблицаЗначений;  
 ТаблицаЗначений.Колонки.Добавить("СИЗ");     
 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();  
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл    
	 Для каждого СтрокаТабЧасти Из СписаниеС Цикл        
		 Если СтрокаТабЧасти.СИЗ <> ВыборкаДетальныеЗаписи.СИЗ 
			 Тогда     
			 НоваяСтрока = ТаблицаЗначений.Добавить();      
			 НоваяСтрока.СИЗ = СтрокаТабЧасти.СИЗ;         
		 КонецЕсли;     
	 КонецЦикла;  
 КонецЦикла;  
 Если ТаблицаЗначений.Количество() > 0 Тогда      
	 Для каждого Строка Из ТаблицаЗначений Цикл     
		 Сообщение = Новый СообщениеПользователю;     
		 Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";     
		 Сообщение.Сообщить();     
	 КонецЦикла;          
	 Отказ = Истина;    
 КонецЕсли;     
 
 Движения.СкладСИЗ.Записывать = Истина;  
 Для Каждого ТекСтрокаСписаниеСиз Из СписаниеС Цикл   
	 Движение = Движения.СкладСИЗ.Добавить();   
	 Движение.ВидДвижения = ВидДвиженияНакопления.Расход;   
	 Движение.Период = Дата;    
	 Движение.СИЗ = ТекСтрокаСписаниеСИЗ.СИЗ;   
 КонецЦикла;
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. eksetro 6 16.10.18 00:11 Сейчас в теме
Может лучше воспользоваться типовой наработкой? https:// /articles/2017-02-12-two-methods-for-inventory-check/ , если нет еще ссылки на документ, то табличную часть преобразовать в таблицу значений и использовать в запросе.
+
3. user1068267 16.10.18 00:34 Сейчас в теме
Ваша ссылка не открывается.
Мой код нельзя превратить в рабочий?
+
9. eksetro 6 16.10.18 17:58 Сейчас в теме
(3) погуглите “Новая” и “старая” методики контроля отрицательных остатков, первая же ссылка от "курсы-по-1с_рф", все очень доступно написано. По поводу превратить в рабочий, иногда лучшее лечение это удаление и написание заново.
+
4. catena 110 16.10.18 06:09 Сейчас в теме
При сравнении каждой строки выборки с каждой строкой документа, каждый(-ое) СИЗ из ТЗ обязательно хоть раз не найдется.
Рекомендую посмотреть методы таблицы значений Найти(), НайтиСтроки(), метод выборки НайтиСледующий(), так же изучить соединения в запросе и передачу ТЗ в запрос параметром.

При желании можно ознакомиться с методикой пост-проверки остатков: документ проводится, после проведения проверяется отрицательный остаток на складе и в случае обнаружения, проведение откатывается.
+
6. user1068267 16.10.18 09:47 Сейчас в теме
(4) Я совсем недавно начала с этим разбираться и мне еще многое непонятно. Можете конкретно сказать где ошибка и как ее исправить? До этого у меня был код, в котором прописывался запрет на списание товара большего количества, чем есть на складе. Вот он работает хорошо. Но при этом позволяет списывать то, чего вообще нет
+
8. catena 110 16.10.18 09:59 Сейчас в теме
(6)Нет, простите, не могу. Тут таких "добрых людей" много, код вам напишут. Но толку? Я написала, в какую сторону копать, если хотите разобраться, читайте документацию в указанном направлении. Не хотите, ждите копипаста.
+
5. ranis888 104 16.10.18 08:39 Сейчас в теме
Если ТаблицаЗначений.Количество() > 0 Тогда 
Для каждого Строка Из ТаблицаЗначений Цикл 
Сообщение = Новый СообщениеПользователю; 
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". "; 
Сообщение.Сообщить(); 
КонецЦикла; 
Отказ = Истина; 
КонецЕсли; 


Думаю тут нужно условие проверки остатков ?

Если ТаблицаЗначений.Количество() > 0 Тогда 
Для каждого Строка Из ТаблицаЗначений Цикл 
Если Строка.Остатков > 0 тогда
Иначе
Сообщение = Новый СообщениеПользователю; 
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". "; 
Сообщение.Сообщить(); 
КонецЕсли;
КонецЦикла; 
Отказ = Истина; 
КонецЕсли; 
Показать
+
7. starjevschik 16.10.18 09:51 Сейчас в теме
мда уж.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СкладСИЗОстатки.СИЗ
|ИЗ
| РегистрНакопления.СкладСИЗ.Остатки КАК СкладСИЗОстатки"
;
РезультатЗапроса = Запрос.Выполнить();

Показать

тут вот у нас в выборке, надо полагать, текущие остатки на складе? Так? Если так, что что нам надо проверить в табличной части? Что товар из строки в этой выборке отсутствует. Я правильно рассуждаю?
Как же мы это проверим?
ТаблицаОстатков = РезультатЗапроса.Выгрузить();
Для Каждого Строка Из ТЧ Цикл
Если ТаблицаОстатков.НайтиЗначение(Строка.СИЗ, "СИЗ") = Неопределено Тогда
// то, что есть в строке ТЧ, отсутствует в остатках
Сообщить("Этого на складе нет " + Строка.СИЗ);
КонецЦикла;



зачем вот это все остальное?
ну о том, что вообще все это делается не так, я уж не говорю...

ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("СИЗ");
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Для каждого СтрокаТабЧасти Из СписаниеС Цикл
Если СтрокаТабЧасти.СИЗ <> ВыборкаДетальныеЗаписи.СИЗ
Тогда
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.СИЗ = СтрокаТабЧасти.СИЗ;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ТаблицаЗначений.Количество() > 0 Тогда
Для каждого Строка Из ТаблицаЗначений Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";
Сообщение.Сообщить();
КонецЦикла;
Отказ = Истина;
КонецЕсли;

Движения.СкладСИЗ.Записывать = Истина;
Для Каждого ТекСтрокаСписаниеСиз Из СписаниеС Цикл
Движение = Движения.СкладСИЗ.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.СИЗ = ТекСтрокаСписаниеСИЗ.СИЗ;
КонецЦикла;
Показать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот