LicDataDecoder — расшифровка файла программной лицензии 1С




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

50 Comments

  1. ifal

    По сути обертка над ring?

    Reply ↓
  2. GeraltSnow

    (1) Да

    Reply ↓
  3. Aleksey81

    Помоги разобраться.

    Получаю ответ. «Выбранный файл не является лицензией или поврежден.»

    Запускал на двух компьютерах с Win 10 и Server 2008

    Установлен Ring 0.11.4

    Что не так?

    Reply ↓
  4. GeraltSnow

    (3) Проверил у себя — действительно с Ring 0.11.4 и License-Tools 0.7.0, которые идут вместе с 8.3.13.1690 программа не работает.

    Могу пока только посоветовать поставить утилиты других версий. Позже попробую найти причину несовместимости.

    Reply ↓
  5. Aleksey81

    Напрашивается вопрос. А в какой платформе или интернет ресурсе можно найти версии Ring 0.10.0.1 и версией License 0.11.5.3 ?

    Reply ↓
  6. GeraltSnow

    (5)

    Ошибочка вышла — в описании публикации перепутал местами версии. Правильно так — RIng 0.11.5.3, License 0.10.0.1.

    Поставляются эти версии вместе с платформой 8.3.14.1565

    В описании к этой платформе написано следующее:

    Как было:

    Утилита командной строки ring и модуль license этой утилиты поставлялись в составе дистрибутива «1С:Предприятие», в каталоге ExtDst. Установка утилиты была доступна после установки собственно «1С:Предприятия».

    Как стало:

    Утилита командной строки ring и модуль license этой утилиты выделены в отдельный программный продукт со своим дистрибутивом — Утилита лицензирования 1С:Предприятия. Дистрибутив доступен для использования на операционных системах Windows 7 и старше и Linux с архитектурами x86 и x86-64.

    Архив с дистрибутивом имеет имя вида 1c-enterprise-license-tools-a.b.c+d-os-arch.zip. Архив с дистрибутивом поставляется вместе с дистрибутивом системы «1С:Предприятие».

    Размещение установочных файлов утилиты ring и модуля license этой утилиты в каталоге ExtDst больше не выполняется.

    Reply ↓
  7. akela2014

    а с какими версиями ring и license работает?

    Reply ↓
  8. GeraltSnow

    (7)

    Ring 0.11.5.3, License 0.10.0.1. Поставляются эти версии вместе с платформой 8.3.14.1565

    Скоро обновлю публикацию и немного перепишу программу, чтобы её поведение было более логичным.

    Reply ↓
  9. Xershi

    Думаю вам стоило ознакомиться чуть раньше с https://infostart.ru/public/876329/.

    Из ключевых плюсов:

    — Открытый код.

    — Код на 1С.

    — Кроссплатформенность (правда пока не реализована из-за отсутсвия других сервером, но это не проблема доделать в связи с первыми плюсами!).

    Reply ↓
  10. GeraltSnow

    (9)

    Не сомневался, что кто-нибудь оставит здесь ссылку на универсальный монитор) Всё же у моей программы есть один неоспоримый плюс перед этой обработкой — для её работы не требуется лицензия на 1С. В случае, когда системному администратору требуется как можно быстрее переактивировать лицензию на 1С после переустановки операционной системы или апгрейда компьютера, этот нюанс очень важен.

    Reply ↓
  11. dmarenin

    (0) в коде не нашел алгоритм декодирования в сорцах, судя по:

    process.StartInfo.FileName = «cmd.exe»;

    process.StartInfo.Arguments = «/C ring license list —path «» + folderName + «»» + » —send-statistics «false»»;

    не декодер вовсе, а гуй над ринг.

    Reply ↓
  12. Xershi

    (10) ну это как сапожник без сапог! Если сисадмину нравится юзать кучу скриптом и прог это его выбор!

    Reply ↓
  13. monkbest

    А можно накидать примеров ситуаций, когда это бывает полезно? Какие задачи можно решить этой утилитой?

    Я понял, что она вытаскивает какую-то инфу из файла лицензии, но зачем она?

    Reply ↓
  14. akela2014

    а может вообще установочный пакет забабахать с нужными ring, license и самой программой?

    Reply ↓
  15. GeraltSnow

    (14)

    Боюсь, распространение LicenseTools отдельно от платформы будет считаться нарушением авторского права 1С. А вообще я думал над тем, чтобы поместить архив с рингом в ресурсы программы, чтобы она работала независимо от того, какая версия ринга установлена в системе.

    Reply ↓
  16. GeraltSnow
    Reply ↓
  17. monkbest

    (16) спасибо, понял. У меня просто не было такого, чтобы совсем всё прос**ли, хотябы рег.анкета или книжка 🙂 а lic@1c.ru вроде оперативное реагировал, на любые вопросы

    Reply ↓
  18. basforum

    Всем привет!

    Безусловно нужная программа, просто коллеги судят не теми масштабами.

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

    Хотел её протестить на реальных серверах, но к сожалению, скачать её без стартмани нельзя.

    Reply ↓
  19. teflon

    (0) Заметил, что программа не распознаёт файлы программных лицензий базовых версий конфигураций/платформы.

    На таких файлах выдает: «Выбранный файл не является лицензией или поврежден.»

    Однако, на программных лицензиях от Проф версий конфигураций/платформы всё отрабатывает как надо. Так и должно быть?

    LicData Decoder 1.4, Версия JRE: 1.8.0_191, Версия RING: 0.11.5-3.

    Reply ↓
  20. GeraltSnow

    (19) Во время разработки программы не было под рукой базовой лицензии, поэтому отлаживал её только на файлах проф лицензий. Как только попадется клиент с базовой лицензией — выпущу новую версию программы.

    Reply ↓
  21. teflon

    (20) Хотел Вам ссылку отправить, на программную лицензию для базовой версии, но через личные сообщения не получилось этого сделать: «Сообщение не отправлено, отложенная группа». Если сообщите координаты, могу выслать программную лицензию от базовой версии.

    Reply ↓
  22. GeraltSnow

    (21)

    Лицензию получил. Ring её не распознаёт, видимо просто не умеет работать с базовыми.

    Reply ↓
  23. sergling

    «Выбранный файл не является лицензией или поврежден.» — что с этим делать? В консоли утилита разбирает файл нормально. Лицензии ПРОФ.

    Reply ↓
  24. user705522_constantin_h

    (6)

    Ошибочка вышла — в описании публикации перепутал местами версии. Правильно так — RIng 0.11.5.3, License 0.10.0.1.

    Поставляются эти версии вместе с платформой 8.3.14.1565

    Установил платформу 8.3.14.1565 и 8.3.14.1630 ни в одной нет RIng 0.11.5.3, License 0.10.0.1.

    Reply ↓
  25. GeraltSnow

    (24)

    LicenceTools не устанавливается автоматически вместе с платформой, он ставится вручную. Нужно запустить файл 1ce-installer.cmd из папки license-tools, находящейся в дистрибутиве платформы. Далее следовать инструкциям установщика. Если ранее была установлена другая версия ринга, то перед установкой нужно удалить его через панель управления, а потом вручную удалить папку C:Programdata1C1CE.

    Reply ↓
  26. GeraltSnow

    (23)

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

    Reply ↓
  27. dendzu

    Здравствуйте! Маленькое предложение. Прогоняю через Вашу программу *.lic файлы из папки на рабочем столе. Устал постоянно когда выбираю новый файл идти от C:ProgramData1Clicenses к рабочему столу. Предложение: запоминать выбор последнего пути к папке, а не постоянно C:ProgramData1Clicenses. а так пока все норм.

    Reply ↓
  28. GeraltSnow

    (27)

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

    Reply ↓
  29. dendzu

    (28)Ок

    Reply ↓
  30. GeraltSnow

    (29) Обновил программу до версии 1.5. Теперь по умолчанию будет открываться папка, в которой находилась последняя выбранная лицензия. При необходимости автоматического открытия стандартной папки с лицензиями можно установить соответствующую галку.

    Reply ↓
  31. dendzu

    (30) Здравствуйте! А не скините обновленную версию проги мне на эл.почту?

    Reply ↓
  32. GeraltSnow

    (31) Напишите адрес почты в личные сообщения

    Reply ↓
  33. germax

    При открытии обработки кнопка Выбор файла не активна(( Что это может быть?

    Reply ↓
  34. GeraltSnow

    (34) Версия Ring не соответствует минимальной. Удалите Ring и License через панель управления, после чего вручную удалите папки C:ProgramData1C1CE и C:Program Files1C1CE. Далее скачайте платформу 8.3.14.1565 или новее и установите LicenseTools из её комплекта поставки.

    Reply ↓
  35. user1257155

    Добрый лень! При попытке вытащить информацию с файла лицензии выдает такое сообщение

    C:ProgramData1Clicenses

    Файл: 20190717150647.lic

    Пин-код: [WARN ] com._1c.license.activator.storage.LicenseStorage

    Рег.номер: Пропускаем файл C:ProgramData1Clicenses20190717150647.lic. Ошибка декодирования файла лицензии.

    [ERROR ] Неправильный вызов команды (для справки см. «ring help»): Параметр —name может иметь только одно значение. Указаны значения: «[WARN», «]», «com._1c.license.activator.storage.LicenseStorage», «-«, «Пропускаем», «файл», «C:ProgramData1Clicenses20190717150647.lic.», «Ошибка», «декодирования», «файла», «лицензии.».

    В чем может быть причина? Лицензия единственная и рабочая, 1С запускается и работает на ней!

    Reply ↓
  36. Miller777
    Reply ↓
  37. Miller777

    В последних платформах 8.3.14 и 8.3.15 в папках ExtDst дистрибутива ring и license-tools не обнаружил. Где их брать?

    Установлены 1c-enterprise-ring-0.11.4-1.x86, 1c-enterprise-license-tools-0.7.0-1.x86.

    Reply ↓
  38. GeraltSnow

    (39)


    В последних платформах 8.3.14 и 8.3.15 в папках ExtDst дистрибутива ring и license-tools не обнаружил. Где их брать?

    В папке ExtDst эти утилиты больше размешаться не будут. В папке с дистрибутивом платформы есть папка license-tools, в ней нужно найти и запустить файл 1ce-installer.cmd. Перед установкой LicenseTools нужно удалить старые версии Ring и License, а потом вручную почистить папку C:Programdata1C1CE.

    Reply ↓
  39. GeraltSnow

    (37)

    Вижу два варианта — либо используются устаревшие версии Ring и License, либо LicenseTools был установлен поверх них. Попробуй сделать, как написано в (25)

    Reply ↓
  40. gigabyte-leha

    Ошибка при определении внутреннего имени лицензии. Возможные причины:

    Файл лицензии поврежден

    Файл не является лицензией 1С

    В системе присутствуют остатки от предыдущих версий Ring и License

    Обновился формат лицензий и текущая версия LicenseTools его не поддерживает.

    Reply ↓
  41. AllexSoft

    (16) или покупать USB лицензию..

    Reply ↓
  42. mr_best_23rus

    Очень, очень полезная штучка, спасибо !

    Reply ↓
  43. user1140233

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

    Reply ↓
  44. o4karek

    (45) Лицензия платформы с конфигурацией никак не связана. Вообще никак.

    Reply ↓
  45. user1140233

    (46)тогда можно смело туда загрузить?

    Reply ↓
  46. GeraltSnow

    (47) Можно.

    Чтобы поставить базу на поддержку, нужно:

    0. Сделать резервную копию базы!

    1. Выгрузить файл конфигурации поставщика (конфигурация — поддержка — настройка поддержки — сохранить в файл)

    2. Загрузить конфигурацию поставщика из файла (конфигурация — загрузить конфигурацию из файла)

    Reply ↓
  47. o4karek

    (47) Можете загружать несмело 🙂

    Но перед загрузкой нужно безусловно сделать бэкап изменяемой базы, чтобы «потом не было мучительно больно» 🙂

    Reply ↓
  48. user1140233

    Спасибо всем, загрузил, конфигурации были одинаковые, проблем небыло.

    Reply ↓
  49. dimidac

    Здравствуйте! Подскажите пожалуйста, а можно ли с помощью данной утилиты не просто вытащить информацию из файла, а к примеру редактировать ее в этом файле? Было бы очень здорово!

    Reply ↓
  50. YannikAlx

    Эта утилита — собственность 1С и вы хотите чтоб они позволили вам выдавать лицензии вместо себя (ибо редактирование файла лицензии =выдача новой )? )))))))))))

    Reply ↓

Leave a Comment

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