Печать договоров в шаблон формата RTF




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

33 Comments

  1. kalitwa

    у меня пишет- не найдет шаблон договора :-). Хотя я всё сделала как вы написали 🙁

    Reply
  2. bigmal

    Шаблон договора надо положить в папку ExtFormsДоговоры. Эта папка создается автоматически при первом запуске обработки

    Reply
  3. Доня

    А где сам Шаблон то?

    Или его надо самим создавать

    Reply
  4. Доня

    Ой, увидела Шаблон, прошу прощения, но выдает:

    ПокупательНаименование=СокрЛП(Покупатель.ЮрЛицо.ПолнНаименование);

    ПЕЧАТЬДОГОВОРАРАБОЧАЯ.ERT(295)}: Поле агрегатного объекта не обнаружено (ЮрЛицо)

    А Для Бух.7.7 работает ?

    Reply
  5. Доня

    Открывается, к огромному моему сожадению , только в Комплексной 7.7

    В 1С Бухгалтерия не открывается ❓ .

    Вещь конечно очень замечательная ❗ . А нельзя ли ее доработать до В 1С Бухгалтерия ❓ .

    Пока не могу плюсовать 😥

    Reply
  6. bigmal

    Доня, для бухгалтерии придется дорабатывать. Сегодня займусь этим.

    Reply
  7. Доня

    Спасибо, жду с нетерпением

    Reply
  8. Tatar_Ed

    При первом запуске, у меня не создает папку Договоры\r

    у кого работает?

    Reply
  9. Утюг

    Создает, только не в ExtForms, а в папке ИБ — автор в описании ошибся.

    Reply
  10. Утюг

    Да, еще автор забыл (не захотел) убрать свои (нетиповые) особенности, в частности,

    ТекМагазин=Константа.Магазин; ФлагМагазин=ПустоеЗначение(ТекМагазин);
    Reply
  11. bigmal

    Доработал обработку для печати из бухгалтерии и ТиС. Убраны нетиповые особенности (спасибо Утюгу 🙂 ).

    Подчеркну, что обработка не претендует на универсальность (этого и не требовалось изначально) и в любом случае необходимо её подгонять под свои требования. Считаю, что главное в ней — это попытка работать с rtf-файлом как шаблоном. Времени вникать в этот формат нет, да в этом и нет особой необходимости. Главное, что сохраняется «девственная» чистота сервера, админ доволен 🙂 🙂

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

    Reply
  12. Доня

    В Бух.7.7 все работает 😀

    спасибо!

    Reply
  13. Tatar_Ed

    в ТиС работает, но покупателей берет из справочника фирм. Как сделать чтоб брал из справочника контрагентов?

    Reply
  14. Tatar_Ed

    еще бы добавить №договора, сквозную нумерацию.

    Reply
  15. bigmal

    Изначально задумывалось, что договор заключается между Фирмой и Контрагентом, т.е. Покупатель — Фирма, а продавец Контрагент. Можно и нумерацию сделать, но особой надобности не было. Думается мне, что все эти пожелания можно отнести на «доработку напильником» 🙂

    Reply
  16. Утюг

    (13) По всей видимости, у автора крупная розница, поэтому много поставщиков и, соответственно, бОльшая часть договоров именно с поставщиками. Переделать наоборот достаточно несложно, но гораздо интереснее было бы сделать универсальный механизм назначения вида справочников в зависимости от того, с кем заключается договор (поставщик, покупатель). Можно даже использовать разные шаблоны. Вобщем, автору +.

    Reply
  17. bigmal

    (16) Да, всё в действительности так и обстоит. Думаю, что скоро я внесу изменения именно в части выбора вида справочника.

    Reply
  18. Tatar_Ed

    Кабы уметь работать этим «напильником» 😀 . Поля покупателя и поставщика не сложно поменять, а как поставить нумерацию?

    Reply
  19. Утюг

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

    Reply
  20. Доня

    (17) <<Думаю, что скоро я внесу изменения именно в части выбора вида справочника>>

    видимо еще изменений не было?

    Reply
  21. bigmal

    Возникла ситуация, когда при земене поля на другое оно перестало нормально выводиться на печать. Например DataPole04 заменили на DataPole06, а на печать выходит просто текст DataPole06.

    Это происходит, когда во время замены меняется язык ввода. Т.е., если посмотреть в получившийся шаблон допустим в Блокноте, то в промежутках между каким-либо символом из DataPole будет присутствовать что-то вроде lang1033f2 и т.п. Ищется же в тексте именно сочетание символов DataPole, поэтому нормально такая ситуация и не отрабатывается.

    Для решения этой проблемы надо поля копипастить, пробовать переключать раскладки и т.п. А если все-таки ничего не поможет, то можно всё выправить в том же Блокноте. Согласен — есть небольшой геморр, но на данном этапе только так. Полноценный парсер rtf создавать не предпологается вообще.

    Reply
  22. bigmal

    (20) Доня, уже бы давно сама сделала. Там делов на 15 минут 🙂 🙂

    Reply
  23. Доня

    (22) У Вас-то рука набита!

    А мне отнюдь, не 15 минут, надо!

    Полдня посижу, при условии, если отвлекать не будут. 😥

    Reply
  24. Tatar_Ed

    Всем привет.

    Идея набора договора из 1С меня очень заинтересовала и роясь в недрах сети наткнулся на такую обработку. http://www.buh77.ru/dog_post1.htm

    Это платная. Может кому пригодится.

    Reply
  25. SM_2008

    Автору- спасибо!!! Очень полезная идея для нас, нам нужны разные варианты договоров для клиентов. Переделаю под свои особенности, думаю добавить в «Заявку покупателя». Еще раз спасибо 🙂

    Reply
  26. bigmal

    Всегда «пожалсста» 🙂

    Reply
  27. andre1213

    Сегодня решил воспользоваться, но почемуто не находит папку Договоры, хотя положил её в каталог ИБ. Бух 7.7

    Reply
  28. bigmal

    К бухгалтерии эти обработки не адаптированы, поэтому придется допиливать самому. Именно поэтому папка «Договоры» и не создастся автоматически.

    Reply
  29. andre1213

    Понятно, спасибо в любом случае. По крайней мере есть точка отправки. Пилю 😀

    Reply
  30. stk73

    А нельзя ли все одним архивом выложить, а то 4 суток скачивать как-то не айс, только за это плюсовать не стану.

    Reply
  31. kreat1

    Неработает:(((

    вот что пишет:

    ФайлШаблон=Парам.Получить(«шаблон»);

    …..RAB_BASE\EXTFORMSПЕЧАТЬРТФ.ERT(76)}: Значение не представляет агрегатный объект (Получить)

    Reply
  32. shakmaev

    Жать что нильзя сохрянять вместе с картинками в нормальном формате. Все съезжает

    Reply
  33. whtblck

    доработал напильником под себя, работает

    спасибо, авось пригодица

    Reply

Leave a Comment

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