Свертка 60, Свертка 62, Исправление ошибок взаиморасчетов, Исправление 60, Исправление 62




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

36 Comments

  1. GoodWinSpr

    не забываем ставить плюсы

    Reply
  2. zzerro

    А можно скриншоты и более подробно написать че делает то обработка

    Reply
  3. GoodWinSpr

    (2) добавил скрин и описание….

    Reply
  4. Маруся66

    🙁 ну вот а я обрадовалась…. {Форма.Форма(38)}: Поле объекта не обнаружено (ДокументыРасчетовСКонтрагентами)

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

    Reply
  5. GoodWinSpr

    (4) какая конфигурация ? Работает на БУХ, Возможно взлетит на УПП, никаких УТ и ЗУП 🙂

    Reply
  6. Маруся66

    аааа……вот оно че….а у меня комплексная (((

    Reply
  7. Brida

    Какой ужас.. а топором не пробовали?

    Reply
  8. GoodWinSpr

    (7) Ты о чем?

    Reply
  9. Brida

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

    Reply
  10. GoodWinSpr

    (9) Для этого предусмотрена галка «Этап 3» которую если не ставить то сворачиватся не будет, и как исправить причину если она была в прошлом году? или документов и контрагентов более 1000 …. а перебрасывать недостающую сумму можно, тк это своего рода взаимозачет, только в разрезе одного контрагента/договора. Многие бухгалтера просили меня об этом, для этого и написана обработка. (Кроме того иногда причина — кривые руки, это к сожалению с помощью обработки не исправить 😀 )

    Reply
  11. lady_lace@mail.ru

    Подскажите а нет ли такой же у Вас для 1С:Предприятие 8.2 (8.2.12.96) конфигурация Бухгалтерия предприятия, редакция 1.6 (1.6.25.6). Спасибо.

    Reply
  12. Tishu

    а если УСН, то почему не двигаются регистры по результатам корректировок?

    Reply
  13. GoodWinSpr

    (12) Потомучто эта обработка для бухгалтерского учета, для налогового нет такой… так как для начала необходимо чтоб эти регистры «шли» между собой, и т.д. и т.п., в общем для бухгалтерского она…

    Reply
  14. lady_lace@mail.ru

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

    Reply
  15. Ctrl P

    необходимо сделать свертку в разрезе документов по счету 76.05, в принципе обработка справилась, но т.к. счет АП, то она «задвоила» обороты по всем субконто, и по тем с которыми все в порядке… не можете быстро подсказать как проще избавиться от задвоенных движений

    Reply
  16. Intimatik

    интересная обработка, жаль что рейтинга не хватает

    Reply
  17. fornasov

    спс

    Reply
  18. fornasov

    спсб

    Reply
  19. m818rt

    Для 1с БП 2.0.29 Подходит???

    Reply
  20. profych1

    Поспотрел, но не пользовался

    Reply
  21. rinatkin

    После загрузки остатков в 2.0 из 1.6 образовались некоторые суммы которые не закрываются по текущей деятельности, надеюсь спасет обработка, а то НГ начался уже.

    Reply
  22. vechiy

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

    Reply
  23. al_ban

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

    Reply
  24. tsar

    (4) Маруся66, У меня тоже КА. Закомментировал эту строку, где ругался и вроде заработало. И даже вроде бухгалтер сказала, что цифры вроде верные получились (но досканально ещё не проверила она:)).

    Reply
  25. Alex_Pet

    Похоже автор забросил данную обработку. Жаль. Хотелось бы гарантированно рабочую версию под КА. Плюсану для рейтинга: может что и сдвинется.

    Reply
  26. gala2009

    попробую сейчас эту скачать, так как эту не получается допилить http://forum.infostart.ru/forum24/topic38706/

    до требуемого

    Reply
  27. gala2009

    нет в жизни счастья. у нас Корректировка реализации в сторону уменьшения, аванс естественно не восстановит. скачала обработку, по описанию должна поставить на кредит пассивного субсчета 62.02 с дт 62.01 разницу по Корректировке реализации например 100 руб

    Reply
  28. gala2009

    т е д.б. дт 62,01 кт 62,02 100 руб

    в операции после обработки же:

    дт 62,01 кт 62,02 -100 руб

    дт 62,01 кт 62,02 100 руб

    что это значит? прокрутилось и ничего не изменилось. убирать вручную например все красные проводки?

    это тоже проблемы не решило, разбегается по третьему субконто

    Reply
  29. gala2009

    наконец то в последнем релизе БП 2.0.43.6 в корректировке поступления и реализации сделали зачет и восстановление аванса. это радует!

    Reply
  30. oleg212

    Плюсону! Хорошая обработка

    Reply
  31. sdf_tm

    спасибо. очень помогло.

    но! второй этап не работает для 62 счета. а всё потому, что попутано правое с левым в



    ИначеЕсли Прав(Счет01.Код,2)=»62″ тогда

    +рекомендация: добавить еще один этап — нулевой, в котором третье субконто сворачивается в один служебный «документ расчетов с контрагентами»

    а для совсем запущенных случаев — еще и в один договор. (да — такое тоже встречается…)

    Reply
  32. GoodWinSpr

    Спасибо за поиск ошибки, поправил!

    Reply
  33. fokin

    Правильно понимаю — обрабатываются все выбранные счета по всем контрагентам?

    И нельзя выбрать контрагента — в коде:

    Контрагент=Неопределено;

    Reply
  34. yase

    Обработка полезная, работа проделана- видно. Спасибо.

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

    Reply
  35. yase

    (33) fokin, Да, в текущей версии почему-то автор поставил заглушку на Контрагента. Но в принципе добавить выбор контрагента на форму, закомментировать эту строку и раскомментировать установку параметра Контрагент в запросах и должно работать с отбором по контрагенту (причем по группе тоже можно)

    Reply
  36. fokin

    ну я то так и сделал)

    просто вопрос — зачем автор убрал сей функционал

    Reply

Leave a Comment

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