Печатная форма "Акта взаимозачета"




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

24 Comments

  1. $erg

    упп 1.2.32 под 8.1 не печатает

    «ВНИМАНИЕ!

    не удалось сформировать внешнюю печатную форму!

    Ошибка при вызове метода контекста (Выполнить): {(6,39)}: Поле не найдено

    «СчетФактураВыданный.ДокументОснование» ПО

    ПоступлениеТоваровУслуг.Ссылка =

    <> СчетФактураВыданный.ДокументОснование»

    Reply
  2. elisabet

    Спасибо указание на ошибку — исправила.

    Reply
  3. Brabusmen

    Метод объекта не обнаружен (ОтветственныеЛицаОрганизаций) не печатает!!

    Reply
  4. elisabet

    (3) У тебя торговля?

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

    Reply
  5. Brabusmen

    Если не сложно,подскажи как??? У меня УТ

    Reply
  6. elisabet

    (5) Заходишь в конфигуратор — открываешь форму: в ней находишь строку «ОтветственныеЛицаОрганзаций» и букву «й» меняешь на «и». И все работает.

    Reply
  7. totoo

    Не печатает ((( в 8.1. УПП 1.2.32.1

    Значение не является значением объектного типа (Метаданные)

    СтрокаТаблицы.Параметры.СчетФактура = СФ.СчетФактура.Метаданные().Синоним + » № «+СФ.СчетФактура.Номер+ » от «+СФ.СчетФактура.Дата;

    Что нужно исправить?

    Reply
  8. elisabet

    (7) Странно — посмотри для этой накладной, для которой происходит затык структуру подчиненности документов.

    У меня УПП 1,2,31,1 — все работает. на каждый из документов реализации выписана счет-фактура.

    Reply
  9. Asenka2

    Классный акт, а для Бухгалтерии 2.0 как переделать?

    Reply
  10. bnw

    Поддерживаю просьбу Asenka2. Очень хотелось бы такую форму для БП 2.0.

    Reply
  11. mahovik

    и я тоже хочу для БП 8.2!!! НУ пожаааалуйста! 😀

    Reply
  12. domowoy

    А для Комплексной автоматизации подойдет?

    Reply
  13. alexks321

    Хорошая форма, только почему то выдает сообщение

    {ВнешняяОбработка.АктКорректировкаДолга.МодульОбъекта(198)}: Значение не является значением объектного типа (Метаданные)

    СтрокаТаблицы.Параметры.СчетФактура = СФ.СчетФактура.Метаданные().Синоним + » № «+СФ.СчетФактура.Номер+ » от «+СФ.СчетФактура.Дата;



    Как быть если входящие документы без счет фактуры (т.е. без НДС)?

    Reply
  14. elisabet

    (12) для комплексной автоматизации подойдет, там тот же принцип регистров используется.

    (13) Если нету счет-фактуры … надо подумать. У меня точно всегда есть. попробую воспроизвести ситуацию.

    Reply
  15. alexks321

    Буду признателен, если внесете изменения. Очень понравилась форма, только применить не могу, т.к. не всегда формируется. Дело в том, что у вас НДС тоже сразу прописан, т.е. ситуация «Без НДС» не рассматривается в принципе. А сейчас сплошь и рядом все на УСН или на ЕНВД.

    Встроенная форма, которую предлагает 1С, очень уж примитивна до нельзя, Ваша же просто отдушина для УПП, но в некоторых ситуациях не применима.

    Reply
  16. рибак

    Поддерживаю просьбу Asenka2. Хотелось бы такую форму для БП 2.0.

    Reply
  17. clab

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

    Reply
  18. Deniz200

    Очень полезная внешняя форма, но у меня при открытии вылетает ошибка. {ВнешняяОбработка.АктКорректировкаДолга.МодульОбъекта(198)}: Значение не является значением объектного типа (Метаданные)

    СтрокаТаблицы.Параметры.СчетФактура = СФ.СчетФактура.Метаданные().Синоним + » № «+СФ.СчетФактура.Номер+ » от «+СФ.СчетФактура.Дата;

    Причем в торговле пробывал, работает, заменил последние буквы. У меня УПП 1.3. И ситуацию бы без НДС как-нибудь бы разрешить, вообще шикарная форма была бы. Спасибо!

    Reply
  19. evgaid

    Поддержу, для БП 2.0 такую ищу. Спецы, может кто займется, если есть время и желание.

    Reply
  20. kalliostro

    При выводе на печать ошибка:

    {ВнешняяОбработка.КорректировкаДолга.МодульОбъекта(298)}: Значение не является значением объектного типа (Метаданные)

    ОбластьМакета.Параметры.Документ2 = ТЗВЗ.Получить(б).СФ2.Метаданные().ПредставлениеОбъекта+» «+ТЗВЗ.Получить(б).СФ2.Номер+» от «+Формат(ТЗВЗ.Получить(б).СФ2.Дата, «ДЛФ=Д»);

    Кто как поборол её?

    Reply
  21. elisabet

    (20) К сожалению основание в виде корректировки долга не обрабатывалось при написании формы.

    Reply
  22. Светлый ум

    Нехватает группировки по договорам.

    Reply
  23. Infector

    Как черновик вполне себе.

    Из крупных косяков — НДС всегда 18%, даже когда использованы иные ставки.

    По мелочи:

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

    2. Когда счет-фактура как отдельный документ не внесена выкидывает исключение при той же попытке получить метаданные от значения Null

    3. жестко вбитый текст «г. Москва» совсем не радует пользователей из Калининграда.

    4. Игнорируются поля «НомерВходящегоДокумента» и «ДатаВходящегоДокумента» в случае с поступлениями и входящими счет-фактурами

    Reply
  24. elisabet

    (23) форма делалась в 2010 году, для упп 1.2, там впомине половины полей не было

    Reply

Leave a Comment

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