Групповое создание счетов-фактур на основе реализаций и поступлений (БП 3.0, 2.0)




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

38 Comments

  1. JLaikova

    Спасибо! Нужная обработка. Находит не созданные счет- фактуры и создает их.. Но хорошо бы, чтоб нумерация счетов-фактур созданных совпадала с номером Реализации товаров и услуг..

    Reply
  2. AlexanderP

    Добавил такую возможность, + создание счетов-фактур полученных

    Reply
  3. JLaikova

    (2) Спасибо!

    Reply
  4. ir.iv

    Спасибо, оказалась очень удобная вещица!

    Reply
  5. AlexanderP

    И вам спасибо!

    Если еще что «допилить», пишите, посмотрим

    Reply
  6. m_aster

    Спасибо!

    Reply
  7. Vadim75

    Здравствуйте! Скачал обработку, проверил все хорошо. Один момент только по счет-фактурам выданным, номер реализации ТКн000000001 в в счет — фактуре становится н000000001 Как можно поправить? Спасибо.

    Reply
  8. Vadim75

    Надо чтобы было 000000001. Спасибо.

    Reply
  9. Vadim75

    Галочку — «Нумировать счет фактуры выданные как основание» — ставил.

    Reply
  10. AlexanderP

    (7) Vadim75, а какая у вас максимальная длина номера у РТУ и счета-фактуры? В моей 3.0.37.37 это 11 и 12 соответственно, у вас РТУ имеет номер из 12 символов. Какой префикс у организации стоит? Вы хотите СФ без префикса? Наверное, проще сейчас будет групповой обработкой убрать «н»

    Reply
  11. ALIP_CO

    А как получить файл ?

    Reply
  12. AlexanderP

    (11) ALIP_CO, нужно скачать — кнопка «Абонемент»

    Reply
  13. ALIP_CO

    Вернулся к теме. Не понял -где кнопка «Абонемент» ?

    Reply
  14. AlexanderP
  15. ALIP_CO

    Скачал, спасибо. Только непонятно. Галку сохранять нумерацию поставил

    У меня номера реализаций ОО-0000001 — 10 символов, в конфиге допустимая — 12.

    Так вот префикс программа почему-то отрубает — при просмотре списка СФ его не видно

    Хотя когда входим в сам документ СФ, в поле номера он есть

    Reply
  16. AlexanderP

    Если в самом документе есть префикс, значит, программа его не отрубает. В списке, может, колонку раздвинуть?

    Reply
  17. svbel85

    Работает, все хорошо, можно бы еще сообщения выводить в процессе, а то если большой период и много сф непонятно сколько ждать.

    Reply
  18. AlexanderP

    (17) svbel85, можно, но, боюсь, от этого еще медленнее работать будет, ведь придется с сервера гонять инфу.

    В новом году посмотрю 🙂

    Reply
  19. profite

    А где обработка для БП 2.0? Скачал обе они только на управляемых формах.

    Reply
  20. AlexanderP

    (19) выслал отдельную ссылку для скачивания.

    Должно быть 2 формы (см. вложение).

    Reply
  21. JLaikova

    (20) и мне ссылку, пожалуйста! Заранее спасибо

    Reply
  22. AlexanderP

    Кто просил, файл выслал. На всякий случай обработку перезалил.

    Reply
  23. mangust4

    Если в заданном периоде присутствуют документы реализации с видом операции «Комиссия» появляется ошибка:

    Произошла ошибка: {ВнешняяОбработка.СозданиеСчетовФактур.Форма.Форма.Форма(76)}: Ошибка при вызове метода контекста (Заполнить): Ошибка при выполнении обработчика — ‘ОбработкаЗаполнения’: {Документ.СчетФактураВыданный.МодульОбъекта(671)}: При передаче на комиссию выписка счета-фактуры не требуется

    UpDate*

    Плюс, пожалуйста добавь отбор по контрагенту

    Reply
  24. AlexanderP

    (23)Внес изменения.

    Reply
  25. mangust4

    (24)

    Скачал ещё раз.

    Та же самая ошибка — ничего не изменилось.

    Произошла ошибка: {ВнешняяОбработка.СозданиеСчетовФактур.Форма.Форма.Форма(76)}: Ошибка при вызове метода контекста (Заполнить): Ошибка при выполнении обработчика — ‘ОбработкаЗаполнения’: {Документ.СчетФактураВыданный.МодульОбъекта(671)}: При передаче на комиссию выписка счета-фактуры не требуется

    Reply
  26. user1126687

    {ВнешняяОбработка.ГрупповоеСозданиеСчетовФактур.МодульОбъекта(22,92)}: Переменная не определена (ДополнительныеОтчетыИОбработкиКлиентСервер)

    ДобавитьКоманду(ТаблицаКоманд, «Групповое создание Счетов-фактур», «ГрупповоеСозданиеСФ», <<?>>ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(), Ложь); (Проверка: Толстый клиент (обычное приложение))

    {ВнешняяОбработка.ГрупповоеСозданиеСчетовФактур.МодульОбъекта(23,100)}: Переменная не определена (ДополнительныеОтчетыИОбработкиКлиентСервер)

    ДобавитьКоманду(ТаблицаКоманд, «Групповое создание Счетов-фактур (фоновое задание)», «Выполнить», <<?>>ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(), Истина); (Проверка: Толстый клиент (обычное приложение))

    ….такие вот дела (((

    Reply
  27. AlexanderP

    (25)Вы в обработке ничего не меняли? Потому что называется она у вас иначе, и строка 76 формы у меня пустая.

    Reply
  28. AlexanderP

    (26) Аналогичное сообщение вы написали и здесь https://forum.infostart.ru/forum9/topic191342/

    А мою и не скачивали.

    Reply
  29. user1126687

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

    Reply
  30. Alex_E

    Вопрос можно? А зачем автоматически созданные счета-фактуры полученные в бухгалтерии? Кто-то созднный таким образом входящий НДС собирается к вычету предъявить?

    Reply
  31. user1126687

    (30)

    входящие сф да, для принятия ндс к зачету.

    а мы исходящие хотим группой создать и отправить.

    сами продажи группой переносим, так же всей кучей их печатаем.

    а потом каждую сф приходится отдельно создать. потом эсф, потом отправка…

    не работает обработка..

    {ВнешняяОбработка.СозданиеСчетовФактур.Форма.ФормаОбычноеПриложение.Форма(8)}: Поле объекта не обнаружено (ВидСчетаФактурыВыставленного)

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

    у меня стоит 1С:Предприятие 8.3 (8.3.10.2561) Бухгалтерия для Казахстана, редакция 2.0, разработка для Казахстана: «1С-Рейтинг» (2.0.27.2)

    Reply
  32. user1126687

    я может не тот файл выбрала? скачала СозданиеСФВыданныхИПолученных

    Reply
  33. Alex_E

    (31)

    входящие сф да, для принятия ндс к зачету.

    — я в курсе… Просто в обработке предлагается их автоматическое создание, я уж испугался, что это для вычета по НДС))))

    Reply
  34. AlexanderP

    (32)Похоже на тот. Видимо, для Казахстана другая структура данных.

    Если выложете конфигурацию, то посмотрю.

    Reply
  35. user1126687

    (34)

    да, там вид не НаРеализацию, а Основной.

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

    в любом случае сф выданные создает, то что надо! спасибо большое.

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

    Reply
  36. AlexanderP

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

    вы спасли молодость моего отдела

    Это самое главное! )))

    Reply
  37. namazi74

    Спасибо! Пригодилось!

    Для обычных форм не проставляется номер документа — основания. Добавил перед проведением строку

    ОбъектСчетаФактуры.Номер = ВыборкаПоОснованиям.Ссылка.Номер;

    Вроде помогло.

    Reply
  38. user970589

    Спасибо! 560 документов.. бухи просили перенести из одной базы в другую реализации за квартал. Они и перенеслись через синхронизацию.. Но без с-ф.

    Reply

Leave a Comment

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