7.7 Установка родителя

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем AlexLink, 6 фев 2018.

  1. TopicStarter Overlay
    AlexLink
    Offline

    AlexLink

    Регистрация:
    12 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте. В справочнике номенклатура есть массив элементов. Проблема в том, что нужно создать группу с таким же названием как и у элемента и сразу установить родителя. С первой частью вопросов нет, а вот с назначением родителя целая проблема. Пишет: Объект не может быть перепозиционирован!

    Код:
    Процедура СозданиеГрупп()
      
        ЭЛ = СоздатьОбъект("Справочник.Номенклатура");  
        ГР = СоздатьОбъект("Справочник.Номенклатура");
        ЭЛ.ВыбратьЭлементы();
        Пока ЭЛ.ПолучитьЭлемент() = 1 Цикл   
        Если ЭЛ.ЭтоГруппа() = 0 Тогда
        Сообщить(Эл.Наименование);
        ГР.НоваяГруппа();
        ГР.Наименование=ЭЛ.ТекущийЭлемент().Наименование;
        ГР.Записать();
        Эл.ТекущийЭлемент().УстановитьАтрибут("Родитель", ГР);
    //  ЭЛ.ТекущийЭлемент().Родитель = ГР;
        КонецЕсли;
          КонецЦикла;
      
    КонецПроцедуры
    
    
    Подскажите пожалуйста, в чем проблема?
    Последнее редактирование: 6 фев 2018
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    В том, что это нельзя делать в цикле по текущему объекту...
  3. TopicStarter Overlay
    AlexLink
    Offline

    AlexLink

    Регистрация:
    12 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    А можете подсказать как нужно делать?
  4. TopicStarter Overlay
    AlexLink
    Offline

    AlexLink

    Регистрация:
    12 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Спасибо, сам догнал как сделать=) Может не совсем хорошо но результат желаемый получил

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

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    Но ведь процедуры никак не связаны у вас. Все делается намного проще внутри основного цикла
  6. TopicStarter Overlay
    AlexLink
    Offline

    AlexLink

    Регистрация:
    12 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Это да, но я одной сразу создал группы, а уже второй просто сопоставил элементы с группами. Не спорю, что делается проще но я не совсем хорошо знаю 1С и поэтому мне показалось, что так проще=)
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    Ну... У вас не проверки на дубли... Если повторно запустить - много мусора будет. К тому же - вложенносто только первого уровня..
  8. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    518
    Симпатии:
    83
    Баллы:
    54
    Здравствуйте.
    А у меня короче получился код. И, на мой взгляд, быстрее. :)
    Код:
       ЭЛ = СоздатьОбъект("Справочник.Категории");
        ГР = СоздатьОбъект("Справочник.Категории");
        ЭЛ.ВыбратьЭлементы();
        Пока ЭЛ.ПолучитьЭлемент() = 1 Цикл
            Если (ЭЛ.ЭтоГруппа() = 0) И (НЕ(ЭЛ.Родитель.Наименование = ЭЛ.Наименование)) Тогда
                    ГР.НоваяГруппа();
                   ГР.Наименование = ЭЛ.Наименование;
                   ГР.Записать();
                   ЭЛ.Родитель = ГР;
                   ЭЛ.Записать();
                   ЭЛ.ВыбратьЭлементы()
            КонецЕсли;
        КонецЦикла;
    Последнее редактирование: 8 фев 2018
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    Ну... Если только справочник не из 2500 элементов)))
    Есть способ еще быстрее.. Не присваивать родителя текущему элементу... А другому объекту.. Тогда выборка не нарушается и не нужно повторять ее сначала
  10. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    518
    Симпатии:
    83
    Баллы:
    54
    А можете показать пример? У меня сначала было желание поместить весь справочник в таблицу значений, чтобы не открывать выборку заново. Хотя в моем варианте условия будут пропускать неактуальные элементы практически мгновенно, но, конечно, лишние циклы ни к чему.
  11. TopicStarter Overlay
    AlexLink
    Offline

    AlexLink

    Регистрация:
    12 янв 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Так там суть такая, что элементов было около 1000 и их нужно было распихать по группам с таким же наименованием. Это все нужно было на один раз. В данной конфигурации нет партий и поэтому каждый приход того или иного товара будет заносится в группу с таким же именем, единственное отличие это цена, каждый раз новая. Упрощает поиск да и порядок в номенклатуре.
    --- Объединение сообщений, 8 фев 2018 ---
    Я пробовал что-то похожее но не утверждаю, что точно такую же процедуру писал, то оно постоянно писало Объект не может быть перепозиционирован!
    Так что пришлось городить выше на писаное:)
    Последнее редактирование: 8 фев 2018
  12. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    518
    Симпатии:
    83
    Баллы:
    54
    Кстати. Вижу у себя ошибку - нет точки с запятой после второй выборки элементов. А как же работал тогда отчет? Проверка на синтаксис такого текста ошибок не показывает. Странно...
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    ...
    Если Эл.Родитель.Выбран()=0 Тогда
    НоваяГруппа.НайтиЭлемент(Эл.ТекущийЭлемент());
    ГР.НоваяГруппа();
    ГР.Наименование=ЭЛ.Наименование;
    ГР.Записать();
    НоваяГруппа.Родитель=ГР.ТекущийЭлемент();
    НоваяГруппа.Записать();
    КонецЕсли;
  14. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    518
    Симпатии:
    83
    Баллы:
    54
    У меня с таким вариантом почему-то только первый элемент обрабатывается, остальные остаются, как есть. В отладчике видно, что цикл прерывается после первого же присвоения.
    Последнее редактирование: 9 фев 2018
  15. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    Мммм... Значит я ошибся... И выборка видит изменения структуры... Ради прикола надо попробовать устанавливать родителя ПРЕДЫДУЩЕГО элемента из выборки... Изврат конечно... Если и это не заработает (а думаю что нет). То самый быстрый алгоритм - выборка элементов в СписокЗначений. И уже потом в цикле по списку создавать группы. Эффект будет более явно виден чем больше элементов в справочнике
  16. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    518
    Симпатии:
    83
    Баллы:
    54
    Запросом выгрузить справочник в таблицу значений и по ней делать цикл. Да, была такая мысль. В запросе сразу отобрать только не групповые элементы. На мой взгляд, получится красиво. И, главное, быстро.
  17. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.459
    Симпатии:
    523
    Баллы:
    204
    Ну запросом будет быстрее выборки в цикле. Согласен.

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