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

Тема в разделе "1C и всё что с ней связано", создана пользователем New2011, 18 мар 2010.

  1. New2011

    New2011 Гость

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

    SeverBap Well-Known Member

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

    Hryv Гость

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

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

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

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
  5. New2011

    New2011 Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    А справочник сотрудники не подчиненный случаем? Если так то может произойти ситуация когда у группы один владелец, а у элементов другой - здрасвуй ошибочка!

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

    Hryv Гость

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А так ? ВыбратьЭлементы - совсем лишнее, но, вроде, не мешает

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

    New2011 Гость

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

    puh14 Well-Known Member
    1C Team

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

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

    New2011 Гость

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

    Hryv Гость

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

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

    vbs Well-Known Member

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

    Hryv Гость

    Это, кстати, и использовано при переборе :gifts:
     
  15. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Так перебирать-то не надо !
    Нашли элемент - поменяли родителя, вот и все
     
  16. Hryv

    Hryv Гость

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Ну да, девушка поправила ошибку, а потом изобрела перебор :gifts:

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    А если так?
     
  19. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А где здесь улучшение ? Или оптимизация ?

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

    и короче, и экономичнее
     
  20. unknown181538

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    Если работает, то да.
     
Загрузка...

Поделиться этой страницей