Получение кода ФИАС для УПП 1.3 через веб-сервис 1С




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

36 Comments

  1. leon131167

    Добрый день.

    Вываливается с ошибкой

    {Форма.Форма.Форма(7,32)}: Конструктор не найден

    ЗащищенноеСоединение = Новый <<?>>ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

    {Форма.Форма.Форма(8,24)}: Конструктор не найден

    WSОпределения = Новый <<?>>WSОпределения(«https://api.orgaddress.1c.ru/orgaddress/v1?wsdl», Логин, Пароль, ,10, ЗащищенноеСоединение);

    {Форма.Форма.Форма(10,17)}: Конструктор не найден

    Сервис = Новый <<?>>WSПрокси(WSОпределения, «http://www.v8.1c.ru/ssl/AddressSystem», «AddressSystem», «AddressSystemSoap12»,

    Reply ↓
  2. AlekSo

    (1) Добрый. А на какой платформе? Такое возможно на платформе 8.2 Там если я не ошибаюсь не было защищенного соединения. Я тестировал хоть и на 8.3, но в режиме совместимости версии 8.2.13. По крайней мере отсюда должно работать.

    Reply ↓
  3. AlekSo

    Только-что обнаружил, что возвращается код именно дома! Почему-то не возвращает код помещения. Работаю над этим!

    Reply ↓
  4. deman_ru

    (3)Исправили?

    Reply ↓
  5. AlekSo

    Пока жду ответа от 1С.

    Reply ↓
  6. katnevamk

    УПП, редакция 1.3 (1.3.106.2) всё прекрасно работает!!! А то мы замучились бухгалтерам вставлять коды с сайта ФИАС, ожидая когда разработчики сделают. Спасибо!

    Reply ↓
  7. user960210

    Возражу. УПП, редакция 1.3 (1.3.106.2) . по прежнему возвращает код дома. Ждём исправления.

    Reply ↓
  8. androidT1C

    Смотрю, какой код ФИАС пишет 1С в реестр больничных (по пилотному проекту ФСС) в ЗУП КОРП 3.0: туда вообще пишется код улицы! Код дома пишется только если НЕ найден (пустой) код ОКТМО по региону.

    Поэтому мне для реестров в ФСС кода дома вполне достаточно 🙂

    Reply ↓
  9. AlekSo

    Если бы ещё понимать как этот код используется в ФСС. Возможно им действительно достаточно кода дома.

    1С отказывается давать консультации по веб-сервису. Пока пробую разные комбинации вставки номера квартиры в XDTO. Но похоже дело всё же в том, как это обрабатывает веб-сервис. Возможно в их задачи просто не входит определение кода помещения.

    Reply ↓
  10. akitayev

    Если зайти на сайт fias.nalog.ru, то для нашего областного центра (Великий Новгород) просто отсутствуют номера помещений (квартир). И до настоящего момента отсылаем реестры в ФСС с пустым кодом ФИАС.

    Reply ↓
  11. AlekSo

    (10)С пустым он как-раз не отправляется. По крайней мере в заявлении. Должен быть заполнен хоть чем-то. Хоть всеми единицами. Похоже его никто не проверяет. Вот если стоит признак отправки заказным письмом, то они могут поставить вместо адреса только код, и тогда письмо не дойдёт. Но вряд-ли они уже ввели такую технологию.

    Reply ↓
  12. androidT1C

    У нас (Нижний Новгород) пока ФСС принимает с пустым кодом. Сколько это продлится — хз.

    Reply ↓
  13. userGJ

    А есть где-то нормативный документ, в котором регламентировано какой ФИАС нужен в реестрах ФСС: код дома или код поиещения (квартиры)?

    Reply ↓
  14. AlekSo

    (13) Я такого пока не нашёл.

    Обнаружил интересную весчь!

    Создал больничный лист, указал сотрудника. В заявлении в поле адреса встает адрес только до дома! Хотя в контактной информации физлица квартира есть. Похоже всё-таки везде указывается именно дом.

    Reply ↓
  15. arakelyan

    ЗУП 2.5 не проходит аутентификацию. (ИТС Проф действующий)

    Reply ↓
  16. AlekSo

    (15) Сделал несколько попыток. Действительно пару раз выпадала ошибка на аутентификацию. Но при следующей попытке всё сработало. Попробуйте ещё раз. Возможно сервер был занят.

    Reply ↓
  17. arakelyan

    (16) Всё ок, спасибо

    Reply ↓
  18. ANDRU48DOP

    Адаптировал на платформе 8.2.19.130

    Проверил также по сайту http://fias.nalog.ru/ExtendedSearchPage.aspx

    На сайте бьется мой адрес до квартиры, а в вашей обработке только до дома?

    Можно ли изменить, чтобы бился в обработке id до квартиры, как на сайте http://fias.nalog.ru/ExtendedSearchPage.aspx ?

    Reply ↓
  19. ANDRU48DOP

    При повторном запросе выходит иногда выходит

    {ВнешняяОбработка.фиас_ПолучениеКодаФИАС.МодульОбъекта(27)}: Ошибка при вызове метода контекста (Ping)

    Результат = Сервис.Ping(КодЯзыка, Метаданные.Имя);

    по причине:

    При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://www.v8.1c.ru/ssl/AddressSystem}:AddressSystem:Ping()

    по причине:

    При вызове веб-сервиса произошла ошибка. Ошибка HTTP: HTTP Status 403.

    .

    403 Forbidden

    nginx

    Reply ↓
  20. sea123

    (18) Подскажите, что именно было сделано под платформу 8.2?

    Я вроде бы привел параметры в соответствие с платформой, но постоянно получаю вот такую ошибку.

    Новый WSОпределения(«https://api.orgaddress.1c.ru/orgaddress/v1?wsdl», Логин_, Пароль_,10) {(1)}: Ошибка при вызове конструктора (WSОпределения)

    Reply ↓
  21. ANDRU48DOP

    (20)

    Подскажите, что именно было сделано под платформу 8.2?

    Я вроде бы привел параметры в соответствие с платформой, но постоянно получаю вот такую ошибку.

    Новый WSОпределения(«https://api.orgaddress.1c.ru/orgaddress/v1?wsdl», Логин_, Пароль_,10) {(1)}: Ошибка при вызове конструктора (WSОпределения)

    Оставить вот так WSОпределения(«https://api.orgaddress.1c.ru/orgaddress/v1?wsdl», Логин_, Пароль_);

    и прокси только три первых параметра

    Сервис = Новый <<?>>WSПрокси(WSОпределения, «http://www.v8.1c.ru/ssl/AddressSystem», «AddressSystem», «AddressSystemSoap12»)

    на 8.2.19.130 взлетело на 19.90 не работает

    Reply ↓
  22. AlekSo

    Добавил версию для платформы 8.2. Проверял на 8.2.19.130.

    Reply ↓
  23. AlekSo

    (18)Может, конечно, это от адреса зависит, но у меня и на 8.2 такой же ответ.

    Reply ↓
  24. ANDRU48DOP

    (22)

    Добавил версию для платформы 8.2. Проверял на 8.2.19.130.

    Скажите, идентификатор ФИАС только до дома (от чего это зависит)?

    На сайте фиас налог до квартиры бьется.

    Reply ↓
  25. AlekSo

    поскольку 1С не даёт никаких описаний своего веб-сервиса, то всё разбирается экспериментальным путём. пакет для запроса разрабатывался по описаниям ФИАС. Почему не возвращается код помещения — определить не могу.

    Reply ↓
  26. SashasDas

    Работало до предыдущей пятницы. Теперь на строке WSОпределения = Новый WSОпределения(«https://api.orgaddress.1c.ru/orgaddress/v1?wsdl», Логин, Пароль,10) вылетает с ошибкой «При создании описания сервиса произошла ошибка. https://9011371:xxxxxxx@api.orgaddress.1c.ru/orgaddress/v1?wsdl

    по причине:

    Ошибка работы с Интернет: Peer certificate cannot be authenticated with given CA certificates». Что-то поменялось у 1С-ников?

    Reply ↓
  27. AlekSo

    (26)У меня работает по прежнему. Если ругается на сертификат, то может причина в обновлении винды?

    Reply ↓
  28. SashasDas

    Не обновлял. Движок 8.2.19.130. На винде обновление отключено. Сейчас просто вставил метаданные из БП в КА, и ФИАС получаю по связи кода кладр между РС АдресныеОбъекты и АдресныйКлассификатор. Недостаток: связь вижу на уровне улицы — не глубже.

    Reply ↓
  29. Dmtr666
    Reply ↓
  30. dendzu

    Обработка хорошая (спасибо), помогла в моем проекте, но брал только уникальный код дома. Уникальные коды региона, города, населенного пункта — вот этих данных жаль нет в этой проге. Пришлось брать другим путем. Код смотрел Ваш, но не стал углубятся — времени не было.

    Reply ↓
  31. dendzu

    (30)Еще добавлю. Из 146 сотрудников из списка таки не нашел УИН домов у 5 -ых. Смотрел в чем проблема, но не увидел ошибок. Зашел на сайт ФИАС, набил адрес и так проставил УИН.

    Reply ↓
  32. silis

    Не работает, если тип дома — владение, поправьте, пожалуйста

    Reply ↓
  33. AlekSoTSK

    (32) В коде стоит подстановка владения. Есть какой-нибудь адрес с владением для проверки?

    Reply ↓
  34. silis

    (33)429150, Чувашская Республика — Чувашия, Комсомольский р-н, Асаново д, Советская ул, владение № 16

    …Если АдресСотрудника.ТипДома = Перечисления.ТипыДомов.Владение Тогда

    КодЭлементаДом = «1020»;

    КонецЕсли;

    Откуда взяли этот код? Я перерыл информацию, ничего не нашел.

    Методом проб и ошибок, я подобрал, что, если поставить КодЭлементаДом = «1030», тогда работает верно.

    Reply ↓
  35. diml

    С корпусом тоже проблемы. Не бьется УИН дома, хотя на сайте ФИАС проходит.

    Reply ↓
  36. gpinf

    Добрый день!

    Выдает ошибку:

    {ВнешняяОбработка.ПолучениеКодаФИАС.Форма.Форма.Форма(109)}: Индекс находится за границами массива

    Отзыв = Результат.Item[0].Variant[0];

    Reply ↓

Leave a Comment

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