<?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='\
На сколько я понял, речь идет о примере для «своей» конфигурации. На мой взгляд удобнее использовать механизмы БСП «присоединенные файлы» или «файлы».
В примере присутствует много листинга, но возможно чего-то не хватает; для этого случая хорошо было бы выложить cf.
Мне очень не понравилась практика названия реквизитов как «объект».
Написано на типовой как раз БСП переделан чтоб в SQL не хранить файлы. Листинг рабочий но получился большой. Будьте внимательны с событиями формы. Если ошибки есть или сложности пишите.
(2) Farzar, Вы же пишете, что делаете это для УПП, КА. Разве там используется БСП?
А у БСП есть свои настройки для хранения файлов в томах на диске.
Типовые конфигурации, где используются управляемые формы написаны на базе БСП от этого отталкивался
(3) hotey, в КА используются точно )
в скуле всё равно безопаснее хранить 🙂
Автор конечно молодец работа с файлами без попытки доставляет. Я так понимаю это сделано для файловой базы данных?
Конечно все зависит от размеров организации и объема номенклатуры, с которой она работает.
Реализовал аналогично в относительно небольшой организации (число номенклатурных позиций не больше 100 000), путь к сетевому каталогу храним в константе, картинка при выборе ее пользователем автоматом копируется на сетевой ресурс с именем, равным коду номенклатуры. Много лет — полет нормальный.
Для того, чтобы пользователи на сетевом ресурсе не грохнули картинки, защита от дурака — сетевой ресурс скрываем символом $ в имени ресурса.
Скорее для серверной, файловая при больших объемах все равно не выживет. Когда у вас 2000 позиций и еще 5000 характеристик в этом случае Вы экономите пару гигабайт.
(8) Farzar, А смысл при использовании SQL хранить данные в отдельно лежащей папке на файловой системе вы думаете так быстрее будет ?
Главное экономия места и время выполнения резервного архива и например отчет «Остатки в картинках» работает чуть быстрее.
По мне так плохой метод.
Какой-нить пользователь удалит картинки с общего ресурса или переместит их в другое место и всё?
Или Вы не разрешаете пользователям добавлять номенклатуру и редактировать изображения?
Как это всё разворачивать быстро на другом сервере?
Если экономите место в базе, почему не вынести картинку в другую sql базу?
Если скорость то лучше переместить таблицу с файлами на другой раздел/сервер итд?
(9) nSpirit2, на самом деле с файлами быстрее работается… но я с вами солидарен, смысл хранить в файлах, если пользуется скуль.
в общем, велосипед на любителя…
(10) Farzar, никакой экономии времени на резервное копирование нет, это миф. да и + к тому это не безопасно. вот нападет какой-нибудь вирь и пожрет ваши картинки и документы
Когда данные лежат в едином месте, как единое целое, вот тут вы экономите время на резервное копирование и перенос «в случае чего»…
У нас была похожая практика использования файлов на сетевом ресурсе, но это бред и мы от этого ушли, когда объём файлов стал > 350ГБ и число этих файлов перевалило за 2 000 000
Если сильно захотеть, можно использовать скульный FileStream, тогда и файлы получатся как файлы и вроде как бы в скуле.
(11) CatMix,
Мое личное мнение не претендующее на единственное верное.
Отвечу по пунктам:
Или Вы не разрешаете пользователям добавлять номенклатуру и редактировать изображения?
— пользователь пути к картинке не видит, полный путь в константе.
— константе задаем новый путь, копируем директорию
Если экономите место в базе, почему не вынести картинку в другую sql базу? — не вижу смысла хранить бинарные неструктурированные данные в скл.
Если скорость то лучше переместить таблицу с файлами на другой раздел/сервер итд? — более сложный вариант.
Так и не понял, если есть БСП с механизмом хранения в томах на дисках, зачем велосипед?
А как быть если распределенная база?
(15) alyaev.a.v, насколько понимаю, тут конкретный пример доработки типовой УТ 10.3. Доработать только эту часть, либо встраивать БСП в УТ 10.3 и все равно делать какие-то доработки? Тут каждый решает сам для себя 🙂
Из статьи
http://infostart.ru/public/190375/
1. хочется выкинуть лишнее и получить быстрое, в этом варианте БСП подходит только для самого минимума функций, по тому что БСП это более менее универсальный монстр с кучей «лишнего»
2. есть принципиальные расхождения требуемых алгоритмов от того что есть в типовых, в данном случае то же БСП не сильно подходит.
(18) Kyrales,
Первое что приходит на ум включить в план обмена регистр Изображения далее в константе ПутьККартинкамНаСервере указать новый путь.
Возможно несколько вариантов пути:
1. Дописать к плану обмена копирование файлов при отправке и при получении данных.
2. Простой если скорость интернета позволяет можно расшарить ресурс, не забывая о безопастности, поставить запрет на редактирования из подчиненной базы.
3. и тд.
Первое, что приходит на ум, облачные сервисы 🙂 Яндекс.Диск например, дешево и сердито, практически 0 строчек кода доработки.
Все тут говорят про БСП, как про некую панацею. Мол если 1С создало БСП, то нафига велосипед городить.
БСП бывает разных версий. В УТ 10.3, УПП 1.3, Бух 2.0 она тоже есть, в них есть куча общих одинаковых для всех конфигураций модулей с полезными функциями.
Для управляемых форм в БСП есть механизмы по хранению файлами, но Вы пробовали посмотреть код, которым это реализовано? Там черт ногу сломает. А что если завтра БСП обновят? Все переписывать?
Для таких задач — только самописки потому, что:
1. Дешевле в разработке
2. Читабельный код, который через 2 года другой специалист поймет (если кодер не ушлепок:) )
3. Быстрее работает (100%)
4. Решает конкретную задачу, и делается под хотелки заказчика, а не универсально для всех на свете ООО. Самописка — всегда удобнее (если кодер не ушлепок:) )
5. Меньшая зависимость от смены релизов
(22)Все так пафосно. «Является правильным и хорошим тоном…», «Писать на 1с не зная БСП это как на С++ без STL…» и т.д.
Сравнение 1С(с ее БСП) и «С++ без STL», вообще, поражает дикостью.
В (21) верно подмечено. Сам не раз в этом убеждался. А работа «из коробки» у фирмы 1С имеет только смысл, что «вроде как работает и ладно».
(22) nSpirit2, вы хоть раз открывали модули отвечающие за работу с файлами в БСП? Видимо, нет. Я открывал.
По претензиям ко мне:
1. дешевле = потратить меньше времени на разработку. Такие мелкие задачи обычно оплачиваются по факту отработанного времени
2. я не ругал БСП, я просто довожу до сведенья незнающих, он сложна. Хотя, ДА — Я хорошего мнения о своих способностях, как разработчика. Да и опыт у меня богатый. Но авторов БСП не ставлю ниже себя:)
допустим ситуация:
прихожу к клиенту с почасовой оплатой, работа на месте, сколько отработал, столько получил, задачи заранее не известны, их много и они небольшие, меня просят к документу реализации чтоб можно было скан цеплять
что я должен делать? Пару часов смотреть в модули БСП, потом час вкрячивать туда своё и выдать потом решение не очень удобное в плане интерфеса? И объяснять менеджерам, что это не удобно, зато универсально. Да им пое**ть, что это решение универсально и будет рабоать на соседнем заводе так же хорошо, как в их фирме. им нужно хорошо у них, а директору надо быстро, потому что время — деньги.
нет я за 15 минут набрасываю регистр сведений и рисую в документе пару кнопок (добавить, просмотреть файл), выгоняю на 5 минут всех из базы, сохраняюсь проверяю и все! и перехожу к следующе задаче
в БСП учитывается много фишек, оно работает в web клиенте, в серверной базе, в файловой… все это круто, но надо решать конкретные задачи. Самые живучие решения — простые, их потом легко трансформировать под новые обстоятельства.
(24)»за 15 минут набрасываю регистр сведений и рисую в документе пару кнопок…»
Ага. Был у меня случай с «чудо программистом». Писал все влет… регистры, документы, справочники. Просто скорость поражала и такое знание языка.
Хорошо, что нашел время потестить это чудо мысли. Я ужаснулся реализации. Там, при изменении конфы, пришлось бы каждый раз его вызывать.
Снес его поделку и решил, по максимуму, штатными средствами. Не так быстро, довольно прилично призадумываясь, что можно использовать из того, что уже есть.
Работает несколько лет и не просит кушать.
Так что использование штатных возможностей, на мой взгляд, должно быть не на последнем месте.
(24) monkbest, Это называется методом костыльного программирования. Они захотели я им сделал за 15 минут костыль. Они захотел хранить еще и сканы договоров. Я и там сделал костыль… Хотя БСП с точки зрения интерфейса тут каркас позволяет хранить все файлы однообразно… А еще вы точно за 15 минут написали все проверки на существование.. Проверку доступа и прочие вещи которые надо написать при работе с файлами…
Не поверите да и всем доволен.
(25) OBEH, БСП входит в состав конфигураций, но не все его механизмы везде задействованы во всех объектах. Например 1С Бухгалтерии 3.0 есть БСП последней версии, в которой реализована работа с хранением файлов. Но это не значит, что вы можете прикрепить произвольный файл к документу «реализация товаров и услуг» быстро и удобно
Есть справочник файлов. Есть доп.сведенья, в которых можно указывать тип значения — «файл». Это стандартные подсистемы.
Но, чтобы прикрепить файл к документы, надо:
1. Записать документ
2. Нажать кнопку доп сведенья
3. Начать редактировать сведенье, в котором лежит файл
4. Из списка всех файлов в справочнике выбрать нужный, а там его, т.е. нажать кнопку создать
5. Сохранить файл в справочнике.
6. Выбрать в доп сведенье элемент справочника.
Это не удобно. Каждый руководитель сам принимает решение «ломать» «не ломать». Если ломать, то он думает «А по чем?».
Ломание механизмов БСП — дорого, аукнется при обновлении еще дороже.
(26) nSpirit2, мои костыли прочные и красивые, не переживайте, работаю годами. Я сам порой забываю об их существовании, настолько они органично врастают в систему и в жизнь предприятия, как будто они тут были еще до меня, со времен установки типовой конфигурации
(26) «всем доволен….».
По моему, это клиника. Особенно, применительно к 1С.
(22) nSpirit2,
Одно дело, когда есть исходный функционал в конфигурации, тут да, моветон. Но когда конфигурацию необходимо этим функционалом дорабатывать, что бы потом его использовать — тут уже можно и поспорить 🙂
(29) OBEH, Ну да все прекрасно работает… Вам не нравиться 1С. Напишите что нибудь свое умное и хорошее. Боюсь все проблемы 1С вытекают из того что она и так вам жизнь упрощает в плане программирования как может.
(30) insurgut, Вот с вами я полностью согласен. Ну чтобы не попасть в просак каркас следует знать типовой функционал. Причем я именно говорю о том какие функции торчат из БСП наружу. Что бы не написать свой деревянный велосипед.
В конечном итоге костыли всегда оставаться костылями. И потом при переходе при смене редакции тот кто будет это делать заставят вас икать за ваш костыль.
Станет все проще, если понять, что 1С торгует платформой и коробками с описанием языка и примерами прикладных решений на этой платформе.
Именно, примерами, а не законченными решениями.
Поэтому «Все прекрасно работает», если предприятие подгонять под этот пример.
Так что все, кто хочет реально работать, берут напильник и пилят этот самый пример для себя.
Курочить конфу, когда можно обойтись штатными средствами, да и безо всяких БСП — жуть.
Делается просто:
1. Добавляется доп.свойство справочника, хранящее строковый адрес картинки;
2. Добавляется внешняя печатная форма, привязанная к карточке номенклатуры, суть которой в работе с картинкой (выбор, показ, файловые операции);
3. Добавляется внешняя обработка, групповой менеджер картинок, настроек работы с ними (кои хранятся в общем хранилище настроек) и прочая.
Всё.
(33) Yashazz, Ваш ход мыслей верный в плане того что можно не редактировать типовую конфу. ЕЕ легко ОБНОВЛЯТЬ.
Но в примере минимум изменений кода в форме номенклатуры:
1. ПоказатьИзображение —
2. ОткрытьИзображение —
Основной код в отдельном общем модуле и общей форме которые не будут обновляться.
Разница только в том где хранить код в отдельном общем модуле или во внешней обработке.
(33) Yashazz, хорошая мысль, мне нравится. Помимо печатных форм еще есть и обработки заполнения, которые тоже везде можно присоединить.
единственное, сложно будет реализовать для незаписанного объекта
(0) хорошее решение, сам так делал
Я один заметил что не будет работать код (в цикл не зайдет)
Функция ПолучитьЧастьСтрокиОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска)
ПозицияСимвола = СтрДлина(ИсходнаяСтрока);
Пока ПозицияСимвола = 1 Цикл
(33) Ограничение — работа с ЕДИНСТВЕННЫМ изображением. Иногда этого не достаточно (ну либо опять воротить костыли).
(37) kosmo0,
Должно быть так:
Скорее при вставке глюк, спасибо коммент.
(38) kosmo0, Костыли воротить не надо, добавьте в форму только две кнопочки вперед и назад:
Поправьте, пожалуйста, ошибки
Опишу в вкратце действия
В модель формы пишу код
4. Добавляю общею форму
(41) echo77, исправил, большое спасибо.
Только подсветка кода слетела, после сохранения..
(33) (40) Сначала. Что понимается под термином «свойство»? Я предполагал что это типа из УПП свойства объектов, на основе Планов видов характеристик. Если я понял правильно, то будете создавать свойства «Картинка1», «Картинка2» и далее? А если какому-то элементу нужно будет 30 картинок?
(13) insurgut, Делал так же, еще на самописной семерке, а все операции над изображением производил с помощью командной строки IrfanView.
тоже страдаем раздуванием базы, а как быть если распределенная база?
(45) hazd, Яндекс.Диск или OneDrive вам в помощь. Проще уже некуда 🙂
Интересно данный материал нормально будет работать на УТП 8..2?
Просто стандартные методы забиваю оперативную память в хлам. Работать просто не возможно.
Начал делать все по инструкции и на конечном этапе выплыла такая вот ошибка:
Странно правда.
ОсновноеИзображение имеет тип поле картинки.
Вот это все так же сделано.
Может кто подскажет кудой копать?
Все разобрался..
У Вас в коде нужно поправить в двух местах:
Я сначала поставил = , а как оказалось нужно было поставить <>.
Чуть переделал данное решение с полем HTML
Ну это не суть важно.
Мне интересно как открыть форму изображения например при клике на миниатюру в подборе или в справочнике.
То есть передаю владельца формы в третьем параметре, но ничего не открывается, а если перед выводом формы Открыть форму Номенклатуры:
Тогда открывается и форма элемента и форма Изображения
Можно ли как-то сделать чтобы просто открывалась форма изображения?
Все сделал. У меня все получилось.
Теперь оперативная память не забивается.
Поле HTML рулит.
Если что обращайтесь. Подскажу.
А никто не рассматривал смешанный вариант хранения картинок?
1. все картинки хранятся на диске/фтп/облаке
2. в БД есть регистр/справочник, в котором хранится путь к картинке и на который ссылаются нужные справочники (товары, сертификаты, клиенты и прочее)
этот регистр/справочник общий для всех баз в распределенке
3. в БД есть «локальный кеш» справочник/регистр, в котором хранятся сами картинки, к которым было обращение за последний месяц.
Этот справочник исключительно локальный и в обменах не участвует. Его без проблем можно чистить каждый месяц или вообще не чистить.
Можно картинки в нем хранить не по дате обращения, а по количеству обращений.
Таки образом получаем и возможность хранения огромного количества картинок (любых файлов) без раздувания БД
И за счет локального «кэша» картинок в самой базе получаем быстрый доступ к часто используемым картинкам, что уменьшает количество тормозов при хранении в сети/облаке/фтп
Причем размером локального кеша (размером БД) можно управлять без потери данных.
(52) VZhulanov, как вариант имеет право на существование. Я сейчас примерно так и сделал. Все фото хранятся в Dropbox локально на каждом сервере. Dropbox запущен службой. И мне достаточно добавить новые фотографии на одном сервере и фотки загрузятся на остальные.
Вариант с часто используемыми нормальный, НО в подборе используется отображение картинки и получается, что все картинки будут тащиться в кеш.
А позиций более 8000.