(простое решение для тех, кто не нашел ничего подобного на просторах интернета и не имеет навыков быстрого формирования контрольных сумм CRC, md5 средствами 1С, но имеет желание или необходимость выполнения такого сравнения).
* было актуально для платформы 8.2, платформа 8.3 уже позволяет получить хеш MD5 или CRC32
Цель:
отслеживать изменение содержимого реквизитов, имеющих тип Хранилище, например, при реализации механизма хранения истории изменения прикрепленных к объекту файлов в типовой конфигурации.
Задача:
получить инструмент, позволяющий сравнивать двоичные данные на основании их строкового представления.
Решение:
Представляю Вам функцию для сравнения значений типа Хранилище:
Функция СравнитьХранилища(Хранилище1, Хранилище2)
Если ТипЗнч(Хранилище1)=Тип(«ХранилищеЗначения») Тогда
ДвоичныеДанные1 = Хранилище1.Получить();
ИначеЕсли ТипЗнч(Хранилище1)=Тип(«ДвоичныеДанные») Тогда
ДвоичныеДанные1 = Хранилище1;
Иначе
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Хранилище2)=Тип(«ХранилищеЗначения») Тогда
ДвоичныеДанные2 = Хранилище2.Получить();
ИначеЕсли ТипЗнч(Хранилище2)=Тип(«ДвоичныеДанные») Тогда
ДвоичныеДанные2 = Хранилище2;
Иначе
Возврат Неопределено;
КонецЕсли;
Если (ДвоичныеДанные1 = Неопределено ИЛИ ДвоичныеДанные2 = Неопределено)
И НЕ (ДвоичныеДанные1 = Неопределено И ДвоичныеДанные2 = Неопределено)
Тогда
Возврат Ложь;
КонецЕсли;
Base64Строка1 = Base64Строка(ДвоичныеДанные1);
Base64Строка2 = Base64Строка(ДвоичныеДанные2);
Возврат Base64Строка1 = Base64Строка2;
КонецФункции
Вместо непосредсвенного использования Base64Строка для сравнения можно использовать хэши, сформированные, например, с помощью решения представленного здесь: «Простая и быстрая хэш функция (hash) средствами 1С (оптимизированный вариант)».
ВНИМАНИЕ: Начиная с версии платформы 8.3 вместо формирования строки Base64 уместее использовать получение хеша MD5 или CRC32 с помощью объекта «ХешированиеДанных«.
…
Хеш = ПолучитьMD5_Сервер(ТекстДляХеша);
…
Функция ПолучитьMD5_Сервер(Текст)
ОбъектХеш = Новый ХешированиеДанных(ХешФункция.MD5);
ОбъектХеш.Добавить(Текст);
Возврат ОбъектХеш.ХешСумма;
КонецФункции // ПолучитьMD5_Сервер
Банальное фуфло. Не стоит публикации
Если бы автор еще md5 высчитывал от хранилища, а потом их и сравнивал, вот это да. Тогда можно было бы говорить что в хранилище структура с ключами md5 и хранилище, при помещении в базу рассчитывается md5…
anig99 прав, фуфло. При постановке задачи первое, что приходит на ум base64 (для тех кто хотя бы раз читал справку по объекту Хранилище).
(2) а кто не читал, то ЗначениеВСтроку.
Если (ДвоичныеДанные1 = Неопределено ИЛИ ДвоичныеДанные2 = Неопределено)
И НЕ (ДвоичныеДанные1 = Неопределено И ДвоичныеДанные2 = Неопределено)
Тогда
Возврат Ложь;
КонецЕсли;
Код нужен, чтобы максимально запутать себя и читателей кода? 🙁
(3)Помогло, спасибо.