Имя: Пароль:
1C
 
Как скопировать элемент справочника с починеными элементами?
0 maiskii__kot
 
29.11.05
12:45
имеется элемент справочника. как скопировать этот элемент так, что бы скопировались и все элементы подчиненного справочника?
1 LOD
 
29.11.05
12:47
Есть два способа:
1)Руками создать элементы
2)Програмным способом
2 maiskii__kot
 
29.11.05
12:48
программным спопобом, можно просто в наглую перебирать все элементы и реквизиты этих элементов. но это не очень эффективно :-(
3 LOD
 
29.11.05
12:49
В програмном способе
Необходимо задать "Владелец" подчиненного справочника
4 LOD
 
29.11.05
12:50
Надо в коде чуть чуть написать ;)
5 maiskii__kot
 
29.11.05
12:50
//3 понятное дело. без этого будет уже не подчиненный справочник.
нет ли стандарной обработки по копированию целого элемента, не разбирая по реквизитам?
6 LOD
 
29.11.05
12:51
Я не видел
А тебе сложно написать около 6 строчек кода ?
7 maiskii__kot
 
29.11.05
12:53
хочется что-то универсальное
8 LOD
 
29.11.05
12:54
(7) Волшебную палочку ? ;)
9 LOD
 
29.11.05
13:01
Сделай обработку в 9 строк (универсальную для твоего случая)
10 skunk
 
29.11.05
13:02
(9)ты уверен что за 9 строк сделаешь... если да то сделай...


(7)мыло давай
11 Rovan
 
гуру
29.11.05
13:04
(10) Ну 29, максимум 39, от силы вообще 49
12 maiskii__kot
 
29.11.05
13:05
(10) [email protected]
заранее спасибо
13 skunk
 
29.11.05
13:05
(11)сделай...
14 Каанкереде
 
29.11.05
13:07
(11) У меня 80. Копирует со всеми подчинениями и историями значений.
15 skunk
 
29.11.05
13:07
// Пит где-то сказал... что данное он решил в 50 строк кода... у меня получилось
// децел больше... ((( ... хотел бы взглянуть, как творят профи...
16 skunk
 
29.11.05
13:08
(12)ушло
17 skunk
 
29.11.05
13:08
(14)я туп... у меня 249 строк... правда с коментами...
18 Каанкереде
 
29.11.05
13:10
(17) ну ведь мы с тобой профессионалы...Давай достанем и померямся!
Вообще можно и одной строкой, только длинной :)
19 Rovan
 
гуру
29.11.05
13:10
(14) я тоже делал на 8-ке....только там не истории значений а реггистры - их я не трогал
20 шайтан
 
29.11.05
13:10
смотри ТиС, ФормаСписка "Спр.Номенклатура", кнопка "Копировать"
21 skunk
 
29.11.05
13:11
(18)я не профессионал... ты что... я тут просто опыта набираюсь...


где мериться то будем
22 skunk
 
29.11.05
13:11
(20)не то... она не все копирует
23 LOD
 
29.11.05
13:12
Процедура Сформировать()  
   СпрВл=СоздатьОбъект("Справочник"+СпрВладелец.Вид());
   СпрПодч=СоздатьОбъект("Справочник"+СпрПодчинен.Вид());
   СпрПодчНовый=СоздатьОбъект("Справочник"+СпрПодчинен.Вид());
   СпрПодч.ИспользоватьВладельца(СпрВладелец.ТекущийЭлемент(),);
   СпрПодч.ВыбратьЭлементы();
   Пока СпрПодч.ПолучитьЭлемент()=1 Цикл
        СпрПодчНовый.Новый();
        СпрПодчНовый.Владелец=...
        // заполняем чтонадо и как хотим
        СпрПодчНовый.Записать();
   КонецЦикла;
КонецПроцедуры
24 Каанкереде
 
29.11.05
13:13
а как тут код веделять ? что то не наду где прочитать
25 шайтан
 
29.11.05
13:13
(22) если универсальность не нужна, то для примера подойдет
26 LOD
 
29.11.05
13:14
(10) Что я делаю не так ?
У меня работает нормально (((
27 Каанкереде
 
29.11.05
13:15
Функция СформироватьТекстЗапросаДляКопирования(ВидСправочника)
   тхтТекЭлемент="ТекЭлемент=";
   тхтВладелец="Владелец=";
   ЕстьПодчиненные=0;    
   Для н=1 По Метаданные.Справочник() Цикл                          
       ТекМетСпр=Метаданные.Справочник(н);
       Если ТекМетСпр.Владелец.ПолныйИдентификатор()=ВидСправочника Тогда
           ИД="Справочник."+ТекМетСпр.Идентификатор;
           тхтТекЭлемент=тхтТекЭлемент+ИД+".ТекущийЭлемент,";
           тхтВладелец=тхтВладелец+ИД+".Владелец,";            
           ЕстьПодчиненные=1;
       КонецЕсли;
   КонецЦикла;                                                
   //удалим лишние запятые
   тхтТекЭлемент=Лев(тхтТекЭлемент,СтрДлина(тхтТекЭлемент)-1);
   тхтВладелец=Лев(тхтВладелец,СтрДлина(тхтВладелец)-1);  
   Если ЕстьПодчиненные=1 Тогда
       Возврат (тхтТекЭлемент+";"+тхтВладелец+";"+"Условие (Владелец=Элемент);Группировка ТекЭлемент;");
   Иначе
       Возврат "0";// подчиненных нет
   КонецЕсли;
КонецФункции // СформироватьТекстЗапросаДляКопирования

//Процедура полного копирования справочника вместе со всеми подчиненными элементами и историей всех реквизитов
Процедура гл_КопированиеЭлемента(Элемент,Владелец="",ТекстЗапроса="")   Экспорт
   Если ПустоеЗначение(Элемент)=0 Тогда
       Если Владелец="" Тогда
           Владелец=Элемент.Владелец;
       КонецЕсли;  
       ВидСправочника=Элемент.Вид();  
       Спр=СоздатьОбъект("Справочник."+ВидСправочника);
       СпрМет=Метаданные.Справочник(ВидСправочника);
       Если СпрМет.Владелец.Выбран()=1 Тогда
           Спр.ИспользоватьВладельца(Владелец);
       КонецЕсли;
       Если Элемент.ЭтоГруппа()=1 Тогда
           Спр.НоваяГруппа();
       Иначе    
           Спр.Новый();
       КонецЕсли;
       Спр.Родитель=Элемент.Родитель;
       Спр.Наименование=Элемент.Наименование;
       НачатьТранзакцию();
       Для н=1 по  СпрМет.Реквизит() Цикл
           Реквизит=СпрМет.Реквизит(н);
           РеквизитИД=СпрМет.Реквизит(н).Идентификатор;
           Тип=Реквизит.Тип;
           Если  Тип = "Неопределенный" Тогда
               Зн=Элемент.ПолучитьАтрибут(РеквизитИД);
               Если (Тип = "Перечисление") или (Тип = "Справочник") или (Тип = "Документ") или (Тип = "Счет") Тогда
                   Тип = Тип + "." + зн.Вид();
               КонецЕсли;
               Спр.НазначитьТип(РеквизитИД,Тип);
           КонецЕсли;
           Если Реквизит.Периодический=1 Тогда
               ПерРек=СоздатьОбъект("Периодический");
               ПерРек.ИспользоватьОбъект(РеквизитИД,Элемент);
               ПерРек.ВыбратьЗначения();
               Пока ПерРек.ПолучитьЗначение()=1 Цикл
                   Спр.ИспользоватьДату(ПерРек.ДатаЗнач,1);
                   Спр.УстановитьАтрибут(РеквизитИД,ПерРек.Значение);  
                   Спр.Записать();
               КонецЦикла;
           Иначе  
               Спр.УстановитьАтрибут(РеквизитИД,Элемент.ПолучитьАтрибут(РеквизитИД));        
           КонецЕсли;
       КонецЦикла;    
       Попытка
           Спр.Записать();
       Исключение  
           ОтменитьТранзакцию();
           вк_Норма.Предупреждение("Элемент справочника "+СПр.ПредставлениеВида()+" не записан."+ОписаниеОшибки(),,3);
       КонецПопытки;
       ТекстЗапроса=СформироватьТекстЗапросаДляКопирования("Справочник."+ВидСправочника);
       Если ТекстЗапроса<>"0" Тогда
           Запрос=СоздатьОбъект("Запрос");  
           Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
               сообщить("не удалось выполнить запрос","!!!");
               Возврат;
           КонецЕсли;
           Пока Запрос.Группировка(1)=1 Цикл    
               гл_КопированиеЭлемента(Запрос.ТекЭлемент,Спр.ТекущийЭлемент(),ТекстЗапроса); // рекурсивный вызов  
           КонецЦикла;
       КонецЕсли;  
       ЗафиксироватьТранзакцию();
   КонецЕсли;
КонецПроцедуры // глКопированиеЭлемента
28 Каанкереде
 
29.11.05
13:18
А плин. вк_Норма.Предупреждение надо заменит на просто Предупреждение();
29 skunk
 
29.11.05
13:20
(26)честно сказать все... ты кучу всего не учел...

(27)ты думаешь мне свой тоже сюда плюхнуть
30 LOD
 
29.11.05
13:22
(29) Это принцип работы обработки
А ты хотел чтоб я тут всю обработку кинул как (27)
Зачем ?
Не вижу смысла !
31 skunk
 
29.11.05
13:24
(30)что бы заценить ее универсальность... только вот думаю есть ли смысл тут кидать...


(28, 30)может просто по мылу обменяемся... как думаете
32 Каанкереде
 
29.11.05
13:25
А мне оно н фиг? у меня своя есть :) Человек просил универсального, я дал. Может погорячился конечно, наверное в мыло надо было :)
33 LOD
 
29.11.05
13:26
(31) Спасибо большое
Но это не те вещи которыми стоит меняться (ИМХО, мож я и ошибаюсь)
Мож я где и не прав, но считаю это элементарным алгоритмом, и не достойным траты времени на его обсуждения с такой детальностью
34 skunk
 
29.11.05
13:27
(32)мы как вроде с тобой писькам мерились ;)
35 skunk
 
29.11.05
13:29
(33)любой алгоритм можно разбить на кучу элементарных кубиков... а вот из меньшего количества кубиков сложит полноценное здание....
36 LOD
 
29.11.05
13:29
Рупора в студию !
"Как он счтает" у вас всё равно короче, меньше и уже  ;)))
37 LOD
 
29.11.05
13:30
(35) Согласен - но не стоит на этот пример тратить своё время
38 Каанкереде
 
29.11.05
13:30
(37) А чем мы тут вообще занимаемся, кроме как тратим свое время?
39 Каанкереде
 
29.11.05
13:31
(34) Ну и померялись заодно :)
40 skunk
 
29.11.05
13:32
(38)а так ты победил ... по длине кода... 87 против 92 ))))

вечером погоняю его на подводных камушках...
41 Каанкереде
 
29.11.05
13:35
(40) Комментарии, коментарии надо убрать. И тогда тебе меня не догнать !! :)
42 LOD
 
29.11.05
13:35
(40) Я одного малого знал (он погриб)
Так тот умудрялся типовыми процедурами (то что уже написано в типовой) пользоваться (мы в шоке были от его извращений)
У него всегда его текст был короче
После этого мне показалось бессмысленым мериться ...
43 Каанкереде
 
29.11.05
13:36
(40) Если чего найдешь намыль [email protected] пожалуйста.
44 skunk
 
29.11.05
13:37
(41)убрал... чистый код сравнивал
(42)тут это бы явно не взлетело
45 skunk
 
29.11.05
13:38
(43)о кей...
46 skunk
 
29.11.05
15:54
(43)ну вроде в стандартых все гуд... работает

у твоей плюс
копирует группы... моя нет (исправить не проблема)

у моей
копирует на много шустрее, так обходиться без запроса...
47 skunk
 
29.11.05
15:54
скорость на глаз сравнивал
48 Каанкереде
 
29.11.05
16:54
(46) А у тебя подчиненные подчиненных копирует?
У меня вот лента мебиуса будет, если подчинение кольцевое :)
49 skunk
 
29.11.05
16:57
(48)да копирует... скорее всего тоже... не пробовал... как и у тебя рекрусию использую...

function CopyRefItem(refItem, refParent = "", refOwner = "")
AdBlock убивает бесплатный контент. 1Сергей