Загрузка контрагентов по ИНН для Бухгалтерии 2.0




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

19 Comments

  1. Serega-artem

    А данные о контрагенте откуда подгружаются?

    Reply
  2. unk2

    Сервис 1с, которые предоставляется во всех новых типовых конфигурациях. Там определенное кол-во можно загружать бесплатно, а потом нужно платить.

    Но для обычной организации достаточно бесплатного сервиса

    Reply
  3. unk2

    Добавил в описание обработки что нужна подписка на ИТС. Данные берутся с сервисов 1с. Для подписчиков ИТС бесплатно.

    Reply
  4. МимохожийОднако

    Чем отличается от http://infostart.ru/public/419787/

    ?

    Reply
  5. unk2

    Не так давно 1с изменили адреса для загрузки. Я был вынужден переделывать. И после этого выложил на инфостаре.

    Reply
  6. sam1c55

    Конфа Бухгалтерия 2.0 на платформе 8.3 используется в режиме совместимости с 8.2 или 8.3

    Reply
  7. unk2

    Режим совместимости типовой. Как в типовой бухгалтерии 8.2.16

    Reply
  8. user725779

    Приобрели конфу, внедрили в свою база. При нажатии на кнопку Заполнить по ИНН выдает ошибку: {ОбщийМодуль.крэк_ИНН_ОбщегоНазначения.Модуль(284)}: Ошибка при вызове конструктора (WSОпределения)

    Возврат Новый WSОпределения(АдресWSDL, ИмяПользователя, Пароль, ,Таймаут);

    по причине:

    Аутентификация пользователя не выполнена. URL сервиса: https://api.orgregister.1c.ru/orgregister/v7?wsdl

    Заходили на сайт its.1c.ru под указанным в конфе логином и паролем- заходит нормально.

    Reply
  9. unk2

    (8) Напишите мне в личном сообщении. Помогу решить проблему. И завтра еще проверю у себя. Может снова что то изменили 1с.

    Reply
  10. unk2

    (8) Попробовал. Все работает. Внимательнее нужно указывать логин и пароль. Там структура. Может что то напутали. Вот еще раз привожу ф-цию где нужно указать. Уже думаю может это вынести в константы….

    Функция ПараметрыАутентификацииВСервисе()
    
    Возврат Новый Структура(«Логин, Пароль»,
    «LoginITS»,  //логин ИТС
    «MyPassword» // пароль ИТС
    );
    
    КонецФункции
    

    Показать

    Reply
  11. user725779

    Параметры заданы верно, смотрел в отладчике, единственное конфа у нас самописная не БП 2.0. Если сможете могу запустить по амми или вьюверу 11.

    Reply
  12. unk2

    Можно по амми

    Reply
  13. user725779

    Проверили на БП 2.0 релиз 65.7, аналогичная ошибка

    Reply
  14. user725779

    73 473 800 амми

    Reply
  15. user725779

    Попробовали в БП 3.0, все прошло ок

    Reply
  16. unk2

    По коду вроде увидел что все верно. Может все таки регистр букв в пароле? Логин то видел что цифровой…

    Может там что то с больщой буквы…

    Reply
  17. unk2

    Можете мне выслать cf файл конфиграции? Что то не до обновили… Я не понимаю..

    Reply
  18. unk2

    Могу какую нибудь типовую вам обновить чтобы показать что работает… Если вы работаете на типовой

    Reply
  19. user725779

    Спасибо за помощь, все заработало.

    Reply

Leave a Comment

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