Заполнение реквизитов контрагентов по ИНН (1С:Контрагент) для УТ 10.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='\

18 Comments

  1. sokol_6630

    Планируется ли выпуститься версия для управляемых форм(для бухгалтерии 3.0)?

    Reply
  2. lefthander

    (1) В бух 3.0 этот механизм встроен. Или нет? 😉

    Reply
  3. Dilovar9

    (1)

    Планируется ли выпуститься версия для управляемых форм(для бухгалтерии 3.0)?

    (2) В бух 3.0 он уже есть в конфигурации

    Reply
  4. quert

    все чудесно работает. Помогите добавить в форму редактирования контрагента. Заранее спасибо

    Reply
  5. rozer

    (3) пришлось значительно переписать обработку (выдрал из БП3) в части получения адреса — сравните то какой адрес выдает ваша обработка и какой в БП3 с подключенным сервисом «1С:Контрагент»

    Reply
  6. enziger

    На 10.3.13.2 не работает

    Reply
  7. morpheus2

    Пишет ошибку:

    {ОбщийМодуль.ОбщегоНазначения.Модуль(3169)}: Ошибка получения файла описания web-сервиса:

    Ошибка при получении файла с сервера api.orgregister.1c.ru:

    Ошибка аутентификации при доступе к ресурсу: orgregister/v7?wsdl

    ВызватьИсключение(НСтр(«ru = ‘Ошибка получения файла описания web-сервиса:'») + Символы.ПС + ОписаниеФайла.СообщениеОбОшибке)

    Пробовал вводить логин и пароль от разных действующих аккаунтов ИТС. Ни один не работает(((

    Reply
  8. brrart

    Всё работает. Спасибо.

    Жаль только на платформе 8.2 не работает.

    Reply
  9. rahimov_d

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

    Reply
  10. Dilovar9

    (9)

    озможность пер

    К сожалению пока нет, но планирую реализовать.

    Reply
  11. sergey484

    (7) Аналогичная ошибка. Автор, хэлп.

    Reply
  12. Dilovar9

    (11) Какая версия платформы ?

    Reply
  13. pal_vas

    Я так полагаю обработка под 8.1, очень пригодится, автору большое спасибо!!!

    Reply
  14. Dilovar9

    (13)

    так полагаю обработка под 8.1, очень пригодится, автору большое спасибо!!!

    Обработка работает, только под 8.3

    Reply
  15. Jackson_s

    К сожалению, обработка работает только в файловом варианте на СУБД sql сервер выдает ошибку

    {ОбщийМодуль.ОбщегоНазначенияПовтИсп.Модуль(494)}: Ошибка при вызове метода контекста (Заблокировать)

    ВызватьИсключение(КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке));

    Конфигурация Управление торговлей», редакция 10.3 (10.3.47.2)

    Платформа 1С:Предприятие 8.3 (8.3.11.3034)

    Возможно есть способ победить ошибку в sql варианте работы?

    Reply
  16. Dilovar9

    (15)


    15. Евгений Сысоев (Jackson_s) 11.04.18 20:47

    К сожалению, обработка работает только в файловом варианте на СУБД sql сервер выдает ошибку

    {ОбщийМодуль.ОбщегоНазначенияПовтИсп.Модуль(494)}: Ошибка при вызове метода контекста (Заблокировать)

    ВызватьИсключение(КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке));

    Конфигурация Управление торговлей», редакция 10.3 (10.3.47.2)

    Платформа 1С:Предприятие 8.3 (8.3.11.3034)

    Возможно есть способ победить ошибку в sql варианте работы?

    Обработка нормально работает с клиент — серверном варианте, возможно у вас есть ограничения по правам ?

    Reply
  17. Jackson_s

    Права полные. Что-то связанно с блокировками

    {ОбщийМодуль.ОбщегоНазначения.Модуль(2872)}: Ошибка при вызове метода контекста (Заблокировать)

    по причине:

    Использование блокировки допустимо только внутри транзакции в режиме управляемых блокировок!

    В той же базе в файловой версии ошибки нет и все работает.

    Reply
  18. Catine

    Появлялась ошибка:

    {ВнешняяОбработка.ЗаполнениеРеквизитовИНН.Форма.Форма.Форма(210)}: Ошибка при вызове метода контекста (getEntrepreneurRequisitesByINN)

    Ответ = Прокси.getEntrepreneurRequisitesByINN(ВходныеПараметры);

    по причине:

    При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ws.orgregister.company1c.com/}:RequisitesWebServiceEndpointImpl7Service:getEntrepreneurRequisitesByINN()

    по причине:

    При вызове веб-сервиса произошла ошибка. Аутентификация пользователя не выполнена.

    <soap:Envelope xmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»>

    <soap:Body>

    <soap:Fault>

    <faultcode>soap:Server</faultcode>

    <faultstring>SERVER-9: User not found by password and login </faultstring>

    </soap:Fault>

    </soap:Body>

    </soap:Envelope>

    по причине:

    Аутентификация пользователя не выполнена

    Причина: логин не помещался в поле

    Reply

Leave a Comment

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