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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *