Снятие-восстановление паролей пользователей в 1С:Предприятие 7.7




Принцип обмена данными из 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='\

38 Comments

  1. LeXXeR

    Соарон рулит! 😉

    Reply ↓
  2. vcv

    А зачем обработка, если каждый уважающий себя одинэсник просто обязан иметь в потайном кармане пропатченное portable ядро 1С, которому все пароли по барабану.

    Reply ↓
  3. Timesoft

    А зачем таскать в потайном кармане контрафакт, если в 7-ке отключить пароли пользователей можно переносомпереименованием одного файла в базе ???????

    Reply ↓
  4. vde69

    для обработки необходимо запретить скачивание с рейтингом меньше +3 (что-бы юзвери не тянули).

    а вообще совершенно бесполезная вещь, замену хешей паролей я и без внешних DLL напишу за пару часов, только не нужно это вообще…

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

    Reply ↓
  5. samadurov

    (3) Если в организации более 50 информационных баз и не все пользователи на месте, чтобы узнать пароль для входа, то лазить в каждую базу и переименовывать папку usrdef очень утомительно…

    Reply ↓
  6. samadurov

    (4) для начала в конфигуратор войти надо… Ну, а если есть время, то пишите, как говорится, Шура, пишите!!!

    Reply ↓
  7. vde69

    (3) а зачем вообще надо знать пароль пользователя? не надо!!! если пользователи забывают свои пароли — это их проблеммы (у меня вообще вин авторизация давно везде http://infostart.ru/projects/2836/ )

    (4) если права на папку UserDef есть — войду без проблемм, если нет — то и твоя шняга не поможет (или поможет ?)

    ————————————————

    кроме того на сколько я понимаю механизм паролей в 7.7, просто распарсив файлы можно получить только хеш MD5, (при запущеной 1с можно взять открытый пароль текущего пользователя), так, что ты в любом случае не получаешь пароль, а только временно можешь войти под конкретным пользователем, а это расцениваеться как ВЗЛОМ сесии, и уж выкладывать кряк, которым могут тупые звери пользоваться — я-бы не стал, ведь далеко не везде UserDef только на чтение установлен 🙂

    Reply ↓
  8. saba1960

    Полезная обработка. Я довольна!

    Reply ↓
  9. RandomDV

    (1) Не всегда можно ставить чего хошь.

    (2) Самый норм. вариант.

    (3) Под SQL ? Ну-ну. Чревато потерей настроек соединения с SQL сервером.

    Reply ↓
  10. Steamroller

    Бесполезная обработка, поскольку снять/восстановить пасс юзера в семёрке это весьма простое дело. Причем вариантов довольно много. Можно удалить известный файл, заменить хэш, или организовать атаку по типу MD5 по извлеченному хэшу пароля пользователя, это если нужно получить пасс.

    Reply ↓
  11. Джиневра

    Убойная штука :)) Плюс!

    Reply ↓
  12. Sonia

    Может пригодиться. Удобно. Плюс!

    Reply ↓
  13. Abadonna

    (9)>Под SQL ? Ну-ну. Чревато потерей настроек соединения с SQL сервером.

    С каких это щей? 1Cv7.DBA никакого отношения к users.usr не имеет

    Reply ↓
  14. samadurov

    (13) Извините, обработка написана только для DBF.

    Reply ↓
  15. Valera_ch55

    Спасибо! За работу +

    Reply ↓
  16. isp655

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

    Reply ↓
  17. Ramzay

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

    А обработка мне понравилась. Просто и понятно.

    Reply ↓
  18. samadurov

    (17) Извините за долгое молчание. Был в отъезде. А файл, где хранятся пароли пользователей находится в папке USRDEF и называется users.usr

    Reply ↓
  19. Ramzay

    users.usr — буду знать. Спасибо.

    Reply ↓
  20. DRY

    вот если бы еще пороль на автора конфигурации показывался.. эх..

    Reply ↓
  21. kadra

    Обработка понравилась. Нужна в работе

    Reply ↓
  22. ChessCat

    (13) >1Cv7.DBA никакого отношения к users.usr не имеет

    еще как имеет

    попробуй в конфигураторе в списке пользователей ИБ изменить список пользователей чтобы ПЕРВЫЙ по списку стал другой (например первый в списке был Вася, а после изменения списка пользователей первым стал Петя). И после сохранения списка пользователей получишь сброс настроек к SQL серверу (пустой 1Cv7.DBA)

    Иногда для получения такого эффекта достаточно просто отсортировать список пользователй по алфавиту и сохранить (первым становится другой — и все, получите пустой 1Cv7.DBA)

    Reply ↓
  23. Abadonna

    (22)>»попробуй в конфигураторе в списке пользователей ИБ изменить список пользователей чтобы ПЕРВЫЙ по списку стал другой»

    Не поленился попробовать. Первым стоял AUTOPILOT, удалил нах, как был DBA так и остался, как были параметры соединения с базой, так и остались.

    Ты сам придумал, или приснилось?

    Reply ↓
  24. vip

    (22)(23) Сброс 1Cv7.DBA происходит когда users.usr правится при запущенном конфигураторе.

    Поэтому перед любыми действиями с users.usr надо проверять, запущен ли конфигуратор.

    А вот как проверять, могу продать за пару пива.

    Reply ↓
  25. Abadonna

    Я В КОНФИГУРАТОРЕ УДАЛИЛ/СОХРАНИЛ. Совойства коннекта остались прежними

    Reply ↓
  26. vip

    (25) Ты поступил абсолютно штатно.

    При этом ничего не слетит.

    Я о том, что если из режима Предприятия изменить users.usr при запущенном Конфигураторе, то свойства коннекта слетят.

    Reply ↓
  27. Abadonna

    >Я о том, что если из режима Предприятия изменить users.usr

    ТАКОЙ изврат мне бы и в голову не пришел, хотя, как ты в курсе, я это паршивенький компаунд раздербанил давным-давно, да и не один я…

    Reply ↓
  28. whtblck

    прикольно, спасибо

    Reply ↓
  29. chsm

    Спасибо, пригодилось, вовремя

    Reply ↓
  30. artnet

    Ну подскажите дураку-куда эти 3 файла надо скопировать…

    Или чего ещё с ними сделать?Я ни фига не понимаю…

    Reply ↓
  31. samadurov

    (30) Задавая вопрос о трех файлах Вы имели ввиду FormEx.dll, UsersDef.dll и сам файл обработки СнятьВосстановитьПарольЮзера.ert? Если так, то файл обработки нужно поместить в папку ExtForms информационной базы, а файлы внешних компонент FormEx.dll и UsersDef.dll — в саму папку с информационной базой…

    Reply ↓
  32. artnet

    Скопировал…А дальше то чего делать?

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

    Может есть простые пути?Помогите.

    Reply ↓
  33. samadurov

    (32) Самый простой путь — в папке с информационной базой переименовать папку USRDEF, например, в USRDEF1. И тогда можно войти в базу без авторизации пользователей

    Reply ↓
  34. artnet

    (33)Спасибо!Переименовал.Виста написала-«Программа остановлена,начинаю сбор информации…»

    Другая база запускается без проблем.

    Reply ↓
  35. Ivanov_OM

    Хорошая обработка.

    Но можно все сделать проще.

    Reply ↓
  36. Kristi74

    Когда столкнулся с такой проблемой, поиски привели к определенному файлу, удаление которого и сняло все пароли.

    Reply ↓
  37. samadurov

    (36) Понятно, что удалив файлик можно решить проблему. Но, это слишком «топорно», не этично и не красиво по отношению к держателям баз.

    Reply ↓
  38. Kristi74

    (37) samadurov. Забыл пароль — 2 минуты и все готово. Конечному пользователю как-то все равно насколько этично я это сделал, ему важен результат и всё. Платят тоже только за результат, а не за красоту проделанной работы. Пришел, молча все сделал и ушел. Ничего более. Это специалисты могут между собой соревноваться в красоте, изящности и гибкости решения проблемы. А насчет «не красиво по отношению к держателям баз», некрасиво пароли забывать, в крайнем случае ведь можно и записать куда нибудь.

    Reply ↓

Leave a Comment

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