<?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='\
Как памятка — хорошо.
Плюс!
Да, к сожалению новшества 1с превращают читаемый код в бред умственно отсталого. Автор молодец.
Код увеличивается в разы. жесть!!!
Крайне бы не рекомендовал использовать подобный код где либо за пределами веб клиента. Минусы очевидны — безусловная загрузка любого файла. Представьте ситуацию, когда пользователь выберет файлике размером в 20 Гб, например? Все повиснет и надолго, ведь этот метод грузит все подряд, не давая вклиниться в обработку загрузки. На веб клиенте это единственный вариант без расширения работы с файлами, а вот в тонком и других клиентах стандартный диалог выбора файлов НО без использования модальности все же стоит использовать.
Хорошая статья.
(4) Bonov, я не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы объемом 20Гб
Я даже не могу представить себе ситуацию, когда в базу 1С будут загружаться файлы более 10-20мб (файлы оффиса, картинки, мп3 и прочее барахло)
А о том, что старые методы и совместимости, скоро уйдут в небытие, говорить бессмысленно
(6) чего тут представлять-то? Просто берете и выбираете файлы большие, видео и презентации, ПДФ-ки бывают огромные и т.п. Передача файлов это же не вопрос вашего представления вообще.
(7) Идальго, само по себе хранение больших файлов в недрах базы данных, тем более 1С, абсурдно. Для этого есть репозитории и файловые хранилища. К чему и приучаю своих клиентов.
А прикреплять к документу или элементу справочника PDF, который весит 300мб…
В общем, на своём половом органе я вертел такие PDF и уж тем более видео файлы 🙂
(8) вопрос то не в том логично или нет загружать такие файлы, а в том, что можно просто случайно выбрать большой файл и понеслась))
(8) всегда найдется идиот, который и файл большой выберет, и экзешник загрузит, и вообще как только окно 1С перестанет отвечать на запросы в процессе загрузки файла — постарается его поскорее принудительно закрыть. Защита от дурака должна быть всегда! И для этого в 1С полно современных методов, соответствующих последним требованиям по совместимости. Нужно только прислушаться и разобраться, а не твердить свое…
(8) ну не храните большие файлы в недрах 1С, храните в репозитории. Но, что если репозиторий будет под управлением 1С и хранятся файлы централизовано на сервере? Один черт файлы передавать нужно будет на сервак из окна 1С. Другое дело, что 1С должна при этом давать возможность нормально работать (поток н-р дополнительный пилить или еще как-то).
В общем, на своём половом органе я вертел такие PDF и уж тем более видео файлы
Отчасти я вас конечно понимаю, но вот далеко не всякому пользователю ясно, почему бы и не прикрепить файло в 300 мб к справочнику. Почему вы как программист не можете обеспечить корректность, надежность и т.п. этой операции? И на самом деле, пользователь прав, мало ли что у него за файлы и зачем они ему, по крайней мере это не должно волновать программиста, это не его задача. Его задача в обеспечении норм.работы пользователей и хотелок.
И это еще плюсуют?)))))
(10) Bonov, мы друг друга прекрасно поняли 🙂 Но от идиотов даже на кухне никто не застрахован)))
не вижу в этом ничего плохого, загрузка всё равно идёт во временное хранилище. А заботиться о потерянных данных «дурака» (как вы выразились), как минимум странно
Я не твержу своё, данный метод рекомендован самим вендором, иначе бы его не было и не было никаких режимов совместимости модальных окон и асинхронных методов. До поры до времени тонкий и web клиенты различаются, но всё ведёт к тому, что они будут единым целым. Достаточно посмотреть на западные примеры систем подобных 1С — работа в них строится через web
(11) Идальго, это какое-то извращение, управлять файловым репозиторием через 1С, вы так не считаете?
как я уже сказал выше, даже на кухне никто не застрахован)))
Потому что я не Господь Бог))) Пользователь же не спрашивает, почему механик в автосервисе не может обеспечить взаимозаменяемость зч от жигулей и кайена?)))
вот прекрасный ролик)))
http://www.youtube.com/watch?v=TGb6fNUkA4s
1С это вообще извращение, особенно на УФ. Тем не менее, я допускаю, что репозиторий может иметь систему учета и управления (н-р у нас огромная библиотека здоровых фоток, книг, презентаций, видяшек и т.п.). Неужели вы считаете, что для этого никому не может требоваться система управления?
Он вполне может это спросить. Далее, сравнение не корректное. Вас же не просят сделать доработку 1С, чтобы она пользователям задницу подтирала.
А ролик действительно прекрасный.
(15) Идальго, почему некорректное? Вы даже сами аналогию провели)))))
(16) потому что функции разные.
Итак, 1С умеет файлы прикреплять — умеет. Ну вот и пользователь может захотеть прикрепить огромный файл. Нигде же в документации не написано (вроде), что большие файлы прикреплять нельзя и не написано почему. А пользователю м.б. это нужно. И хорошо, что вы своих пользователей приучили только мелкие картинки грузить, но, полагаю, это решение скорее административного толка, не технологическое.
Сделал как-то загрузку картинок в номенклатуру УТ 11 с папки сервера. Объяснил почему с сервера, а не с клиента. Но пользователи захотели грузить с любого места — со своей папки, с флешки… Пришлось сделать.
Раз уж 1С такое наворотили, можно было бы в платформу добавить возможность просмотра свойств картинок, например, чтобы сообщить пользователю, что картинка огромная. И если 1С сумеет, предложить преобразовать в меньший размер (на клиенте), либо отказаться от загрузки.
Плюсануть то я плюсанул, но вот в документации 1С все это расписано.
Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы
Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так. Как по мне то 1С молодцы и не топчуться на месте с ноги на ногу и делают революционные прорыви, пусть они не всем нравяться, я сам не любитель «Такси» да и слово подобрали. что вообще никто не понимает почему именно «Такси»… Но все же, мы на этом работаем и мы под это разрабатываем и давайте не будем утаивать и то, что на других языках есть масса неудобного использования — где на своих форумах вы также найдете как пинают святыню С++, Java и другие языки…
А может проблема не в языках программирования?… Думаю следует вначале посомтреть на себя, а смог бы я нечто подобное сделать прежде чем критиковать. У меня все!
(18) MaxS, да, я примерно о том же
(19) logarifm, спасибо большое за ваш комментарий!
Руководство разработчика: Глава 4. Встроенный язык. 4.7.8. Синхронные и асинхронные методы работы
Следует почитать автору это прежде чем вообще говорить о том, что 1С не сделала или сделала не так.
Так я не говорил, что она не сделала или сделала не так. Я просто констатировал факт. Не у всех есть возможность постоянно курить пособие, поэтому и сделал небольшую памятку (прежде всего для себя 🙂
(20) Извеняюсь и не будучи рекламой этого блога, просто на заметку автору, заведите себе блог. Я вот сделалтакой блог (ссылка) . Если я беру чьи-то статьи в него на заметку то обязательно это указываю. Зато удобно и всегда под рукой.
(20) Скажу больше, не у всех есть это пособие.
(19) logarifm, Мы покупали 1С еще версии 8.2. Причем она была с книжками от 8.0.
Поэтому у нас «Описание встроенного языка», часть 1, глава4 называется «Общие объекты».
И где нам узнавать о новом функционале, если не в интернете? После каждого обновления платформы покупать новую версию?
(22) VladimirKHV, список изменений не является секретом и всегда подробно описывается с каждым релизом электронно на сайте ИТС и портале обновлений. Напримерhttp://downloads.v8.1c.ru/content//Platform/8_3_7_1873/1cv8upd.htm
(23) Serj1C,
Кабы кто еще додумался там (ну или в другом каком месте) именно постить различия между 8.3.7.1873 и 8.3.7.****, а не между 8.3.7.1873 и 8.2..
На версии платформы 8.3.7.1949 ругается, что надо использовать расширение для работы с файлами, а при повторном вызове все удачно срабатывает.
Что бы это вылечить надо начинать со следующего кода:
не пиши чушь про «модальные окна запрещены», покури «Блокировка всего интерфейса».
в остальном неплохо.
а если выбирается множество файлов и без диалога открытия?
Это, нормально что нет листинга процедуры «ОбработкаСохраненияФайлов», к которой обращается ОписаниеОповещения в листинге сохранения файла? Или я опять ни чего не понял?
Метод НачатьПолучениеФайлов(ОписаниеОповещения,ПолучаемыеФайлы, ДиалогОткрытияФайла, Истина) требует установки расширение работы с файлами, если без расширения то подойдет только метод ПолучитьФайл(АдресВР,ПутьКФайлуВыгрузкиПолн, Истина);
(29) статью нужно переписать, всё руки не доходят
что-то пошло не так у меня!
Переменная не определена (Запись)
Процедура или функция с указанным именем не определена (РазборСтроки)
Переменная не определена (Адрес)
(32) запись вам не нужна, разборСтроки — аналогично.
См (30)
(33) тогда еще больше ошибок!
(30) Ждем! )))
+ не отрабатывает на веб клиенте. из за запрета модальности.
У меня вопрос. Как реализовать загрузку файла на WEB клиенте, без диалога выбора файла? НачатьПомещениеФайлов, в нем есть параметр Интерактивно, но на Веб клиенте он всегда Истина, т.е. диалог выбора файла будет отображен.
А мне надо загрузить конкретно по указанному пути c:wwwkkk.jpg на WEB клиенте?
(6) а я могу — когда компания занимается производством медиаконтента.
Гигабайтный видеоролик — это нормальное почти ежедневное явление. И для того чтобы просто зарегистрировать локальный путь в системе, придётся ждать, когда 1С загрузит его во временное хранилище или получать сообщение о запрете модальности.
В моей ситуации нужно просто зарегистрировать путь в форме, а загрузку файла в облако запустить асинхронно — немодального решения я пока не нашел.
Если кто подскажет, буду премного плюсодарен 🙂
Вы писали:
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
НачатьПомещениеФайлов(ОписаниеОповещения, , ДиалогОткрытияФайла, Истина, УникальныйИдентификатор);
В СП для НачатьПомещениеФайлов третьим параметром передается имя файла, а не ДиалогВыбораФайла. это вы ошиблись или в каких-то релизах так было раньше? было бы круто передавать диалог выбора с установленными на тип файла фильтрами, но пока такой возможности не вижу.
(39) используйте ДиалогОткрытияФайла.Показать()
Естественно, методы от версии к версии в платформе могут меняться.
Наконец написал свою публикациюРабота с файлами (обычная и управляемая форма) все структурировано и методы все актуализированы!
с блекджеком и ш……