Автоматическое формирование счетов-фактур на аванс.




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

20 Comments

  1. Skylark

    Круто, только разместил — уже два скачивания!

    Добавьте, кто-нибудь и комментарий что ли.

    Я впервые выкладываю в сеть свою «нетленку».

    Reply
  2. support

    Поздравляю!

    Reply
  3. Звездочет

    Очень плохо, криво и непрофессионально!

    Зачем тащить громоздкий код формирования карточки счета? Неужели нельзя заполнить таблицу простейшим запросом по бухитогам? А карточку счета можно при желании открыть и сформировать командой ОткрытьФорму() с передачей нужных параметров.

    Если уж сформировали таблицу, почему бы не добавить туда выбор ставки НДС или подбор счета на предоплату. Кто сказал, что авансы поступают исключительно по основной ставке налога?

    Ничего не предусмотрено для проверки наличия ранее созданных счетов-фактур, предотвращения создания дублей и перезаполнения существующих счетов-фактур.

    Необоснованно включаются в обработку валютные авансы. С 01.01.06 получение авансов по экспорту НДС не облагается и счф по таким операциям не составляются.

    А про напильник- вообще смешно.

    Reply
  4. Skylark

    Спасибо за конструктивную критику.

    В свое оправдание хочу сказать следующее: моего кода в обработке немного, она сделана очень быстро под совершенно конкретные собственные нужды, скомпилирована из «кусков» типовой бухгалтерии.

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

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

    Если кто-нибудь напишет, что такая обработка актуальна, то я обязуюсь привести ее в надлежащий вид.

    Reply
  5. Плюшкин_

    Пока не скачивал.Но,судя по описанию,в этой обработке не предусмотрено формирование записи по восстановлению НДС с аванса ?

    Reply
  6. wolfsoft

    Господа, экономьте трафик других людей! «Жмите» в zip-архив! 🙂

    Reply
  7. das

    5) «… Если кто-нибудь напишет, что такая обработка актуальна, то я обязуюсь привести ее в надлежащий вид… »

    тема авансов — актуальна, так что ждем продолжения.

    Reply
  8. margosha80

    Мне, как пользователю понравилось, но есть недочеты. Я говорю как опытный пользователь и как главный бухгалтер. Вопрос Авансов актуален.

    1) не проставляется вид операции: Аванс

    2) дата может быть и датой поступления аванса (как у меня)

    3) можно внедрить и печать сразу же

    4) более расширенную возможность нумерации (у меня, например, что бы не сбивать нумерацию введен АВ000159)

    И, кстати, есть обработки для бухгалтерии по печати документов по поступлению и реализации (я имею введу торг-12 и с/ф), но не нашла ни одной обработки комплексной печати на аванс. Промах Ваш товариши программисты!!!!

    Reply
  9. Skylark

    Спасибо за интерес к разработке! Сиуация сейчас такова, что я не имею больше времени заниматься 1С «просто так». Может недельки через три, когда пойду в небольшой отпуск, посижу немного — сделаю чего-ниубдь. В общем «следите за рекламой» на сайте http://infostart.ru/projects/829/ !

    🙂

    Reply
  10. brinka

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

    Обработка очень нужна и актуальна

    Reply
  11. Skylark

    Простите, друзья! Работаю полный рабочий день — все часы расписаны; а вечером программирую аутсорс еще часа по два-три ежедневно. На авансы нету времени совсем. Хотя очень хочется сделать что нибудь красивое и полезное на эту актуальную тему, с учетмо всех замечаний и «последних» тенденций.

    Может быть в выходные? Не знаю …

    Reply
  12. elen_l

    Очень нужна Ваша помощь в доработке (за отдельную плату естественно), если есть возможность откликнитесь на post_l@bk.ru

    Reply
  13. mv7890

    мне потребоволась такая обработка. Нашел эту страницу. Во многом согласен с

    «Звездочет». Сейчас «причесываю» обработку и исправляю ошибки.

    Также сделаю возможным формирования СФ на аванс по результатам сальдо на конец периода. Обращайтесь: n7890@nm.ru

    Reply
  14. pj

    Много не учтеных факторов, суммы берет из документа а не из счетов бух учета, посмотри http://infostart.ru/projects/4292, там часть твоего кода(создание фактур), но учет идет от бух счетов.

    Reply
  15. Skylark

    Опупеть, какая долгая жизнь у этой простенькой обработки!

    Как молод я был … какой наивный код писал…

    🙂

    Больше тысячи скачиваний. Видать тема действительно актуальная. Посетило даже минтуное желание сделать ее с нуля и «как надо», чтобы закрыть все вопросы.

    Но мне по-прежнему не до этого 🙁

    Reply
  16. анфиска

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

    Reply
  17. анфиска

    А печать сразу же внедрить было бы не плохо да и на тему нумерации правильное замечание.

    Reply
  18. elekona

    Обработка работает, сохранила мне кучу времени. Спасибо.

    Reply
  19. Бух-проф

    А у меня что-то не работает, помогите кто-нибудь!!!!!!!!!!!!!!

    СЧЕТАФАКТУРЫНААВАНС.ERT(1217)}: Номер не уникальный!

    Reply
  20. LPas

    Спасибо, допилил и использую

    Reply

Leave a Comment

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