Коммандер для 1С




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

49 Comments

  1. Armando

    Почему F7 — удалить? А F8 — создать каталог?

    Reply
  2. tamidi

    Действительно, F7 и F8 лучше поменять, на автомате можно и лажануться, кто привык к Тотал коммандеру зачастую пользуется клавиатурой

    Reply
  3. Dyganov

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

    (1) +1 я точно не туда ткну.

    Reply
  4. mrmasson

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

    Reply
  5. mrmasson

    (3) Dyganov, Спасибо за отзыв. Проверьте почту- скоро Вам тоже пришлю обработку)

    Reply
  6. Yashazz

    Во, теперь попёрли коммандеры… Чем ваш отличается от предыдущих?

    Reply
  7. mrmasson

    (6) Yashazz, Основным «идейным» вдохновителем для меня явился «Тотал коммандер для 1с» (ссылка в самой публикации). То, что я описал в достоинствах, как раз я не нашел в том коммандере. Вы можете скачать и посмотреть мой коммандер — не понравится, напишите что и почему — верну обратно Вам 1$m. Понравится — буду рад. В любом случае любая обоснованная критика будет мне полезна

    Reply
  8. 99-9999

    Отличная обработка. Однозначно плюсую. Бухам понравится

    Reply
  9. 99-9999

    (4) Хорошая инициатива

    Reply
  10. mrmasson

    (9) 99-9999, Спасибо,Спасибо)

    Reply
  11. mrmasson

    Что еще можно добавить/изменить в данной обработке?

    Reply
  12. Armando

    (11) например, прикрутить полнотекстовый поиск.

    Reply
  13. mrmasson

    (12) Armando,думал, но в итоге отказался. т.к. единовременно работа в одном справочнике, то обычного поиска в пределах этого справочника вполне достаточно, достаточно выбрать нужный реквизит. Можно, конечно, сделать возможным поиск по нескольким реквизитам одновременно. Спасибо. Подумаю.

    Reply
  14. Yashazz

    У меня вопрос вообще ко всем подобным блокам: что полезного можно выкрутить из двух панелей, кроме перекидывания между папками и сравнения? Лично моя фантазия на этом кончилась.

    Reply
  15. mrmasson

    (14) Yashazz, В принципе только это и нужно.Попробуйте привести в порядок тот же справочник «номенклатура», который велся всеми.

    Reply
  16. Nelli_A86

    Оригинальная идея, обработка однозначно «must have»

    Reply
  17. hasan-rusel

    Пригодиться в копилку)

    А добавить можно групповое переименование и сравнение папок

    Reply
  18. mrmasson

    (18) hasan-rusel, Прекрасная идея. На досуге подумаю

    Reply
  19. dedicated

    Спасибо большое! Еще можно прикрутить сохранение настроек в хранилище, чтобы после закрытия в следующий раз открывать с предыдущего места.

    Reply
  20. mrmasson

    (20) dedicated, Спасибо за совет, непременно в ближайшее время им воспользуюсь.

    Reply
  21. iov

    а прикрутить можно вот что.

    1) Отметка галками множественная по кнопкам (все все снять инвертировать )

    2) отбор по вхождению строки

    3) лог действий. (возможность записи в журнал)

    4) отмена действий (о да и такое видел)

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

    6) соответственно групповая обработка по галкам или выделению (банально вызов групповой обработки типовой с заполнением)

    7) печать структуры выделенных.

    Reply
  22. DrAku1a

    Еще один коммандер… Свой что-ли написать 😀

    Reply
  23. mrmasson

    (22) iov, п.2 реализован. Над остальным задумаюсь

    Reply
  24. mrmasson

    (23) DrAku1a, было бы интересно потом сравнить)

    Reply
  25. ATrade06

    Как насчет кнопки Заменить(Объединить).

    Reply
  26. mrmasson

    (26) ATrade06, Напишите, пожалуйста, подробнее (в личку либо здесь) что Вы подразумеваете. Немного не могу понять идею(( Такими темпами в ближайшее время выйдет версия 2.0). Все скачавшие сейчас смогут в дальнейшем скачать обновленную версию бесплатно

    Reply
  27. bulas

    Alt + F7 (поиск) не помешает добавить, когда справочники большие.

    Reply
  28. mrmasson

    (28) bulas, поиск есть (в правом верхнем углу). Добавлю сочетание клавиш. Спасибо

    Reply
  29. rasswet

    удалить удаляет или пометку ставит? может отметить это как-то на самой форме?

    Reply
  30. mrmasson

    (30) rasswet, Ставит пометку на удаление! когда Вы нажмете F8 система Вас предупредит о том, что будет установлена пометка на удаление. Думаю гораздо проще и быстрее будет потом удалить помеченные на удаление объекты, чем восстанавливать ссылочную целостность (если объект будет удален сразу, без контроля)

    Reply
  31. Rad90210

    Очень симпатичненько. Не плохо бы добавить на хоткеи стандартные функции (хотя бы частично) с универсальных обработок: поиск дублей, переименование, перенумерация, групповая обработка … Если эргономично вместить в интерфейс — можно было бы продавать 🙂

    В любом случае плюс. ВОт накоплю СМ и скачаю ))

    Reply
  32. Rad90210

    При попытке добавить доп. колонку в справочнике статьи затрат (Бух 8.2 для Украины) пишет

    {Форма.Форма.Форма(44)}: Ошибка при вызове конструктора (ОписаниеТипов)

    ЭлементыФормы.ЛеваяТЧ.ТипЗначения = Новый ОписаниеТипов(СпрСписок);

    по причине:

    Недопустимое значение параметра (параметр номер ‘1’) (СправочникСписок.Статьи затрат)

    В принципе то же происходит с другими справочниками (номенклатура и контрагенты — работают корректно)

    Жалко что отбор и сортировку нет возможности делать по доп. колонкам.

    Reply
  33. Rad90210

    При отсутствии элемента, кнопка удалить перестает быть активной (что корректно), а просмотр и копировать — остаются активными. При попытке нажать на просмотр в этой ситуации приводит к ошибке:

    {Форма.Форма.Форма(172)}: Значение не является значением объектного типа (Ссылка)

    ОткрытьЗначение(ТекСтрока.Ссылка);

    (36) — актуально и для УТ для Украины

    Reply
  34. Rad90210

    Еще можно было бы в опции вынести что то типа — «Не спрашивать действительно ли я чего то хочу». Если в корне много реквизитов — каждый раз отвечать не камильфо 🙁

    Reply
  35. mrmasson

    (36) Rad90210, исправил обнаруженные ошибки, обработку пересылаю на почту повторно для дальнейшего изучения.

    Поиск по дополнительным колонкам делать можно. Сортировку включать не стал, т.к. на одном из форумов сотрудник 1с написал, что по не индексируемым полям сортировку делать не рекомендуется (как-то так)

    Reply
  36. mrmasson

    (40) Rad90210, Изначально дополнительные колонки в отборе не делал, т.к .посчитал что поиска будет достаточно. Думаю стоит добавить

    Reply
  37. Rad90210

    В ЗуПе просмотр для справочника Контрагенты:

    {Форма.Форма.Форма(178)}: Ошибка при вызове метода контекста (ЗначениеЗаполнено)

    Если ЗначениеЗаполнено(ТекСТрока) Тогда

    по причине:

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

    это в исправленной версии. для предыдущей — все гуд.

    Reply
  38. mrmasson

    (42) Rad90210, понял. исправлено)

    Reply
  39. DAnry

    А чем отличается от «Тотал коммандер для 1С» ?

    Reply
  40. CratosX

    В Total Commander есть функция сравнения файлов. Прикрутите тут такую фичу

    http://infostart.ru/public/152745/

    Reply
  41. mrmasson

    (44) DAnry, отличается тем, что я описал в достоинствах

    Reply
  42. mrmasson

    (45) CratosX, для чего сравнивать файлы? обработка работает со справочниками. если только сравнивать два элемента справочника (смотреть чем различаются реквизиты)…

    Reply
  43. leshiy26

    А почему перепутаны горячие клавиши F7 и F8?

    обычно F7 — создать каталог F8 — удалить

    Reply
  44. mrmasson

    (48) leshiy26, Изначально было перепутано — об этом написали, и я сразу исправил в обработке, но скриншот не получилось поменять. Сейчас изменил скриншот

    Reply
  45. DAnry

    Еще одна похожая разработка http://infostart.ru/public/65473/Data Commander, я б сказал даже покруче. Например источником данных может быть запрос, также есть опция установки произвольных значений выбраным елементам и т.д.

    Reply
  46. mrmasson

    (50) DAnry, если тут на сайте поискать я думаю много найдется.

    Reply
  47. Nebiros777

    Инетересно для работы с большой базой например торгового центра или холдинга.

    Reply
  48. mrmasson

    (54) Nebiros777, На это и рассчитано.

    Reply

Leave a Comment

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