Имя: Пароль:
1C
1C 7.7
v7: Недетерминированность в плане повторяемости ЗначениеВСтроку{Внутр}
0 Chai Nic
 
03.08.21
11:47
Наткнулся на баг в 1с 7.7. Или это не баг, а специально уложенные грабли.

Если несколько раз подряд делать сериализацию таблиц значений с одинаковым содержимым, то получаемые строки могут отличаться (при сравнении на равенство). При этом полученные путем десериализации объекты через обратную функцию ЗначениеИзСтроки{Внутр} - одинаковы, как и должно быть.

Оказалось, что типовая сериализация не гарантирует повторяемость результата-строки, а гарантируется лишь повторяемость объекта, полученного при восстановлении этой строки.

Путем анализа текстовых строк выгрузки обнаружилось, что строки колонок таблицы могут выгружаться в разном порядке. При этом дополнительно хранится порядок строк, что обеспечивает корректное восстановление(десериализацию).

Но вот возможности использовать сериализацию для сравнения таблиц на идентичность - теряется.

Такая вот загогулина, панимаишь..
1 Злопчинский
 
03.08.21
11:50
Занятно.
2 ДенисЧ
 
03.08.21
11:51
И что?
3 ДенисЧ
 
03.08.21
11:51
Сделай свою сериализацию. С шахматистками и карточной настольной игрой.
4 Garykom
 
гуру
03.08.21
11:52
(3) А что шахматистки в это деле как то иначе?
5 Garykom
 
гуру
03.08.21
11:54
(0) Ты особенности реализации ТЗ в платформе 1С, написанной на C++ (термины указатель, динамический список что то говорят?) понимаешь?
Это не баг, это фича

Можно сортировать или копировать строки в новые ТЧ и вот они новосозданные будут (должны) одинаковы
6 brainguard
 
03.08.21
11:57
(0) Спасибо! Будем знать и сравнивать таблицы через сворачивание.
7 ДенисЧ
 
03.08.21
11:58
(4) Да. У них есть правило - тронул ходи...
8 Chai Nic
 
03.08.21
11:59
(5) Да я понимаю. Как и понимаю, что они ничего не должны кроме того, что написано в документации. А в документации повторяемость не гарантируется.
9 Chai Nic
 
03.08.21
13:18
В общем, если очень надо и очень хочется сохранять таблицу в строке, пригодной для сравнения - то можно использовать для сериализации объект ИндексированнаяТаблица из 1с++ и его родные методы ВСтроку и ИзСтроки. Метод ВСтроку дает пригодную для последовательных сравнений строку, в отличие от платформенной функции.
10 Вафель
 
03.08.21
15:02
А на 8 кстати таже проблема?
11 Chai Nic
 
03.08.21
15:27
(10) В восьмерке ЗначениеВСтрокуВнутр объявлено устаревшим, и его не рекомендуют использовать в любом случае.
А вообще, конечно, вопрос интересный. Существует ли в 1с документированный способ сериализации объекта, где бы гарантировалась повторяемость при сериализации одинаковых копий объекта (не ссылок на один и тот же объект). Хотя бы в рамках одного сеанса.
12 Вафель
 
03.08.21
15:49
(11) тут недавн ветка была как сравнить тз.
И угадайте какой метод был предложен...
13 Сияющий Асинхраль
 
03.08.21
16:38
Хорошо сказано "строки колонок таблицы", пора новый термин вводить "колонки строк" :-)
14 Garykom
 
гуру
03.08.21
16:44
(11) в json
15 Chai Nic
 
03.08.21
16:44
(13) Там именно "строки колонок" хранятся, в сериализации. Гляньте внутрь. Данные хранятся сгруппированные по колонкам. То есть сначала первая колонка (все строки), потом вторая.. и так далее. А потом ещё некий служебный тег - единый порядок строк в этих колонках. Нифига не логично, но так оно есть.
16 Сияющий Асинхраль
 
03.08.21
16:48
(15) Верю, но то что данные хранятся по колонкам, это не значит, что хранятся "строки колонок", хранится колонка, а уж в каком порядке это другой вопрос...
17 Chai Nic
 
03.08.21
16:50
(16) Вопрос терминологии) Логично было бы предполагать, что колонки выгружаются в натуральном порядке возрастания номеров строк, а вот фигвам, они выгружаются как хочет платформа, а для компенсации этого дополнительно пристегивается список перестановки строк)
18 Сияющий Асинхраль
 
03.08.21
16:52
+(16) Ну и, да простит меня автор, всегда считал, что сравнивать большие текстовые куски, что нам и выдает значениевстрокувнутрь() признак плохого стиля :-( . Максимум на что эта штука годится обмен между базами быстро пишется и то в случае, если в ТЗ скидывать ТОЛЬКО простые типы: число, строка, дата...
19 Chai Nic
 
03.08.21
16:53
(18) Ну, сравнивать таблицы "в лоб" по строкам и столбцам тоже стиль так себе. Может это и правильно, но мееееедленно.
20 Garykom
 
гуру
03.08.21
17:02
(19) хеш считать
21 brainguard
 
03.08.21
17:03
(19) Свернуть() работает достаточно быстро
22 brainguard
 
03.08.21
17:13
Можно свое ЗначениеВСтроку сделать. Всего-то шесть строк

резстрока="";
для каждого стр из тз цикл
    для каждого колонка из тз.колонки цикл
        резстрока=резстрока+строка(стр[колонка.имя]);
    конеццикла;
конеццикла;
23 Chai Nic
 
04.08.21
07:56
(21) Свернуть считает итоги, а идентичность таблиц подразумевает не только идентичность итогов
24 Chai Nic
 
04.08.21
08:02
(14) А что, формат json однозначно определяет отображение объекта в сериализованную строку? Вряд ли. Есть пробельные, форматирующие элементы, комментарии, которые при чтении игнорируются, а при записи могут быть добавлены. Кроме того, в xml например явно прописано, что атрибуты объектов могут сохраняться в произвольном порядке, не обязательно в порядке их добавления или в алфавитном. Скорее всего, подобное и в json есть.
Так что, формата, где бы декларировалась и поддерживалась детерминируемая повторяемая сериализация в 1с похоже нет(
25 Злопчинский
 
04.08.21
11:28
(22) такое не прокатит. в этом варианте будет представление значения. например, в двух таблицах будет одно и то же представление "основной договор", но договора при этом - разные...
26 mistеr
 
04.08.21
11:49
(15) Наоборот логично, если учесть, что в таком виде строка лучще сжимается.

(17) Думаю, что выгружаются так, как лежат в памяти.
27 MarySue
 
05.08.21
11:24
(25) ну можно добавить проверку на тип значения.  Если тип справочник - выгружать код+представление.  Если документ - выгружать Вид()+ДатаДок+НомерДок.
28 MarySue
 
05.08.21
11:27
(19) это во-первых правильно, во-вторых не медленно ни фига
в-третьих, это единственный вариант, при котором можно сразу сформировать вменяемый репорт о расхождениях в сравниваемых таблицах:  в какой строке, в какой колонке, в чём различие.
29 Garykom
 
гуру
05.08.21
11:35
(25) угу кривая хэш-функция
30 Garykom
 
гуру
05.08.21
11:37
(28) зависит от условий задачи
если выявлять расхождения не надо то просто делаем два хэша и сравниваем их
если нужны расхождения то да тупо в лоб сравнивать
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.