Вход | Регистрация

Информационные технологии ::

Метки:

Банальный вопрос по справочникам .....

Я
   zov
 
26.12.03 - 11:11
Каким Методом можно путешествовать по уровням справочника? Вверх и вниз. Вниз получается. А как вверх незнаю. Вот кусок проги. В ней я все время сползаю на уровень ниже. А как подняться выше. Или остаться на том же уровне при создании группы?
       ТоварА = СоздатьОбъект("Справочник.Номенклатура");
       ТоварА.ВключатьПодчиненные(1);
       ТоварА.ВыбратьЭлементы();  
       Пока    ТоварА.ПолучитьЭлемент() > 0  Цикл  
           Если ТоварА.ЭтоГруппа()=1 Тогда
               
       //ТоварВПрайсе.ВыбратьЭлементы();
       
               ТоварВПрайсе.НоваяГруппа();
               ТоварВПрайсе.Наименование = ТоварА.Наименование;  
               ТоварВПрайсе.Записать();
               Сообщить("Добавили новую группу товар - " + ТоварВПрайсе);
               ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе);
               Продолжить;
           КонецЕсли;          
           Остаток =  глДатьОстаток(ОстатокВсего,ТоварА,глПустаяФирма,Контекст);
           Если    ОстатокВсего > 0    Тогда
               //ДобавитьТовар(ТоварА, ТоварВПрайсе);
               ТоварВПрайсе.Новый();                  //* Добавление существующего
               ТоварВПрайсе.Наименование        =    ТоварА.Наименование;
               ТоварВПрайсе.Товар                =    ТоварА.ТекущийЭлемент();  
               ТоварВПрайсе.ФормаВыпуска        =    ТоварА.ФормаВыпуска;
               ТоварВПрайсе.ДействующееНачало    =    Товара.ДействующееНачало;  
               ТоварВПрайсе.Номером            =    ТоварА.Номером;  
               ТоварВПрайсе.Производитель        =    ТоварА.Производитель;  
               ТоварВПрайсе.Записать();
               Сообщить("Добавили следующий товар - " + ТоварА);
           КонецЕсли;
           
       КонецЦикла;
 
 
   skunk
 
1 - 26.12.03 - 12:13
Что типа:
ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе.Родитель.Родитель);
   zov
 
2 - 26.12.03 - 15:24
Нет. Все гораздо проще.
У меня получается, что я ныряю все глубже и глубже.
А мне надо остаться на том же уровне. Как остаться?
   zov
 
3 - 26.12.03 - 15:25
И потом Родитель.Родитель это вниз.
А на верх как?
   skunk
 
4 - 26.12.03 - 15:39
Короче смотри
У самого верхнего уровня Родитель = ПустоеЗначение.
У второго Родитель = РодительПервогоУровня.
У третьего Родитель = РодительВторогоУровня.
Значит
То есть если поднятся на уровень из третьего элемента тебе надо
ИспользоватьРодителя(РодительВторогоУровня.РодительПервогоУровня)

Или
Группа0 = Пусто
Группа1.Родитель = Группа0
Элемент1.Родитель = Группа1
Группа2.Родитель = Группа1
Элемент2.Родитель = Группа2
Отсюда:
Элемет2.Родитель.Родитель = Группа1

Блин возьми под отладчикам посмотри и все сам в куришь.
   mike
 
5 - 26.12.03 - 15:56
Можно так :
Родитель = Товар.Родитель;
Товар.НоваяГруппа();
Товар.Родитель= Родитель;
Товар.Записать();
   SteveD
6 - 26.12.03 - 16:53
ТоварВПрайсе.ИспользоватьРодителя(ТоварA.ТекущийЭлемент());
   zov
 
7 - 26.12.03 - 18:05
Т.е все эти примеры показывают, что тривиальные действия
надо делать не стандартными методами.
Я сделал это ползанье по уровням. Но. В других базо-ориентированных языках это делается гораздо проще.
Я приведу пример проги той самой, но уже работающей правильно. Может кто-то сможет ее оптимизировать.
Мне так кажется, что это очень коряво. С точки зрения классики.
       ТоварВПрайсе = СоздатьОбъект("Справочник.Прайс_лист");
       ТоварВПрайсе.ВыбратьЭлементы();
       Пока    ТоварВПрайсе.ПолучитьЭлемент(1) > 0  Цикл
           Если ТоварВПрайсе.ЭтоГруппа()=1 Тогда  
                 Сообщить("Группа "    +    ТоварВПрайсе    +    " - удалена из Прайс-листа");
                 ТоварВПрайсе.Удалить(1);
               Продолжить;
           КонецЕсли;
             Сообщить("Товар "    +    ТоварВПрайсе    +    " - удален из Прайс-листа");
             ТоварВПрайсе.Удалить(1);
       КонецЦикла;
       Форма.Обновить();
       ТоварА        =    СоздатьОбъект("Справочник.Номенклатура");
       ТоварА.ВключатьПодчиненные(1);
       ТоварА.ВыбратьЭлементы();  
       ТекУровень    =    1;
       Пока    ТоварА.ПолучитьЭлемент() > 0  Цикл  
           УровеньА    =    ТоварА.Уровень();
           Если ТоварА.ЭтоГруппа()=1 Тогда  
               Если (УровеньА = 1) Тогда
                   ТоварВПрайсе.ИспользоватьРодителя(ПолучитьПустоеЗначение("Справочник.Прайс_лист"));
               ИначеЕсли ТекУровень < УровеньА Тогда
                   ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе);
               ИначеЕсли ТекУровень > УровеньА Тогда
                   ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе.Родитель);
               КонецЕсли;
               ТоварВПрайсе.НоваяГруппа();
               ТоварВПрайсе.Наименование    =    ТоварА.Наименование;
               Сообщить("Добавили новую группу - " + ТоварВПрайсе.Наименование);
           Иначе
               Если ( ТекУровень > УровеньА) Тогда
                   ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе.Родитель);
               ИначеЕсли  ( ТекУровень < УровеньА)  Тогда
                   ТоварВПрайсе.ИспользоватьРодителя(ТоварВПрайсе);
               КонецЕсли;

               Остаток    =  глДатьОстаток(ОстатокВсего,ТоварА,глПустаяФирма,Контекст);
           
               Если    ОстатокВсего > 0    Тогда
                   ТоварВПрайсе.Новый();                  //* Добавление существующего
                   ТоварВПрайсе.Товар                =    ТоварА.ТекущийЭлемент();
                   ТоварВПрайсе.Наименование        =    ТоварА.Наименование;
                   ТоварВПрайсе.ФормаВыпуска        =    ТоварА.ФормаВыпуска;
                   ТоварВПрайсе.ДействующееНачало    =    Товара.ДействующееНачало;  
                   ТоварВПрайсе.Номером            =    ТоварА.Номером;  
                   ТоварВПрайсе.Производитель        =    ТоварА.Производитель;  
                   Состояние("Добавили товар - " + ТоварВПрайсе.Наименование);
               КонецЕсли;
           КонецЕсли;
           ТекУровень                    =    УровеньА;
           ТоварВПрайсе.Записать();
       КонецЦикла;  
======================================================
И еще. Форма.Обновить(); Ни какой реакции.
Я ожидал, что будет показан пустой справочник. А ничего не меняется.
   mike
 
8 - 27.12.03 - 16:35
А в чем смысл задачи ?
   skunk
 
9 - 28.12.03 - 05:29
Судя по всему сперва очищает справочник Прайс, а потом копирует из номенклатуры с остатками.
   mike
 
10 - 28.12.03 - 09:02
Можно использовать таблицу  с колонками : Товар , прайс . При  добавлении в прайс новой группы , добавлять в таблицу новую строку . Далее при смене родителя в номенклатуре одновременно найти в таблице соовесттвующий родитель прайса и все получится.
 
  Рекламное место пустует
   mike
 
11 - 29.12.03 - 17:13
Дополнение : За 2 прохода все делается просто   :
На первоми проходе строишь таблицу групп : Товар-Прайс и формируешь прайс без привязки к группам . На 2 проходе берешь родителя из этой таблицы и привязываешь к прайсу
   zov
 
12 - 29.12.03 - 19:29
Mike! Спасибо.
Я в целом понял.
Если можно чиркни схему. Хотя бы в общих чертах.
На 1С-э.
   mike
 
13 - 30.12.03 - 16:59
////******************************************************************************
//// Переформировать()()
Процедура Переформировать()
   Табл=СоздатьОбъект("ТаблицаЗначений");
   Табл.НоваяКолонка("Товар","Справочник");
   Табл.НоваяКолонка("Прайс","Справочник");
   Прайс= СоздатьОбъект("Справочник.Прайс");
   Прайс.ВыбратьЭлементы();
   Пока Прайс.ПолучитьЭлемент()=1 Цикл
       Прайс.Удалить(1);    
   КонецЦикла;
   // 1 проход
   Товар= СоздатьОбъект("Справочник.Номенклатура");
   Товар.ВыбратьЭлементы(0);
   Пока Товар.ПолучитьЭлемент()=1 Цикл
       Если Товар.ЭтоГруппа()=1 Тогда
           Прайс.НоваяГруппа();
           Прайс.Наименование = Товар.Наименование;
           Прайс.Записать();
           Табл.НоваяСтрока();
           Табл.Товар= Товар.ТекущийЭлемент();
           Табл.Прайс= Прайс.ТекущийЭлемент();
       Иначе
           Прайс.Новый();
           Прайс.Наименование = Товар.Наименование;
           Прайс.Записать();
       КонецЕсли;
   КонецЦикла;    
   // 2 проход
   Товар.ВыбратьЭлементы(0);
   Прайс.ВыбратьЭлементы(0);
   ТекущийТоварРодитель=0;
   ТекущийПРайсРодитель=0;
   Пока Товар.ПолучитьЭлемент()=1 Цикл
       Прайс.ПолучитьЭлемент();
       Если ПустоеЗначение(Товар.Родитель)=1 Тогда
           Продолжить;
       Иначе
           ТоварРодитель = Товар.Родитель;
       КонецЕсли;    
       Если ТекущийТоварРодитель<>ТоварРодитель Тогда
           ТекущийТоварРодитель=ТоварРодитель;
           стр = 0;
           Табл.НайтиЗначение(ТекущийТоварРодитель,стр,"Товар");
           ТекущийПрайсРодитель= Табл.ПолучитьЗначение(стр,"Прайс");
       КонецЕсли;
       Прайс.Родитель = ТекущийПрайсРодитель;
       Прайс.Записать();
   КонецЦикла;    
КонецПроцедуры // Переформировать()
   mike
 
14 - 30.12.03 - 17:43
послал а не подумал, что порядок выборки элементов должен быть одинаковым : Код-Код Или Наименование-Наименование, Причем если код-код то тип кода должен быть тоже одинаковым. Иначе второй цикл не сработает.
   zov
 
15 - 30.12.03 - 18:28
Благодарю.
Получилось более изящно, но мне кажется что тоже грамоздко.
Хотя это и относительно.
Еще раз спасибо.


Список тем форума
Рекламное место пустует   Рекламное место пустует
Основная теорема систематики: Новые системы плодят новые проблемы.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует