|   |   | 
| 
 | Изменился хэш при обновлении платформы 1С. | ☑ | ||
|---|---|---|---|---|
| 0
    
        leoway 11.10.20✎ 23:53 | 
        [B]Вопрос гуру 1С.[/B]
 Реализовал в системе учет печатных форм (mxl) путем вычисления хэш-функции (MD5). Все делал средствами 1С. Формирую печатную форму, далее передаю ее в поток в двоичных данных, далее вычислю хэш. После смены платформы 1С с 8.3.12 на 8.3.15 у [B][U]всех[/U][/B] ранее сохраненных печатных форм, при сравнении с вновь сформированных хэш стал другой. В чем может быть проблема? Доп. комментарий: при обработке печатной формы, параметры страницы не сохраняю. Если сравниваю два текста MXL документов, они одинаковы. | |||
| 1
    
        Timon1405 12.10.20✎ 00:03 | 
        что показывает сравнение mxl в hex-редакторе?     | |||
| 2
    
        Сияющий в темноте 12.10.20✎ 00:24 | 
        поди же 1с внутрь пишет версию формата,и неудивительно,что она поменялась.     | |||
| 3
    
        Жан Пердежон 12.10.20✎ 04:34 | 
        (0) сам себе злобный буратино: пихаешь в md5 закрытый формат, который постоянно меняется     | |||
| 4
    
        Провинциальный 1сник 12.10.20✎ 06:41 | 
        Хэш документа гарантирует проверку неизменности документа. Но странно от него ждать одинаковости, если исходные документы разные на уровне потока битов. Если вы хотите, чтобы хэш гарантировал не побитовую точность, а лишь отображаемый документом контент - то хэш-функции нужно передавать некий "нормализованный" документ простого формата типа xml или текста, сформированный из исходного.     | |||
| 5
    
        spectre1978 12.10.20✎ 06:45 | 
        (0) что значит два текста документов? Сравнивать надо два файла mxl между собой, например через командную строку можно вот так 
 fc /b 1.mxl 2.mxl Так одинаковые? | |||
| 6
    
        spectre1978 12.10.20✎ 06:53 | 
        И да, никто не обещал что при смене платформы бинарники будут одни и те же. Строго говоря, 100% гарантии нет и в пределах одной платформы, потому что не исключено, например, что в какой-то записи используются только отдельные биты, а остальные, неиспользуемые - случайные, забыли обнулить. И будет файлик при каждом сохранении немножко отличаться, а может, и нет.     | |||
| 7
    
        leoway 12.10.20✎ 09:40 | 
        (5) При сравнении двух файлов, файлы индентичны. Также сравнил их средствами 1С  2-ва mxl и через текстовый редактор - файлы интентичны. 
 (1) hex-редактором еще не смотрел. (4) Начал склонятся к данной идеи. (6) Не очень согласен с с этим высказыванием, т.к. механизм формирования печатной формы один и тот же в рамках одного сервера и платформы. | |||
| 8
    
        Провинциальный 1сник 12.10.20✎ 09:50 | 
        (7) "т.к. механизм формирования печатной формы один и тот же в рамках одного сервера и платформы"
 В общем и целом, одинаковость не документируется и два табличных документа, заполненных одним и тем же алгоритмом и сохраненные, могут бинарно отличаться. Скажем, платформа может писать в файл какой-то УИД или отметку времени. | |||
| 9
    
        leoway 12.10.20✎ 11:28 | 
        (8) Безусловно. Сейчас проверил хэш сторонним ресурсом. Файлы до обновления платформы и после - индентичны.
 Проблема пока больше в другом. Почему все файлы стали иметь другой хэш? Не мог же поменяться механизм вычисления хэш функции в 1С при обновлении платформы? Буду искать причину. В любом случае, спасибо за ответы. | |||
| 10
    
        RomanYS 12.10.20✎ 11:32 | 
        (9) Код вычисления хэша покажи     | |||
| 11
    
        leoway 12.10.20✎ 12:54 | 
        (10) Предварительно удаляю настройки печати из табличного документа строкой:
 ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Вывести(ИсхТабДокумент); На вход функции передаю Табличный Документ. Функция СохранитьДанныеПФ(ИсхТабДокумент, ПараметрыПечати, РежимРаботы, ОписаниеОшибки) Экспорт //Очистим параметры печати пользователя ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Вывести(ИсхТабДокумент); // 1. Передаем ПД на сервер Поток = Новый ПотокВПамяти; ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL); ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные(); // 2. Получить хэш ПараметрыПД.Хэш = ПолучитьХэшПечатнойФормы(ФайлДД); .... Функция ПолучитьХэшПечатнойФормы(ФайлДД) Экспорт ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеДанных.Добавить(ФайлДД); ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); Возврат ХешСумма; КонецФункции | |||
| 12
    
        RomanYS 12.10.20✎ 13:03 | 
        (11) Получается у тебя 3 подозрительных объекта: табдок, поток и сам хэш.
 Первый ты вроде проверил, последний 1с сломать всё-таки не должна была. Остается проверить поток (ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные();). | |||
| 13
    
        leoway 12.10.20✎ 13:05 | 
        (12) Отказаться от потока и перейти на работу с временным файлом?     | |||
| 14
    
        RomanYS 12.10.20✎ 13:09 | 
        (13) для начала проверить. Ну и про сам mxl выше писали, если хэш должен подтверждать именно данные, то от оболочки mxl желательно отказаться     | |||
| 15
    
        lodger 12.10.20✎ 13:18 | 
        где то в этих 5 строках зарыта собака.
 Поток = Новый ПотокВПамяти; ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL); ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные(); ПараметрыПД.Хэш = ПолучитьХэшПечатнойФормы(ФайлДД); ХешированиеДанных.Добавить(ФайлДД); | |||
| 16
    
        spectre1978 12.10.20✎ 13:24 | 
        СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); - не может быть косяка здесь? Например в применении неразрывных пробелов...     | |||
| 17
    
        leoway 12.10.20✎ 13:58 | 
        (16) Точно  нет.     | |||
| 18
    
        leoway 12.10.20✎ 14:05 | 
        (15) Провел эксперимент переместил формирование функции на сервер. Хеш стал другой.
 Походу это работа с потоком как-то работает иначе на клиенте и сервере. // 1. Передаем ПД на сервер Адрес = ПоместитьВоВременноеХранилище(ТабДокумент, Новый УникальныйИдентификатор()); // 2. Получить хэш ПараметрыПД.Хэш = лл_УправлениеПечатью2DСервер.ПолучитьХэшПечатнойФормыНаСервере(Адрес); Функция ПолучитьХэшПечатнойФормыНаСервере(Адрес) Экспорт ТабДокумент = ПолучитьИзВременногоХранилища(Адрес); Если НЕ ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") Тогда Возврат ""; КонецЕсли; Поток = Новый ПотокВПамяти; ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL); ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные(); ХешСумма = ПолучитьХэш(ФайлДД); Возврат ХешСумма; КонецФункции Функция ПолучитьХэш(ФайлДД) Экспорт ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеДанных.Добавить(ФайлДД); ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); Возврат ХешСумма; КонецФункции | |||
| 19
    
        leoway 12.10.20✎ 14:22 | 
        Дополню предыдущую проверку. Хэш в потоке и через файл на сервере индентичны.
 Функция ПолучитьХэшПечатнойФормыНаСервере(Адрес) Экспорт ТабДокумент = ПолучитьИзВременногоХранилища(Адрес); Если НЕ ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") Тогда Возврат ""; КонецЕсли; //Вариант 1 Поток = Новый ПотокВПамяти; ТабДокумент.Записать(Поток, ТипФайлаТабличногоДокумента.MXL); ФайлДД = Поток.ЗакрытьИПолучитьДвоичныеДанные(); ХешСумма = ПолучитьХэш(ФайлДД); Сообщить("Хэш в потоке: " + ХешСумма); //Вариант 2 ИмяФайла = ПолучитьИмяВременногоФайла("mxl"); ТабДокумент.Записать(ИмяФайла); ХешСумма = ПолучитьХэшФайл(ИмяФайла); УдалитьФайлы(ИмяФайла); Сообщить("Хэш через файл: " + ХешСумма); Возврат ХешСумма; КонецФункции Функция ПолучитьХэш(ФайлДД) Экспорт ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеДанных.Добавить(ФайлДД); ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); Возврат ХешСумма; КонецФункции Функция ПолучитьХэшФайл(ИмяФайла) Экспорт ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); ХешированиеДанных.ДобавитьФайл(ИмяФайла); ХешСумма = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); Возврат ХешСумма; КонецФункции | |||
| 20
    
        Franchiser 12.10.20✎ 14:26 | 
        (18) проверь через hex.  Возможно проблема в кодировке.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |