Ошибки партионного учета (для Украины)




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

21 Comments

  1. Romarius

    В таком случае лучше прописать контроль партий при копировании

    Reply ↓
  2. dobraleks

    (1) над этим уже задумался, вот решил год закрою и сделаю условие такое.. 🙂

    Reply ↓
  3. stagov

    «…Кому помогло не поскупитесь поблагодарить «+ «….»

    а кому это может помочь???

    в смысле — этот список ошибок.

    Reply ↓
  4. stagov

    а таблицу значений создать ???

    загнать туда доки с багами, с возможностью открыть и т.д….

    Reply ↓
  5. dobraleks

    (3) если вам не подходит, это не значит что другим не нужно..

    на каждый товар найдется свой покупатель…

    Reply ↓
  6. stagov

    ага навоз то же селяне покупают поля удобрять… это к тому, что «на каждый товар найдется свой покупатель…»

    мне больше нравится девиз «сделай как я, сделай лучше меня…»

    Reply ↓
  7. dobraleks

    (6) «Сделай как я» -это так ….

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

    Я правильно понял Вас??

    Reply ↓
  8. stagov

    1.Бух.учет для Украины от захода не позволяет делать подобные вещи «копировать строки в документах, но забывают перещелкивать партии. Вот и получается что на елементе может висеть 2 ,а то и 3 «партии по умолчанию», или партия принадлежит другому елементу справочника»

    2.Если это все таки возможно…

    Пример. предприятие с оборотом 300 доков в день. штат операторов-менеджеров набивающих доки.

    КАК вашим отчетом можно это исправить???

    Вы представляете сколько на это нужно времени??? При вышеуказанном объеме.

    см. п.4

    Reply ↓
  9. dobraleks

    (8) че вы мне будете расказывать что «невозможно», возмите последний релиз бухни для Украины (на данный момент если вы в курсе 277) и смодулируйте ситуацию!! например на доке операция №5…

    Если вы не знаете, то это уже другой вопрос..

    У меня бухи (их больше 18), хитрые и «умные», они еще и не такое умудряются сотворить..

    Данный отчет реализован пока именно как «ошибки партионного учета» , а если позволит свободное время далее в планах реализовать именно ИСПРАВЛЕНИЕ АВТОМАТОМ..

    P/S/ Вы хоть пробовали у себя запускать??

    на ваш 2 пункт, хороший совет дал (1), себе с нового года буду реализовывать чтоб не было подобных ситуаций..

    Reply ↓
  10. v.l.

    Всем: Ну и чего ругать? Это же не очередной перенумератор.

    Reply ↓
  11. stagov

    я даже в курсе, что Выпущен релиз 7.70.015 конфигурации » Торговля+Склад для Украины». и релиз 7.70.031 конфигурации «Бухгалтерия + Торговля + Склад + Зарплата + Кадры для Украины».

    Отчет запускал и в ООО «Добро» и еще в 20 базах — никакого результата.

    а что такое «…например на доке операция №5… »

    пытался нагло допустить подобную ошибку — не дает данная процедура накосячить

    Процедура ИзмТМЦ()

    Если ТМЦ.Выбран()=1 Тогда

    глУстановкаБазЕд(Контекст,ТМЦ);

    // если партия этого ТМЦ уже есть, не будем ее трогать

    Если Партия.Выбран() = 1 Тогда

    Если Партия.Владелец <> ТМЦ Тогда

    глПолучитьПартиюПоУмолчанию(Партия,ТМЦ);

    КонецЕсли;

    Иначе

    глПолучитьПартиюПоУмолчанию(Партия,ТМЦ);

    КонецЕсли;

    УстЦенаБезНДС();

    ИзмЦенаБезНДС();

    КонецЕсли;

    КонецПроцедуры

    или

    Обнаружены одинаковые ТМЦ (партии) в строках 1 и 2

    Reply ↓
  12. stagov

    еще пока ни кто и не ругал.

    Reply ↓
  13. dobraleks

    (11) пример допускания наглой ошибки!.

    только что взял 277 демку и тупо допустил ошибку следующим образом.

    1. Запустил отчет понятно что ошибок нету.

    (рис1.) (рисунки смотри выше 3,4 и 5 миниатюры).

    2. Док операция №5. Добавляю стоку Дт 201 Главный магазин- Авансовый платеж — партия по умолчанию (партия принадлежит авансовому платежу).

    3. Добавляю еще одну проводку по Кт 201, Главный магазин-Авансовый платеж-партия по умолчанию. (партия принадлежит Авансовому платежу), !!!! Потом меняю авансовый платеж на «АРЕНДУ»»» партию не перещелкиваю. (рис2)

    4. Запускаю отчет, внизу сообщает что партия по Умолчанию в аренде принадлежит Авансовому отчету!!

    (рис3.)

    Показал чтоб было видно Дт и Кт, также само происходит когда копируют строки например по Дт201, Тмц-поменяли, а партию забывают перещелкнуть, вот и получаются такие ошибки.

    Reply ↓
  14. stagov

    «Очень часто бухи любят копировать строки в документах,….»

    копировать строки в документах и проводку в Операции это принципиально разные вещи по ходу

    По терминам в документе операция копируется не строка а проводка.

    Reply ↓
  15. dobraleks

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

    Вывод один. Проблема такая бывает, решать ее как то надо, а кто как копирует это уже второстепенное.. 🙂

    Reply ↓
  16. stagov

    Я улучшил Вашу обработку и если Вы не против (т.к. интерфейс и часть кода Вашего создания) — могу выложить.!?

    Reply ↓
  17. dobraleks

    да без проблем! одна голова хорошо а 2 лучше..

    За идею хотя б поблагодарили.. 😉

    Reply ↓
  18. stagov

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

    Reply ↓
  19. dobraleks

    а я вам скажу как практикующий програмер и бух в одном лице..

    вопрос не в том хорошие спецы или нет, а в человеческом факторе..

    Reply ↓
  20. stagov

    Я еще более апгрейдил Ваш отчет.

    Если есть возможность — проверьте функциональность кнопки «Выполнить»

    http://infostart.ru/public/64439/?PAGEN_1=1#comm345021

    Reply ↓
  21. tmm

    Как бы ещё научиться в нём работать.

    Reply ↓

Leave a Comment

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