[XLStoMXL] Конвертер документов MS Excel 2000 в формат табличного документа 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. Filipp_inf

    Все красиво, только непонятно как же работать с этим конвертером, который .EXE, инструкций нет, а при запуске просто «промелькивает» , и все…

    Reply
  2. Robert

    ОК. Это утилита командной строки. Промелькивает как раз инструкция. В командной строке нужно написать:

    XLStoMXL.exe filename.xls

    Утилита на выходе создает по файлу MXL для каждого листа XLS.

    Reply
  3. Я тока не понял? это что твоей програмка стала? или и была твоей

    Reply
  4. Robert

    И была моей

    Reply
  5. Filipp_inf

    И еще нюанс о котором не говорится в ReadMe — это то, что имя исходного файла должно быть задано только латинскими буквами.

    Reply
  6. Robert

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

    XLStoMXL.exe «Мой любимый файл.xls»

    Reply
  7. VladimirY

    У меня объединение ячеек не перешло 🙁

    Reply
  8. GriAI

    Сработало практически хорошо, замечания:

    1) В некоторых строках поменялось выравнивание (вместо «по значению» стало «право»)

    2) Граница разукрасилась

    проверял на Препроводительной ведомости из К+ (приказ N 199-П от 9 октября 2002 г. Приложение 8)

    Reply
  9. bear_

    Нужная вещь! Сразу пустил в дело, все получилось ОК!

    Reply
  10. azernot

    А как бы ещё задавать конечное имя (путь)…

    Reply
  11. Darth_Sim

    Аффтару зачод! Работает реально стабильнее и качественнее всяких внешних обработок. Однозначный must have!

    Reply
  12. maysi

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

    ОБИДНО!!!

    Reply
  13. maysi

    Извиняюсь, ошибочка вышла…

    Комментарий относился к обработке «[MXLtoXLS] Сохранение больших таблиц в EXCEL» от Che_Burashka.

    Reply
  14. Bod

    СПС

    Reply
  15. soft25

    ну что сказать…..молодец…

    Reply
  16. molot

    Спасибо! Спас!

    Reply
  17. Maxis

    Как ее применять? Exe-шник быстро закрывается

    Reply
  18. Maxis

    XLStoMXL.exe — это утилита командной строки.

    Порядок использования:

    XLStoMXL.exe filename.xls

    Reply
  19. garaevilnur

    Зачот … отлично все работает!!!

    Reply
  20. Алла М

    А нельзя ли для чайников -бухгалтеров, которые работают в винде и забыли (или не знали)как работать в Досе,но знают 1С пошагово объяснить, как это все запустить?

    Reply
  21. German

    Даже формы из консультанта взял.

    Reply
  22. mrnovel

    красиво. молодчина.

    Reply
  23. rasswet

    зачетная штука! СПАСИБО!

    Reply
  24. sawserg

    Вовремя наткнулся на эту программу, так как мне не очень удобны загрузки из Excel-файлов, я обычно копировал информацию сначала в *.mxl через буфер обмена. Естественно, это муторно.

    Reply
  25. Winston

    Плюс+++

    Reply
  26. zilot123

    Конвертор хороший. Только если в екселевском файле есть формулы, то при открытии xml файла пишет невозможно отркыть файл ) Если что знайте где копать )

    Reply
  27. sol-boris

    Класс, очень нужная вещь!

    Reply
  28. AS108

    Спасибо, нужная вещь!

    Reply
  29. snic

    отличная утилита!!!

    Reply
  30. sokir

    Не совсем корректно перенесло: часть таблицы ушла далеко вправо, но удалить лишнее 5 сек делов, а перенос вручную из экселя пол дня + испорченный настрой на весь день от занятия хренью!

    Поэтому большой жирный +.

    Reply
  31. tvssspb

    Конвертнул, чуть подправил и… Счастье!!!

    +

    Автору большое спасибо! 😀

    Reply
  32. Lito86

    Куда пиво высылать 😀

    Reply
  33. Tristania

    Спасибо!

    Reply
  34. nickkey

    Большое спасибо очень помогла для создания отчета начальству и для саморазвития :)))

    Reply
  35. sergnik

    Спасибо, результат приятно удивил. конвертил очень большую таблицу, думал будет много ручного труда

    кое-где заменило украинское «і» на цифру 1, остальное форматирование конвертнулось правильно

    Reply
  36. KrakoZyabl

    Это вещь мало сказать нужная.. она еще и ПОЛЕЗНАЯ для здоровья!!!=), т.к. избавляет от кропотливого труда перерисовывания всяких Excel’евских формочек из консультанта и т.д.. СПасибо большое за предоставленную возможность воспользоваться данным решением +++.

    p.s. и где я только раньше был..не зная о сием.

    Reply
  37. ch1mera

    Спасибо большое, очень пригодилось.

    p.s.было бы неплохо это сделать в виде обработки под 8.1/8.2, чтоб была возможность как задать имя выходящего файла, так и сразу просмотр MXL-файла

    Reply
  38. scanner1980

    А чем проект Иоксель не нравится? Или о нем никто не знает?

    Проект ЙОКСЕЛЬ

    Йоксель (Yoksel) – это набор программных средств для работы с табличными документами. В настоящее время Йоксель представлен в виде:

    Самостоятельного приложения (*.exe).

    Внешней компоненты для 1С:Предприятия 7.7, которая предоставляет функции Йокселя разработчикам через встроенный язык 1С:Предприятия.

    COM-сервера для любого приложения, поддерживающего технологию COM.

    Возможности Йокселя:

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

    Прямая запись файлов Excel – можно создать книгу, заполнить список листов и записать книгу в файл. При этом будет сохранено форматирование и внедренные объекты табличных документов для листов. Конвертер Йокселя работает на несколько порядков быстрее встроенного в 1С:Предприятие конвертера и обеспечивает более высокое качество полученных документов. Подробнее.

    Поддержка табличных документов 1С:Предприятия – поддерживается формат встроенных табличных документов в полном объеме. Документы можно загружать и записывать. Подробнее.

    Элемент управления, позволящий отображать табличные документы на диалоговых формах 1С:Предприятия. Подробнее.

    Преобразование табличных документов в файлы графических форматов: BMP, JPEG и PNG. Подробнее.

    Расширенная работа с отчетами. Йоксель предоставляет разработчикам под 1С:Предприятие 7.7 ряд возможностей, отсутствующих в 1С:Предприятии и делающих работу с отчетами удобнее. Подробнее.

    Показать

    Reply
  39. KrakoZyabl

    (39) Спасибо, обязательно посмотрю…да я не знал о таких вот вещах(((

    Reply
  40. nll.jojo

    сразу начал использовать, зачет

    Reply
  41. vitekryazan

    спасибо, очень помогло

    Reply
  42. fixin

    плюс за идею…

    только думаю, можно не в ЭКЗЕ, а в 1С написать.

    Reply
  43. dagroma

    Великолепная штука, даже когда не в 1С

    Reply
  44. eugen91

    Красота, то что искади на протяжении года!

    Reply
  45. Margaritaya

    Спасибо,круто.

    Reply
  46. puritan

    Автору огромный респект! Сэкономил кучу времени.

    Reply
  47. _o_o_

    Спасибо большое!

    ОООчень помогли.

    У меня, правда, отработало с сообщением Unknown error.

    Но файл создался, внутренность его 1С распознала. Волшебно!

    Reply
  48. chebser

    Наткнулся сейчас на эту замечательную утилиту через 9 лет после её публикации. Автору респект! Для чайников: кладём исходный файл в папку с экзешником, нажимаем Win+R, в появившееся окно перетаскиваем екзешник, после экзешника дописываем полное имя исходного файла, например, maket.xls, нажимаем ОК — и готово, mxl появится в папке с экзешником.

    Reply
  49. KrakoZyabl

    (49) Пользовался этой обработкой раньше, да, хорошо помогала при создании печатных форм на основе экселя. Сейчас платформа 1С 8.3. позволяет открыть файл ексель и можно оттуда скопировать в таблицу mxl содержимое.

    Reply

Leave a Comment

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