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




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

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 не будет опубликован. Обязательные поля помечены *