Добрый день уважаемое сообщество. У меня возникла проблеме. Есть кусок кода в 1с77
Процедура перенос()
Спр=создатьобъект("Справочник.Номенклатура");
Спр.найтипокоду("9");//Продані
Род=создатьобъект("Справочник.Номенклатура");
Род.найтипокоду("6");//Двері
//сообщить(спр);
начатьтранзакцию();
Спр2=создатьобъект("Справочник.Номенклатура");
Спр2.ИспользоватьРодителя(Род);
Спр2.ВыбратьЭлементы();
Пока Спр2.ПолучитьЭлемент()>0 Цикл
Если Спр2.ЭтоГруппа()=0 Тогда
сообщить(спр2.наименование);
к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
Если к=0 Тогда
Спр2.Родитель=спр.текущийЭлемент();
//Сообщить("Перемещено "+Спр2.ТекущийЭлемент().Наименование);
КонецЕсли;
КонецЕсли;
Спр2.записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры
У меня задача: массово переместить с папки "Двері" в папку "Продані" по заданным условиям. при работе данного кода он переносит только один элемент, а не весь массив элементов удовлетворяющим условие к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
Если к=0 Тогда
Укажите пожалуйста на ошибку.
По-идее, все правильно. Возможно, ломается выборка из-за ИспользоватьРодителя/Родитель.
Я бы выбрал все элементы запросом (со всеми условиями) и шел уже по этой выборке.
Спр2.Родитель=спр.текущийЭлемент();
Спр2.записать();
Ломается выборка.
Как вариант - переписать все товары в тз, потом цикл по тз и менять родителя.
запрос типа такого
текст = "
ТМЦ = Справочник.ТМЦ.ТекущийЭлемент;
Код = Справочник.ТМЦ.Код;
Родитель = Справочник.ТМЦ.Родитель;
Условие(Родитель = РРРР)";
Процедура перенос2()
ОчиститьОкноСообщений();
Спр=создатьобъект("Справочник.Номенклатура");
Спр.найтипокоду("9");//Продані
Род=создатьобъект("Справочник.Номенклатура");
Род.найтипокоду("6");//Двері
сс=0;
//сообщить(спр);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("код");
СпрП=создатьобъект("Справочник.Номенклатура");
начатьтранзакцию();
Спр2=создатьобъект("Справочник.Номенклатура");
//Спр2.ИспользоватьРодителя(Род);
Спр2.ВыбратьЭлементы();
Пока Спр2.ПолучитьЭлемент()>0 Цикл
Если Спр2.ЭтоГруппа()=0 Тогда
//сообщить(спр2.наименование);
к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
Если к=0 Тогда
ТЗ.НоваяСтрока();
тз.код=спр2.код;
//Спр2.Родитель=спр.текущийЭлемент();
//Спр2.записать();
сс=сс+1;
//Сообщить("Перемещено "+Спр2.ТекущийЭлемент().Наименование);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
спрП.найтиПоКоду(Тз.код);
спрП.Родитель=спр.ТекущийЭлемент();
спрП.записать();
Сообщить(спрП.Наименование);
КонецЦикла;
сообщить(сс);
КонецПроцедуры
Потому, что фильтр ИспользоватьРодителя обновляется всякий раз при смене родителя и та хрень, которая в выборке стает недействительной
Пока ТЗ.ПолучитьСтроку()=1 Цикл
спрП.найтиПоКоду(Тз.код);// Ищем в справочнике отобранный в таблице значений элемент справочника.
спрП.Родитель=спр.ТекущийЭлемент();//Назначаем ему заранее найденный новый элемент-родитель
спрП.записать();//Записываем
КонецЦикла;
Ну элегантнее будет все-таки выборка запросом.
дело больше не в Родителе. А в Выборке.
Попробуйте в Выборке поменять Код. Или поменять после ВыбратьЭлементыПоРеквизту() значение этого Реквизита...
не помню точно, но по идее поведет точно так же.
0. СпрДвери - ссылка на группу Двері
СпрПродано - ссылка на группу Продані
СписокЗачений - список значений
1. далее возможны 2 варианта:
1.1.1. выборка по родителю СпрДвери - заполнить СписокЗачений теми элементами, которые удовлетворяют условиям
1.1.2. пройти по списку значений (СписокЗачений), установить нового родителя (СпрПродано), записать
1.2. в бесконечном цикле открывать выборку по родителю СпрДвери, проверять условие - если удовлетворяет - установить нового родителя (СпрПродано), записать, выйти из выборки.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua