|   |   | 
| 
 | 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) зависит от условий задачи
 если выявлять расхождения не надо то просто делаем два хэша и сравниваем их если нужны расхождения то да тупо в лоб сравнивать | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |