Счет фактуры на аванс (формируются по состоянию счета 62)




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

20 Comments

  1. pj

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

    Reply
  2. Anatolka

    очень надо,

    впринципе просто проверять подчиненность выписаных сф, но доделай сам =)

    Reply
  3. pj

    Да в том то и дело, что мне не надо:), народ предупреждаю, чтобы дров не наломали. Ну хоть кто то что нибудь напишите, положительное или отрицательное ;), помогло если кому то, порадуйте автора, спасибом

    Reply
  4. Anatolka

    ну а зачем тогда писать что подправишь если тебе нах это не надо?

    Reply
  5. pj

    Каюсь, не так тебя понял, поправил, на проверку по вложенности и суммы, если фактура есть, и она отличается по сумме, то ставится сумма по счету.

    Reply
  6. pj

    Просьба по точней сообщать, что хотелось бы поправить, дабы не было недоразумений.

    Reply
  7. pj

    Добавлена функция переделки выписок(если в выписке фигурирует счет 62.1 то переделывается на 62.2, корректировка в обратную сторону проводится проведением последующей реализации или обработкой для формирования СчФ, если отгрузка была раньше выписки)

    Reply
  8. Craig

    У тя явно в моделу что то присутствует, чего нету в типовых: ошибка

    Если Константа.МетодопределенияВыручки.Получить(СчетФактура.ДатаДок) = глПоОтгрузке <<?>>Тогда

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(87)}: Переменная не определена (глПоОтгрузке)

    СчетФактура.СтавкаНДС = глЗначениеПоУмолчанию<<?>>(«ОсновнаяСтавкаНДС»);

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(123)}: Функция не обнаружена (глЗначениеПоУмолчанию)

    СчетФактура.НДС = Окр(ОплатаАванс*глЗначениеПоУмолчанию<<?>>(«ОсновнаяСтавкаНДС»).Ставка/(100+глЗначениеПоУмолчанию(«ОсновнаяСтавкаНДС»).Ставка) ,2,1);

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(124)}: Функция не обнаружена (глЗначениеПоУмолчанию)

    Reply
  9. pj

    обнови релиз бухии и будет тебе счастье:)

    Reply
  10. pj

    44 скачивания и почти никто ни чего не пишет, народ не поленитесь отпишитесь. у вех ли работает, что не устраивает, детище все таки, интересно.

    Reply
  11. Craig

    Вполне возмжно, база полгода не обновлялась)

    Reply
  12. buKIN

    А для БП 8.1 че-нить подобное есть? Очень нужно…

    Reply
  13. Dziden

    если не ошибаюсь, то после 12 релиза бухии, все уже работает

    Reply
  14. pj

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

    Reply
  15. Green733

    Спасибо

    Reply
  16. Craig

    Работает

    Reply
  17. pj

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

    Reply
  18. pj

    Кстати если кому нужно 60 счет приписать, могу дописать, пишите в личку или сюда

    Reply
  19. ola777

    Поставила вашу програмулину, но такая вещ правильно выставилось только по одному контрагенту. Во всех остальных случаях либо не считает оплату авансом, и сама ставит счет 62.1 а потом как бухнет через 2 квартала. В общем путается при определении аванс или нет. Все у себя проверила. не проще ли было выставлять на аванс когда весь 62 счет без учета субсчетов возникает выставлять на эту сумму счет фактуру на аванс. Мы бухи в большинстве своем стараемся все на одном договоре проводить, чтоб не париться, а у кого учет еще и по договорам у того свой прог что нибудь сочиняет и правит. Я все проверяю ни одна обработка правильно не выставляет ни у меня ни у знакомых.

    Reply
  20. Artemuch2

    У тя явно в моделу что то присутствует, чего нету в типовых: ошибка

    Если Константа.МетодопределенияВыручки.Получить(СчетФактура.ДатаДок) = глПоОтгрузке <<?>>Тогда

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(87)}: Переменная не определена (глПоОтгрузке)

    СчетФактура.СтавкаНДС = глЗначениеПоУмолчанию<<?>>(«ОсновнаяСтавкаНДС»);

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(123)}: Функция не обнаружена (глЗначениеПоУмолчанию)

    СчетФактура.НДС = Окр(ОплатаАванс*глЗначениеПоУмолчанию<<?>>(«ОсновнаяСтавкаНДС»).Ставка/(100+глЗначениеПоУмолчанию(«ОсновнаяСтавкаНДС»).Ставка) ,2,1);

    {\192.168.0.45ERT ФАЙЛЫAVANSY5DN.ERT(124)}: Функция не обнаружена (глЗначениеПоУмолчанию)

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

    Reply

Leave a Comment

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