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