Создан документ с проверкой остатков на складе

```1c
    // 1. Получение запросом данных документа

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ВЫБОР
    | КОГДА Комплектация.ТипДвижения = &Разборка
    | ТОГДА Комплектация.Номенклатура
    | КОНЕЦ КАК Штрихкод,
    | ВЫБОР
    | КОГДА Комплектация.ТипДвижения = &Разборка
    | ТОГДА Комплектация.Склад
    | КОНЕЦ КАК Склад
    |ПОМЕСТИТЬ НоменклатураДокументРазборкаХранение
    |ИЗ
    | Документ.Комплектация КАК Комплектация
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
    | ПО (КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка)
    |ГДЕ
    | Комплектация.Ссылка = &Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | Комплектация.Номенклатура КАК НоменклатураРодитель,
    | Комплектация.Штрихкод КАК ШтрихкодРодитель,
    | Комплектация.Склад КАК СкладРодитель,
    | Комплектация.ТипДвижения КАК ТипДвижения
    |ИЗ
    | Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация КАК Комплектация
    | ПО КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка
    |ГДЕ
    | КомплектацияТаблЧастьДетали.Ссылка = &Ссылка";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Разборка", Перечисления.ВидыКомплектаций.Разборка);
    РезультатОбщегоЗапроса = Запрос.Выполнить();

    // 2. Формирование движений регистра
    Движения.РегистрХранения.Очистить();
    Движения.РегистрХранения.БлокироватьДляИзменения = Истина;
    Движения.СпецификацияНоменклатуры.Очистить();
    Движения.СпецификацияНоменклатуры.БлокироватьДляИзменения = Истина;
    ВыборкаНоменклатура = РезультатОбщегоЗапроса.Выбрать();

    Пока ВыборкаНоменклатура.Следующий() Цикл
    Тип = ВыборкаНоменклатура.ТипДвижения;

    НоменклатураРодитель = ВыборкаНоменклатура.НоменклатураРодитель;
    ШтрихкодРодитель = ВыборкаНоменклатура.ШтрихкодРодитель;
    СкладРодитель = ВыборкаНоменклатура.СкладРодитель;

    Если Тип = Перечисления.ВидыКомплектаций.Разборка Тогда

    Движение = Движения.РегистрХранения.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Документ = Ссылка;
    Движение.Номенклатура = НоменклатураРодитель;
    Движение.Штрихкод = ШтрихкодРодитель;
    Движение.Склад = СкладРодитель;
    Движение.Количество = 1;

    КонецЕсли;
    КонецЦикла;
    // 3. Запись движений в БД
    Движения.РегистрХранения.Записывать = Истина;
    Движения.Записать();
    Движения.СпецификацияНоменклатуры.Записывать = Истина;
    Движения.Записать();

    // 4. Запрос, получающий отрицательные остатки из регистра
    Запрос.Текст =
    "ВЫБРАТЬ
    | РегистрХраненияОстатки.Штрихкод КАК Штрихкод,
    | -РегистрХраненияОстатки.КоличествоОстаток КАК Дефицит
    |ИЗ
    | РегистрНакопления.РегистрХранения.Остатки(
    | &МоментВремени,
    | (Штрихкод, Склад) В
    | (ВЫБРАТЬ
    | НоменклатураДокументРазборкаХранение.Штрихкод,
    | НоменклатураДокументРазборкаХранение.Склад
    | ИЗ
    | НоменклатураДокументРазборкаХранение)) КАК РегистрХраненияОстатки
    |ГДЕ
    | РегистрХраненияОстатки.КоличествоОстаток < 0";

    ГраницаКонтроля = Новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр("МоментВремени", ГраницаКонтроля);
    РезультатЗапроса = Запрос.Выполнить();

    // 5. Вывод сообщений о недостатке товаров
    Если Не РезультатЗапроса.Пустой() Тогда
    //Отказ = Истина;
    ВыборкаОшибки = РезультатЗапроса.Выбрать();
    Пока ВыборкаОшибки.Следующий() Цикл
    Сообщить("Товара "+ВыборкаОшибки.Штрихкод+" недостаточно в количестве "+ВыборкаОшибки.Дефицит+" шт.");
    КонецЦикла;
    Возврат;
    КонецЕсли;
```

Не срабатывает контроль остатков. Запрос для проверки пустой, но если сместить границу на одну секунду, то отрицательные остатки тут же находятся. Интересно то, что есть другой документ с точно таким кодом, но там контроль остатков срабатывает как надо. Не могу понять где ошибка.
---
Вот ваша временная таблица, по которой вы фильтруете остатки
---
Как и говорил, все просто.
Проблема во временной таблице.
У вас во временной таблице Штрихкод это Номенклатура.
А отбор в виртуальной таблице вы делаете по измерению Штрихкод (строка).
---
документы с одинаковым временем?
для общего развития... https://infostart.ru/public/84177/
---
Нет, у документа уникальное время
---
могу предположить, что на момент времени остаток не отрицательный, а отрицательный остаток делает другой документ в ту же секунду. что в самом регистре РегистрНакопления.РегистрХранения по этой номенклатуре?
---
База тестовая, там документов немного. Тут 100% должен быть отрицательный остаток, просто потому, что я списываю со склада на котором номенклатуры никогда не было.

вот регистр. Я на "Склад ИТ" не оприходовал "Тест", его вообще нельзя оттуда списать.
---
Попробуй пересчитать итоги, я когда готовился к спецу по платформе, иногда удивительные баги замечал при выполнении запросов.
---
База полностью самописная, при попытке включить использование итогов в стандартных выдало сообщение
---
судя по работе с временными таблицами, вы это у Чистова переписали?
проверьте проведение / перепроведение документа
проверьте режим удаления движений
---
Провел, перепровел, отменил проведение. В регистре все отражается корректно
---
минусов нет и при проведении и при перепроведении?
---
В регистре минус отражается и при проведении и при перепроведении, а вот запрос всегда показывает отсутствие отрицательных остатков на момент времени.
---
Ну так и разбирайтесь с запросом. Если запрос ничего не выдает, значит или в параметрах, или в отборах что-то не то.
Уберите отбор в виртуальной таблице остатков, посмотрите что выдает в остатках без этого отбора.
Посмотрите что во временной таблице НоменклатураДокументРазборкаХранение.
Тут как бы не так много вариантов того, в чем проблема.
---
Если бы все было так просто, то я бы и не писал.

Во временной таблице все что надо, т.е. и склад и номенклатура. Если убрать отбор по моменту времени, то запрос отрабатывает как надо. Если задать момент времени, но на секунду больше, то тоже все в порядке. Но вот с моментом времени но строго по документу запрос выдает некорректные данные. Проблема именно в моменте времени, но что именно не так я не понимаю
---
```1c
    // 3. Запись движений в БД
    Движения.РегистрХранения.Записывать = Истина;
    Движения.Записать();
    Движения.СпецификацияНоменклатуры.Записывать = Истина;
    Движения.Записать();

    замените на
    // 3. Запись движений в БД
    Движения.РегистрХранения.Записывать = Истина;
    Движения.СпецификацияНоменклатуры.Записывать = Истина;
    Движения.Записать();
```

(13)
---
Сделал, не помогло
---
Киньте базу
---
документ "Комплектация", тип документа "Разборка", заходите под гостем без пароля, я ему дал админские права.
---
Как и говорил, все просто.
Проблема во временной таблице.
У вас во временной таблице Штрихкод это Номенклатура.
А отбор в виртуальной таблице вы делаете по измерению Штрихкод (строка).
---
Мне прям стыдно стало за такую глупую ошибку. Конец года, запара, туплю дико. Спасибо вам огромное.
---
Да не за что) бывает.
---
А почему вы ищете отрицательные остатки на момент времени документа?
На сколько я помню, по методическим указаниям 1С остатки проверяются текущие...
---
Обработка движений сделана как раз таки по последним рекомендациям.
---
возможно что-то изменилось) не отслеживал)
---
Самое интересное, что в других документах эта конструкция работает.
---
Самое интересное что надо внимательнее смотреть в отладчике
---
Попробуйте закомментировать блокировку регистров на изменение, или снять её перед записью движений
---
Не помогло
---
Вот ваша временная таблица, по которой вы фильтруете остатки
---
Да, я уже понял выше свою глупость. Причем в отладчик я заходил неоднократно и видел эту картину, но логической сцепки в мозгу не произошло, хотя тут все очевидно.
---
бывает такое)))
---
Обратите внимание на колонку ШТРИХКОД
---
И проверьте остаток по ШТРИХКОДУ "ТЕСТ"
Он равен 0
---
и Запрос.Пустой() = Истина ... ВСЕГДА
что-то с логикой обработки проведения :)
---
естественно))) внимательнее надо быть....
---
Поэтому то всё и работает