Авторегистрация документа с заполнением файла по шаблону для 1с 8.3




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

26 Comments

  1. gull22

    Чует мое сердце, что и до Документооборота начальники доберутся. Плюс авансом за труды.

    Reply
  2. graser

    Дык вот у нас добрались, сейчас страдать приходится :), После «успешного» внедрения документаоборота, чует мое сердце будет переезд бухгалтерии на эту платформу

    Reply
  3. ivdic

    Хорошая задумка. но вот у нас возникает след. задача: Когда исполненный документ на бумаге (подписанный руководителем) возвращается делопроизводителю на регистрацию, она на основании входящего делает исходящий и сканирует в него бум. документ и регистрирует. Так вот как сделать чтобы в момент регистрации исходящего… «закрывался» автоматически связанный входящий (чтоб менял статус на исполнен) ?

    Reply
  4. graser

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

    Объект у Вас есть, а от него можно всю цепочку размотать 🙂

    Reply
  5. skteks

    Подскажите, при попытке добавить доверенный путь в разделе «Надежные расположения» к локальной папке TEMP 1С (C:UsersUSR1C…AppDataLocalTemp) выскакивает ошибка

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

    И не дает добавить данный путь — а 1С не создает файлы — не может записать в эту папку.

    Reply
  6. graser

    (5) skteks, добавлять надо на сервере, эта донастройка для клиент-серверного варианта. А по ошибке, скорее всего у пользователя, под которым проводите операцию, нет прав на доступ к данному каталогу. Попробуйте настройть office залогинившись под пользователем USR1C…

    Reply
  7. skteks

    Дело не в правах, права дал полные — админские (на сервере для юзера USR1C8), дело в в том, что Word не дает добавить папку «C:UsersUSR1C…AppDataLocalTemp» в надежные расположения! И по политикам безопасности это правильно — ведь туда может писаться все, что угодно, она ведь указывается как временная в Windows. Пробовал и залогонившись под USR1C… Тоже самое — ругается. Как можно обойти эту проблему? Иначе не работает автозаполнение шаблонов

    Reply
  8. graser

    оно по другому не заработает, т.к. в office выполняются макросы, попробуй «C:UsersUSR1C…AppDataLocal» и галочку вложенные папки включить

    Reply
  9. skteks

    Сделал как Вы сказали (поставил галочку «включить вложенные папки») — не получилось. Все равно не пишет в папку Temp — не устанавливает ее доверенной.

    Reply
  10. graser

    попробуй выбрать не папку Temp а выше уровнем

    т.е. полный путь «C:UsersUSR1C…AppDataLocal», ну и на серваке обязательно разрешение макросов и ActiveX без запросов

    Только что проверил, у меня на серваке стоит 2007 офис, и никаких проблем с добавлением как папки Temp, так и других

    Почитай на технете мелкомягких, может чего с политиками

    Ссыль

    Reply
  11. skteks

    Сделал все как Вы говорили — все равно вылезает ошибка — вот в этом месте — не пишет файл в эту папку

    (СтарыйПутьКФАйлу = C:UsersUSR1CV8AppDataLocalTEMPимя_файла)

    //заполняет поля и строки в файле MSWord формата 2007+

    Функция ЗаполнитьФайлMSWordВXML(ДвоичныеДанныеФайла, ТекущаяВерсияРасширение, МассивДанныхДляАвтоЗамен, ЗаменятьПространствоИмен = Истина) Экспорт

    СтарыйПутьКФайлу = ПолучитьИмяВременногоФайла(ТекущаяВерсияРасширение);

    ДвоичныеДанныеФайла.Записать(СтарыйПутьКФайлу);

    НовыйПутьКФайлу = ПолучитьИмяВременногоФайла(ТекущаяВерсияРасширение);

    Макросы включил, ActiveX тоже. Папку указал C:UsersUSR1CV8AppDataLocal\r

    (галочку отметил — «включая вложенные папки)

    Можно ли временную папку переопределить только для 1С? У меня тогда и для Word-a меняется (пробовал сделать C:Temp)

    Пробовал уже на двух серваках совершенно разных:

    на одном Windows server 2008, Office 2010, 1C Документооборот 2.0.16.1 Платформа 8.3.8.1479

    На другом

    Windows 7, Office 2015, 1C Документооборот 2.0.16.1 Платформа 8.3.8.147912345

    Как только меняю для пользователя USR1CV8… темповую папку (можно в ПанельУправления-Система-Дополнительные Параметры Системы-Дополнительно-Переменные среды) так сразу и Word не разрешает ее добавить в надежные хранилища по соображениям безопасности. Получается только конфу править — путь переопределять вручную?

    Reply
  12. graser

    Видимо надо рыть реестр, судя по всему проблема в политиках безопасности, если сам говоришь, что как только переопределяешь папку Temp, то Офис ее перестает воспринимать как надежную.

    Посмотрел реестр у себя, так вот, для пользователя в качестве папки TEMP в реестре прописан C:UsersUSR1CV8AppDataLocalTemp.

    Единственное отличие, которое нашел, это то что надежное расположение для офиса задано в профиле локального администратора сервера

    т.е. у пользователя ServerName / Administrator

    А у юзера USR1CV82 никаких папок не задано, и еще, для пользователя Administrator папка Temp изменена на C: emp

    т.е. расклад такой

    Пользователь USR1CV82

    все настройки путей по умолчанию

    Пользователь Administrator

    Переменная Temp& TMP C:Temp\r

    Надежные издатели C:UserUSR1CV82AppDataLocal

    Reply
  13. skteks

    Добрый день. Разобрался с проблемой — вопрос решился обновлением на конфигурацию 2.0.17.1. И больше ничего не нужно — автозаполнение работает, файлы обновляются.

    Reply
  14. sz99

    Доброго времени суток.

    Решил воспользоваться вашим обработчиком.

    В РС «Произошедшие бизнес события» информация «Не удалось обработать».

    Что может быть?

    Код доработал под свои документы. Сам не программист.

    Reply
  15. sz99

    Разобрался. Спасибо за обработчик.

    Reply
  16. evtushenkoav

    В РС «Произошедшие бизнес события» информация «Не удалось обработать». С чем связано?

    Reply
  17. evtushenkoav

    (16) evtushenkoav, В общем решил проблему так, скопировал текст обработчика во внешнюю обработку и в отладке посмотрел где ошибки возникают. Подправил. Все пошло.

    Reply
  18. eaglemw

    (15) а можно поделиться кодом?

    Reply
  19. user827905
    Reply
  20. Katty_K

    Скажите, кто-нибудь пробовал, с LibreOffice и соответственно файлами формата odt данная доп. обработка по автозаполнению файла должна работать?

    У меня как-то не очень хочет… (у учетной записи 1с на сервере есть права администратора, уровень безопасности в Либре на сервере установлены в минимум, добавлен доверенный источник на путь C:UserUSR1C..AppDataLocal)

    Reply
  21. Katty_K

    (20) Все работает, прошу пардона 🙂

    Reply
  22. Svet_Serg

    (12) вот у меня вопрос такой)

    Если документ уже зарегистрирован, эта обработка как себя поведёт?

    У нас просто настроено так, что если документ «Служебная записка» создал руководитель, то он идёт на «Рассмотрение».

    Если создал простой сотрудник, то — документ сначала на «Согласование», затем на «Рассмотрение».

    Т.е. мне нужно будет настроить авторегистрацию на эти два процесса — 1. регистрация после согласования и 2. регистрация при старте задачи на рассмотрение.

    Reply
  23. CyberBob

    (22)Сделал таким образом: по процессу документ идет на регистрацию, я назвал задачу «Авторегистрация», направляется пользователю «Авторегистратор». По этим параметрам ловим событие и регистрируем документ допобработчиком. Все остальное рулится на этапе конфигурирования карты (шаблона) бизнес-процесса условиями. Т.е. в шаблоне БП ставим задачу «Авторегистрация» на нужное место. Проще всего условия вам нужные настроить при конфигурации шаблона БП с помощью блок-схемы, но можно и таблицей, там просто условия муторно прописывать.

    Reply
  24. Svet_Serg

    (23)

    по процессу документ идет на регистрацию, я назвал задачу «Авторегистрация», направляется пользователю «Авторегистратор»

    А пользователю при этом приходит задача «Ознакомиться с результатами регистрации»? Хотелось бы избежать этого 🙂

    Reply
  25. CyberBob

    (24)Задача ознакомления формируется, но автоматически исполняется, без вмешательства человека)) в том же обработчике авторегистрации.

                   // выполнение задачи
    
    ПараметрыВыполнения = Новый Структура;
    
    ПараметрыВыполнения.Вставить(«РезультатРегистрации», Перечисления.РезультатыРегистрации.Зарегистрировано);
    
    ВыполнениеЗадачСервер.ВыполнитьЗадачуСПараметрами(Задача, ПараметрыВыполнения);
    Reply
  26. Svet_Serg

    (25) Спасибо, попробую такой вариант)

    Reply

Leave a Comment

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