Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> 1с 7.7 изменение родителя , Проблема с изменением родителя          
l2d808 Подменю пользователя
сообщение 01.12.14, 11:35
Сообщение #1

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 64 раз
Рейтинг: 0

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


Signature
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...

sava1 Подменю пользователя
сообщение 01.12.14, 12:00
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

l2d808 Подменю пользователя
сообщение 01.12.14, 12:10
Сообщение #3

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 64 раз
Рейтинг: 0

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

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

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

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


Signature
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...

sava1 Подменю пользователя
сообщение 01.12.14, 12:23
Сообщение #4

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

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

Спасибо сказали: l2d808,

l2d808 Подменю пользователя
сообщение 01.12.14, 12:29
Сообщение #5

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 64 раз
Рейтинг: 0

Цитата(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 Цикл
    спрП.найтиПоКоду(Тз.код);
    спрП.Родитель=спр.ТекущийЭлемент();
    спрП.записать();
    Сообщить(спрП.Наименование);
КонецЦикла;


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

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


Signature
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...

sava1 Подменю пользователя
сообщение 01.12.14, 12:35
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

l2d808 Подменю пользователя
сообщение 01.12.14, 13:37
Сообщение #7

Завсегдатай
Иконка группы
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 64 раз
Рейтинг: 0

Цитата(sava1 @ 01.12.14, 12:35) *
Потому, что фильтр ИспользоватьРодителя обновляется всякий раз при смене родителя и та хрень, которая в выборке стает недействительной

А каким-то волшебным образом зафиксировать есть возможность?

Цитата(l2d808 @ 01.12.14, 13:19) *
А каким-то волшебным образом зафиксировать есть возможность?

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

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


Signature
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...

sava1 Подменю пользователя
сообщение 01.12.14, 14:13
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

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

Домовик Подменю пользователя
сообщение 01.12.14, 14:13
Сообщение #9

Ветеран
Иконка группы
Группа: Местный
Сообщений: 975
Из: Киев
Спасибо сказали: 168 раз
Рейтинг: 0

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

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


Zzen Подменю пользователя
сообщение 26.12.14, 10:44
Сообщение #10

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

0. СпрДвери - ссылка на группу Двері
СпрПродано - ссылка на группу Продані
СписокЗачений - список значений

1. далее возможны 2 варианта:
1.1.1. выборка по родителю СпрДвери - заполнить СписокЗачений теми элементами, которые удовлетворяют условиям
1.1.2. пройти по списку значений (СписокЗачений), установить нового родителя (СпрПродано), записать

1.2. в бесконечном цикле открывать выборку по родителю СпрДвери, проверять условие - если удовлетворяет - установить нового родителя (СпрПродано), записать, выйти из выборки.




Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 4:04
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!