Создание документа Word 2007




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

41 Comments

  1. Душелов

    Вообщем, идея, надеюсь, понятна 😉

    Reply
  2. JohnyDeath

    Отличная идея!

    Reply
  3. Душелов

    Добавил пример для 1С 7.7.

    В принципе, можно и класс для 1С++ написать…

    Reply
  4. jhfrek

    Ты Гений.

    Reply
  5. Душелов

    А дальше все понятно. Можно и без документации по формату обойтись — посмотреть, какие теги на размер шрифта, цвет влияют и дополнить код.

    Так же, как и добавить картинки, заполнение таблиц и прочее… Шаблон есть, а дальше — простор мысли 😉

    Reply
  6. shuka

    я правильно понял, что office ВААБЩЕ не нужен для запуска?

    Reply
  7. Душелов

    Вообще не нужен для формирования файла. Естественно, для его открытия офис нужен 🙂

    Reply
  8. homutke

    ММмм. а как же надпись без внешних компонент, если используются внешние упаковщики.

    Reply
  9. Душелов

    (8) Я для 7-ки не планировал делать, попросили.

    8-ка пакует сама.

    Reply
  10. JohnyDeath

    (8) 1с++ тоже умеет упаковывать/распаковывать 😉

    Reply
  11. Душелов

    (10) но 1с++ — это уже внешняя компонента 😉

    Reply
  12. fantasy2

    в 77 нет метода Упаковать() !?

    как оно без внешних компонент будет работать?

    Reply
  13. Душелов

    (12) — см. комменты 8-10, можно упаковать винраром через ЗапуститьПриложение()

    Reply
  14. Душелов

    Для получения демо-версии или покупки обращайтесь по контактам, указанным в профиле.

    Reply
  15. Душелов

    Залил версию для 8.1

    Reply
  16. Душелов

    (16) Никакой.

    Reply
  17. h00m

    плохо то, что формат docx не совсем универсален. согласен, есть, конечно плагины для 2003, но формат doc всё же универсальней, хотя docx лучше и удобнее — не спорю

    Reply
  18. Душелов

    (18) Это пока… docx как раз более универсальный за счет OpenXML.

    Reply
  19. Lars Ulrich

    фантастишь 🙂 пилюс нашальника

    Reply
  20. uzerdv

    Есть ли возможность приобретения? oip:316615837

    Reply
  21. Alex_Sun

    А можноли с ее помощью вставлять штрих код в документ ворда?

    Reply
  22. Душелов

    (22) Ну не надо в каждую тему-то то спамить…

    Reply
  23. KukA.5

    Василий, ты умница!

    …и как ведущий покатушек 🙂

    Спасибо.

    Reply
  24. Душелов

    (24) :))))

    Reply
  25. GenTay

    Доброго времени суток! Идея хороша, но что-то у меня не вытанцовывается. Или я не понял идею. ввел код, добавил процедуру. Пишет «файл создан», но его нет на компе, есть все кроме него. В чем идея? Где файл?

    Reply
  26. GenTay

    Т.е. красоты как на скриншоте я не добился.

    Reply
  27. ndacoder

    а объединение ячеек корректно обрабатывается ?

    Reply
  28. mark-simf

    Интересная идея!!! Главное все просто и понятно) Давно искал нечто подобное и нашел)))……….

    Reply
  29. koka

    Отлично! Работает на «Ура»!

    Reply
  30. ASoft

    Идея интересная. Спасибо. Использую для создания печатных форм договоров с контрагентами.

    Reply
  31. amatisol

    Не вижу пользы от этого, бухгалтерия в doc редко работает, а если и работают то просто недоучки и сидят таблицы рисуют

    Reply
  32. VapPaha

    не понятно применение, но интересно!

    Reply
  33. Serge_ASB

    Что входит в обработку

    СозданиеДокументаWord2007?

    Сам файл не скачивается от отсутствия «баллов», и подробности работы тоже неясны, т.к. нет обработки, на которую процедура ссылается.

    Reply
  34. larisab

    (34) Файлы скачиваются без баллов, все работы Душелова открыты. К несчастью, его уже нет с нами, вечная память…

    Reply
  35. Serge_ASB

    (35) larisab,

    знаком не был, но присоединяюсь к пожеланию вечной памяти.

    P.S. посмотрю еще раз.

    Reply
  36. Serge_ASB

    файл создает, но при попытке открытия ругается что

    «Не удается открыть файл из-за ошибок содержимого».

    Reply
  37. rasswet

    супер вещь. после небольшого изменения работает под управляемым интерфейсом.

    умный человек писал.

    Reply
  38. Astrakhan_man

    Подскажите а как поставить защиту на сформированный документ WORD?

    Reply
  39. skunk

    не понял как плюсовать … но зачет однозначно

    Reply
  40. Manticor

    (38) rasswet, скачать cf-ник, попытался загрузитm в чистую конфу — пишет структура конфигурации не совместима с текущей версией программы. Как Вы ее запустили?

    Reply
  41. Чарик

    Просто класс обработка!

    Reply

Leave a Comment

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