|
Контроль остатка на складе. | ☑ | ||
---|---|---|---|---|
0
Алекс55555
12.10.15
✎
22:40
|
При проведении расходной накладной при нехватке товара необходимо выдавать сообщение и не позволять провести документ .
Для упрощения - я опустил склады ( считаем что склад один ). Вот текст , но почему-то не работает.Подскажите пожалуйста. Процедура ОбработкаПроведения(Отказ, Режим) Движения.УчетТоваров.Записывать = Истина; Для Каждого ТекСтрокаПеречень Из Перечень Цикл Движение = Движения.УчетТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Склад = Склад; Движение.Номенклатура = ТекСтрокаПеречень.Номенклатура; Движение.Количество = ТекСтрокаПеречень.Количество; КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяПеречень.Номенклатура, | СУММА(РасходнаяНакладнаяПеречень.Количество) КАК Количество |ПОМЕСТИТЬ ДокТЧ |ИЗ | Документ.РасходнаяНакладная.Перечень КАК РасходнаяНакладнаяПеречень |ГДЕ | РасходнаяНакладнаяПеречень.Номенклатура = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяПеречень.Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | УчетТоваровОстатки.Номенклатура, | УчетТоваровОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.УчетТоваров.Остатки( | , | Номенклатура В | (ВЫБРАТЬ | ДокТЧ.Номенклатура | ИЗ | ДокТЧ КАК ДокТЧ)) КАК УчетТоваровОстатки |ГДЕ | УчетТоваровОстатки.КоличествоОстаток < 0"; Запрос.УстановитьПараметр("Ссылка",Ссылка); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда Отказ = ИСТИНА; ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ("Остаток на складе маленький "); Сообщение.Сообщить(); КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
1
Алекс55555
12.10.15
✎
22:49
|
Но все равно проводит расходную накладную , и остаток уходит в минус.
|
|||
2
Мимохожий Однако
12.10.15
✎
22:51
|
Как страшно жить
|
|||
3
Sun_Storm
12.10.15
✎
22:56
|
При такой проверке остатка перед запросом надо записать движения.
|
|||
4
GreatOne
12.10.15
✎
22:59
|
Записать();
|
|||
5
Алекс55555
12.10.15
✎
23:20
|
(4) Написал
Движения.Записать(); Ничего не изменилось к сожалению , все также уходят в минус остатки. |
|||
6
Ринат-СПб
12.10.15
✎
23:22
|
а проверить перед записью движений?
|
|||
7
GreatOne
12.10.15
✎
23:33
|
ты перед запросом надеюсь записал?
|
|||
8
Garykom
гуру
13.10.15
✎
00:11
|
(0)
1. вот нафига тормоза делать? сначала делаем расход и потом еще проверка на минуса 2. а что будет если два разных документа списания одновременно проводят? 3. а что будет если отменят приход? |
|||
9
H A D G E H O G s
13.10.15
✎
00:15
|
(8) "1. вот нафига тормоза делать? сначала делаем расход и потом еще проверка на минуса "
Что не так? |
|||
10
H A D G E H O G s
13.10.15
✎
00:16
|
Запрос - переписать.
Остатки - фильтровать соединением с временной таблицей, без всяких параметров Виртуальной таблицы. |
|||
11
Garykom
гуру
13.10.15
✎
00:17
|
(9) ну кому то может и так...
а кто то сначала считает деньги в кошельке и только потом пытается заплатить чтобы не вышло в процессе оплаты что их не хватает |
|||
12
Garykom
гуру
13.10.15
✎
00:22
|
(11) этот вопрос уже обсуждался кстати
2 или 3 действия: 1. сделать движения в возможный минус 2. проверить наличие минусов (причем по конкретным номенклатуре/сериям/партиям в доке) 3. отменить движения - не всегда вместо 1 или 2 действий: 1. проверить наличие свободных остатков 2. сделать движения - не всегда |
|||
13
H A D G E H O G s
13.10.15
✎
00:32
|
(12) Это мнение типичных 1С негов.
Думай, почему вариант в 3 действия - лучше. |
|||
14
Garykom
гуру
13.10.15
✎
00:35
|
(13) это примерно как http://www.anekdot.ru/id/422920/
|
|||
15
itlikbez
13.10.15
✎
00:48
|
(12) Как ни странно, но 2-3 действия более производительны в высоко нагруженной системе.
|
|||
16
Garykom
гуру
13.10.15
✎
00:52
|
(15) а можно поконкретнее?
вот плохо представляю как сначала вычесть, потом сравнить, затем прибавить обратно может быть быстрее чем сначала сравнить, затем ничего не делать? в случае если есть свободные остатки то 2=2 |
|||
17
Горогуля
13.10.15
✎
05:46
|
||||
18
hhhh
13.10.15
✎
06:30
|
(16) уже миллион раз обсуждали: в 3 действия в 2 раза быстрее, именно потому, п.3. - проверяется не всегда, а именно только в 1% всех случаев, в 99% остатки положительные и получаются те же 2 действия. Зато пункты 1 и 2 в первом варианте заметно быстрее.
|
|||
19
Любопытная
13.10.15
✎
07:04
|
|ГДЕ
| РасходнаяНакладнаяПеречень.Номенклатура = &Ссылка - Что это? |
|||
20
Любопытная
13.10.15
✎
07:04
|
Этот запрос никогда не вернет ничего при таких условиях.
|
|||
21
Garykom
гуру
13.10.15
✎
11:34
|
(17) "Вот собственно и вся новая методика контроля остатков. Перечислим плюсы этого метода:"
1. · Нет необходимости соединять в запросе таблицу документа и данными регистров" ага только при проверке на отрицательные один фиг соединяем "РегистрНакопления.ОстаткиТоваров.Остатки" и "ВЫБРАТЬ ДокТЧ.Номенклатура ИЗ ДокТЧ КАК ДокТЧ" разницы никакой между соединением по индексу или проверке на включение в список 2. "· Не надо производить проверку на NULL" А зачем и где нужно производить эту проверку то? 3. "· Нет необходимости получать излишние данные (остатки) для проведения документа. Ведь мы чаще все же записываем документ с правильными цифрами и он проводится, чем документы которые уводят остатки в минус." Слов нет... вообще то мы чаще хотим узнать а есть ли вообще остатки, или их уже кто то забрал/зарезервировал и т.д. Для всех несогласных предлагаю предоставить примеры БД на которых и потестим этот "извращенный метод" и "стандартный" ЗЫ мне кажется Павел эту методу придумал в апреле... |
|||
22
Garykom
гуру
13.10.15
✎
11:35
|
(18) Готов протестить...
Как насчет пари? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |