Пример конфигурации "Аптека" (розница)




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

13 Comments

  1. akon

    Конфа запаролина. При загрузке предупреждение-«Не могу открыть файл МодулиГлобМодуль.txt». И подобное на большинство модулей документов, справочников и тд. И как что посмотреть?

    Reply
  2. Xanf_01

    Полностью согласен с (1). Из того что видно возникают сразу несколько комментариев:

    В справочнике товара на карточке присутствуют сразу все реквизиты товара (серии, цены и пр.) Исходя из специфики аптек это около 5000 карточек товара. Кроме того каждый приход будет создавать очевидно новую карточку. Итого при достаточно неплохом обороте аптеки за год справочник товаров разрастется до неимоверных размеров. Как это все будет шевелится? На мой взгляд проще иметь 2 справочника: Товары и подчиненный ему Партии. Кроме того не заметил на карточке товара поля со штрихкодом. Как тогда реализован механизм списания по штрихкоду? Короче много вопросов и нет очевидных ответов 🙁

    Reply
  3. Lexx32

    Извеняюсь, седня все выложу (забыл что у мя все модули внешние)… А по поводу карточек товара, сделано для полность автоматического прихода, поставщики дают эл. наклд. в них нет поля ШК, что и создает трудности… ШК формируется в базе склада а в данную конфу поступает уже с ШК.

    Reply
  4. Lexx32

    Выкладываю архив MD-шник + Модули (md-шник распаралировал, модули посадить в папку с базой).

    Reply
  5. algaid

    (4) А ГлобМодуль.txt ?

    Reply
  6. Lexx32

    ВНИМАНИЕ ВСЕМ! нормальное исправление в 4- коментарии выложено! Прямая ссылка

    http://infostart.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=94758

    Reply
  7. Lexx32

    15.09.10 8:25 Изменил основной файл : Apt.zip нормальная незапороленная конфа…

    Reply
  8. Tarlich

    мне кажется что и обувь и продукты можно этой конфой продавать

    Объясняю почему минус :

    1) конечно же главное в аптеке это учет по сериям и срокам годности — что будет с твоей базой если она поработает год ? (хранить такие вещи в справочнике ну ни как не вариант)

    2) то что база набросана на скоряк ….

    Самое большое время уходит на ПоступлениеТМЦ — однозначно требуется загрузка электронных накладных

    3) Что с торговым оборудованием СканерФискальник

    Да — в аптеке возврат от Ф/Л запрешены -))

    посмешил ГЛМодуль при началеРаботыСистемы

    Предупреждение(«Элла Владмировна незабудьте включить сканер. Меню-Сервис-Параметры-Вкладка Сканер Штрих-Кода-Поставить галочку: Включен и нажать ЭНТЕР !!!»);

    Справочник СписокЖВ Руками забивают? ООО так он даже ни как не связан с твоим справочником товаров .

    Пойми Автор правильно — БРАКУЮ!

    Reply
  9. Tarlich

    В Аптеке еще на мало важно учет в отпускных ценах

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

    Можно уточнить — конфигурация делалась для аптеки или для аптечного киоска?

    Reply
  10. Lexx32

    (8-9)Данная конфа пригодна для розничной отдаленной точки — (обработка загрузки накладных об этом говорит), возможности работы с фискальником я не делал т.к. это готовая конфа без наваротов-а унас — у муниципального предприятия нет возможности иметь еще и фискальники… Для загрузки накладных — а это делается на складе, есть загрузка электронных накладных, это примерно 2-2,5 минуты делов вместе с автонаценкой. В данной конфе реализовано только торговля, данные поступают из конфигурации Фармация-Склад, возврат они делать не имеют права, меня интересовало мнение о правильности расхода.

    Reply
  11. firuzji

    Мне понравилось, для небольшой розничной торговли самый раз.

    Reply
  12. ivlev2005

    а какой пароль на вход через администратора?

    Reply
  13. DUSIK

    А штрих кодирование не было прикручено?

    Reply

Leave a Comment

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