Заполнение ОКТМО по ОКАТО




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

14 Comments

  1. chmv

    Здорово. Только не понятно почему 1с этого не сделала

    Reply
  2. chmv

    Не хватает денег. Не могли бы Вы мне прислать на chmv2005@mail.ru

    Заранее спасибо

    Reply
  3. Direktordovolen

    Очень нужная вещь! Спасибо!

    Reply
  4. Алексей777

    не понятно для чего это автор сделал?

    Reply
  5. lazy sea

    Видимо,чтобы самим не искать. Хотя нам налорги скинули соответствие, непонятно что там с 3 последними цифрами? Вроде еще неясно нули надо ставить или прочерки

    Reply
  6. lazy sea

    В данном переходе пострадали Москва и мы, СПБ… У нас по кодам соответствия вместо 11 цифр ОКАТО пока есть только 8 цифр ОКТМО, так и налорги прислали. А по поводу последних знаков у них пока идут совещания( Сначала ФНС письмо накатало, что ставить 000, потом что 001, теперь вот вроде прочерки хотят. Какие нафик прочерки в платежках и декларациях, кто же даст их поставить даже при желании. Придется подождать выхода с каникул и последних решений. Тьфу

    Reply
  7. Angry

    (8) lazy sea, Вы о чем вообще, заменяется не только название, но и длина, там ни нулей ни прочерков не должно быть.

    Reply
  8. KliMich

    Спасибо! Будет полезно.

    P.S. А кому не хватает денег можно зайти на сайт и посмотреть код

    Служба ведения общегородских классификаторов и справочников (ОКТМО)

    🙂

    Reply
  9. lazy sea

    (9) Angry,

    Вы просмотрите целиком справочник ОКТМО) Где 8 знаков, где 11.

    Reply
  10. Swetlana

    Что мне непонятно- данные ОКТМО нужно смотреть по первому разделу или по второму?

    У нас республика Татарстан

    по первому разделу 3 последних знака 000

    а по второму 001

    Какой ставить- непонятно даже

    Reply
  11. Mirage78

    (7) pavl_vs, почему одно число? Здесь похоже речь о справочнике физ.лиц, а там он у каждого сотрудника.

    Reply
  12. pavl_vs

    (13) Mirage78, если кратко, то для физлица важен страховой номер в ПФР; для Учреждения, перечисляющего все взносы и налоги — ОКАТО (ОКТМО) (помимо прочей атрибутики). Это что касается программ кадрового учета м зарплаты, а чисто бухгалтерские программы персоналий (в смысле учета) вообще не имеют.

    Что касается количества знаков: первые 8 знаков это код территориального образования (округ, поселения и пр.),

    последние три — коды составляющих это образование, причем, «МО-образующее» поселение (город, район, село и т.п.) имеет код «001», а составляющие — коды «1хх».

    Reply
  13. VladimirElohov

    (7) pavl_vs, а если организация имеет разветвленную структуру в разных регионах? При этом используется порядка 20 мест уплаты. В таком случае потребуется заполнить ОКТМО не только в организации, но и во всех подразделениях. А их около 100 штук в организации, где мы недавно завершили внедрение. Они там вручную несколько раз заполняли и переколбашивали эти коды в течение двух дней.

    Думаю, обработка могла бы облегчить им жизнь. Я ею не пользовался, но считаю полезной для таких крупных организаций.

    Reply
  14. mikhailovaew

    (5) (7) (15) VladimirElohov совершенно прав: обработка полезна для тех, у кого развита филиальная сеть, то есть у кого в справочнике Подразделения заполнен реквизит ОКАТО. В нашей организации, например, штатная обработка 1С выдает список почти из 500 позиций, руками его заполнять прикажете?

    А автору спасибо!

    Reply

Leave a Comment

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