Создан документ с проверкой остатков на складе
Не срабатывает контроль остатков. Запрос для проверки пустой, но если сместить границу на одну секунду, то отрицательные остатки тут же находятся. Интересно то, что есть другой документ с точно таким кодом, но там контроль остатков срабатывает как надо. Не могу понять где ошибка.
// 1. Получение запросом данных документа
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА Комплектация.ТипДвижения = &Разборка
| ТОГДА Комплектация.Номенклатура
| КОНЕЦ КАК Штрихкод,
| ВЫБОР
| КОГДА Комплектация.ТипДвижения = &Разборка
| ТОГДА Комплектация.Склад
| КОНЕЦ КАК Склад
|ПОМЕСТИТЬ НоменклатураДокументРазборкаХранение
|ИЗ
| Документ.Комплектация КАК Комплектация
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
| ПО (КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка)
|ГДЕ
| Комплектация.Ссылка = &Ссылка
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Комплектация.Номенклатура КАК НоменклатураРодитель,
| Комплектация.Штрихкод КАК ШтрихкодРодитель,
| Комплектация.Склад КАК СкладРодитель,
| Комплектация.ТипДвижения КАК ТипДвижения
|ИЗ
| Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация КАК Комплектация
| ПО КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка
|ГДЕ
| КомплектацияТаблЧастьДетали.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Разборка", Перечисления.ВидыКомплектаций.Разборка);
РезультатОбщегоЗапроса = Запрос.Выполнить();
// 2. Формирование движений регистра
Движения.РегистрХранения.Очистить();
Движения.РегистрХранения.БлокироватьДляИзменения = Истина;
Движения.СпецификацияНоменклатуры.Очистить();
Движения.СпецификацияНоменклатуры.БлокироватьДляИзменения = Истина;
ВыборкаНоменклатура = РезультатОбщегоЗапроса.Выбрать();
Пока ВыборкаНоменклатура.Следующий() Цикл
Тип = ВыборкаНоменклатура.ТипДвижения;
НоменклатураРодитель = ВыборкаНоменклатура.НоменклатураРодитель;
ШтрихкодРодитель = ВыборкаНоменклатура.ШтрихкодРодитель;
СкладРодитель = ВыборкаНоменклатура.СкладРодитель;
Если Тип = Перечисления.ВидыКомплектаций.Разборка Тогда
Движение = Движения.РегистрХранения.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Документ = Ссылка;
Движение.Номенклатура = НоменклатураРодитель;
Движение.Штрихкод = ШтрихкодРодитель;
Движение.Склад = СкладРодитель;
Движение.Количество = 1;
КонецЕсли;
КонецЦикла;
// 3. Запись движений в БД
Движения.РегистрХранения.Записывать = Истина;
Движения.Записать();
Движения.СпецификацияНоменклатуры.Записывать = Истина;
Движения.Записать();
// 4. Запрос, получающий отрицательные остатки из регистра
Запрос.Текст =
"ВЫБРАТЬ
| РегистрХраненияОстатки.Штрихкод КАК Штрихкод,
| -РегистрХраненияОстатки.КоличествоОстаток КАК Дефицит
|ИЗ
| РегистрНакопления.РегистрХранения.Остатки(
| &МоментВремени,
| (Штрихкод, Склад) В
| (ВЫБРАТЬ
| НоменклатураДокументРазборкаХранение.Штрихкод,
| НоменклатураДокументРазборкаХранение.Склад
| ИЗ
| НоменклатураДокументРазборкаХранение)) КАК РегистрХраненияОстатки
|ГДЕ
| РегистрХраненияОстатки.КоличествоОстаток < 0";
ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
РезультатЗапроса = Запрос.Выполнить();
// 5. Вывод сообщений о недостатке товаров
Если Не РезультатЗапроса.Пустой() Тогда
//Отказ = Истина;
ВыборкаОшибки = РезультатЗапроса.Выбрать();
Пока ВыборкаОшибки.Следующий() Цикл
Сообщить("Товара "+ВыборкаОшибки.Штрихкод+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.");
КонецЦикла;
Возврат;
КонецЕсли;
ПоказатьНе срабатывает контроль остатков. Запрос для проверки пустой, но если сместить границу на одну секунду, то отрицательные остатки тут же находятся. Интересно то, что есть другой документ с точно таким кодом, но там контроль остатков срабатывает как надо. Не могу понять где ошибка.
По теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) База тестовая, там документов немного. Тут 100% должен быть отрицательный остаток, просто потому, что я списываю со склада на котором номенклатуры никогда не было.
вот регистр. Я на "Склад ИТ" не оприходовал "Тест", его вообще нельзя оттуда списать.
вот регистр. Я на "Склад ИТ" не оприходовал "Тест", его вообще нельзя оттуда списать.
Прикрепленные файлы:
(11)Ну так и разбирайтесь с запросом. Если запрос ничего не выдает, значит или в параметрах, или в отборах что-то не то.
Уберите отбор в виртуальной таблице остатков, посмотрите что выдает в остатках без этого отбора.
Посмотрите что во временной таблице НоменклатураДокументРазборкаХранение.
Тут как бы не так много вариантов того, в чем проблема.
Уберите отбор в виртуальной таблице остатков, посмотрите что выдает в остатках без этого отбора.
Посмотрите что во временной таблице НоменклатураДокументРазборкаХранение.
Тут как бы не так много вариантов того, в чем проблема.
(12) Если бы все было так просто, то я бы и не писал.
Во временной таблице все что надо, т.е. и склад и номенклатура. Если убрать отбор по моменту времени, то запрос отрабатывает как надо. Если задать момент времени, но на секунду больше, то тоже все в порядке. Но вот с моментом времени но строго по документу запрос выдает некорректные данные. Проблема именно в моменте времени, но что именно не так я не понимаю
Во временной таблице все что надо, т.е. и склад и номенклатура. Если убрать отбор по моменту времени, то запрос отрабатывает как надо. Если задать момент времени, но на секунду больше, то тоже все в порядке. Но вот с моментом времени но строго по документу запрос выдает некорректные данные. Проблема именно в моменте времени, но что именно не так я не понимаю
// 3. Запись движений в БД
Движения.РегистрХранения.Записывать = Истина;
Движения.Записать();
Движения.СпецификацияНоменклатуры.Записывать = Истина;
Движения.Записать();
замените на
// 3. Запись движений в БД
Движения.РегистрХранения.Записывать = Истина;
Движения.СпецификацияНоменклатуры.Записывать = Истина;
Движения.Записать();
Показать(13)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот