Версия для печати темы (https://pro1c.org.ua/index.php?s=9c8f947bf50c5f9ed4cadfb62c088bcf&showtopic=20974)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Прочее 1С 7.7 _ 1с 7.7 изменение родителя

Автор: l2d808 01.12.14, 11:35

Добрый день уважаемое сообщество. У меня возникла проблеме. Есть кусок кода в 1с77

Процедура перенос()
  Спр=создатьобъект("Справочник.Номенклатура");
    Спр.найтипокоду("9");//Продані
    Род=создатьобъект("Справочник.Номенклатура");
    Род.найтипокоду("6");//Двері
    
    //сообщить(спр);
    начатьтранзакцию();
    Спр2=создатьобъект("Справочник.Номенклатура");
    Спр2.ИспользоватьРодителя(Род);
    Спр2.ВыбратьЭлементы();
        Пока Спр2.ПолучитьЭлемент()>0 Цикл    
            Если Спр2.ЭтоГруппа()=0 Тогда
                сообщить(спр2.наименование);
                к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
                Если к=0 Тогда      
                    Спр2.Родитель=спр.текущийЭлемент();
                    
                    //Сообщить("Перемещено "+Спр2.ТекущийЭлемент().Наименование);
                КонецЕсли;
            КонецЕсли;
            Спр2.записать();
        КонецЦикла;
        
    ЗафиксироватьТранзакцию();
КонецПроцедуры
У меня задача: массово переместить с папки "Двері" в папку "Продані" по заданным условиям. при работе данного кода он переносит только один элемент, а не весь массив элементов удовлетворяющим условие
к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
Если к=0 Тогда
Укажите пожалуйста на ошибку.

Автор: sava1 01.12.14, 12:00

По-идее, все правильно. Возможно, ломается выборка из-за ИспользоватьРодителя/Родитель.
Я бы выбрал все элементы запросом (со всеми условиями) и шел уже по этой выборке.

Автор: l2d808 01.12.14, 12:10

Цитата(sava1 @ 01.12.14, 12:00) *
По-идее, все правильно. Возможно, ломается выборка из-за ИспользоватьРодителя/Родитель.
Я бы выбрал все элементы запросом (со всеми условиями) и шел уже по этой выборке.

Пробовал и без родителя. В задаче стоит выбрать все элементы без наличия на складе и переместить в папку проданые. Через запрос к сожелению у меня не получится... Язык запросов не знаю... Может у кого еще есть идеи.... Уже всю голову сломал ((((

Пытался закоментировать строки
Спр2.Родитель=спр.текущийЭлемент();
Спр2.записать();

Перебор всего справочника происходит.
при раскоментировании после первого переноса цикл прерываеться. Отчего так происходит, непонимаю. (((

Автор: sava1 01.12.14, 12:23

Ломается выборка.
Как вариант - переписать все товары в тз, потом цикл по тз и менять родителя.

запрос типа такого
текст = "
ТМЦ = Справочник.ТМЦ.ТекущийЭлемент;
Код = Справочник.ТМЦ.Код;
Родитель = Справочник.ТМЦ.Родитель;
Условие(Родитель = РРРР)";

Автор: l2d808 01.12.14, 12:29

Цитата(sava1 @ 01.12.14, 12:23) *
Ломается выборка.
Как вариант - переписать все товары в тз, потом цикл по тз и менять родителя.

запрос типа такого
текст = "
ТМЦ = Справочник.ТМЦ.ТекущийЭлемент;
Код = Справочник.ТМЦ.Код;
Родитель = Справочник.ТМЦ.Родитель;
Условие(Родитель = РРРР)";

Попробовал по Вашему совету. Вот код
Процедура перенос2()
    ОчиститьОкноСообщений();
    Спр=создатьобъект("Справочник.Номенклатура");
    Спр.найтипокоду("9");//Продані
    Род=создатьобъект("Справочник.Номенклатура");
    Род.найтипокоду("6");//Двері
    сс=0;
    //сообщить(спр);  
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("код");
    СпрП=создатьобъект("Справочник.Номенклатура");
    
    начатьтранзакцию();
    Спр2=создатьобъект("Справочник.Номенклатура");
    //Спр2.ИспользоватьРодителя(Род);
    Спр2.ВыбратьЭлементы();
        Пока Спр2.ПолучитьЭлемент()>0 Цикл    
            Если Спр2.ЭтоГруппа()=0 Тогда
                //сообщить(спр2.наименование);
                к=число(Регистр.Остатки.СводныйОстаток(спр2.ТекущийЭлемент(),,,,"Количество"));
                Если к=0 Тогда  
                    ТЗ.НоваяСтрока();
                    тз.код=спр2.код;
                    //Спр2.Родитель=спр.текущийЭлемент();
                    //Спр2.записать();
                    сс=сс+1;
                    //Сообщить("Перемещено "+Спр2.ТекущийЭлемент().Наименование);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    ЗафиксироватьТранзакцию();
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
    спрП.найтиПоКоду(Тз.код);
    спрП.Родитель=спр.ТекущийЭлемент();
    спрП.записать();
    Сообщить(спрП.Наименование);
КонецЦикла;


    сообщить(сс);
КонецПроцедуры

Переноситься коректно.
Но теперь возникает законный вопрос - Почему ломаеться выборка?

Автор: sava1 01.12.14, 12:35

Потому, что фильтр ИспользоватьРодителя обновляется всякий раз при смене родителя и та хрень, которая в выборке стает недействительной

Автор: l2d808 01.12.14, 13:37

Цитата(sava1 @ 01.12.14, 12:35) http://pro1c.org.ua/index.php?act=findpost&pid=93858
А каким-то волшебным образом зафиксировать есть возможность?

Для массового изменения по каким либо параметрам родителя в справочниках наиболее оптимально использовать таблицу значений с предварительным отбором в оную по заданым параметрам элементов справочника.
Пока ТЗ.ПолучитьСтроку()=1 Цикл 
    спрП.найтиПоКоду(Тз.код);// Ищем в справочнике отобранный в таблице значений элемент справочника.
    спрП.Родитель=спр.ТекущийЭлемент();//Назначаем ему заранее найденный новый элемент-родитель
    спрП.записать();//Записываем
КонецЦикла;

Вот такое маленькое резюме к моему вопросу. Если есть более элегантное решение, с удовольствием рассмотрю.

Автор: sava1 01.12.14, 14:13

Ну элегантнее будет все-таки выборка запросом.

Автор: Домовик 01.12.14, 14:13

дело больше не в Родителе. А в Выборке.
Попробуйте в Выборке поменять Код. Или поменять после ВыбратьЭлементыПоРеквизту() значение этого Реквизита...

не помню точно, но по идее поведет точно так же.


Автор: Zzen 26.12.14, 10:44

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