Заполнение расчетных документов




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

39 Comments

  1. zabaluev

    Очень нужная обработка. Спасибо. Упрощу интерфейс и отдам бухгалтерам, пусть исправляют косяки.

    А как сработает обработка, если расчеты ведуться по двум и более договорам.

    Reply
  2. seducer

    (1) Заполнение ведется в разрезе договоров. При заполнении платежек и ордеров отбор для заполнения делается по договору, указанному в документе. Главное, чтобы в документе стоял правильный договор.

    Reply
  3. rayson

    вероятно очень полезность

    к сожалению в УТ 10.3.5.1 не заполняет

    кто-нибудь пробовал в более ранних чем 10.3.6.8?

    спасибо

    Reply
  4. seducer

    (3) К сожалению, не проверял. А так на память не помню. Но, по идее, должна пойти. Проверь, есть ли, например, в документе реализации вкладка «Предоплата». Код на заполнение взят из обработки действия кнопки «Заполнить-Заполнить документы предоплаты» + дописано заполнение структуры для заполнения.

    Reply
  5. seducer

    (4) + и установлен ли флаг «Вести по документам расчетов с контрагентами» в договоре контрагента.

    Reply
  6. rayson

    в РТиУ разумеется — все договоры по основным видам деятельности «по док-м расчетов» — руками все и заполняли

    великое зло когда контры задним числом молят изменить что-либо и … о чудо — ваша обработка

    пробовал различные комбинации опций — глухо

    табличные части пп не трогает вовсе

    Reply
  7. seducer

    (6) > великое зло когда контры задним числом молят изменить что-либо

    Это точно. Сам маюсь.

    И все-таки, есть ли в РТиУ вкладка «Предоплата»? И какой код привязан в кнопке заполнения? У меня вот какой код

    УправлениеВзаиморасчетами.ЗаполнитьПредоплату(ЭтотОбъект, мСтруктураПараметровВзаиморасчетов);

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

    Reply
  8. seducer

    (6) >табличные части пп не трогает вовсе

    А вот насчет платежек не могу утверждать, что будет работать. Когда там отбор по договору сделали — не заметил.

    Там, в принципе, тоже все взято из типовой.

    А ручками если вызвать заполнение из п/п — заполняет?

    Reply
  9. rayson

    предоплата есть и в РТиУ и в ПТиУ

    ручками заполнение работает — оно конечно непростое но после заполнения 3-й пп работа мартышкина…

    времени жаль но делать нужно — прежде бывало братишку сажал перепроводить цепочки расчетов

    отличную вещь вы изобрели

    Reply
  10. seducer

    (9) Хм…. если ручками заполняет, значит, и так должно пойти. Можно отладчиком пройтись, посмотреть, на чем затыкается. Может, в 10.3.5.1 как-то по-другому делалось.

    Reply
  11. Barracuda64

    большое спасибо.очень полезная штука.Отработала в ред 10.3.3.3.Только поменяла УправлениеДенежнымиСредствами.ЗаполнитьРасшифровкуПлатежей(СтруктураПараметров); на

    РаботаСДиалогами.ЗаполнитьРасшифровкуПлатежей(СтруктураПараметров); Отработала на плат. входящих и приходных кассовых ордерах, даже, если у контрагента несколько договоров.Закрывается все по соответствующим договорам. Очень нужная штука и очень срочно была нужна.Ещё раз спасибо.

    Reply
  12. rayson

    (11) код заменил — не спасло

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

    однако ручное заполнение работает, при след.опциях:

    «По текущей задолженности»

    «По фактической задолженности»

    «Сначала ранние задолженности»

    «Подбирать сумму»

    «По сумме платежа»

    все остальные выключены, без отбора договоров

    может беда в этом

    …и хорошо бы ставку НДС устанавливать — вручную приходится в каждом пп устанавливать

    Reply
  13. simuljakr

    А я сейчас нечто похожее для своей конторы пишу…

    У Вас есть недочет — не обрабатываются документы «ВозвратТоваровОтПокупателя».

    Reply
  14. seducer

    (13) да, я заметил, только поздновато. 🙂 Как появлюсь на работе, выложу дополненный вариант. Щас в отпуске. 🙂

    Reply
  15. seducer

    (13) Обновил. Включил также обработку документов поставщиков (поступление товаров, возвраты поставщику)

    Reply
  16. ludena

    Большое спасибо!!! Такая нужная вещь!!!

    Reply
  17. valery38

    Seducer, огромное спасибо!

    А не могли бы вы включить еще обработку корректировок?

    Reply
  18. seducer

    (17) Каких корректировок?

    Reply
  19. valery38

    Корректировок долга. Это тоже вроде расчетные документы.

    Reply
  20. seducer

    (19) Хм…. видимо, я у себя позже добавил. Обработку обновил.

    Reply
  21. valery38

    Спасибо, правда у меня выдает ошибку (на стр.619) — во входящем плат.поручении не заполнено поле Заказ покупателя 🙁

    Reply
  22. seducer

    (21) Надо посмотреть, что у вас происходит в модуле платежки. Возможно, у вас это поле является обязательным. У меня все договора ведутся в целом. Код открыт, так что можно подправить. 🙂

    Reply
  23. yuko

    А может кто сказать по конкретней из за чего вся эта фигня получается….типа была реализация а в структуре подчиненности на основании ее была еще одна реализация и ПКО…..из чего все это получается…что операторы делают не так

    Reply
  24. seducer

    (23) Ну насчет моих могу сказать, что виновато исправление задним числом. Очень часто лазят. 🙁 Хоть и по служебкам, но лазят.

    Reply
  25. yuko

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

    1) Убрать во всех договорах признак «Вести по документам расчетов с контрагентами»

    2) Перепровести все документы….но предварительно очистить таб. часть «ДокументыРасчетовСКонтрагентом» … а как исправит переходники….или их в принципе не трогать

    Reply
  26. seducer

    (25) Не совсем въехал в вопрос. 🙂

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

    Можно взять копию и на ней поэкспериментировать. В обработке есть отбор, по которому можно отобрать контрагентов, договора. И попробовать перепровести (на копии, естественно) эти документы. Посмотреть, что получится. Но опять же, это не полностью устранит проблему, т.к. в документах заполняются вкладки с документами расчетов. Это надо, чтобы потом люди еще и с этими вкладками работали. Про себя хочу сказать, что я решил проблему на тот момент времени, но….. сейчас опять все перемешалось. Увы, но менеджеры такие. 🙁

    Reply
  27. yuko

    Ну вопрос такой…5 дней база работала с договорами у которых есть признак «Вести по документам расчетов с контрагентами»….как теперь сделать так… (а точнее последовательность действий)…. что бы после всех этих действий….получилось бы так …как если бы мы с самого первого дня работали с договорами у которых нету признака «Вести по документам расчетов с контрагентами»

    Reply
  28. seducer

    (27) Т.е. избавить от признака «Вести по документам расчетов с контрагентами»в договорах, я правильно понял?

    Если да, то тут

    1. Очистить таб.часть «ДокументыРасчетовСКонтрагентом» у этих документов.

    2. Далее пойти по одному из двух вариантов:

    а) распровести документы, убрать признак в договоре, провести документы

    б) в коде временно обойти сообщение, где делается проверка на снятие признака, снять признак, перепровести документы (либо очистить регистр «ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов»)

    Ну или в какой-нибудь другой вариации.

    Все зависит от того, какой у вас уровень. 😀

    Reply
  29. yuko

    Да ты правильно понял…спасибо….а то с этими операторами можно повесится….

    PS. Уровень конечно можно и по луче 🙂 …. набираюсь опыта…спасибо таким людям как ты, а что по этой теме…то хотел уточнить не влияет ли еще этот признак как кроме движений по регистру «ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов»

    Reply
  30. seducer

    (29) 😀

    Ну сам признак, конечно же, не просто так в договоре стоит. Можно прогнать конфигурацию на поиск данного реквизита (глобальный поиск) и посмотреть, где он используется. 🙂

    Reply
  31. vavka

    Спасибо запустилось, полезная штука.

    Обычно с этими документами расчетов одно расстройство.

    Могли бы и полегче придумать для чайников.

    Еще раз большое спасибо.

    Reply
  32. anton_nazarov

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

    Reply
  33. Marka_

    Спасибо, очень нужная, но для УПП немного приходится подпиливать.

    Reply
  34. Belayaya

    Скажите, а на платформе 8.2 работает?

    Reply
  35. seducer

    (34) Да, только нужно предварительно открыть обработку в конфигураторе, чтобы она сконвертировалась под 8.2

    Reply
  36. Belayaya

    Все бы хорошо, но…есть у нас такие ситуации (и их очень много): сначала была продажа, потом оплата, причем в платежном документе указан заказ, хотя взаиморасчеты ведутся по договору в целом. В этих случаях обработка не работает, не заполняет в платежных документах документ расчетов. Если поле заказ очистить, то все нормально.

    Reply
  37. progi1c

    Круто!! Работает!!!

    Договора с позаказным учетом у нас скорее ошибка, поэтому просто вставил игнорирование их в обработке, чтоб в ошибку не валилось. Спасибо!!!!!!!!!!

    Reply
  38. PtizaPtiza

    Такая экономия времени! Ура!!! Спасибо большое!!!

    Reply
  39. PtizaPtiza

    А можно сделать чтобы заполнялись во входящих платежках заказ покупателя (сделка) ?

    Reply

Leave a Comment

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