Внешняя компонента для работы со строками



ВК по технологии Native для работы со строками: хеши по различным алгоритмам, крутое шифрование, вычисление релевантности (схожести) строк. Событие переключения подсистем.

ВК является выделенной частью полной версии MiracleNative. (//infostart.ru/public/125913/)

Изюминки:

Получение хешей, в том числе и по актуальному для 1С (в части последнего интереса к брутфорсу паролей) алгоритму SHA1

   

Шифрование/Дешифрование строк с ключом, когда результат шифрования одной и той же строки с одним и тем же ключом всегда получается разный, а дешифровка однозначной. Исключительно затруднен «взлом»

   

Функция неявного сравнения строк (вычисление релевантности /схожести/). Может пригодиться для чистки справочников от «почти дублей», загрузки прайсов и т.д.

Примеры вычисления релевантности пар строк:

«майка мужская», «мужск. майка» =78
«дизельгенератор», «генератор дизельный» =82
«тонер для принтера», «тонер принт.» =73

Архив включает: собственно саму ВК StringsNative.dll, тестовую обработку (все методы ВК) DLLTest.epf (8.2), файл описания методов StringsNative_dll_ReadMe.txt 

Версия 1.1.1.2:

1. Исправлена досадная ошибка во вспомогательной функции СтрокуБайтовВСтрокуСимволов

2. Добавлен метод  СформироватьГУИД — возвращает стандартную строку GUID Windows

Учитывая, что Майкрософт грозился, что их ГУИД может повториться только раз в тысячу лет, можно использовать
как супер-случайную строку.

Версия 1.1.1.3 (второй файл)

В свете //infostart.ru/public/178957/ от щедрот MiracleNative 😉

Метод ПодключитьКонтрольНавигационныхСсылок() // без параметров.

Перехват события WM_PARENTNOTIFY, генерирует внешнее событие «WM_NAVIGATE_REF_CLICK»

Возвращает: «УСПЕШНО», «УЖЕ ВКЛЮЧЕН» (при повторной попытке при включенном), «НЕ УПРАВЛЯМОЕ ПРИЛОЖЕНИЕ» (работает только в тонком клиенте управляемого приложения).

Пример обработки события:

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если Событие="WM_NAVIGATE_REF_CLICK" Тогда
НавигационнаяСсылка = АктивноеОкно().ПолучитьНавигационнуюСсылку();
НавигационнаяСсылка=СтрЗаменить(НавигационнаяСсылка,"e1cib/navigationpoint/","");
Сообщить("НавигационнаяСсылка: "+НавигационнаяСсылка);
КонецЕсли;
КонецПроцедуры

Метод ОтключитьКонтрольНавигационныхСсылок() — соответственно отключает при необходимости ранее включенный

Версия 1.1.1.5. С учетом комментарие. И ВК, и обработка. Доработки — комментах

98 Comments

  1. Abadonna

    Полный текст readme:

    Поключение ВК:

    ПодключитьВнешнююКомпоненту(ПолноеИмяВК,»StringsNative»,AddInType.Native);

    Создание объекта:

    Строки = Новый(«AddIn.StringsNative.V8Strings»);

    Далее к методам созданного объекта обращаемся как обычно, через точку.

    Например:

    HASH_SHA1=1;

    Стр=Строки.ПолучитьХешСтроки(СокрЛП(ИсходнаяСтрока),HASH_SHA1);

    Методы:

    ПолучитьХешСтроки(ИсходнаяСтрок:строка,Алгоритм:Число): строка

    Возвращает хеш-строку переданной строки по выбранному алгоритму.

    Алогритмы:

    1 — SHA1

    2 — SHA256

    3 — MD5

    4 — CRC32

    5- HAVAL128

    ПолучитьСтрокуBase64(ИсходнаяСтрок:строка): строка

    Получает строку Base64 из переданной.

    Примечание: строка символов, а не hex-последовательность байтов

    ПолучитьСтрокуИзBase64(ИсходнаяСтрок:строка): строка

    Получает строку из Base64-строки (символов)

    СтрокуСимволовВСтрокуБайтов(ИсходнаяСтрок:строка): строка

    Получает строку hex-последовательности байтов переданной символьной строки

    Примечания:

    1. В совокупности с ПолучитьСтрокуИзBase64 является аналогом оператора 1С: Base64Значение(ИсходнаяСтрока)

    2. Именно так в 1С хранится хеш-пароля

    СтрокуБайтовВСтрокуСимволов(ИсходнаяСтрок:строка): строка

    Противоположна предыдущей

    ШифроватьСтроку(ИсходнаяСтрок:строка.Ключ:строка): строка

    Получает шифрованную строку из исходной.

    Ключ — строка ключа, необязательный, если не указан — внутренний ключ ВК

    Примечания:

    1. Используются внутренние методы шифрования Windows

    2. Изюминка состоит в том, что при шифровании с одним и тем же ключом, результат получается разный. А дешифруется однозначно

    ДешифроватьСтроку(ИсходнаяСтрок:строка.Ключ:строка): строка

    Противоположна предыдущей

    РелевантностьСтрок(Строка1:строка,Строка2:строка,Направление:Булево): число

    Функция неявного сравнения строк. Вычисление релевантности (схожести) строк.

    Релевантность до 100 (полностью идентичны)

    Направление — необязательный, по умолчанию Истина

    При Направление=Истина строкой эталоном считается Строка2, иначе Строка1

    Например, релевантность пар:

    майка мужская -> мужск. майка =78

    дизельгенератор -> генератор дизельный =82

    тонер для принтера -> тонер принт. =73

    Тестировалось на: WindowsXP, Windows7, Windows Server ® 2008 Standard Service Pack 2 (32 и 64)

    Reply
  2. Ёпрст

    Пригодится

    Reply
  3. Dach

    Релевантность строк — как работает на больших объемах данных? Насколько быстро? И как сравнивает — посимвольно или «самообучаясь» (запоминая слова из строк и ища похожие) ?

    Reply
  4. Abadonna

    (3) Dach, для больших объемов (длин строк) не предназначена, да и не проверял. Самообучаемости нет, просто всегда выполняется алгоритм.

    Reply
  5. Поручик

    (0) Релевантность по какому алгоритму вычисляется?

    Reply
  6. Abadonna

    (5) Поручик, если честно — ХЗ 😉 нашел готовый модуль, подцепил, потестил, вроде похоже на правду.

    Reply
  7. andrewks

    шифрование — по какому алгоритму?

    Reply
  8. andrewks

    Шифрование/Дешифрование строк с закрытым ключом — не понял, а ключ один внутрях, или как?

    Reply
  9. Abadonna

    (7)

    шифрование — по какому алгоритму?

    Тебе скажи, ты ж расшифровывать начнешь :))) могу только сказать, что используется библиотека винды advapi32.dll, функции CryptEncrypt, CryptDecrypt и т.п…

    не понял, а ключ один внутрях, или как?

    А ридми почитать?;)

    Ключ — строка ключа, необязательный, если не указан — внутренний ключ ВК

    Закрытый ключ метод

    Reply
  10. andrewks

    (9)

    Закрытый ключ метод

    я знаю, что такое закрытый ключ 😉

    потому и возник вопрос. т.е. получается не закрытый ключ (который подразумевает также наличие пары — открытого ключа), а просто ключ

    Reply
  11. andrewks
  12. andrewks

    http://ipoligon.chat.ru/sources/rc4src.zip

    http://ru.wikibooks.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0­%BD%D1%8B%D0%B5_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D­1%86%D0%B8%D0%B8_RC4

    Reply
  13. andrewks

    а вообще, лучше бы блоуфиш запихать http://www.schneier.com/blowfish-download.html

    Reply
  14. Abadonna

    (13)да фиг с ней, с терминологией 😉

    вот что там юзается:

    function CryptEncrypt(Key: HCRYPTKEY; Hash: HCRYPTHASH; Final: LongBool; Flags:

    LongWord; Data: PBYTE; Len: PLongWord; BufLen: LongWord): LongBool; stdcall;

    external ADVAPI32 name ‘CryptEncrypt’;

    и т.д. и т.п.

    а инциализация по алгоритму RC2 (а можно было и по RC4)

    Reply
  15. AlX0id

    (1)

    Спасибо )

    Опробую на досуге Ваш RC2 связать с php-шным 🙂

    Reply
  16. flash2k

    интересная вещь.

    опробую релевантность на справочнике номенклатуры

    Reply
  17. Abadonna

    (16) flash2k, потом результат, плиз, в студию. По скорострельности, например и т.п. А то я обычно свой кокаин не нюхаю :)))

    Reply
  18. PiccaHut001

    ещё одна строковая библиотека. На 1С.

    Reply
  19. awa

    Abadonna, что такое «строка hex-последовательности байтов»? Что получится при вызове метода СтрокуСимволовВСтрокуБайтов(«АбВ»)?

    Reply
  20. Abadonna

    (19) awa, СтрокуСимволовВСтрокуБайтов(«АбВ»)=»C0E1C2″

    Код символа «А»=192=$C0, Код «б»=225=$E1 и т.д. В общем, набор hex-представлений байт по набору символов.

    RESULT:=»;
    for i:=1 to Length(s) do begin
    RESULT:=RESULT+IntToHex(Ord(s[i]),2);
    end;
    
    Reply
  21. andrewks

    (20) т.е. строка сначала конвертируется в ANSI?

    Reply
  22. Miha.L

    Хорошая работа. Плюс.

    Reply
  23. Oleg_nsk

    «внутренний ключ ВК» это какая-то константа из dll или на лету формируемая строка привязанная к железу?

    Reply
  24. Abadonna

    (23) Oleg_nsk,

    Скажем так — длиннющий параметр по умолчанию,передаваемый в функцию. Можно сказать, что и константа.

    Reply
  25. MarSeN

    (0) Abadonna

    Можно получить исходный код реализующий «Перехват события WM_PARENTNOTIFY». Я хотел бы сделать так, чтобы меню из главного окна (статья «v8.2 Управляемые формы: добавляем произвольное пользовательское меню в основное меню 1С без модификации конфигурации» http://infostart.ru/public/179374/ ) перемещалось на активное окно.

    Reply
  26. Abadonna

    (25) MarSeN,

    см. Сабклассинг главного окна 1С, там практически исходник

    Reply
  27. MarSeN

    (26) Abadonna

    Спасибо )

    Reply
  28. MarSeN

    (26) Abadonna

    Перехватил WM_PARENTNOTIFY, но в но в LOWORD(ParamW) нету WM_CREATE. Там вообще ничего нету.

    Весь инет прошерстил (даже аналогичный код перехвата WM_PARENTNOTIFY нашел) — вроде делаю все правильно, а результат нулевой ((

    Reply
  29. Abadonna

    (28) MarSeN, точно не помню, но в режиме декстопа его может и не быть.

    Юзай SPYXX.EXE (от мелкософта), смотри сообщения окна им…

    WM_CREATE у меня появляется в моей базе, где режим подсистем вообще отключен, и по кнопке рождается свободное

    SDI — окно. Зато фиг потом проходит WM_CLOSE или WM_DESTROY

    Я ж в своей базе полным извратом занялся. SDI-окно после рождения приобретает родителя в виде главного и сворачивется в псевдо-трей главного. А при закрытии — кнопка из псевдо-трея уходит.

    Вот так оно смотрится

    Reply
  30. Abadonna

    +/29/ И не надо мне там вообще никакого меню. Кнопки под каждого юзверя прям на ходу перестраиваются

    Reply
  31. Abadonna

    (28) MarSeN,

    но в LOWORD(ParamW)

    Честное слово, аж кайф поймал :))) Свои 😉

    Reply
  32. MarSeN

    (31) Abadonna

    )))

    А ты не мог бы глянуть в исходники «Внешняя компонента для работы со строками»? там как раз то что мне надо «Метод ПодключитьКонтрольНавигационныхСсылок() // без параметров.»

    Reply
  33. Abadonna

    (32) MarSeN, а там и смотреть нечего, там всего одно условие на сабклассинге

    if TheMessage = WM_PARENTNOTIFY{528} then begin // клик на навигационной ссылке
    I_V8.ExternalEvent(‘STRINGS_NATIVE’, ‘WM_NAVIGATE_REF_CLICK’, »);
    end;

    (33) Словечки подбирай

    Reply
  34. MarSeN

    (34) Abadonna

    Понятно. Я просто уже в условии if TheMessage = WM_PARENTNOTIFY пытался LOWORD(ParamW) сравнить с WM_CREATE и тогда послать событие в 1С )

    Там еще есть разница когда режим работы открытия окон в закладках и отдельными окнами. Лан, разберусь

    Еще раз спасибо за помощь, Abadonna. Не буду «засорять эфир» )

    Reply
  35. Abadonna

    (35) MarSeN,

    Там еще есть разница когда режим работы открытия окон в закладках и отдельными окнами

    Вот когда отдельными, там, скорее всего, и будет LOWORD(ParamW)=WM_CREATE

    Reply
  36. Abadonna

    (21) andrewks, извини, сразу не ответил…

    Тип данных String используется, чтобы хранить последовательность символов (предложения).

    По умолчанию String обрабатывается как AnsiString. Он может быть обработан как ShortString, если директива компилятора $LongStrings установлена в Off (по умолчанию установлена в On).

    Поэтому ничего там специально не преобразуется, строка в Дельфи — массив AnsiChar

    Reply
  37. andrewks

    (37) фишка в том, что в 1С строка — unicode UTF-16

    Reply
  38. Abadonna

    (38) andrewks, никаких фишек. Спокойно параметр s := V8AsWString(@Params[1]) принимает, и безо всяких делает

    Я даже не заморачивался. В v8napi.pas все уже предусмотрено, спасибо http://infostart.ru/public/81644/

    Ты, поди, на Си фигаришь? Терпеть его не могу 😉

    Reply
  39. andrewks

    (39) я на Lazarus фигарю 😉

    на Си тоже могу, но редко.

    так я и не понял, какой тип имеет s?

    Reply
  40. Abadonna

    (40) andrewks, Lazarus ка раз вчера пытал. Все зашибись, но размер экзюка… офигеть. Вроде и отладочну информацию исключил…

    вот тебе полный код:

    function TV8Files.StringToHexByteString(RetValue: PV8Variant; Params:
    PV8ParamArray;
    const ParamCount: integer): boolean;
    var i: integer;
    var s, sout: string;
    begin
    s := V8AsWString(@Params[1]);
    sout := »;
    for i := 1 to Length(s) do begin
    sout := sout + IntToHex(Ord(s[i]), 2);
    end;
    V8SetWString(RetValue, sout);
    RESULT := true;
    end;
    
    

    Показать

    Reply
  41. andrewks

    (41)

    Все зашибись, но размер экзюка… офигеть. Вроде и отладочну информацию исключил…

    видимо, не до конца. отладочную инфу лучше в отдельный файл переключить

    Reply
  42. andrewks

    (41) вот здесь

    s := V8AsWString(@Params[1]);

    идёт неявное преобразование типа. так делать не желательно

    Reply
  43. Abadonna

    (43) andrewks, знаешь почему у меня достаточно уникальные разработки? Меня никто не учил, что «так нельзя», я делаю — оказывается можно :))) Вечный двигатель стопудово изобретет человек, который не знает, что его изобрести нельзя 😉

    Reply
  44. andrewks

    (44) и тем не менее… можно получить необратимое преобразование с потерей (если в строке есть символы, не укладывающиеся в ANSI)

    Reply
  45. Abadonna

    +/44/ V8AsWString(@Params[1])- везде стоит в MiracleNative, и везде нормально в строку воспринимается.

    Reply
  46. awa

    (46) Пока речь идет просто о строках — можно не замечать, что внутри компоненты идет преобразование строк в кодировку ANSI и обратно при возврате строк из компоненты. Подавляющее большинство строк, встречающихся в 1С, содержат только те символы, которые входят в кодировку ANSI — до тех пор, пока на компе есть поддержка русского языка и основная кодовая страница win1251. Но на многих серверах это уже не так. Но я не об этом.

    Итак, пока речь идет просто о строках — можно особенно не морочиться с кодировками.

    Но вот как только речь заходит про такие функции, как ПолучитьХешСтроки() или СтрокуБайтовВСтрокуСимволов() — то здесь мы уже имеем дело не просто со строкой, а с ее представлением в памяти, т.е. непосредственно с кодировкой! Результат этих функций напрямую зависит от кодировки строки. В этих функциях, имхо, обязательно должен быть еще один параметр, указывающий кодировку строки. Как минимум нужна поддержка кодировок ANSI, UTF8, UTF16LE и UTF16BE.

    Ну либо в документации четко указать, что кодировка строк — ANSI.

    Просто я подозреваю (не проверял, это лишь умозаключение!), что если установлю пароль «ДамТебеГорошка» в 1С, и получу хэш пароля через свойство СохраняемоеЗначениеПароля пользователя, он не совпадет с хэшем, посчитанным с помощью компоненты.

    Reply
  47. Abadonna

    (47) awa, проверь 😉

    вообще, меня не сильно волнуют другие кодировки. Все должны говорить или на русском,или на английском :)))

    Reply
  48. andrewks

    (47) awa, стопудово не совпадёт, т.к. хэш 1с вычислит либо с utf-16, либо с utf-8, и тоно не с ansi. других строк в базе 1с нет

    Reply
  49. andrewks

    думаю, даже с иероглифами можно не заморачиваться, а попробовать передать в компоненту неразрывный пробел, а потом получить его назад. думаю, придёт уже не он

    Reply
  50. awa

    (48) Пришлось проверить. Все как я и говорил. Не совпало.

    1С считает хеш из последовательности байт, которые образует заданная строка в кодировке UTF8. Соответственно, пока в строке используются только символы из первой половины кодовой страницы ANSI (с кодом меньше 128), например английские буквы и цифры, то все совпадает, так как представление этих символов в кодировках ANSI и UTF8 совпадает. Но для русских букв представление в кодировках ANSI и UTF8 уже разное, и, как следствие, хэши, посчитанные 1С и компонентой разные. Для строки «ДамТебеГорошка» 1С считает такой хэш:

    9c7a3ea5365f570b1cb5feea20cda9952b9111a8

    Компонента для этой же строки считает уже совсем другой хэш

    5643d69c000601f786174e28b8747b7177ae3ecd

    В общем, Abadonna, очень зря тебя не волнуют другие кодировки. В текущем виде компонента не способна помочь в деле работы с паролями 1С.

    Фактически, в компоненте нужна функция, которая считает хэш от строки в кодировке UTF8, и преобразующая двоичный хэш сразу в строку по алгоритму base64. Тогда это получится именно то, что хранится в 1С как хэш пароля.

    (49) andrewks, я и не сомневался)) Логика — вещь железная))

    Reply
  51. Abadonna

    (51) awa, спасибо. подправим. Всех дело-то: AnsiToUtf8(СтрокаAnsi)

    Reply
  52. andrewks

    (52) эмм… не хотелось бы огорчать… но лучше сразу получать unicode, юезо всяких unicode->ansi->unicode

    Reply
  53. Abadonna

    (53) andrewks, проверю. не пойдет, сделаем по другому.

    Reply
  54. andrewks

    (54) не пройдёт

    Reply
  55. kanalex

    на строне х64 сервера не работает:(

    Пишет:

    Тип не определен (AddIn.StringsNative.V8Strings)
    Строки = Новый(«AddIn.StringsNative.V8Strings»);
    
    Reply
  56. mvgfirst

    (56) kanalex,

    на строне х64 сервера не работает:(

    Пишет:

    Тип не определен (AddIn.StringsNative.V8Strings)

    Строки = Новый(«AddIn.StringsNative.V8Strings»);

    Поддерживаю!! Сам бьюсь понять не могу чо за беда!

    И походу я «приплыл» — все тестировал работая с клиентом и что интересно, если на клиенте подключать на том же самом сервере (через РДП) то все работает. А вот добавил создание этой функции в регламентное задание — и на тебе!!! Получил «Тип не определен»

    Кто как решил?!

    Reply
  57. andrewks

    (57) mvgfirst, длях64 сервера нужна скомпилированная х64 версия библиотеки

    Reply
  58. mvgfirst

    Мне-то очень удобна была компонента.

    Одновременно для работы нужно и MD5 и SHA1 (банк для обмена требует что бы 1000 раз хеш от хеша получить)

    И тут вроде все в одном флаконе — но на сервере флакон не открывается

    Reply
  59. mvgfirst

    (58) andrewks,

    (57) mvgfirst, длях64 сервера нужна скомпилированная х64 версия библиотеки

    Полностью с Вами согласен, а где ее взять? Или она идет в поставке а я просто незаметил?

    Ща перекачаю проверю

    Reply
  60. andrewks

    (60) mvgfirst,

    а где ее взять?

    думаю, надо попросить автора собрать х64 версию (если её в архиве нет)

    Reply
  61. mvgfirst

    Автор — прошу! Скомпилируй пожалуйста в x64 — очень надо!

    Reply
  62. mvgfirst

    До меня дошло — почему при загрузке компоненты в клиенте — все работало.

    Хотя я и запускал «Толстого клиента» на х64 сервере — он то запускался все-равно как x86 приложение (ибо их нет 64-разрядных)

    А когда загнал в регламентное задание — компоненту уже захотел подключить сервер — и вот ему-то (чистому «арийцу») надо именно 64-х разрядную компоненту.

    Эх блин, что бы выловить этот глюк — я потратил 5 часов (не хотел заморачиваться с отладочным режимом сервера — и все через логфайлы делал)

    Очень надеюсь — завтра я проснусь, а 64-разрядная компонента уже скомпилена и готова к скачиванию!

    Reply
  63. andrewks

    (63) mvgfirst, это не глюк, это, как-бы, так задумано 🙂

    клиенты под вин — только х32

    а сервер — есть х32, есть х64

    Reply
  64. mvgfirst

    Автор! Отзовись пожалуйста, нужно понимание — ждать версию x64 или нет?

    Reply
  65. mvgfirst

    И в догонку, если вдруг грядут изменения, и возможно расширение функциональности компоненты — может добавить функцию «Пауза(КоличествоМиллисекунд)»

    Нужно это для того что бы организовывать паузу между вызовами команд сервера (такие требования предъявил Банк — ждать минуту между вызовами его API)

    Reply
  66. Abadonna

    (51) awa, Лови, именно твой горох там. Даже слопала пароль, который в белой горчяке только присниться может. Вот аж какой: ступаявлестамжуткоЫЫЫЫ. Уж уж буквы с самым большим кодом, всякие «я» и «Ы». За Япону мать гарантий не даю.

    Reply
  67. Abadonna
    Фотография* (необходима для заполнения профиля)Фотография* (необходима для заполнения профиля)Фотография* (необходима для заполнения профиля)

    Доржи, ты бренды не порти!

    Reply
  68. Abadonna

    (66) mvgfirst, добавив метод Задержка, обычный виндовый sleep(мс). Один параметр, если опущен по умолчанию 25 мс.

    Что касается скомпилировать на х64, то могу попробовать только лазарусом, но там неизвестно, что вылезет…

    Я на нем пока только «Пошел ты, мир!» написал.

    Reply
  69. mvgfirst

    Очень нужна 64-х разрядная, или скажем так «запускающаяся в регламентном задании на 64-х разрядном сервере» )))

    Я на мисте поднял тему поиска альтернтивных способов расчета MD5 и SHA1. Там предложили яваскрипты. И все бы хорошо… да вот выяснилось что в 8.2 метод base64Строка возвращает совсем иное значение чем метод твоей компоненты: ПолучитьСтрокуBase64

    И что самое печальное банк «хавает» именно твой вариант. Понять немогу почему….

    Reply
  70. mvgfirst

    И кстати вопрос, а если запустить твою компоненту на сервере Линукс, работать будет?

    Не то что бы мне это было нужно — но все-таки.

    Reply
  71. Abadonna

    Под эмулятором будет. Я ж не бог, а тупой одноэснег (сам себя всегда так зову) и просто видновый прогер на Д7

    Reply
  72. mvgfirst

    (72) А когда ждать-то х64?

    Reply
  73. andrewks

    (71) mvgfirst, если имеется в виду сервер 1с под linux, то — нет.

    и эмуляторы тут ни при чём. ну, а запуск вин-сервера 1с под вайном — это чистой воды извращение (при наличии «родного», линуксового)

    Reply
  74. Abadonna

    (73) mvgfirst, можешь считать, что уже никогда. У меня даже ОС пол рукой нет x64, чтобы потом туда х64 IDE пихать.

    Очень надеюсь — завтра я проснусь, а 64-разрядная компонента уже скомпилена и готова к скачиванию!

    Мечты… мечты…

    Reply
  75. mvgfirst

    Я гдето так и предполагал…. поэтому решил вопросы (надеюсь что решил) с помощью javascript

    Три скрипта засунул в одну обработку и ее вызываю на сервере. Думаю — то что нужно. Хотя конечно по скорости не самый идеальный случай.

    Что же, завтра рабочий день — в боевых условиях и проверим….

    В любом случае спасибо за внимание и попытки помочь.

    Reply
  76. Abadonna

    (76) mvgfirst, попорчена современная генерация снеговиковыми регл. заданиями. А вопрос-то решается просто:

    батник на запуск от имени Автопилота, там более теперь даже параметр появился /execute, батник по ВИНДОВСКОМУ планировщику заданий — и твори, что хошь! У меня нигде регламенты не используются! А как на 7.7. делали?! Только так! Автопилота сделай терминальным — и все твоим скрипты на фиг не нужны

    Reply
  77. mvgfirst

    А может все-таки подумать и скомпилить?

    MSScriptControl — тоже неработает в x64

    Это прям как проклятие какое-то

    Reply
  78. mvgfirst

    В общем-то с горем пополам через COM+ обертку я запустил скрипты на x64 сервере

    Но чего-то мне это вообще не понравилось

    Слишком много танцев с бубнами

    Reply
  79. cool.vlad4

    (79) а что вам нужно-то? хэши -md5 и sha1 под виндовый сервак 64 бита? на c# такое за полчаса-час максимум делается. http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.aspx

    ЗЫ и не надо говорить, что нет dotnet-а. не поверю.

    Reply
  80. cool.vlad4

    (79) mvgfirst, ну что-то вы не ответили, хотя сообщение прочли. можно поиграться вот так

      asc = Новый COMОбъект(«System.Text.ASCIIEncoding»);
    enc = Новый COMОбъект(«System.Security.Cryptography.SHA1CryptoServiceProvider»);
    bytes = asc.GetBytes_4(«Hello»);
    hashBytes = enc.ComputeHash_2(bytes);
    Сообщить(hashBytes);

    но это такой же костыль как и со скриптами. да и с кодировками.

    Reply
  81. mvgfirst

    (80) cool.vlad4,

    а что вам нужно-то? хэши -md5 и sha1 под виндовый сервак 64 бита?

    Именно, только в виде внешней компоненты (которую кстати здесь и обсуждаем)

    на c# такое за полчаса-час максимум делается.

    Уверен что именно так и есть на самом деле. Но я не пишу на c#, я не пишу внешние компоненты и вообще давно уже отошел от «низкоуровневого програмирования» поэтому — это не про меня.

    Reply
  82. mvgfirst

    А приведенную ссылку я изучал. И даже мне вот подсказали вот это: http://batcoh.livejournal.com/66407.html

    Reply
  83. cool.vlad4

    (83) честно говоря мне лениво следить за всей веткой. если несложно киньте в личку описания функций, что вам нужны. я подумаю, что смогу сделать(сегодня правда, не обещаю). сервак 64 битный у меня под рукой имеется.

    Reply
  84. cool.vlad4

    (83) там жуткий код. а другого наверное от смешения capicom, adodbstream, .net и 1С и не получится.

    Минусы — во-первых говорят, COM достаточно медленно работает.

    COM, конечно не быстрый, но думаю скорость у него просядает из-за того, он COM инициализирует при каждом вычислении хэша. не очень-то благоразумно.

    Reply
  85. mvgfirst

    Нужно мне ровно то что делает сабжевая компонента.

    А именно

    Хеш MD5 на вход который принимает строку а не файл (который должен работать очень быстро — мне его по условиям ТЗ ндо вычислять 1102 раза для каждого отсылаемого пакета)

    Хеш SHA1 на вход тоже строка

    Base64 — на вход должен принимать строку. Пробовал использовать родной 1С-овский. Но он работает только с двоичными данными — и как результат банк не принимает такой файл.

    В 32-х разрядной среде — все это работает с помощью этой компоненты. В 64-х разрядной — компонента просто не пдключается.

    Reply
  86. sttt

    (83) mvgfirst, может это подойдет Компонента скомпилируешь исходники под 64 у меня ее нет под рукой. в архиве готовая dll для 32. возможно не так сделал))

    Reply
  87. sttt

    (86) mvgfirst, сами процедуры в stmd5.cs а в обработке как использовать

    Reply
  88. cool.vlad4

    (87) не подойдет. в таком виде по крайне мере. ВК по такой технологии(COM) на сервере не работает. Надо на чистый COM переписать.

    (86) понятно. завтра отпишусь о результате.

    Reply
  89. mvgfirst

    Ок. Жду результатов. Я так понял — это будет еще одна Nativе-ная компонента.

    А можно тогда сразу сделать две версии и под 32 и под 64 разряда. Что бы универсальная была. Я тогда в коде разделю… и буду подключть в зависимости от окружения.

    Ну или одну которая сработает и там и там, если такое возможно конечно.

    Reply
  90. cool.vlad4

    (90)не , это, не нативная, это же c#. если хочется нативную, могу на плюсах попробовать, но уже чуть позже(сегодня/завтра/послезавтра,как получится). это COM компонента, в архиве в reg64.bat — для регистрации в 64 битах. у меня на сервере работает. компонента простая как 5 копеек, — 2 с половиной метода, там же исходные коды, если захочется поменять. Также в backup

    PS. не думаю, что на плюсах сложно, если взять готовую либу.

    Reply
  91. cool.vlad4

    +(91) и да, если не хочется создавать каждый раз com объект на сервере, можно использовать http://infostart.ru/public/62410/

    Reply
  92. mvgfirst

    (91) cool.vlad4,

    если хочется нативную, могу на плюсах попробовать,

    Думаю надо пробовать… насколько я понял на сервере 1С предприятия работают только Нативные внешние компоненты.

    Я готов подождать Нативную, т.к. с горем пополам уже запустил генерацию хешей на скриптах… но каждый день боюсь что перетанет работать из-за …. короче из-за чего угодно…

    И конечно же я хочу заменить скрипты, на вызов внешней компоненты… поэтому готов и буду ждать нативную. Уверен что многие со мной согласятся. А если в нее можно будет добавлять другие полезные мелочи (например sleep) то тоже будет приятно

    Reply
  93. cool.vlad4

    (93) хорошо. но вот это

    насколько я понял на сервере 1С предприятия работают только Нативные внешние компоненты.

    не совсем верно. COM компоненты прекрасно работают на сервере 1С предприятия, в том числе написанные и на C#. Ваши же скрипты работают? а вызываются они по COM-у. Это обычные ВК не работают. Native-работают и там, и там. Вообще путаницу в терминах 1С хорошо внесла этими компонентами и Native.

    Reply
  94. mvgfirst

    А вот чисто теоретически, какой метод выполнится быстрее из COM или из Native-комопненты, при условии что алгоритм и язык программирования один и тот же?

    Reply
  95. mvgfirst

    Хотя, на сервере Native-компоненту нужно извлечь из макета и подключить, а COM-объект нужно всего лишь подключить. Но все равно… Native, даже исходя из названия (перевода) — как родная а значит должна работать быстрее

    Reply
  96. andrewks

    (95) mvgfirst, думаю, COM будет быстрее (но совсем чуть-чуть), из-за особенностей реализации Native-компонент 1С

    Reply
  97. cool.vlad4

    (96) пока сырая, пресырая, но меня сейчас интересует, работает ли под сервером 64 у тебя, т.е. стоит ли доделывать. Использовал стандартный 1С шаблон ВК. Так, что подключить как обычно

    Если Не ПодключитьВнешнююКомпоненту(Путь,»DemoLib»,ТипВнешнейКомпоненты.Native) Тогда
    Возврат; КонецЕсли;
    ОбъектВК = Новый(«AddIn.DemoLib.AddInNativeExtension»);
    ОбъектВК.ToBASE64(стр);
    ОбъектВК.SHA1(стр);
    ОбъектВК.MD5(стр);
    
    Reply
  98. mvgfirst

    Принял, спасибо.

    Как раз сейчас доделываю свой универсальный планировщик — как раз будет возможность протестировать.

    Reply

Leave a Comment

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