Свертка 1С:Розница 2.1




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

29 Comments

  1. DoctorRoza

    Хм, вопрос к автору, при какой массе бд свертка действительно актуальна?

    Reply
  2. skomar-off

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

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

    Reply
  3. Temniy

    Документы поступления не удалились. Чеки не удаляются.

    Я ожидал что создадутся документы «Ввод начальных остатков» — их нет

    Reply
  4. skomar-off

    либо что то сделали не так, либо надо разбираться.

    Reply
  5. Big Serg

    (4)

    Подскажите, решили ли проблему, на которую жаловался (3) Temniy? Нужна свертка, а просто так (в случае нерабочей обработки) тратить 3SM нехочется

    Еще скажите, на каком релизе тестировалось и поддерживаются свежие релизы?

    Reply
  6. skomar-off

    эта проблема могла возникнуть, если не указывали дату свертки. Проблему не решал, если дадите свой адрес могу так выслать, не жалко) хоть попробуете. Заодним поразвлекаетесь.

    Reply
  7. Div35

    (6) день добрый, а можно тоже пощупать обработку?

    Reply
  8. vk29

    Попробовал обработку на конфигурации 2.1.8.13.

    В текущем исполнении обработка не работоспособна.

    Доделал свертку регистра сведений «Действующие цены номенклатуры» и изменил немного процедуру ПометкаДокументовНаУдаление(). Не работала отмена проведения документа «Пересчет товаров». После этого база свернулась.

    Reply
  9. PLadmin

    Здравствуйте! А на казахстанской рознице обработка будет работать?

    Reply
  10. skomar-off

    не проверял

    Reply
  11. PLadmin

    (10) попробовать как-то можно?

    Reply
  12. dj_tol

    В рознице есть стандартная обработка Свертки базы. Прилично работает.

    Reply
  13. Ioryk

    К сожалению, стандартная свертка работает не прилично.

    Reply
  14. EvgenAEY

    (12) ДЛя 2.1 не нашел в конфигурации, стандартная обработка отдельно от конфигурации?

    Reply
  15. Anubis23

    (8)

    Подскажите, как вы победили документ «Пересчет товаров»?

    Reply
  16. PLadmin

    (15) Не стал ничего побеждать. Сделал перенос базы.

    Reply
  17. skomar-off

    (8)отлично то как

    Reply
  18. T_SON

    На Рознице 2.1.9.20 работает? Можно как то протестировать?

    Reply
  19. dj_tol

    (14)Я делал давно через РИБ на магазин, потом сделал его центральным узлом.

    Reply
  20. user808647

    Добрый день. Подскажите на рознице 2.2 работает?

    Reply
  21. user808647

    (8) Владимир, можете поделится обработкой со своими доработками?

    Reply
  22. vk29

    (21) Там где комментарий //Канатаев —

    Reply
  23. user808647

    (22) Спасибо

    Reply
  24. 1cworks@mail.ru

    Скачал. запустил получил это:

    ВнешняяОбработка.СверткаРозницы21.Форма.Форма.Форма(246)}: Ошибка при вызове метода контекста (Записать)

    Корректировка.Записать();

    по причине:

    Запись не верна! Значение поля «Номенклатура» не может быть пустым! (Регистр накопления: Закупки товаров; Номер строки: 60

    БАза розница для казахтсана. По идее розница с россиской сделано.

    Не сработало.

    Жать что потратил 3 sm

    Reply
  25. skomar-off

    (20)здравствуйте. не могу сказать, не занимаюсь больше этим

    Reply
  26. skomar-off

    (24)надо смотреть почему пустая номенклатура приходит

    Reply
  27. skomar-off

    (18)по идее писалась для 2.1, подрелиз к сожалению не помню, если есть какие то изменения, то они не значительны

    Reply
  28. bvk

    (24) Такая же ошибка и с Российской розницей.

    Reply
  29. ArCtic

    для розницы с ЕГАИС подходит?

    Reply

Leave a Comment

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