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

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

New2011

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

SeverBap

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

Hryv

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

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

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

New2011

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

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

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

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

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

1. исправлено
2. да все верно тэ-именно та группа, в которую нужно перенести элемент.
3.исправлено
 
P

puh14

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

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

Hryv

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

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

Второй вариант врядли. Если работает
СпрСотр.НайтиПоКоду(СокрЛП("57380"),0);
то и
СпрСотр.НайтиПоКоду(СокрЛП(Код),0)
должно работать

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

vbs

А так ? ВыбратьЭлементы - совсем лишнее, но, вроде, не мешает

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

New2011

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

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

справочник неподчинен,типы в соответствии текст=текст
 
P

puh14

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

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

New2011

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

Hryv

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

Не возьмусь подвести теоретическую базу, но лично я чисто интуитивно сразу бы так делал

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

vbs

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

vbs

Так перебирать-то не надо !
Нашли элемент - поменяли родителя, вот и все
 
H

Hryv

Я это и имел ввиду: вариант с перебором заработал скорее всего не из-за перебора, а потому что используется СпрСотр.Родитель= ГруппаРодитель;
 
V

vbs

Ну да, девушка поправила ошибку, а потом изобрела перебор :gifts:

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

unknown181538

А если так?
А так ? ВыбратьЭлементы - совсем лишнее, но, вроде, не мешает

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

vbs

А где здесь улучшение ? Или оптимизация ?

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

и короче, и экономичнее
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!