Работа с файлами в 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='\

41 Comments

  1. vladismi

    Как памятка — хорошо.

    Плюс!

    Reply
  2. surikateg

    Да, к сожалению новшества 1с превращают читаемый код в бред умственно отсталого. Автор молодец.

    Reply
  3. jura376

    Код увеличивается в разы. жесть!!!

    Reply
  4. Bonov

    Крайне бы не рекомендовал использовать подобный код где либо за пределами веб клиента. Минусы очевидны — безусловная загрузка любого файла. Представьте ситуацию, когда пользователь выберет файлике размером в 20 Гб, например? Все повиснет и надолго, ведь этот метод грузит все подряд, не давая вклиниться в обработку загрузки. На веб клиенте это единственный вариант без расширения работы с файлами, а вот в тонком и других клиентах стандартный диалог выбора файлов НО без использования модальности все же стоит использовать.

    Reply
  5. moli_i_n

    Хорошая статья.

    Reply
  6. CeHbKA

    (4) Bonov, я не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы объемом 20Гб

    Я даже не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы более 10-20мб (файлы оффиса, картинки, мп3 и прочее барахло)

    А о том, что старые методы и совместимости, скоро уйдут в небытие, говорить бессмысленно

    Reply
  7. Идальго

    (6) чего тут представлять-то? Просто берете и выбираете файлы большие, видео и презентации, ПДФ-ки бывают огромные и т.п. Передача файлов это же не вопрос вашего представления вообще.

    Reply
  8. CeHbKA

    (7) Идальго, само по себе хранение больших файлов в недрах базы данных, тем более 1С, абсурдно. Для этого есть репозитории и файловые хранилища. К чему и приучаю своих клиентов.

    А прикреплять к документу или элементу справочника PDF, который весит 300мб…

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

    Reply
  9. Quasar

    (8) вопрос то не в том логично или нет загружать такие файлы, а в том, что можно просто случайно выбрать большой файл и понеслась))

    Reply
  10. Bonov

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

    Reply
  11. Идальго

    (8) ну не храните большие файлы в недрах 1С, храните в репозитории. Но, что если репозиторий будет под управлением 1С и хранятся файлы централизовано на сервере? Один черт файлы передавать нужно будет на сервак из окна 1С. Другое дело, что 1С должна при этом давать возможность нормально работать (поток н-р дополнительный пилить или еще как-то).

    А прикреплять к документу или элементу справочника PDF, который весит 300мб…

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

    Отчасти я вас конечно понимаю, но вот далеко не всякому пользователю ясно, почему бы и не прикрепить файло в 300 мб к справочнику. Почему вы как программист не можете обеспечить корректность, надежность и т.п. этой операции? И на самом деле, пользователь прав, мало ли что у него за файлы и зачем они ему, по крайней мере это не должно волновать программиста, это не его задача. Его задача в обеспечении норм.работы пользователей и хотелок.

    Reply
  12. qwinter

    И это еще плюсуют?)))))

    Reply
  13. CeHbKA
    CeHbKA, всегда найдется идиот…

    Защита от дурака должна быть всегда!

    (10) Bonov, мы друг друга прекрасно поняли 🙂 Но от идиотов даже на кухне никто не застрахован)))

    как только окно 1С перестанет отвечать на запросы в процессе загрузки файла — постарается его поскорее принудительно закрыть

    не вижу в этом ничего плохого, загрузка всё равно идёт во временное хранилище. А заботиться о потерянных данных «дурака» (как вы выразились), как минимум странно

    И для этого в 1С полно современных методов, соответствующих последним требованиям по совместимости. Нужно только прислушаться и разобраться, а не твердить свое…

    Я не твержу своё, данный метод рекомендован самим вендором, иначе бы его не было и не было никаких режимов совместимости модальных окон и асинхронных методов. До поры до времени тонкий и web клиенты различаются, но всё ведёт к тому, что они будут единым целым. Достаточно посмотреть на западные примеры систем подобных 1С — работа в них строится через web

    Reply
  14. CeHbKA
    что если репозиторий будет под управлением 1С и хранятся файлы централизовано на сервере? Один черт файлы передавать нужно будет на сервак из окна 1С

    (11) Идальго, это какое-то извращение, управлять файловым репозиторием через 1С, вы так не считаете?

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

    как я уже сказал выше, даже на кухне никто не застрахован)))

    Почему вы как программист не можете обеспечить корректность, надежность и т.п. этой операции?

    Потому что я не Господь Бог))) Пользователь же не спрашивает, почему механик в автосервисе не может обеспечить взаимозаменяемость зч от жигулей и кайена?)))

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

    вот прекрасный ролик)))

    http://www.youtube.com/watch?v=TGb6fNUkA4s

    Reply
  15. Идальго
    это какое-то извращение, управлять файловым репозиторием через 1С, вы так не считаете

    1С это вообще извращение, особенно на УФ. Тем не менее, я допускаю, что репозиторий может иметь систему учета и управления (н-р у нас огромная библиотека здоровых фоток, книг, презентаций, видяшек и т.п.). Неужели вы считаете, что для этого никому не может требоваться система управления?

    Потому что я не Господь Бог))) Пользователь же не спрашивает, почему механик в автосервисе не может обеспечить взаимозаменяемость зч от жигулей и кайена?)))

    Он вполне может это спросить. Далее, сравнение не корректное. Вас же не просят сделать доработку 1С, чтобы она пользователям задницу подтирала.

    А ролик действительно прекрасный.

    Reply
  16. CeHbKA
    Он вполне может это спросить. Далее, сравнение не корректное. Вас же не просят сделать доработку 1С, чтобы она пользователям задницу подтирала.

    (15) Идальго, почему некорректное? Вы даже сами аналогию провели)))))

    Reply
  17. Идальго

    (16) потому что функции разные.

    Итак, 1С умеет файлы прикреплять — умеет. Ну вот и пользователь может захотеть прикрепить огромный файл. Нигде же в документации не написано (вроде), что большие файлы прикреплять нельзя и не написано почему. А пользователю м.б. это нужно. И хорошо, что вы своих пользователей приучили только мелкие картинки грузить, но, полагаю, это решение скорее административного толка, не технологическое.

    Reply
  18. MaxS

    Сделал как-то загрузку картинок в номенклатуру УТ 11 с папки сервера. Объяснил почему с сервера, а не с клиента. Но пользователи захотели грузить с любого места — со своей папки, с флешки… Пришлось сделать.

    Раз уж 1С такое наворотили, можно было бы в платформу добавить возможность просмотра свойств картинок, например, чтобы сообщить пользователю, что картинка огромная. И если 1С сумеет, предложить преобразовать в меньший размер (на клиенте), либо отказаться от загрузки.

    Reply
  19. logarifm

    Плюсануть то я плюсанул, но вот в документации 1С все это расписано.

    Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы

    Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так. Как по мне то 1С молодцы и не топчуться на месте с ноги на ногу и делают революционные прорыви, пусть они не всем нравяться, я сам не любитель «Такси» да и слово подобрали. что вообще никто не понимает почему именно «Такси»… Но все же, мы на этом работаем и мы под это разрабатываем и давайте не будем утаивать и то, что на других языках есть масса неудобного использования — где на своих форумах вы также найдете как пинают святыню С++, Java и другие языки…

    А может проблема не в языках программирования?… Думаю следует вначале посомтреть на себя, а смог бы я нечто подобное сделать прежде чем критиковать. У меня все!

    Reply
  20. CeHbKA

    (18) MaxS, да, я примерно о том же

    (19) logarifm, спасибо большое за ваш комментарий!

    Плюсануть то я плюсанул, но вот в документации 1С все это расписано.

    Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы

    Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так.

    Так я не говорил, что она не сделала или сделала не так. Я просто констатировал факт. Не у всех есть возможность постоянно курить пособие, поэтому и сделал небольшую памятку (прежде всего для себя 🙂

    Reply
  21. logarifm

    (20) Извеняюсь и не будучи рекламой этого блога, просто на заметку автору, заведите себе блог. Я вот сделал такой блог (ссылка). Если я беру чьи-то статьи в него на заметку то обязательно это указываю. Зато удобно и всегда под рукой.

    Reply
  22. VladimirKHV

    (20) Скажу больше, не у всех есть это пособие.

    (19) logarifm, Мы покупали 1С еще версии 8.2. Причем она была с книжками от 8.0.

    Поэтому у нас «Описание встроенного языка», часть 1, глава4 называется «Общие объекты».

    И где нам узнавать о новом функционале, если не в интернете? После каждого обновления платформы покупать новую версию?

    Reply
  23. Serj1C

    (22) VladimirKHV, список изменений не является секретом и всегда подробно описывается с каждым релизом электронно на сайте ИТС и портале обновлений. Например http://downloads.v8.1c.ru/content//Platform/8_3_7_1873/1cv8upd.htm

    Reply
  24. AlX0id

    (23) Serj1C,

    Кабы кто еще додумался там (ну или в другом каком месте) именно постить различия между 8.3.7.1873 и 8.3.7.****, а не между 8.3.7.1873 и 8.2..

    Reply
  25. donyab

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

    Что бы это вылечить надо начинать со следующего кода:

    #Если ВебКлиент Тогда
    НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(«ПослеПодключенияСохранениеАсинхронно», ЭтаФорма));
    #КонецЕсли
    Reply
  26. fixin

    не пиши чушь про «модальные окна запрещены», покури «Блокировка всего интерфейса».

    в остальном неплохо.

    Reply
  27. smaximaa

    а если выбирается множество файлов и без диалога открытия?

    Reply
  28. dimasts

    Это, нормально что нет листинга процедуры «ОбработкаСохраненияФайлов», к которой обращается ОписаниеОповещения в листинге сохранения файла? Или я опять ни чего не понял?

    Reply
  29. z4z4z

    Метод НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина) требует установки расширение работы с файлами, если без расширения то подойдет только метод ПолучитьФайл(АдресВР,ПутьКФайлуВыгрузкиПолн, Истина);

    Reply
  30. CeHbKA

    (29) статью нужно переписать, всё руки не доходят

    Reply
  31. deutsch2008

    что-то пошло не так у меня!

    Reply
  32. deutsch2008

    Переменная не определена (Запись)

    Процедура или функция с указанным именем не определена (РазборСтроки)

    Переменная не определена (Адрес)

    Reply
  33. CeHbKA

    (32) запись вам не нужна, разборСтроки — аналогично.

    См (30)

    Reply
  34. deutsch2008

    (33) тогда еще больше ошибок!

    Reply
  35. deutsch2008

    (30) Ждем! )))

    Reply
  36. deutsch2008

    + не отрабатывает на веб клиенте. из за запрета модальности.

    Reply
  37. ah7777777

    У меня вопрос. Как реализовать загрузку файла на WEB клиенте, без диалога выбора файла? НачатьПомещениеФайлов, в нем есть параметр Интерактивно, но на Веб клиенте он всегда Истина, т.е. диалог выбора файла будет отображен.

    А мне надо загрузить конкретно по указанному пути c:wwwkkk.jpg на WEB клиенте?

    Reply
  38. dimasts

    (6) а я могу — когда компания занимается производством медиаконтента.

    Гигабайтный видеоролик — это нормальное почти ежедневное явление. И для того чтобы просто зарегистрировать локальный путь в системе, придётся ждать, когда 1С загрузит его во временное хранилище или получать сообщение о запрете модальности.

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

    Если кто подскажет, буду премного плюсодарен 🙂

    Reply
  39. lisrws

    Вы писали:

    ОписаниеОповещения = Новый ОписаниеОповещения(«ОбработатьВыборФайла», ЭтаФорма);

    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;

    НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);

    В СП для НачатьПомещениеФайлов третьим параметром передается имя файла, а не ДиалогВыбораФайла. это вы ошиблись или в каких-то релизах так было раньше? было бы круто передавать диалог выбора с установленными на тип файла фильтрами, но пока такой возможности не вижу.

    Reply
  40. CeHbKA

    (39) используйте ДиалогОткрытияФайла.Показать()

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

    Reply
  41. Xershi

    Наконец написал свою публикацию с блекджеком и ш…… Работа с файлами (обычная и управляемая форма) все структурировано и методы все актуализированы!

    Reply

Leave a Comment

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