Имя: Пароль:
1C
1С v8
Сериализация таблицы значений
,
0 Shrk_V_V_V
 
05.10.17
08:52
Сравниваю две таблицы значений с помощью функции ЗначениеВСтрокуВнутр. Но не сравниваются, потому что в каждой строке тзн есть какие-то флажки, которые отличаются. Что это за флажки, как их можно поменять, чтобы совпадали? Платформа 1С 8.2, последняя.
1 DrShad
 
05.10.17
08:55
с помощью этой функции нельзя сравнить две таблицы от слова совсем никак
2 Shrk_V_V_V
 
05.10.17
08:58
Раз нет аргументов, предполагается, что я должен поверить?
3 DrShad
 
05.10.17
08:59
(2) самому мозг включить не судьба? отсортируй их по разному и сравни? таблицы то одинаковы, но сравнить сериализовав никак
4 Shrk_V_V_V
 
05.10.17
08:59
тзн = Новый ТаблицаЗначений;
    тзн.Колонки.Добавить("ПолеСтрока", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(255)));
    тзн.Колонки.Добавить("ПолеЧисло", Новый ОписаниеТипов("Число",,Новый КвалификаторыЧисла(15, 3)));
    стртзн = тзн.Добавить();
    стртзн.ПолеСтрока = "Ква";
    стртзн.ПолеЧисло = 2;
    стртзн = тзн.Добавить();
    стртзн.ПолеСтрока = "Кря";
    стртзн.ПолеЧисло = 4.5;
    тзн2 = Новый ТаблицаЗначений;
    тзн2.Колонки.Добавить("ПолеСтрока", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(255)));
    тзн2.Колонки.Добавить("ПолеЧисло", Новый ОписаниеТипов("Число",,Новый КвалификаторыЧисла(15, 3)));
    стртзн = тзн2.Добавить();
    стртзн.ПолеСтрока = "Ква";
    стртзн.ПолеЧисло = 2;
    стртзн = тзн2.Добавить();
    стртзн.ПолеСтрока = "Кря";
    стртзн.ПолеЧисло = 4.5;
    стр1 = ЗначениеВСтрокуВнутр(тзн);
    стр2 = ЗначениеВСтрокуВнутр(тзн2);
    Сообщить(стр1 = стр2);
    Сообщить(стр1);
    Сообщить(стр2);
    ОткрытьЗначение(тзн);
5 Shrk_V_V_V
 
05.10.17
09:00
Очевидно, что надо отсортировать перед сравнением и обеспечить идентичный порядок колонок. Ну и мозг включить)
6 DrShad
 
05.10.17
09:03
иди у гугла спроси, уже есть несколько алгоритмов сравнения таблиц и все опубликованы и не надо ничего сериализовать, если сам додуматься не можешь
7 Shrk_V_V_V
 
05.10.17
09:05
Вопрос был, как работает функция 1с ЗначениеВСтрокуВнутр для таблицы значений. Если не знаешь, можно просто проигнорировать тему. Зачем спамить?
8 DrShad
 
05.10.17
09:09
нет в таблицах никаких флажков, ибо флажок это клиентское представление на форме
9 Shrk_V_V_V
 
05.10.17
09:10
http://prntscr.com/gtgose

красненьким подчеркнутые циферки интересуют. Наверно я их неудачно флажками назвал.
10 DrShad
 
05.10.17
09:16
забудь вообще про эту функцию, она была актуальна только в 7.7 и то не везде
11 Shrk_V_V_V
 
05.10.17
09:32
Доктор, при всем уважении, выступаете невежливо и не по делу.
12 DrShad
 
05.10.17
09:35
ну если я тебе скажу что эти циферки это описание таблицы, тебе легче станет?
13 DrShad
 
05.10.17
09:37
и если даже они у тебя не сходятся, то таблицы по любому разные
14 Лефмихалыч
 
05.10.17
09:39
обе ТЗ в запрос и полное соединение
15 Shrk_V_V_V
 
05.10.17
09:41
Легче станет, если найти конкретное описание этих циферок. Мой пример работает. А если выгрузить запрос в тзн, потом очистить, и потом заполнить то же самое руками, то в этих циферках получается расхождение. Понятно, что я функцию csv написал руками и все уже сравнил. Но так бы получилось короче и быстрее, вот и решил узнать, может кто разбирался.
16 Shrk_V_V_V
 
05.10.17
09:43
>обе ТЗ в запрос и полное соединение
прикольный вариант. Но надо писать запрос, а тема с сериализацией работает для любой структуры.
17 Рэйв
 
05.10.17
09:44
(15)В качестве извращенного варианта:

Сделай в каждой тз по еще одной колонке, куда для каждой строки сложи сумму ЗначениеВСтрокуВнутр() всех значений, потом  сложи все значения в этой колонке и сравни с такой же хренью в другой тз:-)
18 ptiz
 
05.10.17
09:44
(0) Почему бы не сериализовать в XML и сравить там?
19 DrShad
 
05.10.17
09:45
(15) короче, быстрее и самое главное всегда верно работает вот так

ВсеКолонки = "";
    Для Каждого Колонка Из Таблица0.Колонки Цикл
        ВсеКолонки = ВсеКолонки + ", " + Колонка.Имя
    КонецЦикла;
    ВсеКолонки = Сред(ВсеКолонки, 2);
    
    Таблица = Таблица1.Скопировать();    
    
    Таблица.Колонки.Добавить("Знак", Новый ОписаниеТипов("Число"));
    
    Таблица.ЗаполнитьЗначения(1, "Знак");
    
    Для Каждого Строка Из Таблица0 Цикл ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Строка) КонецЦикла;
    
    Таблица.Колонки.Добавить("Счёт");
    Таблица.ЗаполнитьЗначения(1, "Счёт");
    
    Таблица.Свернуть(ВсеКолонки, "Знак, Счёт");
    
    Ответ = Таблица.Скопировать(Новый Структура("Счёт", 1), ВсеКолонки + ", Знак");
    
    Если Ответ.Количество() = 0 Тогда
        ТаблицыРавны = Истина;
    Иначе
        ТаблицыРавны = Ложь;
    КонецЕСли;
20 DrShad
 
05.10.17
09:49
(18) тогда уж проще сравнивать JSON
21 Shrk_V_V_V
 
05.10.17
09:49
>Почему бы не сериализовать в XML и сравить там?
Так можно. Но я не умею писать тзн в XMl(и обратно) одной строчкой, ну и длиннее строчка получается итоговая.
22 Shrk_V_V_V
 
05.10.17
09:49
>тогда уж проще сравнивать JSON
в 8.2 нету((((((
23 Рэйв
 
05.10.17
09:51
(21)
Функция XML(Данные)
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
    Возврат ЗаписьXML.Закрыть();
КонецФункции
//
24 DrShad
 
05.10.17
09:52
(22) есть, просто вы не умеете им пользоваться
25 Shrk_V_V_V
 
05.10.17
09:54
(23) А обратно?
26 Филиал-msk
 
05.10.17
09:54
(15) Осеннее обострение уберпрограммистов началось.
Ты б еще md5 хеш посчитал. А, извини, md5 скомпроментирован. Тогда sha1
27 Рэйв
 
05.10.17
09:54
(25)
//------Десериализация

Функция ДанныеИзXML(Стр)
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(Стр);
    Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
28 DrShad
 
05.10.17
09:55
(22) https://github.com/legionwfz/1C-JSON
пользуйся на здоровье
29 DrShad
 
05.10.17
09:55
(25) обратно через чтениеXML
30 Shrk_V_V_V
 
05.10.17
09:57
(28) Спасибо, понятно что можно использовать самописку, и я использовал
(27) Спасибо большое, прикольный вариант, работает как песня))
31 Shrk_V_V_V
 
05.10.17
09:58
(27) Главное, неведомой фигни нет))
32 DrShad
 
05.10.17
10:00
(31) ты сам себе противоречишь, когда тебе изначально говорили забыть о своей дури, ты кричал что вопрос не в этом и нечего спамить ))))
33 Shrk_V_V_V
 
05.10.17
10:02
Почему я должен о ней забыть? Это короче и лаконичнее чем XML. Не найду описания флажков, буду XML использовать, это удобнее чем у меня сейчас. Найду- буду использовать это. Почему я должен что-то забывать, лол
34 Shrk_V_V_V
 
05.10.17
10:07
(26) csv-это просто строчка, в которой поля запятыми(точками с запятыми) разделены. Чтобы ее собрать, не надо быть уберпрограммистом)
35 DrShad
 
05.10.17
10:13
(33) какое нафиг описание флажков?

вот оно {"B",1} есть флажок
{"B",0} нет флажка
36 Shrk_V_V_V
 
05.10.17
10:19
Я же картинку прислал. И объяснил, что у меня эти поля разные в одинаковых таблицах значений. И я не знаю, как их поменять, поскольку не знаю что они означают. В любом случае состоявшееся обсуждение небесполезно, поскольку вариант с XML прикольный.
37 DrShad
 
05.10.17
10:21
(36) в (19) еще прикольней
38 Филиал-msk
 
05.10.17
10:22
(36) > вариант с XML прикольный.
Разработка чтобы чисто поржать. Точно.
39 Филиал-msk
 
05.10.17
10:23
(37) Если колонки типизированы, то построитель отчета выгоднее
40 Shrk_V_V_V
 
05.10.17
10:31
(38) В десяти строчках написано сравнение произвольных таблиц значений. Вы бы показали свой вариант сравнения, короче и быстрее. И мы бы вместе поржали над этим. А то я не возьму в толк, над чем вы ржете))
41 Shrk_V_V_V
 
05.10.17
10:35
(40)
Функция XML(Данные)
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
    Возврат ЗаписьXML.Закрыть();
КонецФункции

Сообщить(XML(тзн1) = XML(тзн2)); // Почему это так смешно, объясните))
42 DrShad
 
05.10.17
10:44
(40) в (19) сравнение всего 13 строк, причем можно сравнивать не сортированные таблицы и произвольному набору колонок

поржем!?
43 h-sp
 
05.10.17
11:05
(41) смешно, потому что вы обозвали типовую сериализацию, которая уже 10 лет во всех типовых конфах, прикольным вариантом.

А то, что вы используете какую-то древнюю фигню ЗначениеВСтрокуВнутр, да еще какие-то флажки там выискиваете - это по вашему не прикольно.
44 Shrk_V_V_V
 
05.10.17
11:18
(42) (43)
Я тут гонки устроил.
Вариант доктора- 2 секунды
Вариант XML- 30 секунд
Древняя фигня- 3 секунды.
Так что выискивать фигню, чтобы не юзать XML смысл есть.

Почему вам смешно я не понял, раз мы с вами согласны что с XML вариант хороший.
45 DrShad
 
05.10.17
11:20
(44) потому что это типовой вариант сериализации значений уже много лет
46 Филиал-msk
 
05.10.17
11:24
47 Ёпрст
 
05.10.17
11:27
(44)
На вот, почитай на ночь:

http://catalog.mista.ru/public/326983/
48 FIXXXL
 
05.10.17
11:56
СравнениеЗначений и СериализаторXDTO.ЗаписатьXDTO(ТЗ) прокатят?
49 Сияющий в темноте
 
05.10.17
12:18
когда мы соавниванм таблицы,мы хотим убедиться,что они содержат одинаковые данные и сериализация системными средствамт нас не спасет
и самое главное,что сортировка и сравнение таблиц выгрузкой во что то приводит к очень большой потере производительности,так что нудно искать методы,чтобы этого не делать
50 Shrk_V_V_V
 
05.10.17
12:21
(48) Сравнение значений не работает насколько я понял, а второе вполне, обсуждалось в ветке.
51 Shrk_V_V_V
 
05.10.17
12:23
(49) Сериализация для сравнения больших таблиц понятно что очень медленно. Я просто хотел сравнить маленькие таблицы, написав поменьше букв)