1С:Медицина. Поликлиника. Отчет по регистраторам




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?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='\

27 Comments

  1. Agregadus

    А как число талонов считаете?

    В регистре СменныеЗадания наоборот, на одну услугу несколько 5и минутных талонов идет, т.е. по таблице услуг должно быть меньше талонов.

    Reply
  2. Saifa

    Тот же вопрос! Что такое количество талонов?

    Reply
  3. itlab-05

    Талон = Заказ

    То есть количество талонов это количество документов Заказ

    Reply
  4. Agregadus

    Ещё странным кажется число регистраторов умеющих чеки пробивать.

    Как я понимаю вы по ответственному у документов определяете автора заказа и чека.

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

    У вас прям реально столько людей, работающих с деньгами?

    Reply
  5. Agregadus

    У нас такой отчет разделен на несколько:

    СтатистикаПоЧекам(примерно как в рознице)

    СтатистикаЗаказов

    СтатистикаНеОплаченныхЗаказов с причинами

    Статистика по аналогичным периодам прошлых лет.

    Кассиры смотрят чтоб продажи не падали, заведующая регистратуры мониторит заказы и отказы, когда всё плохо, смотрят «сезонность», вдруг это какой-то прогнозируемый спад.

    Reply
  6. itlab-05

    (4)

    Чеки пробивают кассиры . У чека основанием является Заказ , по нему и анализирую . Беру ответственных у документа Заказ и ответственных у основания документа Чек , в итоге в запросе через Объединить Все компоную отчёт .

    Reply
  7. itlab-05

    (5) а как кассиры у вас влияют на продажи ?

    Reply
  8. Agregadus

    (7) Когда продажи падают не планово, то старший кассир сигнализирует руководству. Далее оно уже начинает копаться, просит у зав регистратуры анализа почему такое произошло.

    Ситуации разные, например заказали 100 услуг, из них оплатили лишь 50, но зато сумма продаж та же или выросла, или заказали 100, выполнили 80, но сумма продаж меньше, хотя по статистике вроде как у регистраторов планы выполнены, но оказывается что дорогостоящие услуги просто не оплатили.

    Reply
  9. itlab-05

    (8)а у нас в практике замечено , что выписали человеку талон , а он увидев сумму разворачивается и уходит .

    Reply
  10. Saifa

    (4) У нас прям реально 13 регистраторов, по очереди работающих с деньгами.

    Reply
  11. Saifa

    (5) Может поделитесь на инфостарте?

    Reply
  12. itlab-05

    (10)в вашем случае отчёт тоже будет работать корректно

    Reply
  13. baracuda

    Кто нибудь юзает эту конфу? Такая замудренная, где ей можно обучиться?

    Reply
  14. itlab-05

    (13)Есть «Учебный курс 1С:Медицина.Поликлиника» ,поищите в интернете.

    Reply
  15. baracuda

    (14) спасибо, поищу

    Reply
  16. Saifa

    (13) Я юзаю. Обучиться можно только методом тыка, я наверное пачку листов переписки уже написала в техподдержку.

    Reply
  17. nakh72

    (16) Полностью с вами согласен, сами столкнулись с этой конфигурацией.

    Прошу прощения что не по теме, у кого то были проблемы с ККТ, вид оплаты не правильно вставал и чек аннулировался?

    Reply
  18. nakh72

    И еще раз не по теме, но может кто ни будт подскажет как работает документ Прикрепление пациентов?)))

    Reply
  19. Agregadus

    (18)

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

    Механизм такой, во внешней обработке описываете формат своего файла, механизм загрузки и создания пациента, буквально 2 метода, если есть какие-то нюансы, в этих методах правите. Далее в приложении добавляете эту обработку, создаете элемент в справочнике МенеджерыЗагрузкиДанных, указав вашу обработку и поля загрузки, если они отличаются от тех, что по умолчанию в вашей обработке. И всё, идете в документ загрузки.

    Reply
  20. Agregadus

    (11)

    Так как отчеты вшиты в конфу и используют новые метаданные, проблематично было сходу отчеты выложить.

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

    https://infostart.ru/public/936596/

    Как будет полноценный функционал расширений, на него переделаю 😉

    Reply
  21. nakh72

    (19)Спасибо больше за разъяснение))) мы уже свою написали внешнею из экселя загружать. Теперь мне стал понятен смысл загрузки для этого документа.

    Reply
  22. Agregadus

    (21) В больничной аптеке такая штука раньше была, сейчас не знаю уже =)

    Менеджер загрузки удобен тем, что код по обработке данных из экселя не надо писать, на выходе таблица получается нужная просто. Там два предопределенных режима: прикрепления и листки нетрудоспособности, ну и произвольные загрузки можно в нём же делать. Удобно когда механизм загрузки один, а поля в файле меняются в зависимости от страховой )

    Reply
  23. nakh72

    (22) огромное спасибо за пояснение) а то конфигурация очень «интересная», сколько еще намучились с фискальным регистратором….

    Reply
  24. Agregadus

    (23)

    Не за что ) по формату фискальных данных можно подглядывать в Рознице, у них быстрее актуализируют =)

    И пишите в поддержку, если что-то не ясно, там подскажут как исправить, ну нам, по крайней мере, не однократно помогали с проблемами

    Reply
  25. nakh72

    (24)Да так и пришлось поступить. А в поддержку пишите какому то из представителей?

    Reply
  26. Agregadus

    (25)

    напрямую пишу.

    Описание продукта

    раньше на форуме и почтой писал, сейчас на 1с коннект перешли =)

    Reply
  27. Saifa

    Коллеги, здравствуйте! Очень надеюсь на вашу помощь! В медицине поликлинике есть обработка «Просмотр занятости», в ней отображается порядка 40 медицинских рабочих мест.

    Так вот, если поставить в настройках период автообновления = 1 сек, то она начинает потихоньку отжирать память. В итоге все заканчивается полным подвисанием с вылетом в «недостаточно памяти». Разработчики молчат пока…

    Reply

Leave a Comment

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