Сравнение значений типа Хранилище

Сравнение значений типа Хранилище
(простое решение для тех, кто не нашел ничего подобного на просторах интернета и не имеет навыков быстрого формирования контрольных сумм 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_Сервер

5 Comments

  1. anig99

    Банальное фуфло. Не стоит публикации

    Reply
  2. pumbaE

    Если бы автор еще md5 высчитывал от хранилища, а потом их и сравнивал, вот это да. Тогда можно было бы говорить что в хранилище структура с ключами md5 и хранилище, при помещении в базу рассчитывается md5…

    anig99 прав, фуфло. При постановке задачи первое, что приходит на ум base64 (для тех кто хотя бы раз читал справку по объекту Хранилище).

    Reply
  3. anig99

    (2) а кто не читал, то ЗначениеВСтроку.

    Reply
  4. artbear

    Если (ДвоичныеДанные1 = Неопределено ИЛИ ДвоичныеДанные2 = Неопределено)

    И НЕ (ДвоичныеДанные1 = Неопределено И ДвоичныеДанные2 = Неопределено)

    Тогда

    Возврат Ложь;

    КонецЕсли;

    Код нужен, чтобы максимально запутать себя и читателей кода? 🙁

    Reply
  5. cargobird

    (3)Помогло, спасибо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *