Имя: Пароль:
1C
 
Как программно скопировать элемент справочника?
0 TDI
 
19.07.06
14:21
Как программно скопировать элемент справочника?
Есть ли какая-нибудь способ копирования справочника прогарммно, без использования методанных ?
1 Каанкереде
 
19.07.06
14:23
нет
2 ZolotarevAA
 
19.07.06
14:23
(0) Можно и без метаданных, но это не универсально, т.к. конфа может поменяться и код придется переписывать.
3 skunk
 
19.07.06
14:24
а почему методанные использовать низя?
4 Каанкереде
 
19.07.06
14:25
(3) неумеет видимо
5 GrayT
 
19.07.06
14:25
Некошерно видимо.... т.е. религия не позволяет ;)
6 skunk
 
19.07.06
14:25
(4)думаешь?
7 Каанкереде
 
19.07.06
14:25
(6) предпологаю...
8 skunk
 
19.07.06
14:27
(7)у тебя телепат сегодня рулит...


а вот если написать ВК... то можно копить без использования методанных
9 1C_ZeroMan
 
19.07.06
14:28
(0) зачем?
10 skunk
 
19.07.06
14:28
(9)про конфу спроси?
11 Каанкереде
 
19.07.06
14:29
(8) зачем ВК? у меня процедура глобальная есть...копирует справочники со всеми реквизитами и подчинениями...

p/s/ вспомнилось. мы как то ею даже мерялись с тобою...
12 skunk
 
19.07.06
14:32
(11)угу мерились... я даже как-то ее искал... уже тут спрашивали...

а ВК чтобы без методанных... правда теже яйца, только жаренные
13 Токс
 
19.07.06
14:56
Открываем форму списка, жмакаем "Ф9"...
14 skunk
 
19.07.06
14:58
(13)периодические... подчиненые
15 Токс
 
19.07.06
15:00
(14) Это косяк 1С... не мой...
16 1C_ZeroMan
 
19.07.06
18:38
(10) да не.. я просто люблю всякие заковырки.. ну мало ли, какая-нить интересная идея мелькнет (свои мозги уже сохнут, приходится подпитываться).. я просто тупо сидел и 10 минут думал, ну на какой фиг мне бы понадобилось программно скопировать элемент, поскольку не нашел ни одного мерцания нейронов, поэтому спросил.. ничего чтобы было оскорбительного или с подвохом.. просто интересно..
17 skunk
 
20.07.06
06:28
//*******************************************
//  Создает список видов подчиненных справочников...
//  если оных нет... то GetListSize к нему вернет 0
//  для получения передать вид справочника список
//  подчиненных треба получить.
function GetVassal(Kind)
   // создаем список значений
   // который будем вертать
   Answer = createobject("valuelist");
   // получаем количество справочников
   // в текущей конфе
   Count = metadata.Reference();
   // циклом посмотрим всех их поближе
   for x = 1 to Count do
       // посмортим есть ли у справочника владелец...
       if metadata.Reference(x).Owner.Selected() = 1 then
           // убедимся что владелец наш...
           if metadata.Reference(x).Owner.Identifier = Kind then
               // если все гуд... хотя какой тут гуд... лишняя
               // работа... то справочник... точнее его вид
               // в наш список
               Answer.AddValue(metadata.Reference(x).Identifier);
           endif;
       endif;
   enddo;
   // вернем список тому... кто его попросил
   return Answer;
endfunction
18 skunk
 
20.07.06
06:28

//*******************************************
//  бля тут я увяз как поляк в болте имени
//  Ваньки Сусанина... на долго и конкретно...
//  трабла в том... что в долбаной 1С нету
//  функции для точного поиска нужного объекта
//  наебка с FindItem не канала... едиственное
//  что можно было юзать... это поиск по коду, но
//  с условием, что код уникален... а это не у всех
//  справочников... у не которых его вообще нет...
//  искание по наименованию и атрибутам отпадали сами
//  собой... так как не исключали повторонсти,
//  а значит и гарантировали 100% результат поиска
//  выход не поверишь... подсказала Ренатка...
//  бля буду светлая голова ;))...
//  подохдит и вспоминая всех львов, баранов и прочую
//  нечесть, кричит... ты что братела, алкаш старый,
//  совсем берегов не видишь... тут же все просто
//  оказалась... что на самом деле просто... и даже
//  можно сказать по татарский хитро...
//  а что делать... не наебешь, не проживешь...
//*******************************************

//*******************************************
//  в краце суть фишки такова:
//  для каждого элемента подчиненного справочника
//  формируется строкое представление оного
//  суть которого преобразования в строку всех
//  значений всех атрибутов за исключением
//  владельца... и если имеется МОД то надо брить
//  и IDD... думаю почему, жевать не надо...
//  если не вкуришь объясню отдельно..
//  PS: я для МОДа не делал... так что в факе
//  про это и скажи... а то наступят на грабли...
//*******************************************

//*******************************************
//  функция которая преобразует элемент справочника
//  в его строковое представление
function GetNotion(refItem)
   // для начала накидаем все что есть обязательно
   // у любого справочника... код... наименование
   // и родителя... а кромя... хотя я уже за это пел
   Answer = valuetostring(refItem.Code) + valuetostring(refItem.Description) + valuetostring(refItem.Parent);
   // получим указатель в мета объектах на наш
   // справочник... для небольшого ушустрения данной функции
   Item = metadata.Reference(refItem.Kind());
   // ну тут все и так ясно...
   // количество атрибутов...
   Count = Item.Attribute();
   // в цикле по всем атрибутам...
   for x = 1 to Count do
       // Имя атрибута
       Name = Item.Attribute(x).Identifier;
       // по имени получим значение атрибута
       // у нашего элемента
       Value = refItem.GetAttrib(Name);
       // добавим строкое представление значения
       // к нашей строке...
       Answer = Answer + valuetostring(Value);
   enddo;
   // отдаем строку...
   return Answer;
endfunction
19 skunk
 
20.07.06
06:28
//*******************************************
//  а это в принципе сама функция и есть
//  короче ищет аналог справочника
//  получает что нада найти и где надо найти
//  в качестве где имеется списко значений
//  формируется для каждого подчиненого справочника
//  отдельно... см. ниже
//  возвращает искомый элемент... если такой
//  существует
function GetAnalogue(refVassal, vlItemVassal)
   // получаем представление искомого
   // элемента
   Present = GetNotion(refVassal);
   // найдем по представление элемент
   Answer = vlItemVassal.Get(Present);
   // вернем его
   return Answer;
endfunction
20 skunk
 
20.07.06
06:29
//*******************************************
//  а это в принципе и сама процедура для копирования
//  справочника... функция рекруссивна... то бишь
//  могет вызывать саму себя... для чего угадай с трех раз
//  получает что надо скопировать... ну и соотвественно
//  родителя и владельца... последнии два не обязательны...
//  и если не указаны... то беруться у того что копируем...
//  вертает скопированный элемент...
function CopyRefItem(refItem, refParent = "", refOwner = "")
   // получим родителя копируемого элемента
   Kind = refItem.Kind();
   // за креативим нужный нам справочник
   refObj = createobject("Reference." + Kind);
   // посмотри дали ли нам владельца
   if isblankstring(refOwner) = 1 then
       // если нет возьмем у нашего элемента
       refOwner = refItem.Owner;
   endif;
   // по пользуемся владельцем
   refObj.UseOwner(refOwner);
   // аналогично поведем себя с родителем...
   // бедные мои родители... чего только от
   // они не натерпелись (((
   if isblankstring(refParent) = 1 then
       refParent = refItem.Parent;
   endif;
   refObj.UseParent(refParent);
   // создадим новый элемент нашего
   // справочника...
   // родителя и владельца имели в начале
   // на тот случай если уникальность кода
   // в пределах подчинения...
   refObj.New();
   // копируем имя..
   refObj.Description = refItem.Description;
   // и врайтим вновь созданный элемент
   refObj.Write();
   // получим список подчиненных справочников
   vlVassal = GetVassal(Kind);
   // посмортрим сколько их...
   Count = vlVassal.GetListSize();
   // если больше нуля, то нам не повезло...
   // а кому работу делать то хоца... мне нет
   if Count > 0 then
       // создадим список значений...
       // куда будем кидать все элементы подчиненных
       // справочников с их текстовым представлением
       // для поиска...
       vlItemVassal = createobject("valuelist");
       // и опять цикл... а что делать
       for x = 1 to Count do
           // получим очередной вид подчиннего справочника
           KindVassal = vlVassal.GetValue(x);
           // за креатим его
           refVassal = createobject("Reference." + KindVassal);
           // за юзаем для него владельца...
           // это то что мы копируем...
           refVassal.UseOwner(refItem);
           // начнем выгребать элементы из него
           refVassal.SelectItems();
           // выгребаем... пока грабиться
           while refVassal.GetItem() > 0 do
               // и копируем их уже для копируемого справочника...
               // в refTemp получаем скопированый элемент
               // подчиненного справочника...
               refTemp = CopyRefItem(refVassal.CurrentItem(), , refObj.CurrentItem());
               // а теперь запихнем его и его представление в наш список
               vlItemVassal.AddValue(refTemp, GetNotion(refTemp));
           enddo;
       enddo;
   endif;
   // ну теперь мы готовы к штурму замка...
   // получаем количество атрибутов у копируемого элемента
   Count = metadata.Reference(Kind).Attribute();
   // и блядь... галопом по европе...
   for x = 1 to Count do
       // и опять метадата... получим указатель
       // на очередной атрибут нашего справочника...
       Attribut = metadata.Reference(Kind).Attribute(x);
       // как вас зовут сэр?
       // меня не зовут... я сам прихожу... когда посчитаю нужным
       NameAttrib = Attribut.Identifier;
       // переодический ли ты у нас...
       if Attribut.Periodic = 0 then
           // если ответ... пшел ты на куй дурачок...
           // то нам лафа
           // получаем значение
           Value = refItem.GetAttrib(NameAttrib);
           // проверим тип нашего атрибута...
           if Attribut.Type = "Справочник" then
               // черт возьми да он справочник...
               // мы попали ногами в жир...
               // бля... надо глянуть вдруг этот справочник
               // подчинен нашему...
               if Value.Owner = refItem then
                   // зараза...
                   // ищем аналог элемента у вновь созданого
                   // спраовчника...
                   Value = GetAnalogue(Value, vlItemVassal).CurrentItem();
               endif;
           endif;
           // установим полученное значение в копируемый справочник...
           refObj.SetAttrib(NameAttrib, Value);
       else
           // блядь... да он в периоде
           // ну то бишь атрибут справочника переодический...
           // создаем историю для нового справочнка
           objPerWhere = createobject("Periodic");
           objPerWhere.UseObject(NameAttrib, refObj.CurrentItem());
           // а также получаем историю копируемого элемента
           objPerWhat = createobject("Periodic");
           objPerWhat.UseObject(NameAttrib, refItem.CurrentItem());
           // начинаем смотреть историю
           objPerWhat.SelectValues();
           // смотри пока смотриться
           while objPerWhat.GetValue() > 0 do
               // скопируем очередную дату истории
               objPerWhere.DateVal = objPerWhat.DateVal;
               // что там у нас за значение на данную дату
               Value = objPerWhat.Value;
               // значение в историю...
               objPerWhere.Value = Value;
               // проверим на подчиненный справочник...
               // трудно понять... смотри выши...
               if Attribut.Type = "Справочник" then
                   if Value.Owner = refItem then
                       objPerWhere.Value = GetAnalogue(Value, vlItemVassal).CurrentItem();
                   endif;
               endif;
               // сохраним историю для нашего... ну ты понял меня ;))
               objPerWhere.Write();
           enddo;
       endif
   enddo;
   // когда все готово... все атрибуты и прочая бодяга получена
   // записана и сохранена...
   // запишем и наш справочник...
   refObj.Write();
   // и вернем его... для рекруссии...
   return refObj;
endfunction
21 1C_ZeroMan
 
20.07.06
07:03
да уж.. :)
22 Obed
 
20.07.06
07:05
Веточку в БЗ
23 skunk
 
20.07.06
07:07
(22)один фих мало кто вкурит
24 Obed
 
20.07.06
07:09
(23) Я вкурил
25 skunk
 
20.07.06
07:12
(24)коменты читал?
26 Obed
 
20.07.06
07:17
(25) ессно, мата дофига :)
27 skunk
 
20.07.06
07:20
(26)а без мата долго бы разбирался?
28 Obed
 
20.07.06
07:21
(27) Без мата вообще не разобрался бы :))))
29 skunk
 
20.07.06
07:22
(28)вывод ... мат нужен
30 Obed
 
20.07.06
07:24
(29) Надо ВР предложить разрешить мат в тематических ветках :D
31 skunk
 
20.07.06
07:26
(30)кстати сейчас перечитал не нашел ни одного мата
32 Obed
 
20.07.06
07:28
(31) Примеры: "бл$дь", "не на$бешь, не проживешь", "бл$ буду", "на$бка с FindItem"...
33 skunk
 
20.07.06
07:29
(32)так далеко я не читал (((
34 Obed
 
20.07.06
07:34
(33) Дык это во второй процедуре :)
35 skunk
 
20.07.06
07:38
(34)я же чурка... читаю снизу вверх
36 Obed
 
20.07.06
07:38
(35) :)
37 skunk
 
20.07.06
07:46
тебе смешно
38 Obed
 
20.07.06
07:48
(37) Наверное еще справа налево?
39 skunk
 
20.07.06
07:50
(38)а еще я вверх ногами читать умею... так с Лошадкой познакомился в метро
40 Obed
 
20.07.06
07:52
(39) Чегой-то ты в метро забыл?
41 skunk
 
20.07.06
07:54
(40)жил я год в питере... полгода пользовался услугами метро
42 Obed
 
20.07.06
07:57
(41) Ужос просто....
43 skunk
 
20.07.06
07:58
(42)и не говори...
44 Obed
 
20.07.06
08:01
(43) Вот в Астану переедешь, будешь там метро строить?
45 skunk
 
20.07.06
08:02
(44)нет... скорее всего буду франч открывать
46 skunk
 
20.07.06
08:02
надо заниматься тем, что знаешь
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn