7.7 Как перенести группу с элементами по условию

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем reanimik, 24 май 2007.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    reanimik
    Offline

    reanimik

    Регистрация:
    24 май 2007
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Есть на пример справочник номенклатура
    В нем Группа "Магазин" в нем подгруппа "Сок" в нем подподгруппа Натуральные(в них наименование J7БР,Rich.) и Ненатуральные(в них наименование СокосБР,Морковный.).
    Вопрос Нужно Создать группу Магазин2 и перенести групп с отдельными элементами в наименование "БР" т.е должно получиться:

    Группа "Магазин2" в нем подгруппа "Сок" в нем подподгруппа Натуральные(в них наименование J7БР и Ненатуральные(в них наименование СокосБР).

    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Справ=СоздатьОбъект("Справочник.Номенклатура");
    Справоч=СоздатьОбъект("Справочник.Номенклатура");
    Спр_ВерхГруппа=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент(1)=1 Цикл
    Если Найти(Спр.Наименование,"БР")>0 Тогда
    Если (Справ.НайтиПоНаименованию("Магазин2",0,1) = 1) И (Справ.ЭтоГруппа() = 1) Тогда

    Иначе
    Справ.НоваяГруппа();
    Справ.Наименование = "Магазин2";
    Справ.Записать();
    КонецЕсли;
    А вот здесь должно быть создание группы и перенос
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    Помогите Всем заранее спасибо
  2. Snake-84
    Offline

    Snake-84 Опытный в 1С

    Регистрация:
    28 янв 2007
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Лично я бы сделал запрос по справочнику без групп с проверкой на строку БР в наименовании, а потом рекурсией (или как-то еще) определял бы цепочку наименований родителей, находил или формировал ее в группе "БР" и менял родителя элемента из запроса. Звучит страшно но сделать довольно легко, просто влом исходник писать ... ты уж извини ...
  3. Aptem
    Offline

    Aptem

    Регистрация:
    15 май 2007
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    тебе нужноперенести товары с "БР" в одноименную подгруппу в
    другой группе? Или как? Только Эту или несколько???

    СпрНом=СоздатьОбъект("справ.ном");
    СпрНом.НовГруппа(); // ит.д. (магазин2)
    СпрНом.Записать();
    тратата=спрНом;

    СпрНом.ИспользоватьВдалельца(магазин);
    СпрНом.ВыбратьЭлементы();
    Пока зушщгстдкшегспткд=1 Цикл
    Если Наити(СпрНом.Наименование,"БР")= 1 Тогда
    Если СпрНом.Родитель=тырыпыры Тогда
    СпрНом.Родитель=Тыры-Растапыры; или тратата
    СпрНом.Записать();
    КонецЕсле;
    КонЕсли;

    Я ЭТО НЕ КОМПИЛИРОВАЛ :unsure:


    кроме шуток... еще там создать проверку на группы и т.д., создать группы....
    Если СпрНом не Заработает , приравняй к ПолучитьПустоеЗнач..
    Можно обойтись без создания такого кол-ва одинаковых справочников

    если напишешь подробнее отвечу подробнее
  4. TopicStarter Overlay
    reanimik
    Offline

    reanimik

    Регистрация:
    24 май 2007
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Да товар перенесет но еще надо создать и группы такие же какие и были у этого товара
  5. TopicStarter Overlay
    reanimik
    Offline

    reanimik

    Регистрация:
    24 май 2007
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Процедура Сформировать()
    Спр=СоздатьОбъект("Справочник.Номенклатура");
    Справ=СоздатьОбъект("Справочник.Номенклатура");
    Справоч=СоздатьОбъект("Справочник.Номенклатура");
    Спр_ВерхГруппа=СоздатьОбъект("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы(0);
    Пока Спр.ПолучитьЭлемент(1)=1 Цикл
    Если Найти(Спр.Наименование,"Товар")>0 Тогда
    Если (Справ.НайтиПоНаименованию("Магазин2",0,1) = 1) И (Справ.ЭтоГруппа() = 1) Тогда

    Иначе
    Справ.НоваяГруппа();
    Справ.Наименование = "Магазин2";
    Справ.Записать();
    КонецЕсли;
    Спр_ВерхГруппа.НайтиЭлемент(Спр.ТекущийЭлемент());

    Если Спр_ВерхГруппа.Уровень()>1 тогда
    УровеньГрК=Спр_ВерхГруппа.Уровень();
    Сообщить(Спр.Наименование);
    Нач=1;
    НачФ=0;
    Для УровеньГрН=3 По УровеньГрК Цикл
    Спр_ВерхГруппа.НайтиЭлемент(Спр_ВерхГруппа.Родитель);
    Если УровеньГрН=3 Тогда
    Справоч.ИспользоватьРодителя(Справ.ТекущийЭлемент());
    иначе
    Справоч.ИспользоватьРодителя(Справоч.ТекущийЭлемент());
    КонецЕсли;
    Справоч.НоваяГруппа();
    Справоч.Наименование=(Спр_ВерхГруппа.Наименование);
    Справоч.Записать();
    Сообщить(Спр_ВерхГруппа.Наименование);
    КонецЦикла;
    Иначе
    Спр.Родитель = Справ.ТекущийЭлемент();
    Спр.Записать();
    Сообщить("Это товар первого уровня");
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    //**************************
    Замучался я с этим переносом номенклатура товара очень большая делает группы токо в обратном порядке.Как быть
  6. Aptem
    Offline

    Aptem

    Регистрация:
    15 май 2007
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    я так понял, магазин2 на корне справочника
    а все группы в магазине2, в них подгрупп нет, только товары

    тогда должно работать следующее:

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


    КонецЦикла;


    КонецПроцедуры
  7. Aptem
    Offline

    Aptem

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


    КонецЦикла;


    КонецПроцедуры



    ЭТО ВСТАВЛЯЙ В ВЫШЕУКАЗАННЫЙ КОД КОМПИЛИРОВАЛ - РАБОТАЕТ
  8. Aptem
    Offline

    Aptem

    Регистрация:
    15 май 2007
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    //*******************************************
    Перем Род;
    Процедура Сформировать()
    СпрНом=СоздатьОбъект("Справочник.Номенклатура");
    СпрРод=СоздатьОбъект("Справочник.Номенклатура");
    СЗ=СоздатьОбъект("ТаблицаЗначений");
    СЗ.НоваяКолонка("Кол");
    СЗ.НоваяКолонка("НН");
    СРод=СоздатьОбъект("ТаблицаЗначений");
    Срод.НоваяКолонка("Род");
    Срод.НоваяКолонка("ном");
    СпрНом.НоваяГруппа();// создаешь магазин2
    СпрРод.НайтиПоКоду("КодМагадин");
    //здесь переносишь атрибуты из маг в маг2
    СпрНом.Записать();
    Тратата=СпрНом;//содержит маг2
    СпрНом.ИспользоватьРодителя(СпрРод.ТекущийЭлемент());
    СпрНом.ВыбратьЭлементы();



    Пока СпрНом.ПолучитьЭлемент()=1 Цикл
    Если Найти(СпрНом.Наименование,"БД")=1 Тогда


    род2=ПолучитьПустоеЗначение();
    Род=СпрНом;
    тт=0;
    Пока 1=1 Цикл
    тт=тт+1;
    Род=Род.Родитель;

    Если СокрЛП(Строка(Род))="" Тогда
    Прервать;
    КонецЕсли;
    Срод.НоваяСтрока();
    СРод.Род=Род;
    СРод.Ном=тт;

    КонецЦикла;
    СРод.Сортировать("-ном");
    Срод.ВыбратьСтроки();
    род2=ПолучитьПустоеЗначение();
    Пока СРод.ПолучитьСтроку()=1 Цикл


    СпрРод.НоваяГруппа();
    //***** и т.д.
    СпрРод.Родитель=Род2;
    Если СЗ.НайтиЗначение(СпрРод.Наименование,######,нн)=0 Тогда
    СпрРод.Записать();
    СЗ.НоваяСтрока();
    СЗ.Кол=СпрРод;
    СЗ.НН=СпрРод.Наименование;
    Род2=СпрРод;
    Иначе
    Род2=ПолучитьЗначение(######,кол);
    КонецЕсли;


    КонецЦикла;
    СпрНом.Родитель=Род2;
    СпрНом.Записать();
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры


    НЕ ПРОВЕРЯЛ НЕТ ВРЕМЕНИ ПЕРЕМЕННЫЕ И СИНТАКСИС ИСПРАВЬ САМ ВОПРОСЫ В АСЬКУ
  9. Snake-84
    Offline

    Snake-84 Опытный в 1С

    Регистрация:
    28 янв 2007
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    А по-моему так все же проще :)

    Процедура Сформировать()
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Если Спр.НайтиПоНаименованию("БР",,1) = 0 Тогда
    Спр.НоваяГруппа();
    Спр.Наименование = "БР";
    Спр.Записать();
    КонецЕсли;
    ГруппаБР = Спр.ТекущийЭлемент();
    СписокРодителей = СоздатьОбъект("СписокЗначений");
    ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
    |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
    |Наименование = Справочник.Номенклатура.Наименование;
    |Группировка ТекущийЭлемент Без Групп;
    |Условие(Найти(Наименование,""БР"") <>0);
    |Условие(ТекущийЭлемент.ПринадлежитГруппе(ГруппаБР)=0);
    |"//}}ЗАПРОС
    ;
    Запрос = СоздатьОбъект("Запрос");
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Пока Запрос.Группировка(1) = 1 Цикл
    СписокРодителей.УдалитьВсе();
    Родитель = Запрос.ТекущийЭлемент;
    Пока Родитель.Уровень() > 1 Цикл
    Родитель = Родитель.Родитель;
    СписокРодителей.ВставитьЗначение(1,СокрЛП(Родитель.Наименование));
    КонецЦикла;
    Спр.ИспользоватьРодителя(ГруппаБР);
    Группа = ГруппаБР;
    Для Сч = 1 По СписокРодителей.РазмерСписка() Цикл
    Группа = СписокРодителей.ПолучитьЗначение(Сч);
    Если Спр.НайтиПоНаименованию(Группа,,1) = 0 Тогда
    Спр.НоваяГруппа();
    Спр.Наименование = Группа;
    Спр.Записать();
    КонецЕсли;
    Группа = Спр.ТекущийЭлемент();
    Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент());
    КонецЦикла;
    Спр.НайтиЭлемент(Запрос.ТекущийЭлемент);
    Спр.Родитель = Группа;
    Спр.УстановитьНовыйКод("");
    Спр.Записать();
    КонецЦикла;
    КонецПроцедуры
  10. valerka78
    Offline

    valerka78

    Регистрация:
    25 май 2007
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Ребят такой вопрос - справочник Контрагенты, в нем группа - "Сотрудники", надо вывести в таблицу соответственно сотрудников.

    Написал процедурку, не работает,в отладчике вижу что не проходит условие -
    ...
    Если Спр.ПринадлежитГруппе("Сотрудники")=1 Тогда
    ...

    в чем может быть косяк?
  11. Snake-84
    Offline

    Snake-84 Опытный в 1С

    Регистрация:
    28 янв 2007
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    странные вопросы задаете, молодой человек :) шучу
    Параметром ведь элемент-группа справочника должна быть, а не строка с ее наименованием
  12. TopicStarter Overlay
    reanimik
    Offline

    reanimik

    Регистрация:
    24 май 2007
    Сообщения:
    4
    Симпатии:
    0
    Баллы:
    1
    Спасибо огромное.То что и хотелось увидеть.
Статус темы:
Закрыта.

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