Подсистема хранения файлов




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

31 Comments

  1. Mogidin

    Хорошее дело. Теперь есть костяк для задуманного давненько уже проекта. Нужно только добавить к этому некоторый функционал и будет то, что дохтур прописал)))

    Reply
  2. o.nikolaev

    Да, хорошая простая штучка которая может пригодиться много где. Хотя дотачивать все равно придется… 🙂

    Reply
  3. СергейКа

    Было бы прикольно, если бы работало хотя бы в минимуме…

    Reply
  4. NoMax

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

    Reply
  5. Mogidin

    (4) контрагенты и договоры для интеграции в типовую конфигурацию.

    (3) у меня работает. что у вас не так?

    Reply
  6. NoMax

    (5)ок понял

    у (3) неработает видимо потому что как я написа в (4) добавление идет только после добавления нового объекта привязки, а первоначально без выбранного «объекта привязки » кнопка «Добавить файл» не работает

    Reply
  7. Mogidin

    (4) ну да. для добавления файла должна быть выбрана «Коллекция», к которой будет принадлежать документ. выбирается она в соответствующем справочнике. вовсе не обязательно сразу добавлять новый объект привязки, в примере есть два готовых.

    было бы хорошо сделать возможность этого выбора прямо в форме «Работа с файлами». нужно всего-то добавить СправочникСписок на эту форму.

    Reply
  8. СергейКа

    (5) «контрагенты и договоры для интеграции в типовую конфигурацию.» Иначе не работает.

    Простите, а где это в описании?

    Если приложен файл *.dt то это подразумевает что загрузил и база будет работать. А что здесь? Сложно было добавить пару строчек об этом?

    Почему выбран раздел «Конфигурация для 1С: Предприятие 8.1» — типа для любой конфигурации?

    А если в моей конфигурации нет таких справочников?

    Reply
  9. Mogidin

    (6) ну да. для добавления файла должна быть выбрана «Коллекция», к которой будет принадлежать документ. выбирается она в соответствующем справочнике. вовсе не обязательно сразу добавлять новый объект привязки, в примере есть два готовых.

    было бы хорошо сделать возможность этого выбора прямо в форме «Работа с файлами». нужно всего-то добавить СправочникСписок на эту форму.

    Reply
  10. Mogidin

    (4) ну да. для добавления файла должна быть выбрана «Коллекция», к которой будет принадлежать документ. выбирается она в соответствующем справочнике. вовсе не обязательно сразу добавлять новый объект привязки, в примере есть два готовых.

    было бы хорошо сделать возможность этого выбора прямо в форме «Работа с файлами». нужно всего-то добавить СправочникСписок на эту форму.

    З.Ы. и соответствующие обработчики событий перенести.

    Reply
  11. Mogidin

    (4) ну да. для добавления файла должна быть выбрана «Коллекция», к которой будет принадлежать документ. выбирается она в соответствующем справочнике. вовсе не обязательно сразу добавлять новый объект привязки, в примере есть два готовых.

    было бы хорошо сделать возможность этого выбора прямо в форме «Работа с файлами». нужно всего-то добавить СправочникСписок на эту форму.

    З.Ы. и соответствующие обработчики событий перенести.))

    надеюсь автор учтет пожелания и выложит новую версию.

    Reply
  12. Mogidin

    нехорошо как-то получилось. рефрэш подвёл. потрите лишние каменты.

    Reply
  13. Mogidin

    (8) ну чего ты завелся. везде бывают ошибки и недоделки. всё это не смертельно и легко решается.

    Reply
  14. СергейКа

    (13) И где это интересно я завелся? 🙂

    Даже минуса не ставил, хотя по уму — нужно было.

    И мне не понятно за что столько плюсов и сразу.

    Такое ощущение что ставили плюсы не попробовав ни разу. Просто за «красивые глазки»? Ни красивой реализации, ни внятного описания…

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

    Reply
  15. СергейКа

    И вообще, интересное совпадение, например: http://infostart.ru/profile/107640/

    За полтора месяца скачан 1 файл. И сразу плюс за него…

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

    Reply
  16. vlsv

    Хотелось бы еще видеть ограничение прав доступа к файлам

    Reply
  17. Alraune

    (15) Кстати, статистика скачанных файлов может показывать неправильное значение. У меня на странице вообще 0 скачанных, а на самом деле это не так.

    Reply
  18. Mogidin

    (15) стаж на данном ресурсе никак не связан с опытом человека по отношению к продуктам 1С.

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

    Скажу про себя. Скачал файл. Посмотрел. Вижу dt. Создаю новую конфигурацию. Загружаю ИБ из полученного файла. Запускаю в режиме предприятия, тестю. Контрагенты не работают, договора не работают. Делаю вывод что это заглушки для интеграции в «типовую» конфигурацию. Меню «работа с файлами». Открываю всё подряд. (так как справочник коллекции уже открыт, в форме для работы с файлами уже выбран объект привязки и я вижу файлики, засунутые автором для примера) Пробую добавить свой файл и немного с ним поиграться. Всё работает, только с авторами косяк.

    Иду смотреть инструкцию.

    Пожелания к следующей версии:

    * сделать в форме работы с файлами возможность выбора коллекции;

    * в справке на скринах видно несколько отображаемых объектов привязки в форме, я такого не наблюдаю, отображается только один объект со своими файлами. + может быть стоит сделать иерархическим справочник коллекций?

    * при даблклике на файле из списка мной заблокированных открывать его для редактирования;

    * полазив в конфигураторе так и не нашел момента установки автора документа. З.Ы. полазив еще решил, что это из-за «демонстрационного режима» конфигурации. Если это дело правильно впилить в большую конфигурацию, можно будет добиться желаемого (ну или, если интеграция не требуется, немного допилить эту). В связи с этим хочется видеть мануал по «правильному» впиливанию этого дела в основную рабочую конфу;

    * форма, показывающая версии файлов, не даёт написать комментарий для конкретной версии. (автор тут меняться не должен, ИМХО, поэтому ничего с ним делать как бы и не надо).

    Reply
  19. AnryMc

    Извините, но «-»

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

    Где «линки» на договор, контрагента… подчиненная сруктура?

    Тема интересная. Обещаю свести свое «фе» к нулю, в дальнейшем, при доработках

    Reply
  20. koreav

    Коллеги,

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

    Пример того как можно подключить новые объекты — справочник коллекции.

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

    Критику принимаю, постараюсь в ближайшем будущем написать руководство по интеграции.

    Reply
  21. AnryMc

    Может кто либо поделиться практическим опытом, как влияет «затягивание» документов в 1С на производительность в файловом и серверном вариантах? Может стоит создавать механизм внешнего хранения файлов с контролем их версий по контрольным суммам?

    Reply
  22. Azdan

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

    Reply
  23. CheBurator

    разработка хорошая, нужная. если бы я сидел на 8-ке — себе бы поставил. как раз то что надо…

    .

    вопрос: при открытии файла на редактирование: открывается «внутри» 1С..??

    Reply
  24. Mogidin

    (23) конечно нет. файлы открываются в своих «родных» приложения.

    doc и xls в MS Word, pdf в Adobe Acrobat (или в других ассоциированных с файлами приложений) и т.д.

    Reply
  25. AnryMc

    (0) Я уже начинаю забывать, что обещал поставить ПЛЮС.

    Я понимаю, что люди бывают заняты — но автору стоило бы откликнуться

    Reply
  26. koreav

    Обновление:

    — добавил руководство по интеграции (на примере УТ 10.3)

    — исправил ошибку: не фиксировался автор

    — увеличил длину наименования файла до 255

    — убрал в демобазе в полном интерфейсе неработающие пункты

    Reply
  27. koreav

    «Хотелось бы еще видеть ограничение прав доступа к файлам»

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

    «* сделать в форме работы с файлами возможность выбора коллекции;»

    Справочник «Коллекции» — это пример, в нашей реальной базе такого нет, зато есть масса других объектов к которым привязываются файлы

    «* в справке на скринах видно несколько отображаемых объектов привязки в форме, я такого не наблюдаю, отображается только один объект со своими файлами. + может быть стоит сделать иерархическим справочник коллекций?»

    В руководстве по интеграции (которое теперь есть 🙂 ) приведен пример, как можно прикрепить клиента, его договора + что бы они отображались одновременно

    «* при даблклике на файле из списка мной заблокированных открывать его для редактирования;»

    сделаю в следующей версии

    «* полазив в конфигураторе так и не нашел момента установки автора документа. З.Ы. полазив еще решил, что это из-за «демонстрационного режима» конфигурации. Если это дело правильно впилить в большую конфигурацию, можно будет добиться желаемого (ну или, если интеграция не требуется, немного допилить эту). В связи с этим хочется видеть мануал по «правильному» впиливанию этого дела в основную рабочую конфу;»

    С автором была ошибка, строка назначения автора была закомментирована, почему-то…

    Как правильно впилить — теперь можно посмотреть в руководстве по интеграции

    «* форма, показывающая версии файлов, не даёт написать комментарий для конкретной версии. (автор тут меняться не должен, ИМХО, поэтому ничего с ним делать как бы и не надо). »

    сделаю в следующей версии

    «Может кто либо поделиться практическим опытом, как влияет «затягивание» документов в 1С на производительность в файловом и серверном вариантах? Может стоит создавать механизм внешнего хранения файлов с контролем их версий по контрольным суммам?»

    SQL, 120 пользователей, ~100k файлов, в базе занимают ~ 4-5Гб. В день добавляется ~500 версий, читается несколько тысяч. С производительностью проблем нет.

    «Я уже начинаю забывать, что обещал поставить ПЛЮС.»

    Пора бы 🙂

    Reply
  28. sckif

    эту разработку можно свободно использовать? ограничения есть какие-нибудь?

    Reply
  29. koreav

    все стандартно:

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

    Reply
  30. MAX3000

    Обработка нужная. Силно упрощает работу с дополнительными файлами.

    Reply
  31. CheBurator

    Автор не может запретить использование алгоритмов и методик — это не объекты авторского права.

    вот если автор нарисует АЛГОРИТМ и выложит его скриншотом, то да — такой скриншот нельяз будет выдавать за свой или без указания авторства, а алгоритм использовать — запросто!

    Reply

Leave a Comment

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