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




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

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