Оставить только "Основной договор" у контрагентов




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

27 Comments

  1. CheBurator

    А книга не поплывет-то по месяцам…?

    Reply
  2. O-Planet

    Сложный вопрос. Эта обработка применяется обычно тогда, когда книга УЖЕ поплыла, потому что что-то в нее не входит, а понять почему — геморойно очень.

    Reply
  3. CheBurator

    Ну тады — ок…

    Reply
  4. aaa

    Но свести книги при работе по основному договору ничуть не проще, а наверное и сложнее, чем по раздельным договорам. В раздельном случае сразу видно неоплаченные договора, а по одному договору ?:)

    Reply
  5. O-Planet

    В общем, рассматривается случай грубого непонимания. Бухша, вводя накладные, вбивала договора, исходя из каких-то внутренних влечений, типа «Поставка от 20.02.06». Оплата же когда приходила, то договор ставился основной. А потом она ВДРУГ поняла, что договор, это, собственно говоря, не еще одно поле комментария, а нечто большее! Вот тогда и начинаютсявопросы типа того: «А почему ваша программа не разбивает оплату сама по договорам?», «А кто это сможет отследить и будет помнить, по каким договорам кто платит, у меня тысячи поставщиков?». Вы с такими бухшами не работали? Я — ТОЛЬКО С ТАКИМИ!!!

    Reply
  6. CheBurator

    да, у каждого — свои тараканы…

    Reply
  7. Super

    Этот отчет писался специально для нашей фирмы. Рекомендуем!

    Reply
  8. das

    Для востановления бухгалтерского отчета dom просто незаменимая.

    Давно хотелось такое сделать, но руки не доходили. Так что БОЛЬШОЕ БУХГАЛТЕРСКОЕ СПАСИБО!!!

    Reply
  9. O-Planet

    Большое пожалуйста. Только dom это что?

    Reply
  10. MITYACHERKAS

    Здравствуйте. Не могу запустить программу. При попытке появляется эта надпись:

    Дог.Новый();

    {D:1СПРЕДПРИНИМАТЕЛЬ.BLREXTFORMSPRNFORMSПРИВЯЗАТЬ ОСНОВНОЙ ДОГОВОР.ERT(53)}: Неверный владелец.

    Reply
  11. O-Planet

    🙂 Надо мануал читать. там сказано, что исправляет в программе 1С:Бухгалтерия 7.7, а не 1С:Предприниматель. Потом, зачем это в PrnForms было помещать?

    Reply
  12. valent

    Пожалйста, вот сообщение из 1С:Бухгалтерия 7.7:

    Дог.Новый();

    {D:TEST_BASES_BUCHСАЛЛИХАНСЕН_05022007EXTFORMSПРИВЯЗАТЬ ОСНОВНОЙ ДОГОВОР.ERT(53)}: Неверный владелец.

    Reply
  13. O-Planet

    Исправлено, проверяйте.

    Reply
  14. valent

    Бухгалтерия, 484

    Конфигурация не измененная

    Права администратора

    Что еще может влиять?

    Дог.Новый();

    {D:……….EXTFORMSПРИВЯЗАТЬ ОСНОВНОЙ ДОГОВОР.ERT(54)}: Неверный владелец

    Reply
  15. Abadonna

    Мой опыт показывает, что бухам ваще глубоко фиолетова аналитика по договорам. Для порядку они что-то требуют с программиста, а на самом деле им наплевать, им главное дебет-кредит по Контрагенту.

    Так что можно смело просто убивать это справочник, будет только лучше всем 😉

    Reply
  16. Abadonna

    Забыл сказать, что опыт по производящим предприятиям, а не купи-продай…

    Reply
  17. Abadonna

    Добавлю еще: аналитика по единственному договору «Основной договор» (у меня он назывался «Без договора») равносильна отсутствию всякой аналитики! Так что, уважаемые бухгалтеры, плюньте вы на эту аналитику, вам она ни к чему, а программистам лишняя головная боль.

    Reply
  18. O-Planet

    Эти задачи и пытается решить моя обработка. Если бухша по непонятным причинам ввела массу договоров, а потом поздно раскаялась, то ей просто необходимо исправить все договора на «Основной договор» в автоматическом режиме.

    Кстати, оно работает теперь на 100%!

    Reply
  19. Abadonna

    Кстати, предлагаю решение, с минимальными изменения в конфе (на будущее)

    1. Справочник договоры закрывается для редактирования вообще, только выбор

    2. При вводе нового Контрагента автоматически добавляется договор с кодом 1 и названием «Основной» (или как кому нравится)

    Тогда никто никогда другой договор выбрать не сможет (аналитика, естественно, будет весьма условная, но зато все остальное стандартное будет работать без вопросов)

    Reply
  20. valent

    Вопросы:

    1. Некорректно обрабатываются операции, сформированные документами «Начисление налогов», «Регламентные операции по налоговому учету».

    2. Обработка не затрагивает документы «Бухгалтерская справка».

    Кто может помочь?

    Reply
  21. А где же автор???

    Reply
  22. O-Planet

    Тут…

    Reply
  23. Pari

    (1) <А потом она ВДРУГ поняла, что договор, это, собственно говоря, не еще одно поле комментария, а нечто большее! <

    И вот когда она это поняла, предлагается фактически удалить аналитику по договорам. Сомнительный вариант решения проблемы.

    <Вот тогда и начинаются вопросы типа того: «А почему ваша программа не разбивает оплату сама по договорам?»<

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

    Reply
  24. gutentag

    Обработка может быть полезна при переходе с 7.7 на 8.х.

    А в остальном читайте внимательнее ИНСТРУКЦИЮ ПО ПРИМЕНЕНИЮ ПЛАНА СЧЕТОВ БУХГАЛТЕРСКОГО УЧЕТА ФИНАНСОВО-ХОЗЯЙСТВЕННОЙ ДЕЯТЕЛЬНОСТИ ОРГАНИЗАЦИЙ. Утверждена Приказом МФ РФ от 31 октября 2000 г. N 94н.

    —-к счету 60 (и к счету 62 аналогично)———

    Аналитический учет по счету 60 «Расчеты с поставщиками и подрядчиками» ведется по каждому предъявленному счету, а расчетов в порядке плановых платежей — по каждому поставщику и подрядчику. При этом построение аналитического учета должно обеспечить возможность получения необходимых данных по: поставщикам по акцептованным и другим расчетным документам, срок оплаты которых не наступил; поставщикам по не оплаченным в срок расчетным документам; поставщикам по неотфактурованным поставкам; авансам выданным; поставщикам по выданным векселям, срок оплаты которых не наступил; поставщикам по просроченным оплатой векселям; поставщикам по полученному коммерческому кредиту и др.

    Reply
  25. otrandrej

    А можно сделать такую же только под ПУБ для Украины 7.7?

    Пожалуйста, очень надо.

    Reply
  26. Ироида

    Мне обработка пригодилась, спасибо! И согласна с (24) gutentag

    Reply
  27. Доня

    Спасибо.

    Очень пригодилось, когда переносила остатки из грязной базы

    Reply

Leave a Comment

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