Имя: Пароль:
1C
1С v8
Как скопировать таблицу значений
0 GreatOne
 
18.12.15
12:17

ТаблицаДанныхВрем = Новый ТаблицаЗначений;
ТаблицаДанныхОбъекта = ПостроительКопия.ПолучитьЗапрос().Выполнить().Выгрузить();
        
Если ТаблицаДанныхВрем.Колонки.Количество() = 0 Тогда
    ТаблицаДанныхВрем = СкопироватьТЗ(ТаблицаДанныхОбъекта, ТаблицаДанныхВрем);

Функция СкопироватьТЗ(ЗНАЧ ТЗ1, ТЗ2)
    
    ТЗ2 = ТЗ1;
    ТЗ2.Очистить();
    Возврат ТЗ2;
    
КонецФункции


Вот такой незамысловатый код очищает обе ТЗ. На выходе ТаблицаДанныхВрем  и ТаблицаДанныхОбъекта  пустые.

Что я не так делаю?
1 GreatOne
 
18.12.15
12:19
По идее мне нужны типизированные колонки в новой ТЗ. Думал так получится, и очень удивился.
2 ukolabrother
 
18.12.15
12:19
а что ты хочешь получить?
3 AllJoke
 
18.12.15
12:19
вникни в код внимательно.
4 ДенисЧ
 
18.12.15
12:19
ВыгрузитьКолонки() не подойдёт?
5 AllJoke
 
18.12.15
12:19
ты возвращаешь очищенную ТЗ
6 ukolabrother
 
18.12.15
12:20
ТаблицаЗначений (ValueTable)
СкопироватьКолонки (CopyColumns)
Синтаксис:

СкопироватьКолонки(<Колонки>)
Параметры:

<Колонки> (необязательный)

Тип: Строка.
Список колонок для копирования в формате: "Колонка1, Колонка2...". Если список не задан, то будут скопированы все колонки.
Возвращаемое значение:

Тип: ТаблицаЗначений.

Описание:

Создает таблицу значений с заданным списком колонок.

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

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Содержимое колонок не копируется.
7 AllJoke
 
18.12.15
12:20
ТаблицаДанныхВрем = ТаблицаДанныхОбъекта;
ТаблицаДанныхВрем.Очитсить();
8 GreatOne
 
18.12.15
12:21
(7) ага, с этого и начал. Обе очищает.
сейчас в (6) попробую. В принципе думал, но там колонок туева хуча. Сейчас циклом пробегусь
9 Господин ПЖ
 
18.12.15
12:21
ТЗ2 = ТЗ1;
    ТЗ2.Очистить();

пятница-рукож.пница...
10 Jonny_Khomich
 
18.12.15
12:23
ну ты очистил у объекта табличную часть. не удивительно.
11 DDwe
 
18.12.15
12:24
А раз обе чистые, то скорее "ТаблицаДанныхОбъекта" на входе пустая.
12 ukolabrother
 
18.12.15
12:25
да вы не поняли что он хочет. Он хочет получить таблицу из построителя и сделать КОПИЮ СТРУКТУРЫ этой таблицы, то есть колонки только, пустую копию. Надеюсь я то правильно понял. Только вот он нарукож.опил так, что страшно.
13 User_Agronom
 
18.12.15
12:26
http://learnpascal.ru/procedure/procedure-and-function-pascal.html

Параметры.

При описании процедуры указывается список формальных параметров. Каждый параметр является локальным по отношению к описываемой процедуре, к нему можно обращаться только в пределах данной процедуры (в нашем примере х, у, z — формальные параметры). Фактические параметры — это параметры, которые передаются процедуре при обращении к ней (а, b, с — фактические параметры). Число и тип формальных и фактических параметров должны совпадать с точностью до их следования.
Параметры-значения.

Другими словами, передача параметров по значению. Копия фактического параметра становится значением соответствующего формального параметра. Внутри процедуры можно производить любые действия с данным формальным параметром (допустимые для его типа), но эти изменения никак не отражаются на значении фактического параметра, то есть каким он был до вызова процедуры, то таким же и останется после завершения ее работы (х, у — параметры-значения).
Параметры-переменные.

Другими словами, передача параметров по ссылке. Это те формальные параметры, перед которыми стоит идентификатор var. Передается адрес фактического параметра (обязательно переменной), после этого формальный
параметр становится его синонимом. Любые операции с формальным параметром выполняются непосредственно над фактическим параметром.
14 GreatOne
 
18.12.15
12:27
(12)ага
сделал как в 6 - сработало)

Ой да ладно, я типовую обработку "Групповое соитие с докумаентами с спр." меняю, там вообще 4 раза на каждом итераторе типа объекта эти таблицы в цикле копируются. Хочу в запрос с объединением
15 GreatOne
 
18.12.15
12:27
+(14) у нас по 60к доков в неделю, обработка тупит страшно
16 Timon1405
 
18.12.15
12:28
(8) Это такое недоООП. кодом "ТЗ2 = ТЗ1;" вы копируете только указатель на таблицу. и знач тут вообще не причем.
17 Локи-13
 
18.12.15
12:29
а работает ли ЗНАЧ с объектами? вот вопрос
18 Jonny_Khomich
 
18.12.15
12:29
Вообще так лучше не делать.
Но вот так попробуй:

Функция СкопироватьТЗ(ЗНАЧ ТЗ1, ТЗ2)
    
    ТЗ2 = ТЗ1.Выгрузить();
    ТЗ2.Очистить();
    Возврат ТЗ2;
    
КонецФункции
19 GreatOne
 
18.12.15
12:29
(16) просто приму это как есть, хоть и не очень понимаю, почему так
20 ukolabrother
 
18.12.15
12:32
(19) так вы создали просто ссылку на таблицу, а не ее копию. Копия делается вот так ТЗ2 = ТЗ1.Скопировать();
21 GreatOne
 
18.12.15
12:34
В любом случае, вопреки ожиданиям, замена

        Для Каждого Стр Из ТаблицаДанныхОбъекта Цикл
            новСтр = ТаблицаДанныхВрем.Добавить();
            ЗаполнитьЗначенияСвойств(новСтр, Стр);
        КонецЦикла;


на объединение временных таблиц в запросе не дало прироста скорости...
22 ukolabrother
 
18.12.15
12:36
очень пятнично, вы это оптимизацией тут так занимаетесь? Это прекрасно
23 Гёдза
 
18.12.15
12:38
(21) Сколько лет у тебя стажа ты говоришь?
24 GreatOne
 
18.12.15
12:38
(22) не поверите, начал это делать, поначитавшись постов на мисте от сереневеньких полосочек, что объединение работает быстрее.
25 ptiz
 
18.12.15
13:00
За 20 постов еще никто не говорил, что ЗНАЧ для параметра с типом "таблица значений" - бессмысленно?
26 Локи-13
 
18.12.15
13:00
(25) см (17)
27 ptiz
 
18.12.15
13:08
(26) Ну я и говорю - ответа не было. Это ж азбука.
28 Поpyчик-4
 
18.12.15
13:10
За 20 постов еще никто не говорил, что ЗНАЧ для параметров имеет смысл только для примитивных типов данных?
29 ObjectRelation Model
 
18.12.15
13:15
(25)(28) не совсем так:

Процедура Чтото(Знач ТЗ1, ТЗ2)
  ТЗ1 = Неопределено;
  ТЗ2 = Неопределено;
КонецПроцедуры;

ТЗ1 - оставит старое значение
30 los_hooliganos
 
18.12.15
13:18
Ладно кто подскажет, почему сравнение 2х ОДИНАКОВЫХ списков значений возвращает ложь?

сз1 = Новый СписокЗначений;
сз1.Добавить(1);

сз2 = Новый СписокЗначений;
сз2.Добавить(1);

сз1= сз2 вернет Ложь
31 Поpyчик-4
 
18.12.15
13:20
(30) Потому что сравнивать через операторы имеет смысл только для примтивных и ссылочных типов.
32 GreatOne
 
18.12.15
13:22
Нашел даже на ИТС
http://its.1c.ru/db/metod8dev#content:2606:hdoc

(31) кстати, судя по статье, сравниваются не значения, а экземпляры
33 Поpyчик-4
 
18.12.15
13:22
(30) И вообще девушка на фотке в футболке не комильфо. Сними её.
34 Лефмихалыч
 
18.12.15
13:23
ТЗ1 = ТЗ2.Скопировать();
35 los_hooliganos
 
18.12.15
13:24
(31) СписокЗначений в 1С и есть ссылочная переменная.
Сравнивается 2 ссылки на область памяти. И они не равны.
36 ObjectRelation Model
 
18.12.15
13:24
(30) потому что переменные хранят только указатели на объекты (слово "ссылка" в 1С уже занята под другое)
выделены две области памяти, естественно указатели (адреса) у них отличаются

собственно указатели и "виноваты" в поведении параметров ЗНАЧ
37 los_hooliganos
 
18.12.15
13:24
сз1 = Новый СписокЗначений;
сз1.Добавить(1);

сз2 = сз1;

сз1= сз2 вернет Истину
38 Поpyчик-4
 
18.12.15
13:25
(35) Пипец. Учи матчасть, инженер знаний со стажем в 7 лет.
39 los_hooliganos
 
18.12.15
13:26
(38) Какую еще мат часть?
40 Лефмихалыч
 
18.12.15
13:29
(38) (39) вы под словом "ссылочный" разное понимаете
41 palpetrovich
 
18.12.15
13:41
(37) более того

сз1 = Новый СписокЗначений;
сз1.Добавить(1);
сз2 = сз1;
сз2.Добавить(2);
если сз1= сз2  Тогда
    сообщить("Истина");
Иначе
    сообщить("ложь");
конецЕсли

тоже вернет истину :)
42 Drac0
 
18.12.15
13:43
(24) Про культ карго слышал?
43 Рэйв
 
18.12.15
13:45
ТЗ2=ТЗ1.Скопировать() уже предлагали?
44 Timon1405
 
18.12.15
13:48
(41) у списка тоже есть отдельный метод Скопировать()
Даешь ООП срач!
45 zak555
 
18.12.15
13:53
(0) всё просто



ТаблицаДанныхВрем = ОбщегоНазначенияКлиентСервер.СкопироватьРекурсивно(ТаблицаДанныхОбъекта)
46 palpetrovich
 
18.12.15
13:54
(45) упс, а что там в СкопироватьРекурсивно?
47 zak555
 
18.12.15
14:00
(46)


// Создает копию экземпляра указанного объекта.
//
// Параметры:
//  Источник - Произвольный - объект, который необходимо скопировать.
//
// Возвращаемое значение:
//  Произвольный - копия объекта, переданного в параметре Источник.
//
// Примечание:
//  Функцию нельзя использовать для объектных типов (СправочникОбъект, ДокументОбъект и т.п.).
Функция СкопироватьРекурсивно(Источник) Экспорт
    
    Перем Приемник;
    
    ТипИсточника = ТипЗнч(Источник);
    Если ТипИсточника = Тип("Структура") Тогда
        Приемник = СкопироватьСтруктуру(Источник);
    ИначеЕсли ТипИсточника = Тип("Соответствие") Тогда
        Приемник = СкопироватьСоответствие(Источник);
    ИначеЕсли ТипИсточника = Тип("Массив") Тогда
        Приемник = СкопироватьМассив(Источник);
    ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда
        Приемник = СкопироватьСписокЗначений(Источник);
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
    ИначеЕсли ТипИсточника = Тип("ТаблицаЗначений") Тогда
        Приемник = Источник.Скопировать();
#КонецЕсли
    Иначе
        Приемник = Источник;
    КонецЕсли;
    
    Возврат Приемник;
    
КонецФункции
48 palpetrovich
 
18.12.15
14:05
(47) тю, а где тут Рекурсивно? :)
49 zak555
 
18.12.15
14:08
(48)


// Создает копию значения типа СписокЗначений.
//
// Параметры:
//  СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить.
//
// Возвращаемое значение:
//  СписокЗначений - копия исходного списка значений.
//
Функция СкопироватьСписокЗначений(СписокИсточник) Экспорт
    
    СписокРезультат = Новый СписокЗначений;
    
    Для Каждого ЭлементСписка Из СписокИсточник Цикл
        СписокРезультат.Добавить(
            СкопироватьРекурсивно(ЭлементСписка.Значение),
            ЭлементСписка.Представление,
            ЭлементСписка.Пометка,
            ЭлементСписка.Картинка);
    КонецЦикла;
    
    Возврат СписокРезультат;
    
КонецФункции
50 zak555
 
18.12.15
14:09
// Создает копию значения типа Структура.
//
// Параметры:
//  СтруктураИсточник - Структура - копируемая структура.
//
// Возвращаемое значение:
//  Структура - копия исходной структуры.
//
Функция СкопироватьСтруктуру(СтруктураИсточник) Экспорт
    
    СтруктураРезультат = Новый Структура;
    
    Для Каждого КлючИЗначение Из СтруктураИсточник Цикл
        СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение));
    КонецЦикла;
    
    Возврат СтруктураРезультат;
    
КонецФункции

// Создает копию значения типа Соответствие.
//
// Параметры:
//  СоответствиеИсточник - Соответствие - соответствие, копию которого необходимо получить.
//
// Возвращаемое значение:
//  Соответствие - копия исходного соответствия.
//
Функция СкопироватьСоответствие(СоответствиеИсточник) Экспорт
    
    СоответствиеРезультат = Новый Соответствие;
    
    Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл
        СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение));
    КонецЦикла;
    
    Возврат СоответствиеРезультат;

КонецФункции

// Создает копию значения типа Массив.
//
// Параметры:
//  МассивИсточник - Массив - массив, копию которого необходимо получить.
//
// Возвращаемое значение:
//  Массив - копия исходного массива.
//
Функция СкопироватьМассив(МассивИсточник) Экспорт
    
    МассивРезультат = Новый Массив;
    
    Для Каждого Элемент Из МассивИсточник Цикл
        МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент));
    КонецЦикла;
    
    Возврат МассивРезультат;
    
КонецФункции

// Создает копию значения типа СписокЗначений.
//
// Параметры:
//  СписокИсточник - СписокЗначений - список значений, копию которого необходимо получить.
//
// Возвращаемое значение:
//  СписокЗначений - копия исходного списка значений.
//
Функция СкопироватьСписокЗначений(СписокИсточник) Экспорт
    
    СписокРезультат = Новый СписокЗначений;
    
    Для Каждого ЭлементСписка Из СписокИсточник Цикл
        СписокРезультат.Добавить(
            СкопироватьРекурсивно(ЭлементСписка.Значение),
            ЭлементСписка.Представление,
            ЭлементСписка.Пометка,
            ЭлементСписка.Картинка);
    КонецЦикла;
    
    Возврат СписокРезультат;
    
КонецФункции
51 Лефмихалыч
 
18.12.15
14:10
горшочек, не вари
52 palpetrovich
 
18.12.15
14:44
(49) ааа, вон оно чё :)