Конвертация из XLS в MXL (для 1С 7.7)




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

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

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

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

23 Comments

  1. Skif46

    Абалдеть!!! Не без изъянов, конечно, но работу по созданию таблиц существенно облегчает. Я конвертировал путевой лист по форме С-4. Править пришлось. Но по сравнению с тем, что с нуля рисовать — мегапомощь!

    СПАСИБО!

    Reply
  2. oninfostart

    Есть острая необходимость, заранее +

    Reply
  3. Natalia

    (1) Потестировала на путевых листах со стандартным набором флажков — … ой )) цвет фона то….. )))

    Поправила изъяны передачи цвета фона и рамки (которые АВТО)

    Поправила изъяны рамки (нижняя двойная и верхняя одинарная в сумме дают визуальную толстую жирную… некрасиво).

    Надеюсь, в теперешнем виде править придется меньше.

    Reply
  4. Skif46

    Не, все равно — с формой путевого листа грузового автомобиля (4-С) глюки с объединением крайних правых ячеек — обьъединяются чуть ли не на всю длину.

    Reply
  5. Natalia

    (4) Может у меня не такой путевой? Вроде не вижу страшных проблем… В архиве исходник и два варианта конвертации — с объединениями и с заменой объединений

    Reply
  6. Pin

    Весьма полезный инструмент. Попробовала конвертировать авансовый(в прикр.файле). Результат, прямо сказать, разочаровал поначалу.

    Но если попробовать так:

    //МаксРяд = Excel.Cells(1, 1).SpecialCells(11).Row;
    //МаксКолонка = Excel.Cells(1, 1).SpecialCells(11).Column;
    МаксРяд =Excel.ActiveSheet.UsedRange.Row+Excel.ActiveSheet.UsedRange.Rows.Count();
    МаксКолонка = Excel.ActiveSheet.UsedRange.Column+Excel.ActiveSheet.UsedRange.Columns.Count();

    то результат заметно лучше становится.

    Я для себя сделала так, что xls-файл, открытый пользователем до конвертации, не вызывает ошибки «Не удалось открыть файл » и после конвертации не закрывается.

    Reply
  7. Natalia

    (6) Ну да — нижняя правая ячейка листа — объединенная… и все наперекосяк, если без поправки.

    Поправила так:

    МаксРяд = Excel.ActiveSheet.UsedRange.Row + Excel.ActiveSheet.UsedRange.Rows.Count() — 1;

    МаксКолонка = Excel.ActiveSheet.UsedRange.Column + Excel.ActiveSheet.UsedRange.Columns.Count() — 1 ;

    иначе захватываются лишние колонка и строка.

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

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

    Если файл открыт — ошибки нет — просто вопрос в случае, если файл изменен. Ошибка бывает, если «сбивать курс, которым идет курсор». Но с этим пока тоже не боролась, да и не буду наверное.

    Есть еще идея побороться с ширинами колонок — так чтобы консультантовские формы «миллиметрик в миллиметрик». Есть даже идея, как это сделать. Но там проблемы уже больше не в 1С.

    Reply
  8. Donat

    А мне всегда, в этом деле, YOKSEL помогал.

    Reply
  9. Dolly_EV

    За труд +, а мне всегда, в этом деле, вот это помогало: infostart

    Reply
  10. Natalia

    (8) Я тоже YOKSEL использую с удовольствием.

    Этой обработкой можно не только «перенести дословно», но и реорганизовать таблицы. Иногда бывает нужно.

    Reply
  11. Sergiusnick

    Особенно мне понравилось «упрощает разговоры с заказчиками («какой макет заказали — такой и получили»).»

    Reply
  12. Natalia

    (11) От особо продвинутого начальства можно конечно получить нагоняй за «нетворческий подход» (было такое на одном из мест работы) 🙂

    Reply
  13. megatrend

    Отличная работа! Спасибо! ❗

    Reply
  14. Tristania

    Спасибо!Значительно упростило работу!

    Reply
  15. soloton

    Прекрасный инструмент. Упрощает работу и сокращает время разработки!

    Reply
  16. daviels

    Спасибо огромный респект создателю :)… правда… надо было сделать небольшую прогу для заполнения миграционных карт. Сконвертировал форму из формата xls ну просто шикарно… СПАСИБО.

    Reply
  17. OzzY

    Огромный жирный +

    Спасибо.

    Reply
  18. LoboVik

    Абалденная штука. Не надо тратить время на рисование форм. Заказчик дает сфою форму в XLS ты ее конвертишь и все готово.

    Reply
  19. palmalsp

    Очень полезная вещь! Спасибо разработчику! Однозначно + )

    Reply
  20. www2007

    Очень сильно порадовала эта обработка. Легким движением заковыристая печатная форма перетекает в 1С!!

    Отлично сделано! +++++!

    Reply
  21. Barok

    Спасибо большое. Держи плюсик!! Будем пользоваться, подправив немного деталей под себя! Искрене благодарю за проделанную работу!

    Reply
  22. BorisBelov

    Огромное спасибо автору! Часто приходится рисовать таблицы, надеюсь на облегчение в работе.

    Reply
  23. sergoqwe

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

    А так же за то, что автор не бросает поддержку старых версий.

    Reply

Leave a Comment

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