Имя: Пароль:
1C
 
Контроль остатка на складе.
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) Готов протестить...
Как насчет пари?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.