Автозаполнение Субконто "Договор" при переходе с ББУ7 на БГУ8




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

40 Comments

  1. evgev1

    А я создаю один общий договор, и с помощью типовой обработкой с итс «замена реквизитов» проставляю его в нужные мне документы (в частности в документы списания и поступления с лицевого счета, иначе эти документы без договора вообще не переносятся). Но с этой обработкой думаю будет удобнее, надо попробовать.

    Reply
  2. mvv1975

    Добавил заполнение в документах «КассовоеВыбытие» и «КассовоеПоступление», «УслугиСтороннихОрганизаций»

    Reply
  3. adeich

    (1). Поступал аналогично. Но обработке +. Полезна особенно тем, кто только начал выполнять перенос

    Reply
  4. RuzAleks

    В БГУ можно отключить обязательность заполнения договоров, тогда все будет проводится. И не надо создавать ненужные объекты, или проставлять первый попавшийся договор в документах!

    P.S. В обработке V77Exp.ert необходимо поправить 2 строчки кода, чтобы выгрузка шла и без договоров в документах… Я думаю — это быстрее нежели написать обработку по установке договоров!

    Reply
  5. mvv1975

    (4) Все равно их лучше проставлять — вести учет, так вести. Пусть бухи привыкнут что договора обязательно надо проставлять. Иначе и бюджетные обязательства толком не сделаешь, зачет авансов по всему контру пойдет. Ну и развернутый анализ будет,.. ну не неверный

    Reply
  6. bb1962

    (1)(3) Не понял, договоры подчинены контрагентам, как можно заменой реквизитов пользоваться.

    Вы что одно значение (один договор) документам по ВСЕМ контрагентам проставляете?

    Reply
  7. adeich

    (6) нет, не «ВСЕМ» контрагентам, а тем, где возможно. Здесь речь больше идет о начислении родительской платы. В 7-ке к «детям» можно было не проставлять договор, и поэтому в документах «Списание с л/с» договора не проставлялись и, как уже известно, такие документы без договоров в 8-ку не переносятся. Поэтому я заводил общий договор «родительская плата», без подчинения конкретному контрагенту и проставлял их обработкой в документы и операции. Но….. в 8-ке, в документах по родительской плате тоже нужно «пошаманить», там нет понятия «общий договор». Если интересно, могу выложить кусок исправленной процедуры НачисленияДоговорНачалоВыбора

    Reply
  8. adeich

    (4) а вот такого делать не надо, отключать обязательность заполнения и так бухи делают кучу ошибок. Пущай привыкают правильно вести учет, а не рисовать потом отчеты с потолка

    Reply
  9. RuzAleks

    (8)(5) У нас бюджетники ведут учет договоров в Комита-Курьер (регистрируют, определяют графики финансирования, предметы контрактов и т. д.). Заявки на расход бьют в АЦК Финансы — (там регистрируются бюджетные обязательства автоматом). Объясните мне ЗАЧЕМ им еще вести учет договоров и в 1С по всем контрагентам? Если им нужно разбить взаиморасчеты по договорам (например, тел. связь и интернет) — они их заносят и выбирают, если не нужно, то обязательный договор — этот лишняя нагрузка на бухгалтеров и ненужная инфа в системе!

    Reply
  10. mvv1975

    (9) А зачет авансов?

    Reply
  11. adeich

    (9)(10) а формирование отчетов тоже делают в АЦК Финансы? Той же 128 формы. 😀 видел я этого «монстра» АЦК Финансы

    Reply
  12. RuzAleks

    (11) 128 форму можно легко заполнить на основании данных о бюджетных обязательствах из АЦК (или занести в 1С итоговые суммы принятых БО по статьям) — по временным затратам куда меньше, нежели проставлять договора при перечислении з/п, в подотчет, регистрировать обязательства на каждый договор.

    Reply
  13. RuzAleks

    (10)А что у нас авансы без договоров не засчитываются?

    Reply
  14. adeich

    (12)вообще то обязательство должно регистрироваться при заключении договора. Но если и этого мало, то тогда такой вопрос. А как же реестр закупок и ст. 73 Бюджетного кодекса, плюс 94-ФЗ? Тоже в АЦК делать? 😀

    Reply
  15. mvv1975

    (12) Мои бухгалтера немножко избалованны программой СБиС++, поэтому, я по их просьбе, добавляю модуль автоматического формирования БО (по факту несения затрат), так что они заполняют основания — сейчас добавились новые клиенты, я им предложил автоформирование БО, значит и они будут заполнять договора.

    (13) Зачитываются, но по всему контру, а не по конкретному договору, что не совсем верно

    Reply
  16. мастеровой

    Спасибо за обработку. Актуально для детских садов, можно ли сделать так чтобы и в документах НачислениеРП и ПоступлениеРП основной договор проставлялся каждому ребёнку.

    Reply
  17. mvv1975

    (16) Добавил документы РП_Начисление, РП_ВводОстатков, РП_ВыпКвитанций и РП_ПостОплаты. Поскольку детсадов у меня нет — проверять толком не на чем. Для теста создал один документ с пустым основание — вроде заполнилось. Проверьте и если не трудно отпишитесь о результате, пожалуйста.

    Reply
  18. мастеровой

    (17) Идеально! Всё как надо. Ещё раз большое спасибо за оперативность.

    Reply
  19. =melena=

    Спасибо большое!Все отлично работает!Очень актуально! 😀 До этого переносила в 8-ку как есть (без договоров),а там уже групповой обработкой заполняла по каждому виду документов отдельно!

    Reply
  20. I2020

    ПКО и РКО еще бы добавить а так всё отлично работает, огромное спасибо

    Reply
  21. dusoran

    Спасибо автору! Думает не только осебе, актуальной обраьоткой помог другим!

    Reply
  22. bogdan87

    Спасибо, за обработку! Очень помогла.

    Reply
  23. annkod

    Я как (1) делаю. Уж лучше один общий договор, чем миллион «основных»… Ну хотя это кому как 😉

    Reply
  24. mi8

    (17) Проверил Вашу обработку на д/садах. Документ поступление РП связан с документом Поступление на лицевой счёт. Там тоже нужно вставить договор. Без него не правильно формируется ОСВ по счёту 205.03.2 в разрезе договоров, выписываются квитанции.

    Reply
  25. (sic)

    Большое спасибо за обработку! В синтаксисе семерки не силен. Немного доработал обработку, попалась ситуация, где в документах «Поступление на л/с» не проставлены договора. Просто скопировал процедуру СозданиеДоговоровВДокахСписанияхЛС() и поменял название документа, и всё пошло как по маслу)

    Reply
  26. rama87

    Часто пользуюсь. Большое спасибо

    Reply
  27. SJR

    а в РКО и ПКО зачем? вроде бы они нормально переносятся даже без договоров =) ну если только для своей «избалованности» )

    Обработка по сути и правда экономит время, что очень важно) спасибо

    Reply
  28. SJR

    Еще бы знаете, что добавить — возможность выбора периода. За какой промежуток времени подставлять договора. Конечно так то и надо тока за 2011 г, но были базы где ведение шло с 2007 г. И поэтому с того времени и заполнялись договора), опять же небольшая экономия времени не помешает никогда)

    Reply
  29. mvv1975

    (28) Вообще-то у меня там нет органичения по периоду — документы просматриваются все что есть в базе (проведенные)…

    Интересно откуда у вас в базе документы с 2007 года… (1С почти каждый год рекомендовала начинать остатками)

    Я бы на Вашем месте моей обработкой пользоваться не стал — она перепроведет все документы, начиная с 2007 года 🙁

    П.С. 1С рекомендует переход с ББУ7 на БГУ8 осуществлять после свертки базы на начало 2011 года — я лично так и делаю — меньше косяков возникает. Так вот, обработку я и писал, подразумевая что у нас есть документы ввода остатков и движения 2011 года — в этом случае обработка перепроведет доки только отчетного периода…

    Reply
  30. ElenaV

    Для медицинских учреждений ваша обработка подойдет?

    Reply
  31. mvv1975

    Подойдет для любого учреждения — главное чтобы база была ББУ7

    Reply
  32. ElenaV

    Только что проверила. Действительно заполнились по Контрагентам все пустые договора на «ОСНОВНОЙ».

    Вопрос .документы, по которым заполнились договора, перед выгрузкой в БГУ нужно перепровдить или они при заполнении договора сразу и перепроводятся?

    Reply
  33. mvv1975

    (32) Перепроводить не надо — они перепровелись моей обработков

    Reply
  34. amerle

    (25) wealth, спасибо ОГРОМНОЕ! Сама в коде не сильна, но Вы очень доходчиво объяснили) Полезная обработочка!

    Reply
  35. RomanG

    Спасибо Большое!!!

    Reply
  36. Temniy

    Спасибо большое обработка сильно помогла.

    Reply
  37. artspeed

    Однозначно + за обработку. Проверил. Работает без ошибок. Спасибо

    Reply
  38. 2011b11

    Спасибо автору за данную обработку, очень помогла. Работает без ошибок. Большое спасибо +

    Reply
  39. Sasha255n

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

    Reply
  40. gorloom99

    Спасибо большое! Мучались сами вбивали договора(

    Reply

Leave a Comment

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