Платежно-расчетные документы в счете-фактуре выданном




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

26 Comments

  1. poppy

    Для такой задачи имхо лучше использовать обработку заполнения табличных частей вместо внешней печатной формы. http://infostart.ru/blogs/345/

    Reply
  2. shushkovka

    (1) С удовольствием бы использовал, но в счете-фактуре нет кнопочки заполнить (Изменить) в которые и встраивается обработка таб. части. Там даже панелек то нет. Потому то и пришлось извращаться.

    Кстати вопрс с получением списка открытых форм так и не решен…

    Никто не знает как это можно сделать? Без ВК.

    Reply
  3. e.kogan

    фор=СсылкаНаОбъект.ПолучитьФорму(«ФормаДокумента»);

    докоб=фор.ДокументОбъект;

    докоб.Прочитать();

    //здесь какие-то действия с докоб

    Если фор.Открыта() Тогда

    фор.Активизировать();

    фор.Обновить();

    фор.Заголовок=»дырдырдыр»; //чтоб убедиться, что действует

    КонецЕсли;

    Reply
  4. shushkovka

    (3) Не работает такой код. Да, imho, и не должен.

    фор=СсылкаНаОбъект.ПолучитьФорму(«ФормаДокумента») даст нам новый экземпляр формы, а не тот что открыт в момент вызова обработки. Вся трудность то в том и состоит, чтобы получить ту форму, из которой была вызвана обработка.

    Reply
  5. e.kogan

    Самое интересное, что он работает… Во всяком случае, на типовых базах ЗУП и Бух — точно.

    Reply
  6. e.kogan

    Вся фишка именно в том, чтобы работать с объектом ЭТОЙ ФОРМЫ.

    Reply
  7. shushkovka

    (5, 6) ну я прежде чем писать (4) проверил…

    Попробуй сам.

    Создай внешнюю печатную форму, воткни свой код.

    Подключи ее…

    дырдырдыр в заголовке не замечено 🙁

    Reply
  8. gutentag

    (7) …а что мешает сделать обработку типа «печатная форма накладная + счет-фактура», вызываемая при печати из «документов на основании которых создаются сч-ф» или вызываемая как «обработка табличной части».

    И именно эта(эти) обработки создадут «правильный документ»



    Я еще не проверял, этот факт(…баланс/отчеты сейчас составляю), но выскажу предположение что еще можно проверить:

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

    Reply
  9. e.kogan

    (7) Специально сейчас выложу похожую по функционалу вещь, которая работает, и кину ссылку. Если для счёт-фактуры не работает, значит, у неё какие-то особенности в форме и/или при её открытии/обновлении. Обычно работает нормально.

    Reply
  10. e.kogan
  11. shushkovka

    (10) спасибо за пример… Действительно работает…. переделал код и получилось!

    Выложил обновленную обработку.

    Reply
  12. lion11

    Спасибо, интересная обработка.

    Только у меня выходят авансы и после даты реализации, а если в параметре ДатаРеализации добавить Дату, то все ОК (СсылкаНаОбъект.ДокументОснование.Дата).

    Еще у нас часто пользуются документом ПлатежныйОрдерПоступлениеДенежныхСредств, добавил себе его в запрос, и тоже работает 🙂

    Reply
  13. shushkovka

    (12) Действительно… чего то протупил по поводу даты 🙂 Исправлено.

    Выложил обновленную.

    Reply
  14. shushkovka

    Приношу свои извенения. Но опять обновил… Просто проверял на списке, и не проверил тот случай, когда только одна платежка. В этом случае в форма счет-фактуры номер и дата сразу не проставлялись. Щас работатет и в том и в другом случае.

    Reply
  15. e.kogan

    (11) Пожалуйста 😉

    Reply
  16. lion11

    (14) Еще интересный момент: Если форма сч.фактуры открыта одна, то все ОК, отображение формы работает, а если открыть Реализацию а потом из нее открыть сч.фактуру, то не работает. Или у меня что-то не так?

    Reply
  17. e.kogan

    (16) Вот о таких вещах я и говорила, что могут быть тонкости. Со «свободноживущими» документами таких глюков нет.

    Reply
  18. shushkovka

    (16) Хм…. такой вариант не проверял… гляну вечерком.

    Reply
  19. Alav

    Автор все работает в типовой, вы просто не умеете их готовить.

    Большая часть фирм ведет взаиморасчеты в БП по договору в целом. В этом случае для «разнесения оплат» используется документ Регистрация оплат от покупателя.

    Причем тут это? А при том что на момент после проведения реализации, но до выписки счет-фактуры нужно сформировать этот документ, и тогда программа (о чудо), увидит нашу предоплату по этой реализации и сформирует номер и дату платежного поручения

    P.S. Не спрашивайте у меня «почему 1С так сделал», или «ведь это не удобно». Это просто уточнение первого предложения автора

    «При вводе счет-фактуры на основе реализации в БП 1.6 почему то не проставляется номер и дата платежно-расчетного документа(ов)»

    Reply
  20. shushkovka

    (19) А вот с этого момента поподробнее… Речь точно идет про БП? Потому как специально поглядел, и не обнаружил документа «Регистрация оплат от покупателя». Есть документ «Регистрация оплаты от покупателей для НДС», но он несколько для другого предназначен… да и вводится раз в квартал.

    Смотрел на релизе 1.6.11.7

    Reply
  21. Alav

    (20) Про него и говорю. Просто по памяти название писал.

    Reply
  22. shushkovka

    (21) ясно… но тогда точно не вариант…

    Reply
  23. AlexStar

    Если в обработке убрать условие — //Если СсылкаНаОбъект.ВидСчетаФактуры = Перечисления.НДСВидСчетаФактуры.НаРеализацию Тогда

    то замечательно работает в УТ. Проверено на релизе 10.3.14.3.

    Reply
  24. Ddkoshka

    Спасибо! Избавили от излишней траты времени!

    Reply
  25. LanGrid

    Плюсую. Облегчил жизнь бухам! Спасибо, все работает!

    Reply
  26. МариМе

    (23) AlexStar,

    Давно искала такую обработку для своих менеджеров. Дабы не искать им номера и даты платежек. Спасибо за совет, как применить данную обработку для УТ.

    Автору отдельное спасибо. Дождусь, когда накапает на счет и обязательно скачаю данную обработку.

    Reply

Leave a Comment

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