Имя: Пароль:
1C
1С v8
как сделать копию объекта? (документа)
0 vde69
 
16.01.17
15:24
у меня есть не записаный в базу объект (документ), я его передаю в процедуру в которой выполняется произвольный код (через Выполнить), я не хочу, что бы в этом коде можно было что либо поменять в объекте, то есть в процедуру мне нужно передать копию объекта...

как сие сделать кошернее?
1 Cool_Profi
 
16.01.17
15:26
ЗНАЧ ?
2 vde69
 
16.01.17
15:27
(1) по логике - да, а вот будет работать или нет сейчас попробую...
3 Vaflya
 
16.01.17
15:30
Выполнить? Недавно с восьмеркой что ли?
Доставалась как то конфигурация, где на каждом шагу было Выполнить, даже не на каждом шагу, а везде, такой ппц был помечен как нетленка и учебное пособие для поколений "как делать не надо"
хммм или я чего то не понял
4 Ёпрст
 
16.01.17
15:34
(0)
ну, создать еще один объект и через заполнитьЗначения свойств заполнить его
5 Ёпрст
 
16.01.17
15:34
а.. зачем токма это всё ?
6 trdm
 
16.01.17
15:36
(1) Только простые типы.
7 timurhv
 
16.01.17
15:38
(0) передавай структуру без ссылки документа и номера
8 vde69
 
16.01.17
15:39
(1) вроде на мутабельность не ругается, но Объект.ВерсияДанных одинаковый

(5) делаю заполнение одного реквизита через пользовательский код, что-то типа произвольного фильтра...

по сколько эта фигня будет часто манятся и не понятно какие варианты потребуются делаю так... что-то вроде конвертации данных...
9 youalex
 
16.01.17
15:40
или через ЗаписатьХML()/ПрочитатьXML(). Но это будет неполная копия, без доп.свойств, экспортных переменных
10 vde69
 
16.01.17
16:18
(4) табличные части не заполняет :)
11 Лефмихалыч
 
16.01.17
16:28
значечниеВРеквизитФормы()?..
12 Лефмихалыч
 
16.01.17
16:29
но, чтобы наверняка - нарисуй функцию, которая получает объект, а возвращает структуру
13 Лефмихалыч
 
16.01.17
16:31
единственное, что может помешать внутри Выполнить() взять да и Записать() переданный объект - это отсутствие метода Записать() у переданного объета.
14 Ёпрст
 
16.01.17
16:35
(10) ну, цикл по ним и копировать
15 Лефмихалыч
 
16.01.17
16:41
Функция ТипаСериализовать(ДокументОбъект)

    Результат = Новый СТруктура;
    
    ДокументМетаданные = ДокументОбъект.Метаданные();
    
    КоллекцииРеквизитов = Новый Массив();
    КоллекцииРеквизитов.Добавить("СтандартныеРеквизиты");
    КоллекцииРеквизитов.Добавить("Реквизиты");
    
    Для каждого КоллекцияИмя Из КоллекцииРеквизитов Цикл
    
        Для каждого Реквизит Из ДокументМетаданные[КоллекцияИмя] Цикл
            Результат.Вставить(Реквизит.Имя, ДокументОбъект[Реквизит.Имя]);
        КонецЦикла;
        
    КонецЦикла;
    
    Для каждого ТабличнаяЧасть Из ДокументМетаданные.ТабличныеЧасти Цикл
    
        Результат.Вставить(ТабличнаяЧасть.Имя, ДокументОбъект[ТабличнаяЧасть.Имя].Выгрузить());
    
    КонецЦикла;
    
    Возврат Результат;    

КонецФункции
16 Лефмихалыч
 
16.01.17
16:41
та же балда с движениями легко делается
17 gero
 
16.01.17
16:45
(0)
А так не взлетит?
НовыйОбъект = ТвойДокумент.Скопировать();
18 Вафель
 
16.01.17
17:46
(17) движений не будет
19 Волшебник
 
модератор
16.01.17
17:51
(18) можно допилить ещё цикл по наборам регистров
20 Лефмихалыч
 
16.01.17
17:56
(17) (19) это не решает задачу - ни чего не мешает записать копию объекта.
21 Волшебник
 
модератор
16.01.17
17:57
(20) Да пусть пишет. Все работают в едином контексте, т.е. с базой. Любой модуль может записать объект в базу, если будет достаточно доступа
22 Волшебник
 
модератор
16.01.17
17:58
(21)+ Кстати, можно ещё заблокировать запись через управляемые блокировки и хрен что запишешь
23 Torquader
 
16.01.17
20:02
(22) Только тогда блокировать нужно будет из другого сеанса или, так как тот же самый сеанс может не заметить блокировки.
P.S. если мы передаём копию объекта, то её также могут записать. Если же мы передаём объект, который не записан, то можно у него поставить заранее заданный GUID, чтобы потом, если его уже записали (а всякое бывает), найти его по этому GUID-у и "расписать" (то есть удалить).
Создание "суррогата" из структур и массивов не очень хорошо, так как, в этом случае, могут оказаться различные документы с одинаковой структурой, что тоже не есть хорошо.
24 vde69
 
16.01.17
20:45
сделал что-то вроде (15), завтра тестить буду
25 Torquader
 
16.01.17
20:48
(24) Мне тут подумалось - если фильтр писать в виде запроса, то логичнее к нему данные передавать как набор временных таблиц - будет и быстрее работать, и точно никто и ничего поменять не сможет.
26 vde69
 
16.01.17
20:55
(25) там все сложнее...

суть задачи - записать в документ реквизит по которому будет идти маршрутиризация документа и визуальное оформление его в задачах (и таких реквизитов несколько). Проблема в том, что что правила по которым тот или иной элемент справочник постоянно меняют (раз в месяц)... пока правила состоят из
1. ЦФО
2. Суммы
3. Статьи

при этом сумма для каждой комбинации ЦФО+Статья разная, в преспективе сюда может добавится еще с пяток параметров...
27 Torquader
 
16.01.17
21:22
(26) А если реквизит для маршрутизации хранить вообще в отдельном регистре, чтобы его можно было записать, не записывая документ ?
28 vde69
 
16.01.17
21:31
(27) тогда джойн делать в динамических списках, реквизит проще... хотя в перспективе может и придется переделывать, пока не известно...
29 Torquader
 
16.01.17
21:34
(28) Просто, потом может понадобится история этого реквизита.
Да и, если он используется при обменах и т.п., то отдельный реквизит, как бы, не предполагает передачи между базами.
А список, соединение с регистром не сильно изменит скорость исполнения.
Зато, один реквизит для всех документов, а не для каждого свой - в некоторых случаях, выборка в общем виде будет быстрее, чем по таблицам всех документов.
30 i_rodionov
 
16.01.17
21:38
(0) Загрузить копию объекта в фиксированную структуру и передать как параметр
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн