Одинаковый остаток и резерв по разным номенклатурах в таблице

1. user1202776 17.07.19 18:31 Сейчас в теме
Из таблицы "Товары" , в другую таблицу выгружаю нужные мне колонки, потом добавляю остаток и резерв.Почему показывает, что остаток и резерв у разных номенклатур одинаковый?В РС тоже по разным номенклатурам записывает идентичный остаток и резерв.Почему так происходит и как это исправить?
Запрос=Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК Резерв,
	             |	ЕСТЬNULL(ВложенныйЗапрос.КоличествоОстаток, 0) КАК Остаток,
	             |	ВозвратТоваровОтПокупателяТовары.Номенклатура
	             |ИЗ
	             |	Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
	             |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ) КАК ТоварыВРезервеНаСкладахОстатки
	             |		ПО ВозвратТоваровОтПокупателяТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
	             |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	             |			ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
	             |			ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
	             |		ИЗ
	             |			РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
	             |		
	             |		СГРУППИРОВАТЬ ПО
	             |			ТоварыНаСкладахОстатки.Номенклатура,
	             |			ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ВложенныйЗапрос
	             |		ПО ВозвратТоваровОтПокупателяТовары.Номенклатура = ВложенныйЗапрос.Номенклатура
	             |ГДЕ
	             |	ВозвратТоваровОтПокупателяТовары.Ссылка.Ссылка = &Ссылка
	             |
	             |СГРУППИРОВАТЬ ПО
	             |	ВозвратТоваровОтПокупателяТовары.Номенклатура,
	             |	ЕСТЬNULL(ВложенныйЗапрос.КоличествоОстаток, 0),
	             |	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)";
	Запрос.УстановитьПараметр("Ссылка",Ссылка);
	Запрос.УстановитьПараметр("НачалоПериода",ТекущаяДата());
	Выборка=Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
	КонецЦикла;
	
ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
Форма = ПолучитьФорму("РегистрСведений.ЛогРедактированияДокументов.Форма.Возврат", , ЭлементыФормы.Товары);
Форма.КлючУникальности = ТекущиеДанные.ИдентификаторСтроки;		
Форма.ТабТовары =ДокументОбъект.Товары.Выгрузить(,"Номенклатура,Количество,Цена,Сумма");
Форма.ТабТовары.Колонки.Добавить("ПричинаИзменения", Новый ОписаниеТипов("СправочникСсылка.AV_ПричиныУрезанияНоменклатуры"));
Форма.ТабТовары.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("УникальныйИдентификатор"));
Форма.ТабТовары.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Форма.ТабТовары.Колонки.Добавить("Резерв", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Форма.ЭлементыФормы.ТабТовары.СоздатьКолонки();
Для Каждого Запись Из Форма.ТабТовары Цикл 
	Запись.Остаток=Выборка.Остаток;
	Запись.Резерв=Выборка.Резерв;
	КонецЦикла;
ЗаполнитьЗначенияСвойств(Форма.ТабТовары,ПервоначальныеДанные);
Топ=Форма.ТабТовары;
Форма.ОткрытьМодально();

 ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
 Для Каждого Данные из ПервоначальныеДанные Цикл 
		КонецЦикла;

Для Каждого Строка Из Топ Цикл
Если ТекущиеДанные.Количество<>Строка.Количество Тогда
			ТекстВопроса = "Данные будут записаны в регистр сведений. Заполнить?";
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );
		Если Ответ = КодВозвратаДиалога.Да Тогда

	НаборЗаписей = РегистрыСведений.ЛогРедактированияДокументов.СоздатьНаборЗаписей();
		НоваяЗапись = НаборЗаписей.Добавить();
		НоваяЗапись.Документ =Ссылка;
		НоваяЗапись.Было =Строка.Количество;
		НоваяЗапись.Стало =Строка.Количество;
		НоваяЗапись.Остаток =Выборка.Остаток;
		НоваяЗапись.Резерв =Выборка.Резерв;
		НоваяЗапись.ПричинаИзменения =Строка.ПричинаИзменения;
		НоваяЗапись.Товар =Строка.Номенклатура;
		НоваяЗапись.Пользователь =ПараметрыСеанса.ТекущийПользователь;
		НоваяЗапись.Период =ТекущаяДата();
		НаборЗаписей.Записать(Ложь);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. antz 17.07.19 18:40 Сейчас в теме
Потому что сначала проходит ВЕСЬ цикл по выборке из запроса:

Пока Выборка.Следующий() Цикл
КонецЦикла;


а потом в цикле по таблице ты каждой строке присваиваешь ПОСЛЕДНЕЕ значение выборки, т.к. после цикла она спозиционирована на последнем значении:

Для Каждого Запись Из Форма.ТабТовары Цикл 
    Запись.Остаток=Выборка.Остаток;
    Запись.Резерв=Выборка.Резерв;
КонецЦикла;


Уже тридцать пятую тему подряд тебе об этом твердят.
user1135816; +1 Ответить
3. user1202776 17.07.19 19:18 Сейчас в теме
(2)как правильно сделать?
4. Teut_Vlad 191 17.07.19 22:43 Сейчас в теме
Попробуй так
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
|    ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК Резерв,
|    ЕСТЬNULL(ВложенныйЗапрос.КоличествоОстаток, 0) КАК Остаток,
|    ВозвратТоваровОтПокупателяТовары.Номенклатура
|ИЗ
|    Документ.ВозвратТоваровОтПокупателя.Товары КАК ВозвратТоваровОтПокупателяТовары
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ) КАК ТоварыВРезервеНаСкладахОстатки
|        ПО ВозвратТоваровОтПокупателяТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
|        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
|            ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
|        ИЗ
|            РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
|        
|        СГРУППИРОВАТЬ ПО
|            ТоварыНаСкладахОстатки.Номенклатура,
|            ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ВложенныйЗапрос
|        ПО ВозвратТоваровОтПокупателяТовары.Номенклатура = ВложенныйЗапрос.Номенклатура
|ГДЕ
|    ВозвратТоваровОтПокупателяТовары.Ссылка.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
|    ВозвратТоваровОтПокупателяТовары.Номенклатура,
|    ЕСТЬNULL(ВложенныйЗапрос.КоличествоОстаток, 0),
|    ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("НачалоПериода",ТекущаяДата());
////тут мы получаем в выборе последнее значение+
//Выборка=Запрос.Выполнить().Выбрать();
//Пока Выборка.Следующий() Цикл
//КонецЦикла;
////можно получить таблицу значение с данными

Выборка=Запрос.Выполнить().Выгрузить();

ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
Форма = ПолучитьФорму("РегистрСведений.ЛогРедактированияДокументов.Форма.Возврат", , ЭлементыФормы.Товары);
Форма.КлючУникальности = ТекущиеДанные.ИдентификаторСтроки;        
Форма.ТабТовары =ДокументОбъект.Товары.Выгрузить(,"Номенклатура,Количество,Цена,Сумма");
Форма.ТабТовары.Колонки.Добавить("ПричинаИзменения", Новый ОписаниеТипов("СправочникСсылка.AV_ПричиныУрезанияНоменклатуры"));
Форма.ТабТовары.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("УникальныйИдентификатор"));
Форма.ТабТовары.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Форма.ТабТовары.Колонки.Добавить("Резерв", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Форма.ЭлементыФормы.ТабТовары.СоздатьКолонки();
Для Каждого Запись Из Форма.ТабТовары Цикл 
	// ищем в таблице значений поулченные данные +
	НаденоеЗначение = Выборка.Найти("Номенклатура", Запись.Номенклатура);
	Если НаденоеЗначение <> Неопределено Тогда
		//-
		Запись.Остаток=НаденоеЗначение.Остаток;
		Запись.Резерв=НаденоеЗначение.Резерв;
	иначе
		Запись.Остаток=0;
		Запись.Резерв=0;
	КонецЕсли;	
КонецЦикла;
ЗаполнитьЗначенияСвойств(Форма.ТабТовары,ПервоначальныеДанные);
Топ=Форма.ТабТовары;
Форма.ОткрытьМодально();

ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
Для Каждого Данные из ПервоначальныеДанные Цикл 
КонецЦикла;

Для Каждого Строка Из Топ Цикл
	Если ТекущиеДанные.Количество<>Строка.Количество Тогда
		ТекстВопроса = "Данные будут записаны в регистр сведений. Заполнить?";
		Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );
		Если Ответ = КодВозвратаДиалога.Да Тогда
			
			НаборЗаписей = РегистрыСведений.ЛогРедактированияДокументов.СоздатьНаборЗаписей();
			НоваяЗапись = НаборЗаписей.Добавить();
			НоваяЗапись.Документ =Ссылка;
			НоваяЗапись.Было =Строка.Количество;
			НоваяЗапись.Стало =Строка.Количество;
			// тут мы снова получали последнее значение, либо так же через "Найти" либо прямо из формы правильные данные
			//НоваяЗапись.Остаток =Выборка.Остаток;
			//НоваяЗапись.Резерв =Выборка.Резерв;
			НоваяЗапись.Остаток =Строка.Остаток;
			НоваяЗапись.Резерв =Строка.Резерв;
			НоваяЗапись.ПричинаИзменения =Строка.ПричинаИзменения;
			НоваяЗапись.Товар =Строка.Номенклатура;
			НоваяЗапись.Пользователь =ПараметрыСеанса.ТекущийПользователь;
			НоваяЗапись.Период =ТекущаяДата();
			НаборЗаписей.Записать(Ложь);
		КонецЕсли;
	КонецЕсли;
КонецЦикла;
Показать
5. user1202776 18.07.19 08:57 Сейчас в теме
(4)
ошибку выдает {Документ.ВозвратТоваровОтПокупателя.Форма.ФормаДокумента.Форма(1480)}: Ошибка при вызове метода контекста (Найти)
НаденоеЗначение = Выборка.Найти("Номенклатура", Запись.Номенклатура);
по причине:
Неверное имя колонки
6. Teut_Vlad 191 18.07.19 09:01 Сейчас в теме
(5) поставьте точку останова и посмотрите имя колонки))
7. user1202776 18.07.19 09:02 Сейчас в теме
(6)там есть номенклатура
8. user1202776 18.07.19 09:04 Сейчас в теме
(6)
Прикрепленные файлы:
9. user1202776 18.07.19 09:33 Сейчас в теме
(6)вы просто местами спутали)
не "Выборка.Найти("Номенклатура", Запись.Номенклатура);" ,а "Выборка.Найти(Запись.Номенклатура, "Номенклатура");"
10. user1202776 18.07.19 09:50 Сейчас в теме
11. user1202776 18.07.19 09:51 Сейчас в теме
(2)сможете более подробно объяснить, что я не так делаю?Чтобы я наверняка все понял)
12. Teut_Vlad 191 18.07.19 12:14 Сейчас в теме
(11) что бы что то сказать, нужно понять что вы хотите
Краткое ТЗ сказать
13. user1202776 18.07.19 12:15 Сейчас в теме
(12)В таблице "товары" пользователь меняет количество, после изменения количества вызывается форма в котором указаны количество было, количество стало, номенклатура и нужно указать причину изменения. В этой форме показывает все правильно. Но в сам РС не ту номенклатуру записывает.
В РС должна попадать та номенклатура, которая была изменена пользователем, также количество было, стало, резерв, остаток по этой номенклатуре
14. Teut_Vlad 191 18.07.19 12:50 Сейчас в теме
Из формы документа, ПередЗаписью
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	ТЗПосле = ЭтотОбъект.Товары.Выгрузить();
	ТЗДо = Ссылка.Товары.Выгрузить();
	ТЗПосле.Колонки.Добавить("КоличествоПосле", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ТЗПосле.Колонки.Добавить("Остаток",  Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	ТЗПосле.Колонки.Добавить("Резерв",  Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СУММА(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток) КАК КоличествоВ_Резерве,
	|	СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток,
	|	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура) КАК Номенклатура
	|ИЗ
	|	РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(, Номенклатура В (&Номенклатура)) КАК ТоварыВРезервеНаСкладахОстатки
	|		ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстатки
	|		ПО ТоварыВРезервеНаСкладахОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
	|
	|СГРУППИРОВАТЬ ПО
	|	ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.Номенклатура)";
	Запрос.УстановитьПараметр("Номенклатура",ТЗПосле.ВыгрузитьКолонку("Номенклатура")); 	
	РезультатОстаткиРезервы = Запрос.Выполнить().Выгрузить();
	
	//Вот этот цикл мжожно уже использовать для формирования регистра записей
	Для Каждого Стр из ТЗПосле цикл
		Если НЕ ТЗДо.Найти(Стр.Номенклатура, "Номенклатура") = Неопределено тогда
			Стр.КоличествоПосле = 	ТЗДо.Найти(Стр.Номенклатура, "Номенклатура").Количество;
		иначе
			Стр.КоличествоПосле = 0;
		КонецЕсли;
		Если НЕ  РезультатОстаткиРезервы.Найти(Стр.Номенклатура, "Номенклатура") = Неопределено тогда
			Стр.Резерв   =  РезультатОстаткиРезервы.Найти(Стр.Номенклатура, "Номенклатура").КоличествоВ_Резерве;
			Стр.Остаток  =  РезультатОстаткиРезервы.Найти(Стр.Номенклатура, "Номенклатура").КоличествоОстаток;
		иначе
			//поставить 0
		КонецЕсли;
	КонецЦикла;
Показать

Почему форма документа Перед записью, потому что в этот момент по ссылке можно получить не измененные данные, а из объекта - текущие
(13)
15. user1202776 18.07.19 13:05 Сейчас в теме
(14)
Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    РеализацияТоваровУслугТовары.Номенклатура,
                 |    СУММА(ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)) КАК Резерв,
                 |    СУММА(ЕСТЬNULL(ВложенныйЗапрос.КоличествоОстаток, 0)) КАК Остаток
                 |ИЗ
                 |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                 |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ) КАК ТоварыВРезервеНаСкладахОстатки
                 |        ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
                 |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                 |            ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
                 |            ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
                 |        ИЗ
                 |            РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
                 |        
                 |        СГРУППИРОВАТЬ ПО
                 |            ТоварыНаСкладахОстатки.Номенклатура,
                 |            ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ВложенныйЗапрос
                 |        ПО РеализацияТоваровУслугТовары.Номенклатура = ВложенныйЗапрос.Номенклатура
                 |ГДЕ
                 |    РеализацияТоваровУслугТовары.Ссылка.Ссылка = &Ссылка
                 |
                 |СГРУППИРОВАТЬ ПО
                 |    РеализацияТоваровУслугТовары.Номенклатура";
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    Запрос.УстановитьПараметр("НачалоПериода",ТекущаяДата());
    Выборка=Запрос.Выполнить().Выбрать();
        Для Каждого Стр Из ИзмененияКоличества Цикл
        МассивСтрок = ПервоначальныеДанные.НайтиСтроки(Новый Структура("ИдентификаторСтроки", Стр.ИдентификаторСтроки));
        Если МассивСтрок.Количество() > 0 И МассивСтрок[0].Количество = Стр.КоличествоСтало Тогда
            Продолжить;
        КонецЕсли;
        КонецЦикла;
ТекущиеДанные = ЭлементыФормы.Товары.ТекущиеДанные;
Отбор = Новый Структура("ИдентификаторСтроки", ТекущиеДанные.ИдентификаторСтроки);
МассивСтрок = ПервоначальныеДанные.НайтиСтроки(Отбор);
    Если МассивСтрок.Количество() > 0 И МассивСтрок[0].Количество <> ТекущиеДанные.Количество Тогда
Если ТекущиеДанные.Количество<>Стр.КоличествоБыло Тогда
ТекстВопроса = "Данные будут записаны в регистр сведений. Заполнить?";
        Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );

        Если Ответ = КодВозвратаДиалога.Да Тогда
            Пока Выборка.Следующий() Цикл
        НаборЗаписей = РегистрыСведений.ЛогРедактированияДокументов.СоздатьНаборЗаписей();
        НоваяЗапись = НаборЗаписей.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяЗапись, Стр);
        НоваяЗапись.Документ = Ссылка;
        НоваяЗапись.Товар = Выборка.Номенклатура;
        НоваяЗапись.Пользователь = ПараметрыСеанса.ТекущийПользователь;
        НоваяЗапись.Резерв = Выборка.Резерв;
        НоваяЗапись.Остаток = Выборка.Остаток;
        НоваяЗапись.Было = МассивСтрок[0].Количество;
        НоваяЗапись.Стало = ТекущиеДанные.Количество;
        НаборЗаписей.Записать(Ложь);
        
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    
КонецЕсли;
Показать
16. Teut_Vlad 191 18.07.19 13:08 Сейчас в теме
(15)
екстВопроса = "Данные будут записаны в регистр сведений. Заполнить?";

Зачем вопрос?)
18. user1202776 18.07.19 13:10 Сейчас в теме
(16)на всякий случай.если пользователь допустил ошибку, нажмет "нет" и не будет записываться в РС
17. Teut_Vlad 191 18.07.19 13:09 Сейчас в теме
(15) тяжело на своих базах получить, то что ты хочешь
Потому что я просто включил Версиирование объектов))
Оставьте свое сообщение

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