Печатная форма платежного извещения ПД-4




Принцип обмена данными из 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. O-Planet

    Вообще, все «строго не судите», которые на ИС стали популярны не так давно, кажутся мне «неканоническими отступлениями» на фоне чьего-то постоянного меряния чем-то. За что судить-то? За то, что выложил нужную многим вещь? Да. если простой отчет, то написать может каждый второй. Но вторая половина предпочитает скачать и плюсануть. Потому и пишем, и выкладываем.

    Reply
  2. maljaev

    (1) ОК, согласен 🙂 Просто стесняюсь я пока на 1С v8 что-то выкладывать. Пишешь вот на 7.7 десять лет, знаешь уже всё как свои пять пальцев, считаешь себя профессионалом. И вот начинаешь изучать восьмерку… и чувствуешь себя полным лохом. Неприятное ощущеньице… 🙂

    Reply
  3. Stety

    (2) Ну да, ощущеньице как у велосипедиста, которого на мотоцикл пересадили: «Ехай, тут тоже два колеса и руль». 🙂

    Тут в одном дружественном ВУЗ-е тетенек из IT заставили со старого Oracle на новый все переводить, так у них точно такое же ощущение. То есть, это нормально.

    Полезная формочка, спасибо.

    Reply
  4. АллаБух

    а у меня не открываетсяпечатная форма……

    Reply
  5. maljaev

    (4) Может от версии 1С зависит? У меня версия ядра 8.1.13.41

    Reply
  6. АллаБух

    а у меня 8.1.12.101

    Reply
  7. Rus_Tiger

    у меня на у УПП тоже не открывается…

    Reply
  8. maljaev

    Кто-нибудь из тех у кого открывается может подсказать почему не открывается у некоторых? Из-за версии ядра?

    Reply
  9. maximis

    Сделайте такую же для 8.1 БП, если есть возможность.

    Reply
  10. ruslanrise

    Александр! Огромное спасибо за столь ценную форму )))) Единственное, не совсем пойму, почему не выводится сумма в полях услуги и итого? Может чего не так делаю?

    Reply
  11. maljaev

    Потому что сумма платы за услуги определяется и заполняется уже на почте/сберкассе, и соответственно итого тоже.

    Reply
  12. Dmi3y

    Для работы в Бухгалтерии 8.1 закомментируйте следующие строки:

    //Если ТипЗнч(СсылкаНаОбъект) = Тип(«ДокументСсылка.ЗаказПокупателя») Тогда

    // ОбластьМакета.Параметры.НаименованиеПлатежа = «Оплата заказа № «+СокрЛП(СсылкаНаОбъект.Номер)+» от «+Формат(СсылкаНаОбъект.Дата,»ДФ=dd.MM.yy»);

    Замените в начале следующей строке

    ИначеЕсли

    на

    Если

    Reply
  13. lbdyjujhcr

    Спасибо, а чтобы выводилось на печать — надо добавить в модуле формы

    что-то типа : ТабДокумент= Печать();

    УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, 1, Ложь, ОбщегоНазначения.СформироватьЗаголовокДокумента(СсылкаНаОбъект));

    Reply
  14. baksin

    Спасибо! Все работает ))

    Reply
  15. Dying

    А для 8.2 никто не сделает такое же?

    Очень надо!

    Reply
  16. makas

    ошибка в форме: Квитанция ПД-4 применяется теми юрлицами, которые не любят кассовый аппарат и поэтому надо писать про НДС в назначении платежа (типа, в том числе НДС — 18руб18коп или НДС не благается)

    Reply
  17. maljaev

    Это всегда так было? Просто заказчик что-то замечаний не делал. Но спасибо, учту.

    Reply
  18. makas

    (17) это мое бухгалтерское суждение: Если у получателе денег на расчетный счет, при налоговой проверке, обнаружат что сумма пришла без НДС, то этот НДС могут «сверху доначислить».

    Лично для меня ПД-4 = Платежное поручение(со всеми атрибутами) только от физического лица.

    …Да и юридическое лицо тоже может заплатить через ПД-4 = нет такого запрета 🙂

    Reply
  19. makas

    Проблему с НДС я решил так(в силу своих бухгалтерсих способностей) + отредактировал поля:

    ОбластьМакета.Параметры.НаименованиеПлатежа = «Оплата заказа № «+СокрЛП(СсылкаНаОбъект.Номер)
    + » от «+Формат(СсылкаНаОбъект.Дата,»ДФ=dd.MM.yy») + » в т.ч.НДС-»
    + СокрЛП(Формат(СсылкаНаОбъект.СуммаДокумента *18/118, «ЧЦ=18; ЧДЦ=2»));
    Reply
  20. makas

    (19) у меня все продается с НДС…….

    У кого нет НДС, могут сделать вторую ПД-4, со словами:

    ОбластьМакета.Параметры.НаименованиеПлатежа = «Оплата заказа № «+СокрЛП(СсылкаНаОбъект.Номер)
    + » от «+Формат(СсылкаНаОбъект.Дата,»ДФ=dd.MM.yy») + » НДС не благается»;
    Reply

Leave a Comment

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