Перенумерация документов для БП 3.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='\

8 Comments

  1. shturneva

    Добрый день! Скачала обработку для 1С 8.3, пытаюсь добавить, 1Ска пишет, «Метод объекта не обнаружен (СведенияОВнешнейОбработке). В чем может быть проблема? Спасибо.

    Reply
  2. Anchoret

    Открыть обработку можно через Файл-Открыть

    Чтобы добавить в базу 1С, я в Модуле объекта прописываю примерно следующее:

    Функция СведенияОВнешнейОбработке()Экспорт
    ТаблицаКоманд = Новый ТаблицаЗначений;
    КолонкаТЧ = ТаблицаКоманд.Колонки.Добавить();
    КолонкаТЧ.Имя = «Идентификатор»;
    КолонкаТЧ = ТаблицаКоманд.Колонки.Добавить();
    КолонкаТЧ.Имя = «Представление»;
    КолонкаТЧ = ТаблицаКоманд.Колонки.Добавить();
    КолонкаТЧ.Имя = «Модификатор»;
    КолонкаТЧ = ТаблицаКоманд.Колонки.Добавить();
    КолонкаТЧ.Имя = «ПоказыватьОповещение»;
    КолонкаТЧ = ТаблицаКоманд.Колонки.Добавить();
    КолонкаТЧ.Имя = «Использование»;
    
    //Команда не присутствует в разделе команд внешнего отчета, но она будет отображаться в списке внешних отчетов вместо названия отчета
    СтрокаТЧ = ТаблицаКоманд.Добавить();
    СтрокаТЧ.Идентификатор = «Траляляля»;
    СтрокаТЧ.Представление = «Подробное Траляляля»;
    СтрокаТЧ.ПоказыватьОповещение = Ложь;
    СтрокаТЧ.Использование = «ОткрытиеФормы»;
    
    Возврат Новый Структура(«БезопасныйРежим,Вид,Наименование,Версия,Информация,Команды»,Истина,»ДополнительныйОтчет»,»Траляляля»,1,»»,ТаблицаКоманд);
    КонецФункции // ()

    Показать

    Reply
  3. a.p.soft

    Лично я считаю, что не нужно увлекаться перенумерацией, а точнее, нужно правильно пользоваться 1С — которая сама правильно нумерует коды. За ручную корректировку кодов (по крайней мере бездумную) бухам нужно давать по рукам. И потому обработка нужна для _разового_ использования, в случае обнаружения «косяков». Попытка добавления обработки означает, что вы планируете постоянно ей пользоваться… Имхо это не правильно.

    Reply
  4. Anchoret

    Согласен, перенумерацию всего пару раз использовал

    Reply
  5. Desperado13

    Бухгалтерия предприятия, редакция 3.0 (3.0.30.16)

    Перенумеровываются документы по всем юр. лицам в базе.

    Пользоваться невозможно.

    Reply
  6. DDos76

    Бухгалтерия предприятия, редакция 3.0 (3.0.32.5)

    Перенумеровываются документы по всем юр. лицам в базе.

    Пользоваться невозможно.

    Благополучно испортил рабочую базу. Заметил не сразу.

    Придется заново перевыгружать из управленки целый квартал.

    Так что большое спасибо автору и жирный минус.

    Reply
  7. a.p.soft

    (6) DDos76, если вы не удосужились даже внимательно прочитать описания/комментарии (например комментарий перед вашим) перед запуском обработок, не говоря о заглядывании в код и дописывании пары «Если» под конкретно Ваши условия и задачи, то имхо Вам в некоторой степени опасно в принципе пользоваться подобными сторонними обработками. Нигде в описании и не заявлялась обработка нескольких юр.лиц, да и отсутствующий выбор юр.лица на форме Вас не насторожил? У меня нет базы с несколькими юр.лицами и потому я не обрабатывал данную ситуацию. Если у вас есть такая база, в чем проблема дописать одно Если? Если попадется такая база я несомненно данную фишку доработаю.

    Reply
  8. rounder

    Нет возможности добавить префикс

    Reply

Leave a Comment

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