Циклический избыточный код (CRC32) и NativeAPI

06.02.14

База данных - Архивирование (backup)

p1c8crc.dll - внешняя подключаемая через NativeAPI компонента из которой можно получить контрольную сумму для строки и предназначена для проверки целостности данных.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Скомпилированная ВК
.dll 85,00Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.
Исходный код ВК
.zip 9,89Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.
Конфигурация
.cf 73,79Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Недавно озадачился получением CRC кода для строк табличной части и вот что из этого получилось. Работы по настоящей тематике проходили в несколько этапов.

Этап 1

Изучение теоретических основ расчета CRC. На этом этапепомогли статьи " Циклический избыточный код" и "Элементарное руководство
по CRCалгоритмам обнаружения ошибок"

Этап 2

Знакомство с NativeAPI для 1С8. Отличная, доходчивая и (главное) дополненая примерами статья "ВК NativeAPI на Delphi и FreePascal"

Этап 3

Оставим теорию и переходим к практике. На любимом Delphi была напишем и скомпилируем dll, которая экспортирует единственную функцию "РасчитатьCRC32". Ей передается единственный строковый параметр, а на выходе получается строка в виде hex.

В модуле проекта объявляем класс:  

TCRC32Class = class(TV8UserObject)
  public
    function crc32Func(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer; var v8:TV8AddInDefBase): boolean;
  end;

и его реализацию:

function TCRC32Class.crc32Func(RetValue: PV8Variant;
  Params: PV8ParamArray;
  const ParamCount: integer;
  var v8:TV8AddInDefBase): boolean;
var
  p: WideString;
  res: string;
begin
  try
    p := V8AsWString(@Params[1]);
    res := IntToHex(CRC32String(p),0);
    V8SetWString(RetValue, res);
    result := True;
  except
    on E : Exception do begin
      res:='['+E.ClassName+'] '+E.Message;
      V8SetWString(RetValue, res);
      result := False;
    end;
  end;
end;

также в части инициализации библиотеки пишем вот такой код:

  with ClassRegList.RegisterClass(TCRC32Class, 'ExecExtention', 'TCRC32Class') do
  begin
    AddFunc('crc32Func', 'РасчитатьCRC32', @TCRC32Class.crc32Func, 1);
  end;

Функция CRC32String реализована в модуле ucrc32.pas, а класс TV8UserObject описан и реализован в модуле v8napi.pas (см. ссылку во втором этапе). Об окончании этого этапа работ сигнализирует файл p1c8crc.dll.

Этап 4

Теперь осталось подключить внешнюю компоненту к конфигурации 1С8.2 и использовать ее. Для этого создадим общий модуль "ОбщийМодульCRC32". В нем напишем вот такой код:

Функция ИнициализироватьКомпонентуCRC32() Экспорт
    Попытка
        ПодключитьВнешнююКомпоненту("ОбщийМакет.p1c8crc", "CRC32Lib", AddInType.Native);
        ОбъектВК = Новый("AddIn.CRC32Lib.ExecExtention");   
    Исключение
        Сообщить("Ошибка создания объекта внешней компоненты AddIn.CRC32Lib.ExecExtention");
        Возврат Ложь;
    КонецПопытки;

     Адрес = ПоместитьВоВременноеХранилище(ОбъектВК, Новый УникальныйИдентификатор);
     ПараметрыСеанса.нсиКомпонентаCRC32 = Адрес;
     Возврат Истина;
КонецФункции

Функция ПолучитьКомпонентуCRC32() Экспорт
     Возврат ПолучитьИзВременногоХранилища(ПараметрыСеанса.нсиКомпонентаCRC32);
КонецФункции

В модуле сеанса проинициализируем компоненту. Для того чтобы вызвать внешнюю компоненту и проверить ее создадим обработку с табличной частью "ТЧ" (реквизиты: наименование, код и crc32) и команду "РасчитатьCRC". Код получился следующий:

&НаСервере
Процедура РасчитатьCRCСерверная()
    
    ВК = ОбщийМодульCRC32.ПолучитьКомпонентуCRC32();
    Для Каждого Стр Из Объект.ТЧ Цикл
        врСтрока = Стр.Наименование+";"+Стр.Код+";";
        Стр.CRC32 = ВК.РасчитатьCRC32(врСтрока);
    КонецЦикла;    
    
КонецПроцедуры


&НаКлиенте
Процедура РасчитатьCRC(Команда)
    РасчитатьCRCСерверная();
КонецПроцедуры

P.S.

Чуть не забыл. В общих макетах нужно создать макет с двоичными данными и именем "p1c8crc". В нее загрузить полученный на этапе 3 файл p1c8crc.dll.

crc32 nativeapi ВК dll

См. также

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73773    629    45    

88

Архивирование (backup) Системный администратор Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Программа позволяет выполнять автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    15992    22    6    

28

Архивирование (backup) Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Платные (руб)

Расширение поможет настроить резервное копирование баз SQL в стандартный файл выгрузки баз 1С (*.dt).

2400 руб.

27.08.2024    1551    1    6    

2

Архивирование (backup) Системный администратор Платформа 1С v8.3 Бесплатно (free)

Предлагаю Вашему вниманию 3 скрипта на bash (sh) для архивирования (backup) типовых конфигураций на Linux средствами 1С и Postgres. Перед запуском корректно заполните раздел "Параметры" в соответствии с Вашими настройками.

20.01.2025    532    Prelude    1    

5

HighLoad оптимизация Администрирование СУБД Архивирование (backup) Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Бэкап в Postgres состоит из набора граблей, которые нужно обойти для успешного восстановления. Они заложены в самых неожиданных местах от предмета резервного копирования (база или кластер) до структуры каталогов. Один неверный шаг и восстановление будет невозможным. Почему нельзя было сделать проще, как в MS SQL или Oracle? Почему бэкап в Postgres оставляет впечатление чьей-то лабораторной работы? Статья адресована прежде всего специалистам 1С, избалованным комфортом в MS SQL, в суровых буднях импортозамещения на Postgres.

13.08.2024    3522    1CUnlimited    9    

6

Инструменты администратора БД Архивирование (backup) Системный администратор Программист Пользователь Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Обработка для "обновления" своей тестовой базы из резервной копии рабочей базы без помощи админов.

1 стартмани

21.05.2024    2346    11    baidinden    4    

8

Архивирование (backup) Администрирование СУБД Системный администратор Россия Бесплатно (free)

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

04.12.2023    10592    n_mezentsev    15    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gislink 37 07.02.14 09:19 Сейчас в теме
Пишется то "Рассчитать" ;-) Единственный метод, и тот с ошибкой написан.
Прикрепленные файлы:
kuzyara; zarius; +2 Ответить
Оставьте свое сообщение