Имя: Пароль:
1C
1C 7.7
v7: Копирование всех реквизитов из старого документа во вновьсозданный
, ,
0 Enlighted
 
18.05.16
00:21
Добрый вечер волшебники.

Вопрос собственно такой:
Программно Создаётся документ, надо в него скопировать абсолютно все реквизиты включая табличные из (текущего/другого) документа того же типа.
Есть ли способ сделать это автоматом, или обязательно надо приравнивать каждый реквизит нового документа к аналогичному реквизиту старого документа?
1 Jaap Vduul
 
18.05.16
00:48
Реквизиты шапки можно через метаданные перечислить и скопировать через ПолучитьАтрибут/УстановитьАтрибут.
Табличную часть проще всего через Выгрузить/ЗагрузитьТабличнуюЧасть.
2 Enlighted
 
18.05.16
01:09
(1) Если я верно понял, то получить атрибут работает только с одним конкретным атрибутом, то-есть все равно придётся перечислять все атрибуты по одному.
3 Вуглускр1991
 
18.05.16
01:40
Сериализуй объект в джейсон и поменяй там УИД, потом получи объект обратно.
4 Злопчинский
 
18.05.16
03:19
(2)  не сношай мозг
Открой типовую тис и найди в ней процедуру
СкопироватьРеквизитыШапки

А тч копируется тремя операторами
5 Bigbro
 
18.05.16
05:48
(2) зачем перечислять можно обойти циклом через метаданные - будет работать универсально.
6 Enlighted
 
18.05.16
06:17
(4) К сожалению это не типовая тис, такой процедуры не значится.

Конфигурация судя по всему банковская или ломбардная. С ампутированными ногами и велосипедом вместо одной из них и костылём вместо другой. Посему решение вижу только в использовании родных методов платформы а не конфигурации.

А вот как тч скопировать тремя операторами это уже интересно, сейчас поищу.
7 Enlighted
 
18.05.16
06:39
Нашёл такое решение для ТЧ

НовыйЗБ.ТабличнаяЧасть.Загрузить(ТекущийЗБ.ТабличнаяЧасть.Выгрузить())

однако ошибка: Поле агрегатного объекта не обнаружено (ТабличнаяЧасть)
8 Mikeware
 
18.05.16
06:53
(7) Открой для себя Синтакс-помощник....
9 73с
 
18.05.16
07:14
(6) а кто не даёт позаимствовать идею из типовой?
10 Mikeware
 
18.05.16
07:15
(9) отсутсвие типовой :-)
11 Enlighted
 
18.05.16
07:15
(9) Типовую надо искать/качать/покупать вот в чем бида.
12 Enlighted
 
18.05.16
07:23
Хорошо решение для ТЧ с помощью тычков прикладом в спину с вашей стороны нашёл:

ТабличнаяЧастьНаЭкспорт = СоздатьОбъект("ТаблицаЗначений");
ТекущийЗБ.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);
НовыйЗБ.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);

Теперь подобное решение для остальных реквизитов было бы просто замечато.
13 Bigbro
 
18.05.16
07:38
вот тут справка по работе с метаданными в 77
http://catalog.mista.ru/public/65108/
14 Bigbro
 
18.05.16
07:47
перебор циклом через общие реквизиты, затем через реквизиты шапки документа. не забыть про тип и вид для неопределенных типов.
15 HawkEye
 
18.05.16
08:19
(0) способ есть!
два цикла + загрузить/выгрузить ТЧ
16 Enlighted
 
18.05.16
08:35
так назрел вопрос:

"общие реквизиты документа" чем отличаются от "реквизитов шапки"?
17 Mikeware
 
18.05.16
08:45
(16) Тем, что они общие для всех документов. в дереве метаданных они находятся в другом месте.
физически общие реквизиты без отбора почти ничем.  Общие реквизиты с отбором сидят в тапблице 1сджорн.
18 73с
 
18.05.16
08:48
(16) общие относятся ко ВСЕМ документам и их не будет в переборе реквизитов шапки конкретного вида документа через метаданные
19 HawkEye
 
18.05.16
08:55
(16) для этого и нужен второй цикл...
20 los_hooliganos
 
18.05.16
09:01
Document newDoc = oldDoc.clone()
21 FIXXXL
 
18.05.16
09:17
а в 7-ке нет у документа метода Скопировать()?
22 Enlighted
 
18.05.16
09:39
(20) НовыйЗБ=ТекущийЗБ.clone();
{Документ.ВозвратСсуды.Форма.Модуль(710)}: Поле агрегатного объекта не обнаружено (clone)

(21) Не нашел такого
23 HawkEye
 
18.05.16
09:47
(22) советую прислушаться к (8)...
24 HawkEye
 
18.05.16
09:48
(21) Скопировать - нет.
25 Enlighted
 
18.05.16
09:50
(23) в синтаксис помощнике как раз таки и не нашел метод Скопировать, clone в синтаксис помощьнике как метод документа тоже отсутствует.
26 HawkEye
 
18.05.16
09:51
(25) если ты их там не нашел, зачем тогда рожал (22)?
27 aka AMIGO
 
18.05.16
09:55
(25)
Вот тебе процедура из типовой ТиС, если поможет:
Процедура СкопироватьРеквизитыШапки(ДокОткуда, ДокКуда)
    
    // общие реквизиты
    Для Сч = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
        ИдентРекв = Метаданные.ОбщийРеквизитДокумента(Сч).Идентификатор;
        ДокКуда.УстановитьАтрибут(ИдентРекв,ДокОткуда.ПолучитьАтрибут(ИдентРекв));
    КонецЦикла;
    // совпадающие реквизиты шапки
    Для Сч = 1 По Метаданные.Документ(ДокОткуда.Вид()).РеквизитШапки() Цикл
        ИдентРекв = Метаданные.Документ(ДокОткуда.Вид()).РеквизитШапки(Сч).Идентификатор;
        Если Метаданные.Документ(ДокКуда.Вид()).РеквизитШапки(ИдентРекв).Выбран()=1 Тогда
            ДокКуда.УстановитьАтрибут(ИдентРекв,ДокОткуда.ПолучитьАтрибут(ИдентРекв));
        КонецЕсли;
    КонецЦикла;
    
    ДокКуда.УстановитьНовыйНомер(СокрЛП(Константа.ПрефиксИБ) + СокрЛП(Фирма.ЮрЛицо.ПрефиксНомеровДокументов));
    
КонецПроцедуры // СкопироватьРеквизитыШапки()
28 aka AMIGO
 
18.05.16
09:56
+27, а да! забыл про старт! типа так:

        СкопироватьРеквизитыШапки(Контекст, ДокРеализация);
29 Enlighted
 
18.05.16
09:58
(28) Ну это не тонкий намёк уже и даже не толстый :).

Однако благодарю сейчас буду мастырить.
30 Enlighted
 
18.05.16
12:40
Блин вроде с реквизитами разобрался, теперь ТЧ. при тесте этого:

ТабличнаяЧастьНаЭкспорт = СоздатьОбъект("ТаблицаЗначений");
ТекущийЗБ.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);
НовыйЗБ.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);

1с вылетает с ошибкой. Если закомментить последнюю строчку то не вылетает.
31 aka AMIGO
 
18.05.16
12:41
(30) реквизиты все совпадают?
32 Enlighted
 
18.05.16
12:53
(31) Почему бы документы одного типа, НовыйЗБ вообще пустой.
34 aka AMIGO
 
18.05.16
12:58
ммм.. отбой моему вопросу..
35 vladko
 
18.05.16
13:57
(30) а как хоть вылетает? по-подробнее чуть...
36 Enlighted
 
18.05.16
14:59
Прекращена работа программы "1С:V7 starter program (for SQL)"
Windows может произвести поиск способа устранения этой ошибки в интернете...

Закрыть программу

Сигнатура проблемы:
  Имя события проблемы:    APPCRASH
  Имя приложения:    1cv7s.exe
  Версия приложения:    7.70.0.18
  Отметка времени приложения:    3ba747d9
  Имя модуля с ошибкой:    BkEnd.dll
  Версия модуля с ошибкой:    7.70.0.27
  Отметка времени модуля с ошибкой:    4573f811
  Код исключения:    c0000005
  Смещение исключения:    00129f4c
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    0a9e
  Дополнительные сведения 2:    0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:    0a9e
  Дополнительные сведения 4:    0a9e372d3b4ad19135b953a78882e789

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt
37 Mikeware
 
18.05.16
15:01
(30) хосспадя. ну сделай через обход метаданных. Там добавить-то три строчки...
38 aleks_default
 
18.05.16
15:08
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Скопировать (Copy)
Синтаксис:

Скопировать()
Возвращаемое значение:

Тип: ДокументОбъект.

Описание:

Создает новый документ копированием существующего.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Использование метода не приводит к записи созданного объекта в базу данных.
Пример:

Объект = ВыбДокумент.Скопировать();


См. также:

ДокументОбъект, событие ПриКопировании
39 Mikeware
 
18.05.16
15:15
(38) Это 7.7
причем чистая.
40 aleks_default
 
18.05.16
15:17
(39)А че, там такого нет? Как так? Восьмерка же сырая еще, а семерка уже обкатанная.
41 Mikeware
 
18.05.16
15:27
(40) ну, у меня в семерке такого можно сделать, не проблема. а вот у него нельзя. да и ненужно... Хватает имеющихся методов
42 Enlighted
 
18.05.16
15:34
(38)
НовыйЗБ = СоздатьОбъект("Документ.ЗалоговыйБилет");
ТекущийЗБ = СоздатьОбъект("Документ.ЗалоговыйБилет");  
ТекущийЗБ.НайтиДокумент(Основание);
НовыйЗБ = ТекущийЗБ.Скопировать();

Еггог:
НовыйЗБ = ТекущийЗБ.Скопировать();
{Документ.ВозвратСсуды.Форма.Модуль(695)}: Поле агрегатного объекта не обнаружено (Скопировать)
43 aka AMIGO
 
18.05.16
15:38
(42) у тебя не установлен openconf?
Если нет - рекомендую, в нём после точки выскакивает список допустимых параметров/аргументов, по крайней мере увидишь, можно или нет подставлять твоё ..Скопировать()
44 aleks_default
 
18.05.16
15:39
(41)А народ жалуется, что в восьмерке кода писать больше приходится...  
(42) Переходи в нашу веру, чувак.
45 aka AMIGO
 
18.05.16
15:42
(43) +  "XBASE.Методы.Скопировать()" - в синтакспомощнике. Никак этот метод не подходит для копирования документов или еще чего.
46 aleks_default
 
18.05.16
15:42
Во имя СКД, Клиента и Сервера!
47 Builder
 
18.05.16
15:43
(36) 18 релиз ????
Ну вы блин даете.... (с)
48 Mikeware
 
18.05.16
15:45
(43) зато у него установлен 18 релиз...
49 aka AMIGO
 
18.05.16
15:49
(47) (48) Да, грустно это всё..
50 Builder
 
18.05.16
15:52
НовыйЗБ = СоздатьОбъект("Документ.ЗалоговыйБилет");
глЗаполнитьШапкуНаОсн(НовыйЗБ,Основание);  

// дальше твой код вроде рабочий.
ТабличнаяЧастьНаЭкспорт = СоздатьОбъект("ТаблицаЗначений");
ТекущийЗБ.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);
НовыйЗБ.ЗагрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);

НовыйЗБ.Записать();

И эта, поставь 27 релиз обязательно!
51 Builder
 
18.05.16
15:55
+ к (50) Реквизиты там попутал.
ТекущийЗБ.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);
заменить на
Основание.ВыгрузитьТабличнуюЧасть(ТабличнаяЧастьНаЭкспорт);

И вот этот код твой лишний, можно работать прямо с реквизитом "Основание", если ты его не меняешь:
ТекущийЗБ = СоздатьОбъект("Документ.ЗалоговыйБилет");  
ТекущийЗБ.НайтиДокумент(Основание);
52 Enlighted
 
18.05.16
15:57
сейчас качну 27 релиз платформы, попробую.
53 aka AMIGO
 
18.05.16
16:16
(52) Загляни в свою почту.
54 Злопчинский
 
18.05.16
16:38
(6) тупой, да? читать не умеешь?
я про ТВОЮ нетиповую конфигурацию не говорил.
еще раз:

не сношай мозг
Открой типовую тис и найди в ней процедуру
СкопироватьРеквизитыШапки
55 aka AMIGO
 
18.05.16
16:40
(54) Друже, у него, похоже нет типовой
56 aka AMIGO
 
18.05.16
16:44
(55)+ в личке "Бишкек, Кыргызстан", есть там франчайзи, или нет - не знаю, но, думаю проблемы точно есть. Кто-то поставил 1С на комп, и сказал: "работайте, другого ничего нет"
57 Злопчинский
 
18.05.16
17:11
(55) оказываю услуги по семерке. удаленно. народ не жаловался. оказывал в тч и с среднеазиатские. лишь бы коннект был. ихние типовые похожи на россиняские либо с изменениячми либо на основе старых релизов/редакций.
58 Злопчинский
 
18.05.16
17:12
//******************************************************************************
// СкопироватьРеквизитыШапки(ДокОткуда, ДокКуда)
// Параметры:
//  ДокОткуда - документ, из которого производится копирование реквизитов
//  ДокКуда   - документ, в который производится копирование реквизитов
// Возвращаемое значение: Нет
// Вызывается из формул элементов диалога:
// Описание: Производит копирование реквизитов общих и шапки, имеющих один. идентификатор.
Процедура СкопироватьРеквизитыШапки(ДокОткуда, ДокКуда) Экспорт
    
    // общие реквизиты
    Для Сч = 1 По Метаданные.ОбщийРеквизитДокумента()
    Цикл
        
        ИдентРекв = Метаданные.ОбщийРеквизитДокумента(Сч).Идентификатор;
        ДокКуда.УстановитьАтрибут(ИдентРекв,ДокОткуда.ПолучитьАтрибут(ИдентРекв));
        
    КонецЦикла;
    
    // совпадающие реквизиты шапки
    Для Сч = 1 По Метаданные.Документ(ДокОткуда.Вид()).РеквизитШапки()
    Цикл

        ИдентРекв = Метаданные.Документ(ДокОткуда.Вид()).РеквизитШапки(Сч).Идентификатор;
        
        Если  Метаданные.Документ(ДокКуда.Вид()).РеквизитШапки(ИдентРекв).Выбран()=1
        Тогда ДокКуда.УстановитьАтрибут(ИдентРекв,ДокОткуда.ПолучитьАтрибут(ИдентРекв));
        КонецЕсли;
        
    КонецЦикла;
    
    ДокКуда.УстановитьНовыйНомер(СокрЛП(Константа.ПрефиксИБ) + СокрЛП(ДокОткуда.Фирма.ЮрЛицо.ПрефиксНомеровДокументов));
КонецПроцедуры // СкопироватьРеквизитыШапки()
59 Enlighted
 
21.05.16
08:34
Всех благодарю за участие, процедура помогла даже слишком, оказалось всех полей более чем нужно. Всеравно перенос данных пришлось организовывать простым присвоением. Но с ТЧ всё отлично, на релизе 27 работает без ошибок.
Процедурку изучил, приму к сведению в следующий раз.
60 breezee
 
21.05.16
08:55
(12) Почему "СоздатьОбъект()", а не "тз = Новый Таблица значений". Есть же специальные функции...
61 ДенисЧ
 
21.05.16
09:32
(60) Потому что 77
62 Enlighted
 
21.05.16
09:50
(60) Потому что бюджет ограничен :)
63 Enlighted
 
21.05.16
09:54
На 1с-ника.