Вход | Регистрация


1С:Предприятие ::

Метки: 

Сериализация таблицы значений

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

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

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

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


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

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

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

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

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

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

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



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует