КОНЦЕПТУАЛЬНОЕ РЕШЕНИЕ: Помощник ввода приходных накладных и прочих документов




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

30 Comments

  1. Mazaloff

    хорошая идея, молодец!

    Reply
  2. Valerich

    плюсую за идею

    Reply
  3. tango

    Шаг 4: во втором случае если не было предыдущих пром.итогов, то от начала

    Reply
  4. AVARY

    (3) Спасибо, поправил.

    Небольшое дополнение:

    Название «Помощник ввода приходных накладных» выбрано для того, чтобы привлечь внимание простых пользователей 1С:Предприятие. Однако, следует понимать, что обработка может быть подключена к любой табличной части в рамках использования механизма внешних обработок заполнения табличных частей.

    Например, можно подключиться к табличной части «Товары» документа «Реализация товаров и услуг» если нужно определить итоговое количество по нескольким позициям или сумму по характеристикам определнного товара. Можно помочь покупателю оставить товары на определенную сумму, объем, вес. Вариантов море!

    Если Вы нашли какое-либо оригинальное применение обработке — сообщите об этом в комментариях!

    Reply
  5. Bux2

    БП 1.6, простой пользователь.

    Скажите, пожалуйста, к документу «Отчёт производства за смену» табличная часть «Материалы» также можно подключить ?

    Идея интересная!

    Reply
  6. AVARY

    (5) Конечно можно!

    Протестировал на УПП, скриншот в файле.

    Reply
  7. AVARY

    Обнаружен небольшой баг при инициализации обработки, просьба скачать новую версию 1.01.

    Reply
  8. Bux2

    В сильно переделанной УПП в «Отчёте производства за смену» таб. часть «Материалы» подключилась, но выдаёт ошибку:

    «Заполнение ТЧ не произведено! Поле объекта не обнаружено (Товары)»

    В БП не подключается. Попробую новую версию.

    Reply
  9. Bux2

    Результат по обновлённой версии.

    «Отчёт производства за смену» таб. часть «Материалы»:

    -В УПП работает. Классно.

    -В БП не подключается. Зато к таб. части «Продукция» подключилась.

    Reply
  10. AVARY

    (9) А в БП при подключении ошибку выдает? Может путаница с версиями?

    Если к табличной части «Продукция» подключилась, то в форме регистрации внешней обработки достаточно добавить вторую строку принадлежности, где указать тот же объект и табличную часть «Материалы»

    Reply
  11. Ish_2

    Скачать и посмотреть, к сожалению , не имею возможности.

    Ориентируюсь По скриншоту. Никак не ожидал такого простого варианта использования строки — «заголовка». Спасибо.

    А может быть добавить вариант с деревом значений ?

    Тогда бы пользователь получил возможность сворачивать и разворачивать нужные строки. Добавить возможность перетаскивания строк из одной ветки дерева в другую. В дереве проще реализовать и автоматический расчет итогов по ветке .

    Reply
  12. AVARY

    (11) Креатив прет! 🙂 Возьму на заметку.

    Reply
  13. den_vladimir

    полезно! хорошая работа!

    Reply
  14. Bux2

    (10) Путаницы с версиями нет.

    Проверила в ДЕМО (1.6.14.4) – не работает.

    В форме регистрации внешней обработки добавила вторую строку с ТЧ «Материалы».

    Всё правильно.

    В БП (1.6.20.6) при подключении ошибку не выдаёт. Смотрите:

    — в ТЧ «Продукция» по кнопке «Заполнить» предлагается стандартное «Установить значение» и «Промежуточные итоги табличных частей».

    — в ТЧ «Материалы» по кнопке «Заполнить» стандартное «Табличное поле «Материалы» будет очищено. Продолжить?»

    Интересно, что в ТЧ «Услуги» и «Возвратные отходы» при отсутствии данных есть возможность вывода «Промежуточные итоги табличных частей».

    Reply
  15. AVARY

    (14) К сожалению нет возможности проверить работу в БП. Из комментария и скриншотов делаю вывод, что для табличной части «Материалы» не реализован механизм внешних обработок заполнения ТЧ — нужна доработка конфигурации. Могу взяться.

    Reply
  16. Bux2

    (12) Не бросайте доработку, Сергей.

    Сворачивать и разворачивать нужные строки (11) — класс!

    Проверить страницу приходной накладной — свернуть.

    И не «ползать» по всему полю.

    Reply
  17. AVARY

    (16) посмотрю насколько востребованной будет обработка на следующей неделе и решу с доработками. Просто на подходе другое «концептуальное решение» 🙂

    Reply
  18. I_G_O_R

    обработку не смотрел, но идея хорошая, зачёт 😉

    Reply
  19. spbpavlov

    смысл обработки если можно просто вывести список и по кнопке М и М+ смотреть все итоги?

    Reply
  20. AVARY

    (19) да вариантов подсчетов итогов масса… Можно и одноэску не ставить, все данные держать в амбарной книге и тыкать на калькуляторе М и М+.

    Цель не просто посчитать итоги. Цель — отображать их пользователю постоянно, динамически перерасчитывать при изменении данных в табличной части. Ну и сравни дружелюбность подхода своего и предоставленного при наборе документа, скажем в 1000 строк: в обработке нашел нужную строку, нажал Ctrl+Space, посмотрел… сходится? пошел к следующей строке. Удобно? Или лучше 1000 раз нажать кнопку М+, 1000 раз спозиционироваться на очередной ячейке (а если данные сверяем по двум колонкам, то 2000(!) раз на каждую из кнопок), ну и никто не даст горантии, что при подсчете итогов ты не пропустишь каку-нибудь строку…

    Тогда уж проще вывести список, сохранить в Excel’е и там подвести итоги.

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

    Reply
  21. spbpavlov

    1000 раз нажимать не нужно, если в списке выделить значения в колонке с 1й строки по N (типа первая страница) нужно нажать один раз M и все значения сложатся в буфер, дальше М+ для каждой последующей страницы

    тоже самое что и ctrl+space

    цель сверить с пф, так вроде для этого постоянно отображать итоги не нужно.

    Reply
  22. AVARY

    1. Для множественного выделения строк в типовых конфигурациях требуется их изменение;

    2. При изменении данных требуется пересчет итогов;

    3. Воспользуемся обработкой в документе «Реализация товаров и услуг»: к нам пришел клиент и набрал товаров по четырем группам номенклатуры. При оплате выясняется, что у него не хватает денег и он просит изменить документ, чтобы по первой группе было не более такой-то сумы, по второй — лругая сумма и т.д. Если использовать обработку — задача решается очень просто, повышается оперативность. Повышается оперативность — повышается конкурентоспособность 🙂

    К плюсам твоего подхода могу отнести:

    1. Использование встроенных возможностей;

    2. Тренируется память 🙂

    Reply
  23. spbpavlov

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

    2. подразумевается что ввел и сверил один раз. второй раз только при наличии ошибки

    3. надуманная ситуация

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

    Reply
  24. CheBurator

    в конторе, где накладные больших размеров вбиваются вручную, особенно радует это в УПП — упоминалось выше — надо кого-то сменить — или дирижера или режиссера… хотя, конечно, на общий конечный результат это практически никак не повлияет… закон такой практически выведенный — результат работы не меняется от количества вложенных вусилий…

    Reply
  25. AVARY
  26. manan

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

    Reply
  27. st_info

    идея хорошая, плюсую

    Reply
  28. dance_dance

    (20) Сергей, а для 7.7 такой подарок сделать можно? Очень нужная вещь! Или этот столик (7.7) уже не обслуживается?

    Reply
  29. AVARY

    По 7.7 работаю, но от OpenConf’а два года как отошел и вспоминать не очень охото 🙂

    Могу перевести Вас на восьмерку, думаю это проще.

    Reply
  30. nbm

    Здорово!. «+».

    Reply

Leave a Comment

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