Ошибка момента времени

1. MikhailDr 26.12.19 08:00 Сейчас в теме
Создан документ с проверкой остатков на складе
//  1. Получение запросом данных документа
	
	Запрос = Новый Запрос;     
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;     
	Запрос.Текст =         
		"ВЫБРАТЬ
		|	ВЫБОР
		|		КОГДА Комплектация.ТипДвижения = &Разборка
		|			ТОГДА Комплектация.Номенклатура
		|	КОНЕЦ КАК Штрихкод,
		|	ВЫБОР
		|		КОГДА Комплектация.ТипДвижения = &Разборка
		|			ТОГДА Комплектация.Склад
		|	КОНЕЦ КАК Склад
		|ПОМЕСТИТЬ НоменклатураДокументРазборкаХранение
		|ИЗ
		|	Документ.Комплектация КАК Комплектация
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
		|		ПО (КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка)
		|ГДЕ
		|	Комплектация.Ссылка = &Ссылка
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	Комплектация.Номенклатура КАК НоменклатураРодитель,
		|	Комплектация.Штрихкод КАК ШтрихкодРодитель,
		|	Комплектация.Склад КАК СкладРодитель,
		|	Комплектация.ТипДвижения КАК ТипДвижения
		|ИЗ
		|	Документ.Комплектация.ТаблЧастьДетали КАК КомплектацияТаблЧастьДетали
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Комплектация КАК Комплектация
		|		ПО КомплектацияТаблЧастьДетали.Ссылка = Комплектация.Ссылка
		|ГДЕ
		|	КомплектацияТаблЧастьДетали.Ссылка = &Ссылка";
		     
	Запрос.УстановитьПараметр("Ссылка", Ссылка);     
	Запрос.УстановитьПараметр("Разборка", Перечисления.ВидыКомплектаций.Разборка);
	РезультатОбщегоЗапроса = Запрос.Выполнить();
		
	//  2. Формирование движений регистра     
	Движения.РегистрХранения.Очистить();
	Движения.РегистрХранения.БлокироватьДляИзменения = Истина;
	Движения.СпецификацияНоменклатуры.Очистить();
	Движения.СпецификацияНоменклатуры.БлокироватьДляИзменения = Истина;
	ВыборкаНоменклатура = РезультатОбщегоЗапроса.Выбрать();
	
	Пока ВыборкаНоменклатура.Следующий() Цикл
		Тип = ВыборкаНоменклатура.ТипДвижения;
		
		НоменклатураРодитель = ВыборкаНоменклатура.НоменклатураРодитель;
		ШтрихкодРодитель = ВыборкаНоменклатура.ШтрихкодРодитель;
		СкладРодитель = ВыборкаНоменклатура.СкладРодитель;
		
		Если Тип = Перечисления.ВидыКомплектаций.Разборка Тогда
				
			Движение = Движения.РегистрХранения.Добавить();
			Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
			Движение.Период = Дата;
			Движение.Документ = Ссылка;
			Движение.Номенклатура = НоменклатураРодитель;
			Движение.Штрихкод = ШтрихкодРодитель;
			Движение.Склад = СкладРодитель;
			Движение.Количество = 1;
				
		КонецЕсли;
	КонецЦикла;
	//  3. Запись движений в БД     
	Движения.РегистрХранения.Записывать = Истина;
	Движения.Записать();
	Движения.СпецификацияНоменклатуры.Записывать = Истина;
	Движения.Записать();

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


Не срабатывает контроль остатков. Запрос для проверки пустой, но если сместить границу на одну секунду, то отрицательные остатки тут же находятся. Интересно то, что есть другой документ с точно таким кодом, но там контроль остатков срабатывает как надо. Не могу понять где ошибка.
По теме из базы знаний
Найденные решения
25. DanDy 51 26.12.19 14:21 Сейчас в теме
Вот ваша временная таблица, по которой вы фильтруете остатки
Прикрепленные файлы:
30. Sashares 34 26.12.19 14:24 Сейчас в теме
(19)Как и говорил, все просто.
Проблема во временной таблице.
У вас во временной таблице Штрихкод это Номенклатура.
А отбор в виртуальной таблице вы делаете по измерению Штрихкод (строка).
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. EVKash 14 26.12.19 08:13 Сейчас в теме
(1) документы с одинаковым временем?
для общего развития... https://infostart.ru/public/84177/
3. MikhailDr 26.12.19 08:19 Сейчас в теме
(2) Нет, у документа уникальное время
4. EVKash 14 26.12.19 09:25 Сейчас в теме
(3) могу предположить, что на момент времени остаток не отрицательный, а отрицательный остаток делает другой документ в ту же секунду. что в самом регистре РегистрНакопления.РегистрХранения по этой номенклатуре?
5. MikhailDr 26.12.19 09:33 Сейчас в теме
(4) База тестовая, там документов немного. Тут 100% должен быть отрицательный остаток, просто потому, что я списываю со склада на котором номенклатуры никогда не было.

вот регистр. Я на "Склад ИТ" не оприходовал "Тест", его вообще нельзя оттуда списать.
Прикрепленные файлы:
6. Comrade88 8 26.12.19 09:46 Сейчас в теме
Попробуй пересчитать итоги, я когда готовился к спецу по платформе, иногда удивительные баги замечал при выполнении запросов.
9. MikhailDr 26.12.19 10:01 Сейчас в теме
(6) База полностью самописная, при попытке включить использование итогов в стандартных выдало сообщение
Прикрепленные файлы:
7. Lenten 25 26.12.19 09:47 Сейчас в теме
судя по работе с временными таблицами, вы это у Чистова переписали?
проверьте проведение / перепроведение документа
проверьте режим удаления движений
8. MikhailDr 26.12.19 10:00 Сейчас в теме
(7) Провел, перепровел, отменил проведение. В регистре все отражается корректно
10. Lenten 25 26.12.19 10:04 Сейчас в теме
(8)минусов нет и при проведении и при перепроведении?
11. MikhailDr 26.12.19 10:09 Сейчас в теме
(10) В регистре минус отражается и при проведении и при перепроведении, а вот запрос всегда показывает отсутствие отрицательных остатков на момент времени.
12. Sashares 34 26.12.19 10:48 Сейчас в теме
(11)Ну так и разбирайтесь с запросом. Если запрос ничего не выдает, значит или в параметрах, или в отборах что-то не то.
Уберите отбор в виртуальной таблице остатков, посмотрите что выдает в остатках без этого отбора.
Посмотрите что во временной таблице НоменклатураДокументРазборкаХранение.
Тут как бы не так много вариантов того, в чем проблема.
13. MikhailDr 26.12.19 12:02 Сейчас в теме
(12) Если бы все было так просто, то я бы и не писал.

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

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

(13)
15. MikhailDr 26.12.19 12:40 Сейчас в теме
16. Sashares 34 26.12.19 13:15 Сейчас в теме
19. MikhailDr 26.12.19 13:31 Сейчас в теме
(16) документ "Комплектация", тип документа "Разборка", заходите под гостем без пароля, я ему дал админские права.
Прикрепленные файлы:
1Cv8.dt
30. Sashares 34 26.12.19 14:24 Сейчас в теме
(19)Как и говорил, все просто.
Проблема во временной таблице.
У вас во временной таблице Штрихкод это Номенклатура.
А отбор в виртуальной таблице вы делаете по измерению Штрихкод (строка).
32. MikhailDr 26.12.19 14:43 Сейчас в теме
(30) Мне прям стыдно стало за такую глупую ошибку. Конец года, запара, туплю дико. Спасибо вам огромное.
35. Sashares 34 26.12.19 15:42 Сейчас в теме
17. DanDy 51 26.12.19 13:16 Сейчас в теме
(15) А почему вы ищете отрицательные остатки на момент времени документа?
На сколько я помню, по методическим указаниям 1С остатки проверяются текущие...
20. MikhailDr 26.12.19 13:56 Сейчас в теме
(17) Обработка движений сделана как раз таки по последним рекомендациям.
21. DanDy 51 26.12.19 13:57 Сейчас в теме
(20) возможно что-то изменилось) не отслеживал)
23. MikhailDr 26.12.19 14:03 Сейчас в теме
(21) Самое интересное, что в других документах эта конструкция работает.
24. DanDy 51 26.12.19 14:19 Сейчас в теме
(23) Самое интересное что надо внимательнее смотреть в отладчике
18. DanDy 51 26.12.19 13:18 Сейчас в теме
Попробуйте закомментировать блокировку регистров на изменение, или снять её перед записью движений
22. MikhailDr 26.12.19 13:59 Сейчас в теме
25. DanDy 51 26.12.19 14:21 Сейчас в теме
Вот ваша временная таблица, по которой вы фильтруете остатки
Прикрепленные файлы:
33. MikhailDr 26.12.19 14:45 Сейчас в теме
(25)
Да, я уже понял выше свою глупость. Причем в отладчик я заходил неоднократно и видел эту картину, но логической сцепки в мозгу не произошло, хотя тут все очевидно.
34. DanDy 51 26.12.19 14:46 Сейчас в теме
26. DanDy 51 26.12.19 14:21 Сейчас в теме
Обратите внимание на колонку ШТРИХКОД
27. DanDy 51 26.12.19 14:21 Сейчас в теме
И проверьте остаток по ШТРИХКОДУ "ТЕСТ"
Он равен 0
Comrade88; +1 Ответить
29. Comrade88 8 26.12.19 14:23 Сейчас в теме
(27)
и Запрос.Пустой() = Истина ... ВСЕГДА
что-то с логикой обработки проведения :)
31. DanDy 51 26.12.19 14:24 Сейчас в теме
(29) естественно))) внимательнее надо быть....
28. DanDy 51 26.12.19 14:21 Сейчас в теме
Поэтому то всё и работает
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот