Сравнение остатков или оборотов двух регистров — накопления или бухгалтерии, версия 2.3




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

47 Comments

  1. artbear

    Прошло чуть более года, как я выложил исправленный вариант по сравнению с авторским, исходным вариантом.

    Работа обработки проверена в течение года на различных конфигурациях типа УПП.

    Reply
  2. coch

    Как раз сегодня возникла необходимость сравнить пару регистров. Спасибо.

    Reply
  3. Abadonna

    + и см. http://infostart.ru/projects/1386/?p=1#comm13 (мой 13 на твой 12)

    Reply
  4. John_Bel

    Спасибо!

    Reply
  5. alexk-is

    …картинка где?

    Reply
  6. artbear

    (5) Забыл, будет.

    Reply
  7. GerHard

    Укажите область применения — внутри одной базы. Или я чего не понял?

    Reply
  8. artbear

    (7) Я надеялся, что если в описании не написано про разные базы, то подразумевается одна 🙂

    Reply
  9. artbear

    Используется система регистрации ошибок http://www.1cpp.ru/bugs/

    Желательно ошибки продукта регистрировать именно в этой системе (Багзилла)

    Reply
  10. artbear

    Используется система регистрации ошибок http://www.1cpp.ru/bugs/

    Желательно ошибки продукта регистрировать именно в этой системе (Багзилла)

    Обратите внимание, что «регистрация/авторизация идет только по e-mail, а не нику»

    Reply
  11. artbear

    (7) Был не прав, возможность работы с другой базой есть через COM-подключение.

    Честно говоря, лично пока не пользовался 🙂

    Зарегил ошибку http://www.1cpp.ru/bugs/show_bug.cgi?id=4297

    чтобы не забыть доработать описание на сайте + доку

    Reply
  12. zakzai

    млин… после кнопки «Анализ» можно откатит изменения?

    может кнопку переименовать — «выполнить»?

    Reply
  13. artbear

    (12) Хочется одной большой кнопки 🙂 ?

    Обработка только показывает различия, сама она не выполняет и не может выполнять каких-либо изменений.

    Подумай сам, каким-образом можно сделать универсальный откат?

    ЗЫ или я тебя не понял 🙁

    Reply
  14. zakzai

    (13)… точно, ложная тревога 🙂 смутила таблица с полем «статус» — «строка удалена» :-))

    Reply
  15. zakzai

    может тогда добавить создание док-та «корректировка записей регистров» с заполнением данных анализа ?

    Reply
  16. artbear

    (14) Ага, в новой версии есть спец.строка расшифровки статуса, а то иногда сам путаюсь.

    (15) Боюсь, что этот вариант уже будет не очень универсальным!

    Все-таки не везде есть подобный док 🙁

    Но можешь оформить заявку/пожелание 🙂

    Вот прямой линк на оформление

    http://www.1cpp.ru/bugs/enter_bug.cgi?product=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%­B5%20%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%BE%D0%B2%­20%D0%BD%D0%B0%D0%BA%D0%BE%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%­8F%20%D0%B8%2F%D0%B8%D0%BB%D0%B8%20%D0%B1%D1%83%D1%85%D0%B3%­D0%B0%D0%BB%D1%82%D0%B5%D1%80%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%­8F%201%D0%A1%208.1

    Reply
  17. artbear

    (16+) Желательно ошибки продукта регистрировать именно в этой системе (Багзилла) — регистрация/авторизация только по e-mail

    Reply
  18. alexandr_astafiev

    мне нужно было сравнить данные регистра накопления «НДС начисленный» с регистром бухгалтерии (в поле Регистр 2 подставил»Журнал проводок (бухгалтерский учет)» ) со счетом 90.3 Налог на добавленную стоимость. Оказалось — чтобы установить галочку на нужном счете пришлось переключиься в режим «Регистр накопления << — >> регистр накопления» , установить галку , в потом снова в положение «Регистр накопления << — >> регистр бухгалтерии» без этого нет доступа к пометкам в плане счетов. В «измерения сравнения» оказалось что можно выбрать только организацию. Но при таком раскладе анализ вообще не запустился , выдав сообщение «»При сравнении с регистром бухгалтерии д.б. выбран только один показатель (ресурс)!»»

    Reply
  19. artbear

    1. В измерениях сравнения можно выбрать только ресурсы, совпадающие по имени. В твоем случае это только Организация.

    2. Для сравнения ресурсов регистра накопления и бухгалтерии можно выбрать только один ресурс регистра накопления, а у тебя наверняка галка выбора стоит на всех ресурсах этого регистра.

    3. «Чтобы установить галку на нужном счете» — у меня вроде все верно 🙁

    Reply
  20. anig99

    Идея хороша…только вот реализация незавершена. Отчет глючный интерфейс кривой.

    Reply
  21. artbear

    (20) Ругать легко, предложения по исправлению или недоработкам есть?

    Reply
  22. anig99

    (21) да. есть. Отладить нормально работу через COM. Размещение элементов сделать более аккуратным. Разрешить сравнивать регистры бухгалтерии между собой.

    Reply
  23. artbear

    (22) 1. «Более аккуратным» — это как?

    Если есть варианты, плиз, выложи форму со своими исправлениями.

    2. Пока нет планов доработка обработки для сравнения регистров бухгалтерии.

    3. Что в работе через КОМ не нравится?

    Reply
  24. anig99

    (22) 3. Как минимум не работает. При попытке поставить галочку выдает Invalid class string

    2. Форма подключения к COM ужасная. Сама форма (основная) не масштабируется, все элементы вроде как бы выровнены, но разбросаны хаотично. Что к чему и в какой последовательности — непонятно.

    Reply
  25. anig99

    читай 2. как 1.

    Reply
  26. artbear

    (25) Работу через КОМ, честно говоря, я лично ни разу не тестировал и не занимался правками 🙁 — это осталось наследие от первого автора.

    Reply
  27. anig99

    (24) по оформлению — можно стрелочками указать последовательность заполнения полей и таблиц.

    Reply
  28. artbear

    (24) Какими стрелочками? и какую последовательность заполнения?

    не понял, поясни

    Reply
  29. anig99

    (28) Чтобы всё взлетело нужно заполнить необходимые поля и таблицы. Можно указать в какой последовательности это нужно делать. Сделать это или рисунками стрелочками или через порядок следования (но тогда ветвей не будет). Блок-схемы и бизнес-процессы видел?

    Reply
  30. anig99

    (30) значит я чайник… Потому как было легче написать своё, чем разобраться в этом…

    Видел моё сравнение через COM? — минимализм + help.

    Reply
  31. DrZombi

    (0) Я смотрю вы у нас тоже не блещете уникумом, качать вломы, но по постам понятно что много очень притензий, минус не ставлю, я не злой 😉

    Reply
  32. artbear

    (32) Ответил в исходной ветке

    http://infostart.ru/ajax/show_comment.php?t=29431&c=8

    «Очень много претензий» — ты бы их суть прочитал сначала.

    Reply
  33. artbear

    hame1e00n — свинтус 🙁 или девочка — минусует только на базе эмоций 🙁

    Обоснование в обсуждении его разработки http://infostart.ru/public/63018 начиная с 5 поста.

    Reply
  34. Sniper9mm

    у меня вот такие данные, что это значит, и как это можно исправить??? заранее большое спасибо 🙂

    23 Изменена Регистр1:Количество=22.

    8 Изменена Регистр1:Количество=7.

    2 Изменена Регистр1:Количество=1.

    Reply
  35. artbear

    (38) Еще один мститель 🙂 — не нравится ему мой минус за его платную разработку http://infostart.ru/public/74330/#comm — смотрим комменты (43),(44) и далее

    ЗЫ а вот предыдущие мстители — смотрим аналоги (33)-(36)

    Reply
  36. husky

    не функционирует на УПП 1.3 (8.2)…..Можно ли доработать?

    Reply
  37. anig99

    (40) попробуй в коде поменять V81.COMConnector на V82.COMConnector

    Reply
  38. Sniper9mmm

    когда выбираешь регистр накопления и бухгалтерии материться

    {Форма.Форма.Форма(412)}: Ошибка при вызове метода контекста (Выполнить)

    ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

    по причине:

    по причине:

    {(1, 1)}: Ожидается выражение «ВЫБРАТЬ»

    Reply
  39. irishka77

    Счет нужно выбрать.пощелкай по регистрам и появится выбор

    Reply
  40. revril

    спасибо))полезно!!

    Reply
  41. Гость

    спасибо за обработку

    Reply
  42. Bassgood

    Скринов обработки так и не появилось =(

    Reply
  43. Bomba1911

    спасибо за обработку. очень кстати)

    Reply
  44. antares_of

    А подскажите мне пожалуйста. Если мне нужно сравнить остатки товаров в двух базах УТ 8.2, мне подойдет эта обработка или нет?)

    Reply
  45. xdim

    Попробую ее в клиент-серверной под 8.2

    Потом выложу вместе со своей если автор не против?

    Reply
  46. xdim

    подключилась, но выдала ошибку при сравнении…

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

    Буквально перед закрытием месяца база перестала бэкапироваться и подавала опасные знаки. Поэтому пришлось ее пару раз ТИИ прогнать с удалением и очищением. Это конечно не прошло бесследно и пришлось пару сот записей регистра найти в базе до ТИИ. И создать с теми же реквизитами движения.

    Reply
  47. user705329_elenapavros

    когда выбираешь регистр накопления и бухгалтерии материться

    {Форма.Форма.Форма(412)}: Ошибка при вызове метода контекста (Выполнить)

    ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

    по причине:

    по причине:

    {(1, 1)}: Ожидается выражение «ВЫБРАТЬ» — напишите как исправить или верните деньги

    Reply

Leave a Comment

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