Коммандер для 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='\

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 не будет опубликован. Обязательные поля помечены *