Просмотр реквизитов (8.1) v1.2




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

32 Comments

  1. cs25

    Сам много с «Аспектом» работал — понимаю тебя. Поэтому ПЛЮС !!! Ещё выложи обработину или алгоритм переноса из «Аспекта» в «УТ», если считаешь нужным конечно …

    Reply
  2. Buxxter

    (1) Дело в том, что там не чистый «Аспект». В течение 7 лет его дорабатывали, в итоге там появились партии, ГТД, некое подобие «холдингов» 1С-овских, переработан механизм иерархии номенклатуры, валютный учет изменен и т.п. Поэтому обработка будет малополезна. А вот про алгоритм могу рассказать… возможно, кого-то наведет на светлые мысли в аналогичных задачах (если кому-то покажется интересным — оформлю отдельной статьей):

    Итак, после недельного ковыряния в DBF-ках Аспекта (параллельно со сдачей диплома) и попыткой сопоставить реальность данных с документацией на БД (а в «Аспекте», надо заметить, изначально очень хорошее описание БД, только вот доработчики моей базы поленились) в голову пришла светлая мысль — ведь есть чудесная софтина от мелкомягких, называется Access!!! Это чудо предоставляет достаточно широкие возможности по импорту/экспорту. В ней можно создать таблицы, источниками данных которых будут мои DBF’ки. Так я и сделал… в итоге получил набор таблиц в БД Access, ну а дальше дело техники. В Access нарисовал схему данных, указал типы связей. Все стало вставать на свои места. Посмотрел на выполненную схему данных, вроде стало понятно, каким образом рассчитываются партии по гтд, по какому признаку объединяются контрагенты и т.п.

    Все в том же Access с помощью конструктора запросов (а он там достаточно удобный, согласитесь) получил нужные мне выборки в удобной форме и без необходимости еще как-то объединять таблицы.

    Дальше кому как удобней — можно импорт напрямую из Access, можно экспортом результатов запросов в *.xls(x), *.dbf и т.п.

    Я использовал экспорт запросов в DBF, т.к. до Access начиналось все именно с этого, и обработка по импорту уже была готова.

    К слову, для импорта из DBF в 1С использовалась компонента GameWithFire.

    Вот такой вот универсальный метод переноса данных получился.

    Позже работники фирмы, для которой делал перенос, использовали мою БД Access для поиска косяков в ведении учета (коих нашлось не мало, а в Аспекте их вообще нереально было найти).

    Метод хорош тем, что для компоновки данных особых знаний не требуется — интерфейс Access интуитивно понятен, данные всегда актуальны (т.к. используется связь таблиц с файлами для импорта) , можно обойтись без написания кода в vba и не париться с компоновкой данных запросами (честно говоря, после моего перехода на 8.1 у меня уже сложности с написанием SQL запросов «от руки», в которых нужно объединить более 3х таблиц, а в Access конструктором запроса я без труда скомпоновал данные из 9 таблиц в одном запросе).

    Reply
  3. Buxxter

    Фигасе камент получился….

    Reply
  4. cs25

    Сам вот делал загрузку из dbf-файлов сразу в 1С-ку. В основном конечно это касалось Справочников …

    Reply
  5. WiseSnake

    Обработка хорошая!

    Только уберите, пожалуйста, фразу «, ставьте плюсы, если понравилось.». За Вас уже все написали. Сразу перед оценкой сообщества. А администрация рассматривает такие фразы как выклянчивание плюсов и не одобряет!

    Reply
  6. larisab

    Оригинальная идея!

    Reply
  7. Buxxter

    (6) ты про обработку или про импорт?

    Reply
  8. Buxxter

    (5) прошу прощения, в первый раз выкладываю что-то )

    Reply
  9. larisab

    (7) Про обработку.

    Reply
  10. detec

    Полезная вещь, спасибо!

    Reply
  11. aves

    Сам сейчас пишу правила из 77 в 8.

    Действительно надо смотреть внутрь объектов, чтобы понять «как там внутри». Тут и писать ничего не надо. Консоль запросов и все. «Выбрать * Из ХХХ».

    Так что из полезного — код. Если надо.

    Reply
  12. Buxxter

    (11) Это упрек? Если так, то, насколько я знаю, в Вашем варианте без временных таблиц не обойтись, а если еще и табличные части…

    А Вы попробовали обработку в действии? Может быть Вы концепт не уловили?

    З.Ы. Если неправильно понял, то прошу прощения.

    Reply
  13. aves

    (12) Нет.

    Не понял насчет временных таблиц. Зачем? Консолью смотрю любые реквизиты шапки или любые ТЧ доков и спр. Смотри сколько влезет. Понятно, что в одним запросом не увидеть и реквизитов шапки и все ТЧ — сделай несколько запросов (1+КоличествоТЧ)

    Вот в 7.7 такого универсального механизма нет.

    Ну а формирование кода — плюс, если надо.

    Reply
  14. acsent

    Из обработки менять реквизиты можно?

    Reply
  15. oskar

    класная , удобная вешь

    Reply
  16. Buxxter

    (14) Сори за задержку. А встречный вопрос: надо ли? Если исходить из цели — нет. Ведь изменение реквизитов, скажем, в документе вызовет необходимость его проведения… ну и т.д.

    Reply
  17. Buxxter

    (15) плюсы ставить не забываем 😉

    Reply
  18. aves

    При формировании кода не хватает заполнения реквизитов значениями. Если реквизиты НЕ справочникидокументы, то их при формировании можно было бы и присвоить.

    Reply
  19. Buxxter

    (18) Не совсем понял. Т. е. формировать код для создания текущего одъекта? Если приведешь пример, когда этого нехватает — сделаю и обновлю. И спасибо скажу ;).

    Reply
  20. aves

    Пример:

    Надо мне сделать новый док РеализацияТиУ. Беру готовый. формирую код. Тут ОК.

    Потом руками пишу напротив отражать в учете истину, по перечислениям — тупо смотрю в обработку на вид и значение и пишу руками (Объект.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия).

    Если бы такие значения были уже присвоены согласно образцу — было бы быстрее.

    А то работаю негром

    Reply
  21. Buxxter

    (20) ОК. На выходных сделаю. Спасибо.

    Reply
  22. Buxxter

    Обновил. Прошу прощения за задержку.

    Reply
  23. Збянтэжаны Саўка

    Еще, по-моему, надо бы добавить в «Тип значения» для числовых и строковых реквизитов и их длину.

    Reply
  24. Buxxter

    (23) Надо бы, тока я не знаю как 🙁

    Reply
  25. aves

    (21) ЗНАЧИТЕЛЬНО лучше. Однако:

    1. Значения типа план счетов теряются при переносе в код. В доке есть, в таблице показывается, в коде пусто, только тип.

    2. Перечисления в контексте данной задачи лучше считать не ссылочным, а заполнять сразу как и примитивные типы (числострокадата). То же вероятно относится и к плану счетов.

    3. Может заполнять ТЧ по образцу первой строки? Не настаиваю.

    4. Длина: Рекв.Тип.КвалификаторыЧисла.Разрядность и РазрядностьДробнойЧасти

    Reply
  26. Buxxter

    (25) 1. Догадывался, но не на чем было проверить 🙁

    2. Согласен, но не придумал (или не додумал… уже не помню), как их вытаскивать. Имя же нельзя для элемента получить, а синоним не всегда с ним совпадает. Подскажите, как засунуть?

    3. Она так и заполняется… проблема возникает, когда ТЧ пустая.

    4. Спасибо, на этих выходных обновлю еще разок.

    Reply
  27. Buxxter

    (25.4) А со строками как (чеб не мучаться)? В т. ч. неогр. длины?

    Reply
  28. aves

    (26)

    2. Не понял про перечисления. Они ж работают у тебя, тока заполняются вместе со справочниками. Пусть заполняются с числами и строками.

    3. Анализирую реализацию. Формирует код ТЧ товары, но значения не подставляет. ТЧ не пустая.

    4. Строки и т.п http://screencast.com/t/0VdrZ1vEgq

    Reply
  29. rutony

    (+ добавлено, — удалено, * испраВлено, #k8SjZc9Dxk переработано)

    =))

    Reply
  30. Buxxter

    Дошли руки наконец-то 😀

    Reply
  31. hemama

    Спасибо агромадное от обычного пользователя. несколько суток ручной работы съэкономила

    Reply
  32. hame1e00n

    Спасибо! Действительно очень нужная вещь!)))

    Reply

Leave a Comment

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