Использование свойств объектов при доработке типовых конфигураций




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

30 Comments

  1. brr

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

    Reply
  2. fabrikant

    Имхо, такие вещи у нормального спеца отрабатываются спинным мозгом. Без подключения головы. Зачем данная статья? Непонятно.

    Reply
  3. luns

    (2) Не у всех к сожалению. Вещь действительно очевидная, но! Как изложено. Отличный методический материал для начинающих.

    Продолжай Poppy

    А то иногда лень очевидное расказывать начинающему, а так, носом в статью ткнул и красота.

    Так что +

    Reply
  4. coder1cv8

    Хорошая статья для новичков.

    Reply
  5. PeRom

    +3 Тут и придраться некчему. Однозначно полезно. Ждём продолжения.

    Reply
  6. PeRom

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

    Есть ещё задача: у одного заказчика по разным договорам разные адреса доставки. Могу выслать своё решение.

    Reply
  7. CheBurator

    > Плюс, однозначно. Я примерно также использую свойства контрагентов и номенклатуры в клюшках.

    а то!

    только многие почему-то не удосуживаются проверять/отрабатывать ветку когда своство отсутсвует как класс…

    Reply
  8. PointAnd

    А что здесь нового? Если конфа не снята с поддержки, то только таким способом и выкручиваются. Но здесь есть одно «НО» — если в базе работает около 30-40 пользователей, то с этим методом надо быть осторожнее, т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций, а так же возникают ситуации с порчей СсылокНаОбъекты (ссылка одного объекта присваивается другому) в следствии чего идет недостоверная информация.

    Все это взято не спотолка, а при работе с типовой УПП в течении года.

    Reply
  9. poppy

    (8)

    > А что здесь нового?

    По сравнению с чем?

    > Если конфа не снята с поддержки, то только таким способом и выкручиваются.

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

    > т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций

    О каких транзакциях идет речь?

    > а так же возникают ситуации с порчей СсылокНаОбъекты

    Причина порчи? Мною приведены примеры чтения свойств. Как чтение может испортить ссылки?

    > Все это взято не спотолка, а при работе с типовой УПП в течении года.

    Может поделишься своим опытом? А то складывается впечатление, что все это взято с потолка…

    Reply
  10. luns

    (8) У нас более 40 свойств использовано (УПП) проблем особых нет. Не удобно только в некоторых отчетах, что «служебные» своиства мешают, но это можно решить, например: http://infostart.ru/profile/10590/projects/1993/

    Ценность этой статьи, не в том что она описывает что то новое, а в том что это сделано подробно и понятно. Насчет транзакций вообще непонятно.. что имется ввиду? Какие таблицы? А про порчу ссылок вообще ересь, свойства они только называются страшно )))))) на деле обычный регистр сведений да ПВХ..

    Reply
  11. v_id

    Спасибо!

    1. Почему в первом примере не стали использовать Категории, и собственно…

    2. Если не сложно дополните статью способами отбора по Категориям.

    Reply
  12. poppy

    (11) Статья дополнена…

    Reply
  13. Hans

    Что то я не понял… Как не снимать с поддержки если общий модуль изменен?

    Reply
  14. poppy

    (13) Ты, Hans, о чем? В статье описан способ не изменять общий модуль.

    По твоему вопросу смотри мои комментарии здесь http://infostart.ru/blogs/892/

    Reply
  15. Hans

    а я что то попутал… Плохо прочитал… Подумал что в статье писывается решение без изменения конфы ваще… а тут только без изменения метаданных и форм.

    Reply
  16. NickKom

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

    Например, после проведения документа необходимо установить некий признак в одно из нескольких фиксированных значений. Установленный признак — свойство именно текущего документа. Но это второстепенный признак, в регистрах не прописан, и из-за него перепроводить документ не стоит. Напрашивается использование свойства документа. Но типовая конфигурация УТ этого не позволяет. Как быть?

    Reply
  17. poppy

    (16) В типовой УТ10.3 свойства у документов есть.

    Reply
  18. NickKom

    (17) Действительно, есть. Поторопился, не разобрался.

    Спасибо.

    Reply
  19. artbear

    (17) В своей публикации http://www.infostart.ru/public/65526/

    сослался на некоторые Ваши работы, т.к. сам использую практически те же самые технологии 🙂

    Reply
  20. bulpi

    И фсе это только для того, чтобы не добавить один реквизит в метаданные ??? А потом долбаться с выводом в отчеты информации по условию, накладываемому на свойство… Да ну вас, окститесь.

    Reply
  21. anig99

    есть свои плюсы и минусы у способа… у статьи тоже… в результате пока «0»

    Reply
  22. poppy

    (20) Не надо все возводить в абсолют. Многие отчеты типовых конфигураций поддерживают механизм свойств.

    Как говорится — кто на что учился. Проще добавить реквизит? Добавляй. Это твое решение, как архитектора ИС.

    (21) Спасибо, что обратил внимание…

    Reply
  23. poppy

    (19) Спасибо, artbear! Для меня важно твое мнение.

    Reply
  24. anig99

    хотя за подробность описания поставлю +

    Reply
  25. rasswet

    нужно это обдумать..может и пригодится.. 🙂

    Reply
  26. Alexey55

    Спасибо! полезная инфа!

    Reply
  27. infosoft-v

    Здравствуйте.

    Полезная статья для тех кто осваивает возможности 1С. Это знание — кирпичик в копилку профессионала.

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

    Reply
  28. alenakrr

    если создать непериодический регистр сведений «ТекущиеКонстанты» и добавить в него все используемые свойства, то не придется писать в модуле «НайтиПоНаименованию» и обеспечит однозначность использования))

    Reply
  29. dyak84

    Спасибо очень полезно и познавательно.Про такую возможность работать со свойствами даже не догадивался. Так держать

    Reply
  30. sns-bizon

    будет полезна новичкам

    Reply

Leave a Comment

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