Перенос элемента

  • Автор темы New2011
  • Дата начала
N

New2011

#1
1С ЗиК,7.7. Хочу программно перенести сотрудника в группу.
Код:
СпрСотр.ВыбратьЭлементы();
СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
тэ=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл 
Код=БД.NUM;
СпрСотр.ВыбратьЭлементы();
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
СпрСотр.ТекущийЭлемент().Родитель=тэ;
сообщить(СпрСотр.ТекущийЭлемент());
КонецЕсли; 
БД.Следующая();
КонецЦикла;
Пишет "Объет не может быть перепозиционирован!"
Это вообще программно реализовывается?
 

SeverBap

Well-known member
18.09.2007
451
0
#2
Код:
СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
ГруппаРодитель=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл 
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
ЭлементНаПеренос=СпрСотр.ТекущийЭлемент();
ЭлементНаПеренос.Родитель=ГруппаРодитель;
ЭлементНаПеренос.Записать();
Сообщить(ЭлементНаПеренос.Родитель);
КонецЕсли; 
БД.Следующая();
КонецЦикла;
 
H

Hryv

#3
New2011,
1. Не вижу где написано СпрСотр.Записать()

2. В отладчике смотрели чему равно тэ если остановиться на строке
СпрСотр.ТекущийЭлемент().Родитель=тэ;
?

3. И еще мелочь, но все же: зачем использовать СокрЛП, если написана в кавычках конкретная строка?
 
N

New2011

#5
Код:
СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
ГруппаРодитель=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл 
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
ЭлементНаПеренос=СпрСотр.ТекущийЭлемент();
ЭлементНаПеренос.Родитель=ГруппаРодитель;
ЭлементНаПеренос.Записать();
Сообщить(ЭлементНаПеренос.Родитель);
КонецЕсли; 
БД.Следующая();
КонецЦикла;
Исправлено,ошибка осталась.
Код:
СпрСотр.НайтиПоКоду("57380",0);
ГруппаРодитель=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл 
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
ЭлементПеренос=СпрСотр.ТекущийЭлемент();
ЭлементПеренос.Родитель=ГруппаРодитель;
ЭлементПеренос.Записать();
Сообщить(ЭлементПеренос.Родитель);
КонецЕсли; 
БД.Следующая();
КонецЦикла;
Добавлено:
New2011,
1. Не вижу где написано СпрСотр.Записать()

2. В отладчике смотрели чему равно тэ если остановиться на строке
СпрСотр.ТекущийЭлемент().Родитель=тэ;
?

3. И еще мелочь, но все же: зачем использовать СокрЛП, если написана в кавычках конкретная строка?
1. исправлено
2. да все верно тэ-именно та группа, в которую нужно перенести элемент.
3.исправлено
 

puh14

Well-known member
11.07.2008
1 412
0
#6
А справочник сотрудники не подчиненный случаем? Если так то может произойти ситуация когда у группы один владелец, а у элементов другой - здрасвуй ошибочка!

Вариант номер два - а какой тип значения поле num в БД? Есжли он число, то сокрлп его превратит в строку, а искать число по строке не выйдет - надо привести типы к одному.
 
H

Hryv

#7
А справочник сотрудники не подчиненный случаем? Если так то может произойти ситуация когда у группы один владелец, а у элементов другой - здрасвуй ошибочка!

Вариант номер два - а какой тип значения поле num в БД? Есжли он число, то сокрлп его превратит в строку, а искать число по строке не выйдет - надо привести типы к одному.
Второй вариант врядли. Если работает
СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
то и
СпрСотр.НайтиПоКоду(СокрЛП(Код),0)
должно работать

Тем более оно стоит в условии "Если", то есть если не найдет то и родителя менять не будет
 

vbs

Well-known member
18.02.2007
1 708
1
#8
А так ? ВыбратьЭлементы - совсем лишнее, но, вроде, не мешает

СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
тэ=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
СпрСотр.Родитель=тэ;
сообщить(СпрСотр.ТекущийЭлемент());
СпрСотр.Записать()
КонецЕсли;
БД.Следующая();
КонецЦикла;
 
N

New2011

#9
А справочник сотрудники не подчиненный случаем? Если так то может произойти ситуация когда у группы один владелец, а у элементов другой - здрасвуй ошибочка!

Вариант номер два - а какой тип значения поле num в БД? Есжли он число, то сокрлп его превратит в строку, а искать число по строке не выйдет - надо привести типы к одному.
справочник неподчинен,типы в соответствии текст=текст
 

puh14

Well-known member
11.07.2008
1 412
0
#10
СпГр = СоздатьОбъект("Справочник.Сотрудники");
СпГр.НайтиПоКоду("57380",0);
Пока БД.ВКонце()=0 Цикл
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
СпрСотр.Родитель=СпГр.ТекущийЭлемент();
СпрСотр.Записать();
Сообщить(СпрСотр.Родитель);
КонецЕсли;
БД.Следующая();
КонецЦикла;

У меня так работает - родитель один объект, элементы - второй.
 
N

New2011

#11
справочник неподчинен,типы в соответствии текст=текст
вот придумала
Код:
СпрСотр.НайтиПоКоду("57380",0);
ГруппаРодитель=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл 
Код=БД.NUM;
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
Если СпрСотр.Код=СокрЛП(Код) Тогда
СпрСотр.Родитель= ГруппаРодитель;
//ЭлементПеренос=СпрСотр.ТекущийЭлемент();
//ЭлементПеренос.Родитель=ГруппаРодитель;
СпрСотр.Записать();
//сообщить(ЭлементПеренос.Родитель);
КонецЕсли; 
КонецЦикла; 
БД.Следующая();
КонецЦикла;
работает все. :gifts:
 
H
#12
У меня так работает - родитель один объект, элементы - второй
Не возьмусь подвести теоретическую базу, но лично я чисто интуитивно сразу бы так делал

Добавлено: по быстродействию, думаю, не лучший вариант
хотя, если не критично...
 

vbs

Well-known member
18.02.2007
1 708
1
#13
А то, что я привел час назад никто не попробовал проверить ?
Думаю, основная загвоздка в том, что
СпрСотр.ТекущийЭлемент().Родитель=тэ; надо заменить на СпрСотр.Родитель=тэ;
Желающие могут посмотреть аналогичный код в обработке "ГрупповаяОбработкаНоменклатуры" в ТиС, например
Перебирать элементы - это кошмар, хоть и работает :gifts:
 

vbs

Well-known member
18.02.2007
1 708
1
#15
Так перебирать-то не надо !
Нашли элемент - поменяли родителя, вот и все
 
H
#16
Я это и имел ввиду: вариант с перебором заработал скорее всего не из-за перебора, а потому что используется СпрСотр.Родитель= ГруппаРодитель;
 

vbs

Well-known member
18.02.2007
1 708
1
#17
Ну да, девушка поправила ошибку, а потом изобрела перебор :gifts:

Хорошо хоть справочник у нее не сумасшедшего размера, а было бы там 30-40 тысяч позиций ? :(
 

unknown181538

НеГуру
28.12.2008
1 417
0
#18
А если так?
А так ? ВыбратьЭлементы - совсем лишнее, но, вроде, не мешает

СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
тэ=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
Спр = СоздатьОбъект("Справочник.Сотрудники");
Спр.НайтиЭлемент(СпрСотр);
Спр.Родитель=Родитель.текущийЭлемент();
сообщить(Спр.ТекущийЭлемент());
Спр.Записать()
КонецЕсли;
БД.Следующая();
КонецЦикла;
 

vbs

Well-known member
18.02.2007
1 708
1
#19
А где здесь улучшение ? Или оптимизация ?

СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
тэ=СпрСотр.ТекущийЭлемент();
Пока БД.ВКонце()=0 Цикл
Код=БД.NUM;
Если СпрСотр.НайтиПоКоду(СокрЛП(Код),0)=1 Тогда
СпрСотр.Родитель=тэ;
сообщить(Спр.ТекущийЭлемент());
Спр.Записать()
КонецЕсли;
БД.Следующая();
КонецЦикла;

и короче, и экономичнее