Сравнение взаиморасчетов с контрагентами УТ с БП




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

70 Comments

  1. aspirator23

    Скачало 25 — плюс 1 (спасибо VladimirS). Кроликоферма плачет.

    Reply
  2. dosen

    У меня сделано так http://infostart.ru/public/65099/

    правда из БП с УТ 😀

    Reply
  3. aspirator23

    (2) — это прямо какое-то дежавю. Даже разница в один день.

    Reply
  4. salve

    а с УТ — БП 2.0 будет работать?

    Reply
  5. aspirator23

    Завтра посмотрю.

    Reply
  6. salve

    (5) В своей тестовой базе, для двух обработок выдает:

    Не удалось подключиться к базе данных бухгалтерии

    Reply
  7. aspirator23

    (6) Нажми кнопку «Настройки» для сверки контрагентов или Склады/настройкиподключения для сверки товарных остатков. Там есть закладка Подключение. Проверь настройки. Там можно указывать также Windows-авторизацию.

    Reply
  8. aspirator23

    (4) С БП 2.0 работает.

    Reply
  9. salve-salve

    (8) С БП 2.0 под платформу 8.2, верно?

    буду тогда разбираться, в чем у меня опять проблема(

    Reply
  10. aspirator23

    (9) Я проверял на 8.1 БП2.0. Там работает. А вот на 8.2 нет — у меня она не установлена. В обработке код открыт, можно посмотреть. Возможно там COM-соединение иначе описывается. Если это так, то это буквально пару строк поправить Посмотрю, если у кого-нибудь стоит 8.2 проверю.

    Reply
  11. salve-salve

    (10) да, чуть иначе:

    в модуле изменить:

    V81 на V82

    Reply
  12. aspirator23

    (11) Спасибо, добавлю возможность выбора платформы.

    Reply
  13. a_a

    Спасибо за обработку очень пригодилась!!

    Reply
  14. aspirator23

    (13) Спасибо за поддержку 🙂

    Reply
  15. Eugen_Vip

    Да, обработка супир!!! еще бы забабахать расшифровку до документов. Но это я уж наверное сам.

    Reply
  16. tani6e4ka

    а по номенклатуре возможно сделать такое сравнение?

    Reply
  17. Поручик

    И куда мы смотрим? На основной странице обработки = «Сравнение товарных остатков УТ с БП»

    Reply
  18. aspirator23
    tani6e4ka пишет:

    а по номенклатуре возможно сделать такое сравнение?

    (16) Как 17 замечает, вот сравнение номенклатуры http://infostart.ru/public/60016/

    Reply
  19. orsprog

    Спасибо за обработку очень пригодилась!!еще бы расшифровку по документам…и по номенклатуре сделать сравнение…и можно продавать…

    Reply
  20. Re:аниматор

    Плохо что нет отбора к примеру по организации.

    Reply
  21. aspirator23

    (20) Согласен, это не делал. У нас одна организация — одна база.

    Reply
  22. a_a

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

    Reply
  23. zealousbit

    Спасибо за разработку. А то когда постоянно бухгалтер портачит, уже никаких сил не остается.

    Reply
  24. izz

    Спасибо, очень помогает в работе!

    Reply
  25. Vovanich

    Для ут 11 такую бы обработинку.Может есть у кого?

    Reply
  26. margo2007

    А если в УПП два раза запустить, то получится сравнение?

    Reply
  27. aspirator23

    (26) Если подразумеваешь сравнить две УПП, то скорее всего сработает.

    Но с особенностью:

    1. в УПП должен быть регистр партии товаров такой же как и в УТ. Говорю должен быть, потому что нет УПП проверить.

    Если он есть, отчет заработает.

    2. в запускаемой УПП будет выборка по регистру остатков, в подключаемой по регистрам бухгалтерии.

    Reply
  28. margo2007

    (27)

    Не сработала.

    Reply
  29. aspirator23

    (28)А на чем упала?

    При выборке из внешней базы или из той в которой запускалась?

    Reply
  30. margo2007

    (29)

    Она не падала. Она молча отработала.

    Никаких сообщений и никаких результатов.

    Хотя расхождения между БУ и УУ точно есть.

    Reply
  31. GAGArinREcorDS

    Подскажите пожалуйста, а если УТ 8.1, а БП 8.2, обработка будет работать? И если нет то, подскажите, что прописать в модуле. Пробовал первую загрузку СверкаКонтрагентов.zip она не сработала. Пишет не удалось подколючиться к базе

    Reply
  32. aspirator23

    (31) Открой обработку. Найди там строку с подключением в процедуре ПодключитьсяКБухгалтерии()

    Для 81 нужно там где V82.ComConnector заменить на V81.ComConnector

    Если пароль, логин, путь для подключения верные, должно подключиться.

    Reply
  33. GAGArinREcorDS

    Спасибо, что ответили. Открыл конфигуратор 81, сделал там так:

     состояние(«Подключение к базе бухгалтерии…»);
    V82=Новый COMОбъект(«V82.COMConnector»);
    Попытка
    ВнешняяБД=V82.Connect(СтрокаПодключения);
    Возврат ВнешняяБД;
    

    Всё равно, выдаёт «Ошибка подключения».

    Паролей никаких нет, единственное что смущает, что путь к БД, он ищет .CD, а у меня база .1CD

    Reply
  34. aspirator23

    (33)Если бухгалтерия на платформе 81 то должно быть так «V81.COMConnector»

    Имя файла неважно. Главное каталог правильный выбрать, если это файловая база.

    Reply
  35. GAGArinREcorDS

    Бухгалтерия у меня 8.2, а Управление Торговлей 8.1

    Reply
  36. aspirator23

    (35) Должно работать. Сколько сталкивался с такой ошибкой: либо неправильно указан логин, пароль, путь,

    права. Кстати вспомнил. Еще была ошибка. Не зарегистрирован ComConnector

    Попробуй зарегистрировать его: regsvr32.exe …. comcntr.dll

    Reply
  37. GoodWinn

    привет, скачала, сконвертировала, открыла, настроила пути подключения, база файловая и вот: ошибка «Не удалось подключиться к базе данных бухгалтерии»

    что с ней делать, как быть, очень нужно что бы работало, с файловой вообще кто пробовал?

    платформа 8.2

    Reply
  38. aspirator23

    (37) работает с файловыми и серверными базами.

    -Проверь правильность пути.

    -почитай по поводу comcntr в пункты 36,33 возможно поможет.

    -посмотри комментарии по обработке по товарным остаткам, там их много. Возможно один из случаев твой.

    Reply
  39. aspirator23

    (37) …скачала, сконвертировала… Вот тут похоже ошибка.

    Скачать нужно версию для 82. Это вторая. Либо если не хочешь второй раз скачивать сделай как описано в (33)

    Reply
  40. GoodWinn

    (39) да, действительно, не ту скачали мне, спс, сразу не увидела.

    Reply
  41. GoodWinn

    (39) отредактировала согласно (33) и вуаля, все работает, спасибо огромное.

    Reply
  42. son_v

    Спасибо большое) Как раз вовремя. Немного доработали под свою древнюю УТ и добавили отбор по организации, а так же сравнение контрагентов по коду, так как наименование волшебным образом волшебными руками меняется, а код остается неизменным.

    Reply
  43. son_v

    Мучали обработку целый день). Не закрывает соединение в Бухгалтерии и все тут. Базы sql обе.

    Reply
  44. aspirator23

    (43) Там если код правили, то обратили внимание на то что соединение не закрывается после формирования отчета. Сделал так специально — в том случае, если нужно построить несколько отчетов, не нужно снова открывать соединение.

    Если такой вариант не подходит, то можете закрывать сессию. Соединение устанавливаете в Неопределено.

    Или пришлите — поправлю.

    Reply
  45. son_v

    Да, соединение закрыли в Неопределено, а так же все переменные, которые соединение используют. Те же массивы для сбора данных из Бухгалтерии. Спасибо за обработку еще раз). Пользователи как увидели обработку, еще пару своих пожеланий озвучили. Отбор по организации, по подразделениям (как реквизит Договора).

    Reply
  46. Re:аниматор

    Отчет не правильно выводить ссылку на контрагента когда к примеру есть одинаковые наименования, но разные ИНН

    В отчете включен режим поиска «ИНН и КПП» данные правильно, а вот ссылку выдает на другого контрагента с тем же наименование, но разным ИНН

    Причина в функции ПолучитьОбъектДляРасшифровки() она ищет ссылку на объект контрагента по наименованию, а при «ИНН и КПП» нужно искать по ИНН

    Переделал так и все работает как нужно

    Функция ПолучитьОбъектДляРасшифровки(ИмяКонтрагента, ИНН, Договор=»»)
    
    Если СпособПоиска=»ИННКПП» Тогда
    ТекКонтрагент=Справочники.Контрагенты.НайтиПоРеквизиту(«ИНН», ИНН);
    Иначе
    ТекКонтрагент=Справочники.Контрагенты.НайтиПоНаименованию(ИмяКонтрагента,1);
    КонецЕсли;
    Если ПустаяСтрока(Договор) Тогда
    возврат ТекКонтрагент;
    ИначеЕсли ТекКонтрагент<>Справочники.Контрагенты.ПустаяСсылка() Тогда
    ТекДоговор=Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Договор,1,,ТекКонтрагент);
    Возврат ТекДоговор;
    Иначе
    Возврат ТекКонтрагент
    КонецЕсли;
    
    
    КонецФункции // ПолучитьОбъектДляРасшифровки()
    
    

    Показать

    Reply
  47. aspirator23

    (46) Re:аниматор, спасибо. Добавлю в обработку.

    Reply
  48. Re:аниматор

    Столкнулся с такой проблемой:

    Есть 2 сервера приложения. На одном SRV-1 установлена УТ платформа 8.3.4 на другом SRV-2 БП 3.0 платформа 8.3.5 (платформа 8.3.4 тоже установлена на SRV-2).

    При формировании отчета из УТ (Платформа 8.3.4) с соединением с базой БП 3.0 (Платформа 8.3.5) выходит ошибка:


    {ВнешняяОбработка.СверкаОстатковКонтрагентов.МодульОбъекта(41)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.4.496)

    Есть способ победить?

    Reply
  49. aspirator23

    (48) Re:аниматор, Ты соединяешься соm-соединением 8.3.4 с сервером 8.3.5

    Решений несколько:

    -Установить везде один сервер, например 8.3.5

    -установить на компьютере, где запускается обработка кроме клиента 8.3.4 еще и клиента 8.3.5

    -подменить на компьютере, где запускается обработка, файл comcntr.dll версии 8.3.4 на 8.3.5 скопировав его с компьютера где развернут клиент 8.3.5. Может потребуется его зарегистрировать.

    Во втором и третьем случае нужно понимать, что если com-соединения используются где-то еще, кроме данной обработки, они могут перестать работать.

    Reply
  50. Re:аниматор

    (49) в том и дело, что

    Установить везде один сервер, например 8.3.5

    это исключено. Разделение из за глючности 8.3.5, УТ на 8.3.4 (на 8.3.5 зависает) БП 3.0 на 8.3.5

    ГЛЮЧНАЯ Платформа 8.3.5

    установить на компьютере, где запускается обработка кроме клиента 8.3.4 еще и клиента 8.3.5

    так тоже не работает

    подменить на компьютере, где запускается обработка, файл comcntr.dll версии 8.3.4 на 8.3.5 скопировав его с компьютера где развернут клиент 8.3.5. Может потребуется его зарегистрировать.

    Рискованно …

    Походу придется писать другой вариант этой обработки. Из УТ выгружать данные в файл, в БП 3.0 отчет формировать по бух. регистрам с загрузкой данных из файла и сверять. как то так видать придется сделать тогда

    Reply
  51. aspirator23

    (50) Re:аниматор, «….так тоже не работает …» Второй вариант у тебя не работает скорее всего из-за того что comcntr.dll от 8.3.5 не зарегистрировался. Обычно при установке он регистрируется автоматически. Можно его зарегистрировать вручную.

    Reply
  52. Re:аниматор

    Побывал регистрировать в ручную версию 8.3.5 и 8.3.4 всё равно НЕ работает …

    Reply
  53. aspirator23

    (52) Re:аниматор, немного не так. У клиента может работать только один comcntr. Т.е. регистрировать нужно только одну библиотеку — ту которая будет использоваться.

    Reply
  54. Re:аниматор

    (53) так вот я регистрировал, проверял, регистрировал проверял. выдает ошибку…

    Бухгалтерам обработка очень понравилась, а теперь плачут, что взаиморасчеты не могут сверить 🙂 уже всё перепробовал.

    установить везде 8.3.5 пока нельзя, зависает УТ на 8.3.5 …

    regsvr32 C:Program Files1cv828.3.4.496incomcntr.dll

    ИЛИ

    regsvr32 C:Program Files1cv828.3.5.1119incomcntr.dll

    Ошибка всегда одинаковая

    {ВнешняяОбработка.СверкаОстатковКонтрагентов.МодульОбъекта(41)}: Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ (8.3.5.1119) отличается от версии корневого модуля ‘core83’ (8.3.4.496)
    Reply
  55. aspirator23

    (54) Re:аниматор, да ошибка явно в нестыковке версий платформы. Как вариант — а в конфигурации в 8.3.5 какой режим совместимости? Этим не пробовал поиграться?

    Reply
  56. Re:аниматор

    (55) Бухгалтерия 3.0 в режиме поддержки 8.3.4 (этот режим установлен разработчиками 1С)

    можно конечно для БП установить и 8.3.4 (рекомендуется 8.3.5), но скоро поддержка на 8.3.4 в БП 3.0 будет отключена и мин. версия платформы будет 8.3.5 там под 8.3.4 100% не зайти

    Reply
  57. Re:аниматор

    Я вот думаю, сделать сверку через внешний файл, ну к примеру с УТ выгружать в файл, а в БП 3.0 загружать файл, формировать данные и сверять.

    По видимому так и придется сделать …

    Reply
  58. aspirator23

    (57) Re:аниматор, это конечно хлопотно, тебе прийдется дописывать, но радует что это все временно. Когда перейдете полностью на 8,3,5 с этим проблем не будет.

    Reply
  59. Re:аниматор

    (58) временно?

    ГЛЮЧНАЯ Платформа 8.3.5

    ну не знаю на сколько это временно… Подготавливаем грозное письмо франчи, по нашей проблеме.

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

    Reply
  60. Re:аниматор

    Сделал через выгрузку в файл. С БП 3.0 выгружаю файл в формате xml с данными и параметрами отчета (период, организация и т.д.). В УТ 10.3 в форму загружаю файл xml, автоматически по параметрам заполняются данные и сверяются с данными файла. Выводится протокол сверки. Получилось просто для пользования и быстро. Для себя решил проблему подключения между версиями одной платформы по ole.

    Reply
  61. aspirator23

    (60) Re:аниматор, хорошее решение.

    Reply
  62. Asenka

    С Бухгалтерией 3.0 и УТ 10.3 будет работать?

    Reply
  63. aspirator23

    (62) Asenka, будет. Обработка запускается в Торговле. Общая структура хранения данных БП20 и БП30 одинакова.

    Reply
  64. Asenka

    (63) aspirator23, Обработка работает отлично. Но если подключается из УТ к базе Бухгалтерии 3.0 пользователь с правами НЕ Администратор (в Бухгалтерии), то подключение не проходит. Как решить проблему?

    Reply
  65. aspirator23

    (64) Asenka, Это объяснимо. При подключении используется com-соедниение. Скорее всего в бухгалтерии у это пользователя нет прав на внешнее соединение.

    Нужно его добавить.

    Reply
  66. zavyzka

    А для УТ 11 что нибудь подобное есть?

    Reply
  67. aspirator23

    (66)Можно написать

    Reply
  68. dachnik

    Спасибо! Немного изменил и переписал как внешнюю печатную форму. Удобно вызывать из любого документа и сразу иметь данные по контрагенту/договору. Если автор не против, могу выложить свой модифицированный вариант…

    Reply
  69. natterru

    А для УТ 10.1 и БП 3.0 будет работать?

    Reply
  70. aspirator23

    (69) УТ 10.1 нужно посмотреть регистры. Конфигурацию выложите?

    Reply

Leave a Comment

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