Прикрепление и хранение файлов в документах и элементах справочников




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

16 Comments

  1. Abadonna

    (0)

    исключительно штатными средствами и без использования внешних компонент

    Прикрутить formex к конфе — одна строчка в ГМ.

    http://infostart.ru/public/74232/

    После этого используй себе в ДопГМ

    ПослеОткрытия(Контекст) и, например, Процедура ПриНажатииКнопкиКлавиатуры(Контекст,КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)

    Волшебное слово Контекст как раз будет содержать объект со всеми потрохами.

    Все «на лету», вызывай что хочешь. В предложенном решении на каждую нужную форму надо положить кнопку, а это уже приличные изменения конфигурации

    Reply
  2. topasha

    Пользователям именно кнопка на форме нужна 🙁 . Так они выдрессированы. Нет кнопки — считай, что нет обработки. До этого я иконку в пользовательский интерфейс вставлял — не видят. А на форме — так пожалуйста, всё в порядке. Пользуются и не жужжат.

    Reply
  3. ACE$

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

    Reply
  4. Noy

    Однозначно лучше было бы:

    Формекс + ПослеОткрытия + Дополнительная Вкладка (или программно создаваемая кнопка, например как тут: Расширенные настройки для отчетов )

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

    (2),(3) Это смотря как учить. У меня большинство пользователей не могут жить без Быстрый доступ к отчетам и HotKey Менеджер для 1С

    Reply
  5. topasha

    Подправил и обновил конфигурацию.

    Добавил отчетик — реестр прикреплённых файлов. В отчет выводится список файлов и объектов программы (документы, элементы справочников), к которым эти файлы прикреплены с возможностью открытия формы.

    И еще. Если у пользователя название прав «Администратор» и у него отключен контроль прав, то на обработке прикрепления файлов, справа вверху будет видна кнопка [files]. При нажатии на неё откроется окно с прикреплёнными файлами.

    Reply
  6. nickkey

    способ неплохо подходит скажем для написания документооборота в любом виде спасибо автору 🙂

    Reply
  7. vasya_l

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

    Reply
  8. AERoport

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

    Reply
  9. rimma_n

    Очень понравилась обработка, спасибо автору огромное!!! Удобно хранить всяческие сканы. Поддерживаю про кнопку на форме. Нет излишней информации о всех хранящихся файлах, доступны файлы только для данного элемента.

    Reply
  10. Доня

    Да! Пользуюсь очень давно.

    Просто супер!!!

    ++++++++++++

    Reply
  11. antares2010

    Спасибо. Но нужно будет доработать под собственные нужды.

    Reply
  12. antares2010

    Возможно ли сделать, чтобы обработка переименовывала прикрепляемый файл? В моём случае с номенклатурой, например так: код_наименование.jpg

    Reply
  13. topasha

    Можно и с переименованием файла сделать. Лишь бы не получилось файлов с одинаковыми именами в одной папке.

    Reply
  14. antares2010

    (14) Как? Можно ещё дату добавить в имя файла, чтобы избежать совпадения имён, хотя в моём случае с номенклатурой это не нужно, поскольку коды уникальны.

    Reply
  15. CheBurator

    Много лет лежала в закладках, наконец внедрил 😉

    Полезная вещь, такую лдавным-давно хотел сделать, и что хорошо — структура хранения точно как я и хотел.

    Обработка не без «шероховатостей» (за счет простоты), но вполне себе!

    Добавил пару строк — кнопку можно вешать на любой список (журнал, форму справочника).

    При правильном допиле — можно вообще кнопку хоть на ТЗ повесить, хоть на список значений — при получении параметра анализировать контекст и далее — как угодно…

    Reply
  16. Доня

    (16)

    Добавил пару строк — кнопку можно вешать на любой список (журнал, форму справочника).

    Можно по-подробнее про «журнал»

    напишите пжл «эти пару срок» здесь

    очень надо!

    Спасибо

    Reply

Leave a Comment

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