Имя: Пароль:
1C
1C 7.7
v7: Как программно скопировать строку табличной части документа?
0 Dolphinbet
 
18.06.14
13:16
Как программно скопировать строку табличной части документа? Т е добавить новую строку и заполнить реквизиты ТЧ значениями соответствующих реквизитов строки источника (ЗаполнитьЗначения() в восьмерке)
1 Dolphinbet
 
18.06.14
13:20
т е аналог ЗаполнитьЗначенияСвойств с семере какой-нибудь нужен
2 Dolphinbet
 
18.06.14
13:26
похоже я один остался на семерке :(
3 NikVars
 
18.06.14
13:32
Метода нет - изобретай. Получай строку и бегай по столбцам в цикле и копируй.
4 Dolphinbet
 
18.06.14
13:32
(3) это не будет изобретением велосипеда?
5 vcv
 
18.06.14
13:33
Там велосипеда на пяток строк. Если в документе нет реквизитов неопределенного вида/вида.
6 Ёпрст
 
18.06.14
13:34
(0) выгрузитьТабличнуючасть - загрузитьТабличнуючасть.. с ТЗ делай че хочешь - копируй, удаляй..
7 vcv
 
18.06.14
13:35
(6) У ТЗ есть штатная возможность копирования строки? Или это с ТЗ делается проще, чем с документом?
8 NikVars
 
18.06.14
13:35
(4) Будет маленький велосипедик ввиду отсутсвия нужного метода реализованного средствами платформы 7.7.
9 Ёпрст
 
18.06.14
13:35
(7) кончно есть, КоличествоСтрок() + Заполнить
10 NikVars
 
18.06.14
13:36
(7) Нет. Нет.
11 Dolphinbet
 
18.06.14
13:36
(9) чтобы скопировать строку нужно выгрузить всю ТЧ документа в таблицу значений? фигасе!
12 vcv
 
18.06.14
13:37
(9) Боюсь, таким образом скопируешь только первую строку. Или несколько первых. А как Заполнить скопировать, например, четвертую.
13 Ёпрст
 
18.06.14
13:37
(11) не хочешь работать с ТЗ, ничто не мешает бегать по метаданным и копировать через ПолучитьАтрибут-УстановитьАтрибут
14 NikVars
 
18.06.14
13:38
(11) Такой подход тоже может быть оправдан в отдельных случаях. Не подходит этот вариант - рубай другим.
15 Ёпрст
 
18.06.14
13:38
(12) че как маленький ? Выгрузил во временную че надо, заполнил этими данными что надо.
16 vcv
 
18.06.14
13:38
(11) На практике использовать метод типа Заполнить, может оказаться быстрее перебора всех реквизитов МнЧ.
17 vcv
 
18.06.14
13:40
(15) Разъяснись. У тебя ТЗ из, например, 10 строк. Нужно скопировать четвертую. Добавляешь новую строку, вызываешь ТЗ.Заполнить(ТЗ,ТЗ.КоличествоСтрок())
Получаешь копию первой строки. Как произвольную скопировать?
18 Ёпрст
 
18.06.14
13:43
(17)
:)))))

ТЗ.Выгрузить(врТЗ,4,4);
ТЗ.НоваяСтрока();
ТЗ.Заполнить(врТЗ,ТЗ.КоличествоСтрок());
19 Ёпрст
 
18.06.14
13:44
можно и так написать:

ТЗ.Выгрузить(врТЗ,4,4);
ТЗ.КоличествоСтрок(ТЗ.КоличествоСтрок()+1);
ТЗ.Заполнить(врТЗ,ТЗ.КоличествоСтрок());
20 Ясный перец
 
18.06.14
13:44
В ТиС я прикручивал для подобного сабжу глОбработкаПодбора с параметрами.
21 vcv
 
18.06.14
13:46
(19) Точно. Туплю. Совсем уже эти кластера с репликациями голову забили. Публично извиняюсь.
22 Dolphinbet
 
18.06.14
13:58
(19) хороший вариант, а можно без выгрузки табличной части в ТЗ, чет мне кажется тормоза будут... выгрузить, потом загрузить обратно
23 Ёпрст
 
18.06.14
13:59
можно, см (13)
24 Dolphinbet
 
18.06.14
14:00
(23) видел, но как конкретно сделать не понял)
25 Ёпрст
 
18.06.14
14:00
Хотя, если в документе у тебя не 100 тыщ строк, то через ТЗ вполне приемлимый вариант
26 Dolphinbet
 
18.06.14
14:01
(25) а если хотя бы 1000?
27 Ёпрст
 
18.06.14
14:03
(24)

Док.НоваяСтрока();
Для к = 1 По Метаданные.Документ(НужныйВид).РеквизитТабличнойЧасти() Цикл
  Индетификатор = Метаданные.Документ(НужныйВид).РеквизитТабличнойЧасти(к).ИИдентификатор
  Док.УстановитьАтрибут(Идентификатор,ДокИсточник.ПолучитьАтрибут(Идентификатор));
КонецЦикла;
28 Ёпрст
 
18.06.14
14:03
(26) это слишком мало, чтоб задумываться о размерах тз.
29 Ёпрст
 
18.06.14
14:05
+27
только, нужно еще условие в (27) пихать на Тип реквизита, если он неопределенный - то сперва назначать тии, получив его из значения реквизита источника.
30 Ёпрст
 
18.06.14
14:06
Тип глядеть как
Метаданные.Документ(НужныйВид).РеквизитТабличнойЧасти(к).Тип
31 Dolphinbet
 
18.06.14
14:08
(27) а ДокИсточник это что? у меня модуле формы документа этого же нет)
32 Dolphinbet
 
18.06.14
14:08
т е мне нужно как то спозиционироваться на строку источник
33 Ёпрст
 
18.06.14
17:01
(32) тебе в самом доке нужна копия ?
Тогда так:

Док.НоваяСтрока();
Для к = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл
  Идентификатор = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(к).Идентификатор;
Док.ПолучитьСтрокуПоНомеру(НужныйНумерСтроки);
ЗначениеАтрибута  Док.ПолучитьАтрибут(Идентификатор);
Док.ПолучитьСтрокуПоНомеру(Док.КоличествоСтрок());
//тут воткнуть условие на тип атрибута и если надо, сделать Док.НазначитьТип
Док.УстановитьАтрибут(Идентификатор,ЗначениеАтрибута);
КонецЦикла;