Работа с "периодикой"




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

    01.11.07 10:00 подправил внешний вид кнопок, обход и подсказки.

    Reply
  2. Shaman100M

    Вопрос к аудитории: использует ли кто периодические реквизиты в планах счетов?

    Reply
  3. svsrus

    Здорово! Особенно 4-ый пункт) +

    До сих пор не приходилось использовать периодические реквизиты в плане счетов.

    Reply
  4. Shaman100M

    Тогда, справедливо будет Che Burashka оставить здесь коммент для рейтинга за идею.

    Reply
  5. CheBurator

    Пришел, увидел, почитал.. не увидел «печати за период»…

    но нормуль…

    Reply
  6. Shaman100M

    (5) Привет! По заголовку «Работа с» логично было бы здесь видеть не только печать, но и множественный фильтр, выборку с пометками, и т.д. В общем, было бы похоже на учойс.

    Другое, будет ли востребована такая овчинка? Три действия и доп. четвертое, — твоя задумка (за него плюсанул), — востребованы (хотя бы при свертке). Для остального есть привычная встроенная в 1с-ке «история» и штатная в ТиС-е «ЗначенияПериодическихРеквизитов» с печатью.

    А потом «Печать за период», — есть смысл? Там «портянка» на сотни листов будет… 🙂

    Или все же переименовать в «Работа админа с перидикой»?

    Reply
  7. shoy

    Замечание при режиме восстановления:

    Прежде чем

    Периодический.ДатаЗнач = СохрДата;

    Периодический.Значение = ТекЗначение;

    Периодический.Записать();

    неплохо бы было назначить тип элементу:

    ТипОбъекта = ТипЗначенияСтр(ТекЗначение);

    Если ТипОбъекта = «Справочник» Тогда

    Если Найти(ТекРеквизит,»Субконто») > 0 Тогда

    Периодический.НазначитьТип(ТипОбъекта+».»+ТекЗначение.Вид());

    КонецЕсли;

    ИначеЕсли (ТипОбъекта = «Документ») или (ТипОбъекта = «Перечисление»)

    Тогда

    Периодический.НазначитьТип(ТипОбъекта+».»+ТекЗначение.Вид());

    КонецЕсли;

    Reply
  8. Shaman100M

    (7) Спасибо за "фикси". Обработку обновил.

    А по назначаемому типу, содержание в идентификаторе реквизита "Субконто" ни о чем не говорит 🙂

    Код
    НазначаемыйТип = ТипЗначенияСтр(ПериодичЗначение) + "." + ПериодичЗначение.Вид(); // для типов "Справочник", "Документ","Счет","Перечисление"
    НазначаемыйТип = ТипЗначенияСтр(ПериодичЗначение); // все остальные типы значений
    

    Показать полностью

    Reply
  9. Tatarin_url

    Прикольная штука, спасибо

    Reply
  10. andrei_prok

    Хорошая обработка, лучшая из всех, касаемо переодических реквизитов! Мне очень помогла исправить ляп бухгалтеров. Спасибо!!!

    Reply
  11. mihenius

    0 : 00 : 00 : 00 : 21 / 37 059 : Оптимизация значений по 12 периодическим реквизитам справочника СвоиЮрЛица

    Периодический.Удалить();

    {…PERIODIC.ERT(1487)}: Значение установлено документом!

    Reply
  12. mihenius

    . . шт. 115.000

    03.04.03 118.000

    09.08.04 142.000

    14.10.04 114.000

    25.02.05 110.000

    12.05.05 108.000

    16.06.05 108.000

    08.07.05 108.000

    19.08.05 112.000

    16.10.05 105.000

    07.02.06 Установка новых цен № КП-0000372 110.000

    25.03.06 Установка новых цен № КП-0000922 109.000

    12.08.06 Установка новых цен № КП-0003021 93.000

    08.10.06 Установка новых цен № КП-0003614 96.000

    19.12.06 Установка новых цен № КП-0004470 105.000

    20.02.07 Установка новых цен № КП-0000326 105.000

    20.02.07 Установка новых цен № КП-0000330 110.000

    27.03.07 Установка новых цен № КП-0000643 110.000

    14.04.07 Установка новых цен № КП-0000818 110.000

    15.05.07 Установка новых цен № КП-0001134 110.000

    09.06.07 Установка новых цен № КП-0001398 110.000

    06.07.07 Установка новых цен № КП-0001600 110.000

    28.07.07 Установка новых цен № КП-0001816 110.000

    21.08.07 Установка новых цен № КП-0002008 110.000

    08.09.07 Установка новых цен № КП-0002155 110.000

    05.10.07 Установка новых цен № КП-0002330 115.000

    20.10.07 Установка новых цен № КП-0002433 115.000

    12.11.07 Установка новых цен № КП-0002569 115.000

    29.11.07 Установка новых цен № КП-0002697 115.000

    15.12.07 Установка новых цен № КП-0002839 115.000

    30.12.07 шт. 105.000

    19.01.08 Установка новых цен № КП-0000051 115.000

    31.03.08 Установка новых цен № КП-0000694 126.000

    Почему-то рубится на 25.02.05, значение установлно не документом …

    нужно попробовать без транзакции …

    Reply
  13. mihenius

    Предлагаю в исключение добавить

    ТабНеКорр.ТекстОшибки = ОписаниеОшибки(); и соответсвующую колонку в ТЗ и таблице

    Reply
  14. mihenius

    Если есть сохраненная настройка отчета с галками почему-то не появляется колонка с пометками

    Появляется, только если нажать вручную на одну из галок …

    Reply
  15. mihenius

    Так же в ТабНеКорр и отчет нужно добавить колонку Владелец, чтобы сразу видеть чей подчиненный элемент попал в отчет.

    Reply
  16. mihenius

    (11) Скорее всего ошибки в таблицах, запустил ТИИ, жду )

    Reply
  17. mihenius

    Ага, так и есть в 11 ложная тревога, глюки в базе 😉

    Reply
  18. Shaman100M

    (17) Пожалуй, добавлю в таблицу значений на форме инфу о возможности ручного изменения пер. реквизита.

    (15) (13) что нить добавим….

    (14) Галки на форме можно сохранять стандартным «сохранением настроек», однако, лучше их оставлять непомеченными, чтоб юзер осмысленно их устанавливал. А табличная часть, — она зависит от конфигурации, стандартное сохранение может не прокатить, — поэтому и сделал свое сохранение.

    Reply
  19. asg1975

    Очень помогла при свертке базы. Плюсую!

    Reply

Leave a Comment

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