Своя нумерация кадровых документов для ЗУП 3.1




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

21 Comments

  1. saa@kuzov.org

    Здравствуйте, Автор!

    Я еще не пробовал разрабатывать расширения, но хочу начать.

    Знаю, что в свежих версиях платформы возможностей уже много.

    Мне нужно поменять расширением периодичность номера документа Реализация из типовой БП 3.0 (ну вот так сложилось исторически, номер начинается сначала раз в квартал).

    Это помогло бы отказаться от ручного обновления.

    Можно ли это сделать в принципе?

    Reply
  2. s.matyukin_visma

    Да. Для этого очень удобно использовать механизм расширений.

    Reply
  3. gull22

    В ЗУП несколько организаций со своими префиксами. Нужно дорабатывать Ваше расширение для сохранения префиксов?

    Reply
  4. PhoenixAOD

    (3)Думаю нет, Префикс ставится до знака «-«, а тут судя по скрину префикс типа документа добавляется в номер уже)

    Reply
  5. PhoenixAOD

    У меня кадры просили на сковзную нумерацию для этих документов по каждой организации.

    Reply
  6. s.matyukin_visma

    (3) Мне кажется проще воспользоваться типовым функционалам и для каждой организации задать свой префикс в настройках.

    Reply
  7. s.matyukin_visma

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

    Reply
  8. gull22

    (6)

    Префикс уже стоит. Меня интересуют не затрутся ли префиксы при использовании расширения

    Reply
  9. s.matyukin_visma

    (8) Юрий, Расширения назначет свои номера для новых документов, префикс организации в них не учитывается, префикс добавить можно, вам необходимо внести изменения в код расширения.

    Reply
  10. hanio

    а подскажи почему не срабатывает, я подключил расширение, платформа 8.3.12.1440, релиз конфы 3.1.5.171, вот только перехвата номера не происходит уходит в типовой механизм определения префиксов.

    Reply
  11. s.matyukin_visma

    (10) Для какого вида документа Вы это смотрите?

    Reply
  12. hanio

    да для любого хоть прием хоть увольнение хоть перевод

    Reply
  13. s.matyukin_visma

    (12)

    Если есть тим вьювер я могу посмотреть. Собственно расширение и сделано для этого. Напишите пожалуйста в скайп s.matyukin_visma, решим.

    Reply
  14. s.matyukin_visma

    По ряду документов были действительно моменты, что номера не назначались корректо, вероятно зависит от среды запуска (платформа/версия ЗУП 3.1 до конца не ясно). Я внес изменения.

    Reply
  15. Novikov_Nikolay

    Добрый день! Помогите пожалуйста! Мы обновились до версии ЗУП 3.1.8.216 и у нас перестало работать расширение. Выдает ошибку: Значение контролируемого свойства РежимСовместимости у объекта не совпадает со значением в расширяемой конфигурации. Есть ли обновленная версия под этот релиз?

    Reply
  16. s.matyukin_visma

    (15) Николай, обновляю свою конфигурацию до указанного релиза, по результатам напишу.

    Reply
  17. s.matyukin_visma

    Коллеги, обновил расширение, а именно убрал контроль режима совместимости, чтобы работало на поздних релизах ЗУП.

    Reply
  18. julia961

    Добрый день!

    Нумерация отпусков не работает, если документ отпуск вводится из документа График отпусков. Что надо изменить?

    Reply
  19. s.matyukin_visma

    (18) Добрый день! В личку написал.

    Reply
  20. julia961

    Извините, не знаю, как посмотреть, то, что в личке.

    Reply
  21. s.matyukin_visma

    С Юлей вопрос в личной переписке закрыли.

    Reply

Leave a Comment

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