Имя: Пароль:
1C
 
Получение остатков товара в чеке ккм
0 GrishaRus
 
23.03.24
11:03
Добрый день пытаюсь получить остаток по товару и внести ее в колонку "Остаток"

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

	Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		СтруктураПоиска.Вставить("Номенклатура"  , ОформлениеСтроки.ДанныеСтроки.Номенклатура);
		СтруктураПоиска.Вставить("ХарактеристикаНоменклатуры", ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
		СтруктураПоиска.Вставить("Склад"		 , Склад);
		
		МассивСтрок = ТаблицаОстатков.НайтиСтроки(СтруктураПоиска);
		Остаток=0;
		Если МассивСтрок.Количество() > 0  Тогда
			  Остаток = МассивСтрок[0].КоличествоОстаток;
		КонецЕсли;
		ОформлениеСтроки.Ячейки.Остаток.УстановитьТекст(Остаток);
		Сообщить (Остаток);
	КонецЦикла;

КонецПроцедуры


выдает остаток 0 хотя это не так
1 Волшебник
 
23.03.24
11:02
Зачем так много кода?

Закачайте остатки в соответствие одним маленьким запросом с отбором по массиву ссылок.
Или в таблицу значений, но обязательно проиндексируйте её.
Затем достаньте остаток очень быстро.
2 Волшебник
 
23.03.24
11:02
Кстати, зачем в чеке ККМ остаток? Там нужно отгружаемое количество, остаток точно не нужен
3 Волшебник
 
23.03.24
11:03
(0) Когда приводите фрагменты кода, то не глотайте названия процедур, а то теряется контекст
4 GrishaRus
 
23.03.24
11:05
(1) это конечно все хорошо, но данный код взят из инета и написан был для РМК и там говорят он работает, я знаю что он и в чеке ккм должен работать но я еще не догнал как нужно изменить запрос что бы он заработал :D
5 GrishaRus
 
23.03.24
11:06
(2) для удобства хотелось бы видеть свободный остаток без необходимости заходить в номенклатуру или в подбор
6 АНДР
 
23.03.24
11:37
7 Волшебник
 
23.03.24
11:39
(6) А я не про временные таблицы, а про таблицу значений
8 АНДР
 
23.03.24
11:44
(7) Точно, я невнимателен.
9 rphosts
 
23.03.24
16:39
(4) первое правило бойскаута: после тебя должно быть чище чем было до тебя
10 Михаил Козлов
 
23.03.24
16:49
(0) Вы определяете остатки по временной таблице ТаблицаНоменклатуры (параметр в запросе), а она у Вас пустая.
11 Волшебник
 
23.03.24
18:43
(5) В чеке этого не нужно. Там надо пробивать что принесли