Нужно сделать так, чтобы при попытке списать со склада товар, которого там нет, выводилась ошибка. Код выдает ошибку на списание любого товара, вне зависимости есть он на складе или нет, и выводит ее 4 раза подряд. Может кто-нибудь помочь решить проблему?
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СкладСИЗОстатки.СИЗ
|ИЗ
| РегистрНакопления.СкладСИЗ.Остатки КАК СкладСИЗОстатки"
;
РезультатЗапроса = Запрос.Выполнить();
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("СИЗ");
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Для каждого СтрокаТабЧасти Из СписаниеС Цикл
Если СтрокаТабЧасти.СИЗ <> ВыборкаДетальныеЗаписи.СИЗ
Тогда
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.СИЗ = СтрокаТабЧасти.СИЗ;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ТаблицаЗначений.Количество() > 0 Тогда
Для каждого Строка Из ТаблицаЗначений Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";
Сообщение.Сообщить();
КонецЦикла;
Отказ = Истина;
КонецЕсли;
Движения.СкладСИЗ.Записывать = Истина;
Для Каждого ТекСтрокаСписаниеСиз Из СписаниеС Цикл
Движение = Движения.СкладСИЗ.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.СИЗ = ТекСтрокаСписаниеСИЗ.СИЗ;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Конфигурация "Весовая ред. 3.0" для Платформы 8.3
- ФСБУ 5/2019 "Запасы". Учет малоценного оборудования и запасов. Суть изменений. Видео примеры в Бухгалтерии 3.0
- Шаблоны сообщений пользователю - подсистема БСП
- Перемещение запасов со склада на склад. УНФ
- Склад списания для каждой строки материалов. БП и БП КОРП 3.0
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Может лучше воспользоваться типовой наработкой? https:// /articles/2017-02-12-two-methods-for-inventory-check/ , если нет еще ссылки на документ, то табличную часть преобразовать в таблицу значений и использовать в запросе.
При сравнении каждой строки выборки с каждой строкой документа, каждый(-ое) СИЗ из ТЗ обязательно хоть раз не найдется.
Рекомендую посмотреть методы таблицы значений Найти(), НайтиСтроки(), метод выборки НайтиСледующий(), так же изучить соединения в запросе и передачу ТЗ в запрос параметром.
При желании можно ознакомиться с методикой пост-проверки остатков: документ проводится, после проведения проверяется отрицательный остаток на складе и в случае обнаружения, проведение откатывается.
Рекомендую посмотреть методы таблицы значений Найти(), НайтиСтроки(), метод выборки НайтиСледующий(), так же изучить соединения в запросе и передачу ТЗ в запрос параметром.
При желании можно ознакомиться с методикой пост-проверки остатков: документ проводится, после проведения проверяется отрицательный остаток на складе и в случае обнаружения, проведение откатывается.
(4) Я совсем недавно начала с этим разбираться и мне еще многое непонятно. Можете конкретно сказать где ошибка и как ее исправить? До этого у меня был код, в котором прописывался запрет на списание товара большего количества, чем есть на складе. Вот он работает хорошо. Но при этом позволяет списывать то, чего вообще нет
Если ТаблицаЗначений.Количество() > 0 Тогда
Для каждого Строка Из ТаблицаЗначений Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";
Сообщение.Сообщить();
КонецЦикла;
Отказ = Истина;
КонецЕсли;
Думаю тут нужно условие проверки остатков ?
Если ТаблицаЗначений.Количество() > 0 Тогда
Для каждого Строка Из ТаблицаЗначений Цикл
Если Строка.Остатков > 0 тогда
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
Отказ = Истина;
КонецЕсли;
Показать
мда уж.
тут вот у нас в выборке, надо полагать, текущие остатки на складе? Так? Если так, что что нам надо проверить в табличной части? Что товар из строки в этой выборке отсутствует. Я правильно рассуждаю?
Как же мы это проверим?
зачем вот это все остальное?
ну о том, что вообще все это делается не так, я уж не говорю...
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СкладСИЗОстатки.СИЗ
|ИЗ
| РегистрНакопления.СкладСИЗ.Остатки КАК СкладСИЗОстатки"
;
РезультатЗапроса = Запрос.Выполнить();
Показатьтут вот у нас в выборке, надо полагать, текущие остатки на складе? Так? Если так, что что нам надо проверить в табличной части? Что товар из строки в этой выборке отсутствует. Я правильно рассуждаю?
Как же мы это проверим?
ТаблицаОстатков = РезультатЗапроса.Выгрузить();
Для Каждого Строка Из ТЧ Цикл
Если ТаблицаОстатков.НайтиЗначение(Строка.СИЗ, "СИЗ") = Неопределено Тогда
// то, что есть в строке ТЧ, отсутствует в остатках
Сообщить("Этого на складе нет " + Строка.СИЗ);
КонецЦикла;
зачем вот это все остальное?
ну о том, что вообще все это делается не так, я уж не говорю...
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("СИЗ");
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Для каждого СтрокаТабЧасти Из СписаниеС Цикл
Если СтрокаТабЧасти.СИЗ <> ВыборкаДетальныеЗаписи.СИЗ
Тогда
НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока.СИЗ = СтрокаТабЧасти.СИЗ;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ТаблицаЗначений.Количество() > 0 Тогда
Для каждого Строка Из ТаблицаЗначений Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "На складе отсутствует " + Строка.СИЗ + ". ";
Сообщение.Сообщить();
КонецЦикла;
Отказ = Истина;
КонецЕсли;
Движения.СкладСИЗ.Записывать = Истина;
Для Каждого ТекСтрокаСписаниеСиз Из СписаниеС Цикл
Движение = Движения.СкладСИЗ.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.СИЗ = ТекСтрокаСписаниеСИЗ.СИЗ;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот