Сравнение оборотно-сальдовой ведомости двух баз и поиск различий в операциях (проводках документов).




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

32 Comments

  1. powerpc
    Reply
  2. echo77

    Механизм сравнения файлов не поможет решить данную задачу?

    Reply
  3. alex_4x

    (1) powerpc,

    А Какая у Вас конфигурация ?

    Reply
  4. ildarovich

    Тем, кто заинтересовался данной темой, предлагаю посмотреть также Компаратор оборотов в информационных базах.

    Reply
  5. alex_4x

    (1) powerpc,

    Все функции общих модулей «БухгалтерскиеОтчеты» и «УправлениеОтчетами» перенес в обработку.

    Попробуйте на вашей базе запустить обработку. Интересно, какая у вас конфигурация (типовая) ?

    Reply
  6. alex_4x

    (2) echo77,

    Конечно можно и простым сравнением файлов. Это просто еще один инструмент, в чём то он может быть удобней, чем просто сравнение файлов. Сравнение файлов «в лоб» не дает результата, так как если в базе перепроводили документы или проводки, даже не меняя их, то в списке операций они могут быть на разных позициях, особенно если время у всех операций одинаковое (на конец или на начало дня). Можно конечно в Excel выгрузить и там функцией ВПР() искать, но это уже дополнительные телодвижения. Тут цель максимально упростить поиск различий.

    Reply
  7. powerpc

    (5) да, типовая:

    Бухгалтерия предприятия КОРП, редакция 2.0 (2.0.57.10) (http://v8.1c.ru/buh8corp/)

    Copyright (С) ООО «1C», 2009 — 2014. Все права защищены

    (http://www.1c.ru)

    Reply
  8. powerpc

    (5) измененную обработку попробовал. теперь так ругается:

    {Форма.Форма.Форма(4,20)}: Переменная не определена (БухгалтерскиеОтчеты)

    ОписаниеПериода = <<?>>БухгалтерскиеОтчеты.СформироватьСтрокуОграниченийПоДатамДляФормы(ДатаНач, ДатаКон);

    {Форма.Форма.Форма(138,2)}: Переменная не определена (БухгалтерскиеОтчеты)

    <<?>>БухгалтерскиеОтчеты.ПоддержкаОднофирменностиДляБухОтчетов(ЭтаФорма, Организация, УчетПоВсемОрганизациям, НЕ НеЗаполнятьНастройкиПриОткрытии);

    {Форма.Форма.Форма(151,2)}: Переменная не определена (БухгалтерскиеОтчеты)

    <<?>>БухгалтерскиеОтчеты.УправлениеПометкамиКнопокЗаголовковКоманднойПанели(ЭтаФорма, ПоказыватьЗаголовок);

    Reply
  9. KapasMordorov
  10. powerpc

    (9) KapasMordorov, http://infostart.ru/public/71572/ тоже кривая какая-то сверка

    Reply
  11. KapasMordorov

    (10)

    В чем кривость?

    Сам вчера пользовался, искал расхождения с копией после перепроведения документов по ТМЦ за 11 месяцев.

    Reply
  12. powerpc

    (11) KapasMordorov, вот именно «искал», там чёрт ногу сломит, строк миллион, опять надо искать внутри что не совпадает

    Reply
  13. alex_4x

    Выражаю глубочайшую благодарность Powerpc за тестирование обработки на БУХГАЛТЕРИИ КОРП. 2.0

    В настоящий момент выявленные им ошибки исправлены, и обработку можно считать совместимой с Бухгалтерией 2.0 КОРП.

    Reply
  14. powerpc

    (13) Отличный отчёт. Последняя версия работает и в 1С8:Бухгалтерия 2.0 КОРП. Спасибо огромное автору. Долгое время не доходили руки сделать такую сверку. Тем более здесь всё так наглядно и удобно! Респект!

    Reply
  15. Maximysis

    {ВнешнийОтчет.ОборотноСальдоваяВедомостьПоСчетуХозрасчетный.МодульОбъекта(424,2)}: Переменная не определена (БухгалтерскийУчет)

    <<?>>БухгалтерскийУчет.ОбработатьВыборСубконто(Элемент, СтандартнаяОбработка, Организация, СписокПараметров, ТипЗначенияПоля);

    в УТП 2.0

    Reply
  16. alex_4x

    (15) Maximysis, А какая у вас конфигурация? В смысле бухгалтерия, упп, версия ?

    Reply
  17. Maximysis

    По валютным счетам падает с ошибкой

    {ВнешнийОтчет.ОборотноСальдоваяВедомостьПоСчетуХозрасчетный.МодульОбъекта(307)}: Ошибка при вызове метода контекста (ПолучитьЗапросОЛЕ)

    ВнешОбрОЛЕ.ПолучитьЗапросОЛЕ();

    по причине:

    Произошла исключительная ситуация (1C:Enterprise 8.2.19.102): {ВнешнийОтчет.ОборотноСальдоваяВедомостьПоСчетуХозрасчетный.МодульОбъекта(667)}: Ошибка при вызове метода контекста (Выполнить)

    {(29, 2)}: Таблица не найдена «Валюта»

    <<?>>Валюта

    Reply
  18. Maximysis

    (16) Адаптировал под свою УТП 2.0, Но ошибка с валютными счетами присутствует и в УПП 1.3

    Reply
  19. chmv

    Интересная идея

    Reply
  20. gull22

    Уря, сработало Комплексная автоматизация, редакция 1.1 (1.1.50.1)

    Но расшифровку по счету 02 не дает

    Reply
  21. alex_4x

    (20) gull22, А что значит «расшифровку не дает» ? — субконто не показывает или что? или не показывает какие документы изменили? Куда нажимаете ? на серое поле (где есть изменения)?

    Reply
  22. phsin

    Спасибо! Бухгалтерия предприятия, редакция 2.0 (2.0.59.5) — работает

    Reply
  23. Taktic

    Изумительная по своей полезности штука!!!

    Проверял на Комплексная автоматизация, редакция 1.1 (1.1.36.1)

    Правда мне пришлось поправить строчку коннектора с

    БазаОле = Новый COMОбъект(«V82.Application»);

    на

    БазаОле = Новый COMОбъект(«V83.Application»);

    И допилить вместо журнала регистрации использование версионирования.

    Reply
  24. alex_phantom

    Добрый день!

    Неверно показывает итоги оборотов по кредиту в подключаемой базе, копирует из текущей.

    Ошибка в модуле объекта, строка 1249, надо заменить строку

    Область.Параметры.ОборотКт2 = Формат(ОборотКт, ФорматПоказателя);

    на

    Область.Параметры.ОборотКт2 = Формат(ОборотКт2, ФорматПоказателя);

    Жаль что нет итогов по количеству.

    А в общем неплохо.

    Reply
  25. AnryMc

    Очень полезная штуковина!

    Можно найти, например, кто накосячил…

    Но я часто (всегда) до своих вмешательств в конфигурацию клиента делаю копию и показываю что после моих вмешательств ничего не изменилось… Обычно проверяю остатки и обороты за период по «Оборотно сальдовой ведомости». ..

    Т.е. если добавить возможность начать с «оборотно-сальдовой ведомости» (по все счетам) то будет удобней сравнивать и «расследовать». Когда ОСВ покажет с какими счетами нужно разобраться…

    Reply
  26. AnryMc

    Отчёт «Различия в операциях…» имеет два блока:

    1) Нет в этой базе

    2) Нет в копии базы

    Т.е. Документ который изменился будет присутствовать в обоих блоках. По моему это не удобно (не логично) ведь он есть в обоих базах…

    Наверно, стоит добавить блок, например, «Различны в базах» и сначала заполнить этот блок а уж затем два предыдущих…

    Reply
  27. zels

    Пара замечений

    1. Нет показа только различий в ОСВ по счету

    2. Почему-то не запоминает адрес подключаемой базы с пользователем и паролем

    Reply
  28. serggo

    А есть ли версия для управлямых форм?

    Reply
  29. alex_4x

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

    Reply
  30. elephant_x

    Хорошая идея, жаль не работает Бухгалтерия предприятия, редакция 2.0 (2.0.65.8)

    В 3.0 понятно почему не работает)

    Reply
  31. dj_casanova

    Доброго времени суток! Есть ли доработки для УТ 3.0? Заранее благодарен за ответ

    Reply
  32. zilot123

    На БП 2.0 обработка работает, но есть замечания:

    1. Для БП КОРП 2.0 подходит плохо, т.к. не проверяет в разрезе подразделений

    2. Нет сверки НУ, ВР, ПР

    3. В обработке не хватает возможности выводить только расхождения.

    Reply

Leave a Comment

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