Быстрая отладка экранных форм документов и справочников




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

    Хорошо, да не очень-то)

    Надо проще.

    1. Создаем внешнюю обработку

    2. Копируем в нее форму документа, справочника, чего угодно

    3. Назначаем ее основной

    Профит!

    Reply
  2. milkers

    (1) Зачем что-то создавать, когда то же самое делается в два клика? Выделить документ,Ctl-c, Выделить дерево обработок,ctrl-V, сохранить как внешнюю. Самое главное сохраняется связь элементов формы с метаданными. В вашем случае она будет потеряна, на форме будет хаос.

    Reply
  3. lukashov_as

    а че так можно было?!:O Спасибо!

    Reply
  4. user705698_bursev
    Если это измененная версия старого, то есть два варианта: 1. Скопировать в документы с новым названием и удалить старый документ. 2. Вручную перенести изменения.

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

    Reply
  5. milkers

    (4) Если это тестовая база и это документ, который создан тобой недавно, то без разницы.

    Reply
  6. user705698_bursev

    (5) Вот это «если» и имеет значительную разницу) Было на практике, что заменил так уже существующий документ, в тестовой базе разумеется. Все ссылки на него сразу тютюкнулись, потом пришлось восстанавливать.

    Reply
  7. milkers

    (6) Согласен, нужно быть осторожнее в этом моменте. Правда можно еще поиграться с режимами объединения конфигураций при переносе документа в боевую.

    Reply
  8. AlX0id

    (2)

    А как же создание реквизитов Ссылка, Номер, Дата, Проведен, ПометкаУдаления и тп?

    А что более интересно — при чуть более сложном документе это все уже просто не работает.. Попробуйте сделать указанную процедуру с документом реализации из ЕРП:

    Ошибка инициализации модуля: ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта

    по причине:

    {ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(649,7)}: Переменная не определена (ОбменДанными)

    Если <<?>>ОбменДанными.Загрузка Тогда

    {ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(1221,7)}: Переменная не определена (ОбменДанными)

    Если <<?>>ОбменДанными.Загрузка Тогда

    {ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(661,2)}: Переменная не определена (ДополнительныеСвойства)

    <<?>>ДополнительныеСвойства.Вставить(«ЭтоНовый», ЭтоНовый());

    {ВнешняяОбработка.РеализацияТоваровУслуг.МодульОбъекта(662,2)}: Переменная не определена (ДополнительныеСвойства)

    <<?>>ДополнительныеСвойства.Вставить(«РежимЗаписи», РежимЗаписи);

    Очистить модуль объекта? Так его функции могут использоваться из формы..

    Кроме того, в форме могут использоваться методы расширения типа Прочитать(), Записать()..

    Reply
  9. the1

    (2) Ты бы хоть проверил для проформы. Никакая связь не теряется, более того, не надо создавать стандартные реквизиты (Код, Наименование и т.д.). Плюс сохраняется связь с модулем объекта исходного документа/справочника (чуть ниже описаны ошибки из-за твоего метода)

    И обратное копирование доработанной формы тоже происходит гораздо более безболезненно, чем описано в публикации — просто Ктрл+Ц/Ктрл+В

    Reply
  10. milkers

    (8) В таком случае, можно закомментарить текст сбойных модулей. Для отладки этого должно хватить.

    Reply
  11. milkers

    (2) Обязательно проверю. Если ваш метод лучше, буду пользоваться им.

    Reply
  12. AlX0id

    (9)

    Кстати, так тоже не очень работает для типовых..

    Накидал свою обработку для открытия форм — типа, копируешь форму в обработку, а в ней своя форма со списком форм — выбираешь и она открывается.. А фигушки — выдает какие-то проблемы с идентификаторами метаданных..

    В этом плане наверное лучше всего работает вариант с расширениями — делаешь расширение для формы, в ней отлаживаешь изменения, а потом переносишь изменения в основную форму.

    Reply
  13. the1

    (12) Есть такой нюанс. Это не ошибка, просто в БСП для внешних обработок нужно указывать въявную тип источника формы

    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПараметрыРазмещения = ПодключаемыеКоманды.ПараметрыРазмещения();
    ПараметрыРазмещения.КоманднаяПанель = Элементы.КоманднаяПанельФормы;
    ПараметрыРазмещения.Источники = Новый ОписаниеТипов(«СправочникСписок.ФизическиеЛица»);      // Вот в этом месте указать тип объекта
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект, ПараметрыРазмещения);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
    
    КонецПроцедуры
    

    Показать

    Reply
  14. AlX0id

    (13)

    у меня оно вот тут начинает свое падение:

    // Обработчик механизма «ВерсионированиеОбъектов»
    ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
    
    Reply
  15. the1

    (14) Тут еще проще, закомментируйте эту строку, да и все (если она не влияет на логику отладки)

    Reply
  16. AlX0id

    (15)

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

    Reply
  17. the1

    (16) Хз, если на скорую руку что-то проверить в работе формы — так очень удобно. Не сталкивался с сильными сложностями? Что за конфа-то хоть?

    Reply
  18. AlX0id

    (17)

    Ерп в основном.

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

    Ну и изменения переносить придется не в один клик, разумеется.. Но это для любой схемы проблема, мне кажется.

    Reply
  19. hobi

    (2) модуля менеджера нет во внешних обработках, а большинство документов содержит код в модуле менеджера. Поэтому только Ctrl-C / Ctrl-V не обойдешься.

    Reply

Leave a Comment

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