<?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 стартмани — это бесплатно?
(1) Вы пропустили в публиции следующий абзац:
И вы всегда можете написать мне, Я обязательно отвечу, если в телегу — то практически моментально :3
Адрес в профиле, редактор не позволил мне прикрепить бесплатно и указать контактные данные.
Также инфостарт не разрешает давать линк на гитхаб :c
Каюсь, извиняюсь — действительно пропустил. Подход понравился, сам делал нечто подобное.
(3) Можете написать в личку — обязательно поделюсь)
Если есть желание поучаствовать — с радостью приму помощь, нереализованный фичи и улучшения описал в статье.
Обработочку сделал недавно, когда поймал себя на мысли, что каждый раз при создании новой печатной формы, Я делаю одно и тоже) Посему аккуратно все оформил, и преследовал некую модульность и простоту разработки.
По сути чтоб создать на её основе новую печатную форму — потребуется изменить шаблон и подправить код всего в одной функции. Причем если новая печатная форма также будет касаться сотрудника — можно ограничится только редактированием макета.
ЗЫ: есть еще подключаемая, самозаполняемая печатная форма по справкам по сотруднику.
Но код там местами не очень, поэтому выложить могу только обфусцированной, иначе мне будет слегка неуютно)
картинки из 1с можно вставить в макет word с помощью вашей обработки?
к примеру вывести основное изображение номенклатуры
(5) Пока нельзя, но технически в этом нет ничего сложного.
Вордовский файл это по сути архив с xml файлами и вложениями.
Если вставить в шаблон картинку, то она окажется в отдельном каталоге и её можно будет заменить.
если выводить таблицу из 1с, то заранее неизвестно количество строк, значит заранее не получится вставить саму картинку.
(7)
Исходные файлы xml ворда толком ничем не отличаются от html документа.
Вы же не будете утверждать, что невозможно сверстать веб страничку в 1с?)
Ну как вы обычно выводите картинки в табличный документ?
Вы вставляете некую заготовку, а потом заменяете её на нужное изображение.
Так и здесь. При разархивировании docx получаете изображение которое вставили в документ шаблоном ранее.
Просто заменяете его на двоичные данные из вашего справочника номенклатур/файлов.
Вообще xml документы имеют ссылки между собой и вполне ясно говорят, что и как они подключают.
Если тут есть гуру XDTO — то в теории можно будет научить 1с’ку читать ворд довольно изящно.
Я с радостью бы это все сделал, но у меня очень много другой работы, поэтому данный функционал мной будет реализован в удобной для использования форме, как только это потребуется по работе.
Здравствуйте!
А этот проект есть на гитхаб? Можно ссылку или идентификатор для поиска?
(9) Привет. Да, есть.
Ссылки на гит тут, вроде как, запрещено прикреплять.
Но в отдельный репозиторий не выносил, а также никак не могу заставить себя выкладывать на гит именно исходный код, а не бинарники.
Давайте попробуем так, оставлю свой никнейм: PlugFox
И некий относительный путь: ones/Обработки и отчеты/Обработки/RMR СоглашениеОНеразглашенииИнформации.epf
Если что — всегда отвечу в личку.
Добрый день.
Подскажите, в обработке при замене параметров и их разделения используется неразрывный пробел. Можно как то сделать обычный пробел?
Если в Процедуре «ЗаполнитьПараметрМакета» где устанавливается «ПараметрМакета» заменить Символы.НПП на » » (пробел), то параметры все открываются слитно с соседними словами.
Неразрывный пробел не подходит, т.к. параметров может быть много и ворд распределяет текст не корректно.
(11) Привет, насколько помню, можно подредактировать и сделать более удобно.
Насколько помню, это связано с тем, что редактируя макет Word в Word’е он вставляет туда кучу лишнего мусора и без неразрывного пробела, в некоторых случаях, слова могут слипаться.
Я постараюсь сделать более удобно в дальнейшем, но не в ближайшее время, тк сильно загружен, да еще и пишу огромную статью про inline webhook telegram бота.
Исправил «исчезновение» пробелов рядом с переменными
Оно возникало от того, что пропадали пробелы в содержимом «w:r/w:t[@xml:space=’preserve’]» блоков.
Пример модуля обработки:
http://git.pfx.pw/snippets/1
Обратите внимание на область Работа_с_word
и в частности на добавленную функцию: ЗаполнитьПробелы()
и закоменченное добавление неразрывных пробелов в функции ЗаполнитьПараметрМакета()
(13) Привет. Можете пере выложить решение проблемы «исчезновение пробелов».
Заранее спасибо
(14)gist.github.com
Перевыложил.
На домашнем сервере, просто, перешел с gitlab на gitea)
Интересное решение.
Было бы неплохо, если бы вы выделили описание алгоритма работы формирования файла ворда жирным или отдельным пунктом.
А то пока все не прочитал, не понял, что вы тут сделали!
Структуру ворда сами разбирали?
А если нужен устаревший формат?
(16)
А то пока все не прочитал, не понял, что вы тут сделали!
К сожалению крайне не хватает времени на публикации.
Да и сейчас я все больше «готовлю» внешние печатные формы с помощью своего другого макета, все автоматизировано и конвеерно.
Может следующая статья будет про это + полуавтоматическое подключение и обновление печатных форм в куче конфигураций одним батником)
Структуру ворда сами разбирали?
А если нужен устаревший формат?
Да, сам, это просто xml, парсю его с помощью XPath выражений.
.doc — не xml, он в корне отличается, это бинарный формат. Сделать нативно средствами 1с тоже можно, но мне явно не до этого сейчас)
(17) ясно, тогда тоже стоит написать про это в ограничениях. Т.к. клиенты разные бывают, стоит устаревший ворд и новый ставить либо нет софта, либо админа.
(18)
Название статьи, внезапно:
А .docx появился в 2007 ворде, если не изменяет память.
2003 ворд — это уже прям раритет, вы в нем очень многое не сможете открыть)))
(19) название статьи конечно говорит, но чтобы не было лишних вопросов, как у меня допустим. Мало ли там просто букву убрать и заработает!
(20) Добавил дополнительно заметочку в статью)
(21) если бегло читать статью внимание падает не на особенности, а на ваше слово «RED». Читающему что и зачем — это просто мусор))
Думаю стоит над акцентами поработать. Но как минимум одним вопросом меньше!
(22) Здорово) Спасибо за фидбэк.
Возможно в будущем статьи будут правиться корпоративным редактором, ну или как минимум постараюсь выработать шаблон (пока еще в поиске себя).
Добрый день. Заинтересовала данная обработка, можете поделиться?
(24) plugfox@gmail.com
telegram: @plugfox