Имя: Пароль:
1C
1С v8
Проверка отрицательных остатков при проведении документа
,
0 19710715
 
11.01.20
16:48
Добрый день всем.
Столкнулся с такой проблемой. Взял для своей задачи из книги Радченко "Практическое пособие разработчика" такой пример для проверки отрицательных остатков на складе после проведения документа непосредственно в процедуре его проведения.
После движений по регистру идет запрос:
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        // Проверить отрицательные остатки
        Запрос3 = Новый Запрос;
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
        Запрос3.Текст = "ВЫБРАТЬ
        |    ОстаткиМатериаловОстатки.Материал,
        |    ОстаткиМатериаловОстатки.КоличествоОстаток
        |ИЗ
        |    РегистрНакопления.ОстаткиМатериалов.Остатки(    ,Материал В
        |                   (ВЫБРАТЬ
        |                        НоменклатураДокумента.Номенклатура
        |                    ИЗ
        |                        НоменклатураДокумента)
        |                    И Склад = &Склад)
        |                   КАК ОстаткиМатериаловОстатки
        |ГДЕ
        |    ОстаткиМатериаловОстатки.КоличествоОстаток < 0";
        Запрос3.УстановитьПараметр("Склад", Склад);
        РезультатЗапроса = Запрос3.Выполнить();
        ТЗ = РезультатЗапроса.Выгрузить();    // для контроля
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) +
            " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """";
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЦикла;

    КонецЕсли;

    В итоге отрицательные остатки не выявляются при их явном наличии (формирую отчет после процедуры проведения), но если я делаю этот же запрос из консоли, отрицательные остатки выявляются.
    Подозреваю, что дело в моменте времени, в который производится проверка. Такое впечатление, что она производится до его окончательного проведения.
1 ДенисЧ
 
11.01.20
17:06
А движения-то созданные записал до проверки?
2 19710715
 
11.01.20
17:23
Да,
Движения.ОстаткиМатериалов.Записывать = Истина;

Но похоже дело в другом. Там для расчета стоимости материалов по среднему значению чуть ранее:

    // Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе
    Движения.СтоимостьМатериалов.Записать();
    Движения.ОстаткиМатериалов.Записать();

   А уже потом после движений проверка отрицательных остатков, но в итоге без учета данного документа. Неужели ошибка в книге?
   Если убираю
   Движения.ОстаткиМатериалов.Записать();
   то остатки контролируются нормально, но стоимость будет расчитываться криво.

   Может все-таки надо после расчета стоимости и после движений и до контроля остатков снова записать?
3 GROOVY
 
11.01.20
17:31
(2) Да, за это обычно убивают :)
4 19710715
 
11.01.20
17:49
Точно в этом дело. Не ожидал такой подставы от Радченко.
Единственное не пойму?
Без принудительного

Движения.ОстаткиМатериалов.Записать();

движения записываются только по окончании процедуры проведения если не было

Отказ = Истина;

? А для чего тогда

Движения.ОстаткиМатериалов.Записывать = Истина;

?
5 19710715
 
11.01.20
17:59
Там еще по третьему регистру движения присутствуют но нигде нет

Движения.Продажи.Записать();

, но документ в итоге по данному регистру проводится нормально. В чем тогда дело?
6 ДенисЧ
 
11.01.20
18:07
(5) А по третьему регистру никто остатки не считает в транзакции проведения. Вот и не записывают явно. И они платформенно записываются по завершении транзакции.

ЗЫ, Может, ты учебник почитаешь, а не методом тыка изучать будешь?
7 19710715
 
11.01.20
18:17
Так я его и читаю. Только его неплохо сначала автору почитать и ошибки исправить,чтоб других в заблуждение не вводить.
8 GROOVY
 
11.01.20
18:21
(7) Почитай учебники. Есть кучка видеоуроков... Ну правда.
9 19710715
 
11.01.20
18:44
Правда? Не, что то тут не то.
Я уже ранее написал:
Если убираю запись пустых наборов записей перед контролем остатков

   Движения.ОстаткиМатериалов.Записать();

то остатки контролируются нормально. То есть до окончания транзакции без принудительной записи движения по данному регистру, эти движения участвуют в контроле и значит каким то образом записаны. Так что вопрос о необходимости явно записывать остается.
10 quest
 
11.01.20
22:31
(7) точно! требуй возврата денег за то что вообще это читать начал.
11 Злопчинский
 
12.01.20
13:31
xt вы стебетесь? дали бы ответ по существу
12 astrawalk
 
12.01.20
13:44
(11) Ответ по-существу. Забыть о контроле отрицательных остатков, как о полностью высосанной из пальца ерунде.
13 Cyberhawk
 
13.01.20
07:33
"Взял для своей задачи из книги Радченко "Практическое пособие разработчика" такой пример для проверки отрицательных остатков на складе после проведения документа" // Ссылку давай на конкретное место в этой книге https://its.1c.ru/db/pubdevguide83
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан