Раздел Б. Справка к ТТН




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

22 Comments

  1. sema1

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

    Reply
  2. Tippa

    (1) sema1, реализовать возможно, только в типовой 7.7 (не алкогольной и не доработанной) где брать данные о емкости? Если у вас в конфигурации где-то хранится емкость для каждой единицы номенклатуры, то число бутылок умножаем на объем, делим на 10 — вот и далы. Ничего сложного…

    Reply
  3. extremehelp

    А для 8.1 управление торговлей 10.3 будет, очень надо, заранее спасибо

    Reply
  4. Масянечка

    Спасибо, действительно в свете постоянных изменений в законодательстве очень нужная вещь. А по поводу далов — можно рассчитывать по формуле, согласна с:

    Tippa пишет:

    (1) sema1, реализовать возможно, только в типовой 7.7 (не алкогольной и не доработанной) где брать данные о емкости? Если у вас в конфигурации где-то хранится емкость для каждой единицы номенклатуры, то число бутылок умножаем на объем, делим на 10 — вот и далы. Ничего сложного…

    Reply
  5. gia2011

    В свое время для учета в далах пришлось ввести такое поле в справочник номенклатуры. Сейчас, при разработке Справки к ТТН, это пригодилось.

    Reply
  6. dequbu

    (3) extremehelp, вот для ут

    Reply
  7. Sanches36

    Хорошая обработка, как раз то, что искал. Правда для пива немного пришлось доработать.

    Reply
  8. Vsue

    Попробовал использовать обработку, но не получается вывести дал. Создал в справочнике номенклатура Дал, задал Дал в классификаторе единиц ОКЕИ, в единицах измерения задал коэффициент пересчета. Запускаю обработку выводит ноль. Конфигурация — измененная версия 7.7 (7.70.027) торговля и склад.

    Reply
  9. napala@

    У меня все проще было: реквизит в справочнике, число, длина 5, точность 3. Давно это было уже, сильно с единицами, помню, заморачиваться не стали.

    Reply
  10. Vsue

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

    Reply
  11. napala@

    Ставили как раз коэффициент дала, т.е., к примеру, 1 бутылка=0,05 дал. Форма умножает кол-во бутылок в документе на коэфф. дал. P.S. дал-это простой реквизит, а не подчиненный справочник единиц.

    Reply
  12. n0ne

    В чем проблема как уже описали выше, простой формулой переводить в далы. 10 литров = 1 дал.

    Вот вопрос возник, а можно ли в поле 6 указывать несколько наименований товара?

    Видел такое просто в одной фирме.

    Reply
  13. gia2011

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

    Reply
  14. evg09

    Подскажите, почему появляется такая ошибка?

    ПоставщикКтоВыдал = Докум.Фирма.Лицензия.ВыдавшийОрган.ЮрФизЛицо.ПолнНаименование;///////////////////

    {Обработка.РазделБ.Форма.Модуль(45)}: Поле агрегатного объекта не обнаружено {ПолнНаименование}

    Хотя все нужные изменения внесены

    Reply
  15. napala@

    Все правильно, а теперь добавить реквизит «лицензия» (справочник.лицензии) в Контрагентов и Фирмы.

    Reply
  16. anc2002

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

    Reply
  17. pinta

    (7) Sanches36, А не скинешь для пива доработанную на мыло 8458484@mail.ru

    Заранее благодарен

    Reply
  18. Barmaglot111

    Прошу немного разжевать изменения в конфигурации, что конкретно надо сделать (я не программист 1С, а справка очень нужна), подключил ее как внешнюю печатную форму, в раздел реализация (купля-продажа), при нажатии появляется пустой лист…. ( 1С 7.7, Тис 9.2 ). У меня основные продажи — пиво, нужны ли какие изменения?

    если можно — на мыло exodus99@mail.ru

    Reply
  19. Damir_202

    (15) Подскажите пожалуйста а как добавить реквизит лицензия в !С, я просто не сильно силён в этом, но очень надо. Заранее благодарю.

    Reply
  20. Damir_202

    (14) evg09, Добрый день. Подскажите пожалуйста как вы решили эту проблему, у меня такая же ситуация. Заранее спасибо.

    Reply
  21. evg09

    (20) Damir_202, Добавлял новый справочник лицензии, потом в справочник Фирмы добавлял реквизит «лицензии». Переделал эту обработку и добавил еще Раздел А, только в моих обработках все позиции из документа печатаются в одной справке, а не отдельная справка для каждой позиции (как в этой обработке), хотя насколько это соответствует постановлению — не знаю. Если нужно могу выложить

    Reply
  22. stello4ka

    (7) Sanches36, Поделитесь и со мной пожалуйста. электронка: stellakg@mail.ru

    Reply

Leave a Comment

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