Отладка внешних печатных форм на тонком клиенте




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

38 Comments

  1. bborisko

    Тоже так всегда делаю.

    Reply
  2. МимохожийОднако

    (2) Borisych, скинь ссылки на лучшее.

    Reply
  3. Поручик

    (3) Гугл в помощь не предлагать?

    Reply
  4. Alex

    Во всяком случае это заработало. Не то что у Порутчика 🙂

    Reply
  5. rutadmeen

    (2) Тут соль не в интересности, а в простоте и доступности

    Reply
  6. Bukaska

    (6) rutadmeen, Просто форма она не всегда нужна, тем более для ВПФ.

    Потом ссылка на объект надо в данных давать, а ведь можно и без неё обойтись, и будет все работать)))

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

    Reply
  7. МимохожийОднако

    (4) Гугл мне всегда помогает)). В контексте (2) придерживаюсь правила подтверждать слова аргументами, то бишь ссылками. То что найду я зачастую не совпадает с поиском оппонента. А терять время на доказательства его слов непрактично.

    Reply
  8. rutadmeen

    (7) Bukaska, может я ошибаюсь, но форма никаким образом не мешает функциональности ВПФ

    Reply
  9. Bukaska

    (8) МимохожийОднако, Мне один раз тыкнули ссылкой по изготовлению ВПФ.. а потом я захотела избавиться от ссылки на объект — вотт тогда и начались танцы с бубном… но сейчас-то я уже в курсе этих мелочей))))

    Reply
  10. МимохожийОднако

    (10) Bukaska, вероятно отвечали не мне )). СсылкаНаОбъект — это обязательный реквизит ВПФ.

    Reply
  11. Bukaska

    (11) МимохожийОднако, Да.. реквизит нужен.. но для корректной работы форма не нужна.. Я имела в виду что в кодинге можно обойтись без данного реквизита..

    То есть в данных обработки он есть, но в кодинге я его не трогаю))) приноровилась уже)))

    Reply
  12. rutadmeen

    (11) МимохожийОднако, Это верно для толстого клиента. Для тонкого клиента все не так, ссылка на массив с доками передается в параметрах к методу Печать.

    Reply
  13. Bukaska

    (13) rutadmeen, Да.. То что реквизит ссылкаНаОбъект обязателен, так это для обычных форм как например бух 2.0.. там ВПФ без данного реквизита не воспользуешься)

    Reply
  14. Borisych

    (3) МимохожийОднако, например, http://infostart.ru/public/73691

    Reply
  15. Borisych

    (5) Alex, а у Поручика что не работает?

    Reply
  16. МимохожийОднако

    (15) Borisych, спасибо..А Поручик постеснялся ))

    Reply
  17. Borisych

    (17) МимохожийОднако, когда сообщение писал — под рукой не было обработки — чтобы ссылку выяснить

    Reply
  18. Поручик

    (5) Кто там ещё гавкает? Что не заработало?

    Reply
  19. paybaseme

    (10) Bukaska,

    То есть в данных обработки он есть, но в кодинге я его не трогаю))) приноровилась уже)))

    А всё от чего? В предыдущей ветке я уже говорил — нужно ДО ознакомиться со стандартом разработки печатных форм в БСП. И тогда не нужно будет приноравливаться к чему-то. Я вам алгоритм писал, как можно получить доступ к ИТС, для ознакомления с документацией. Вы получили его? Если нет — то обязательно получите. А то Ваш бубен скоро от танцев может порваться уже 🙂

    Reply
  20. Bukaska

    (20) paybaseme,

    А то Ваш бубен скоро от танцев может порваться уже 🙂

    С ВПФ — нет.. Другие потяжелее темы есть.. а ВПФ — это не тяжело)))

    Reply
  21. Chif13

    Черт, а мою форму для внешних печатных тонких даж не протестил никто… Ладно слишком видно тежеловата была или статья написана, или сама форма )))) Жаааль….

    Reply
  22. Zamik

    Спасибо помогло. Это наверное самое простое объяснение про отладку для УТ 11.И без всяких обработок.

    Reply
  23. rutadmeen

    Всегда велкам )) Сам периодически обращаюсь обратно к этой статье. Рад, что выложил свободно – всегда можно подсмотреть!

    Reply
  24. mikhailovaew

    (24) кстати, большое спасибо, что именно в формате статьи. Просто, полезно, доступно, и скачивать ничего не нужно )

    Reply
  25. meier8th

    (24) rutadmeen, спасибо

    Reply
  26. Isperator

    Спасибо, статья помогла.

    Reply
  27. ilia3003

    Хорошая Публикация как раз для конфигураций стронних не от 1с

    Reply
  28. Yashazz

    Наверно, я чего-то не понимаю, но по-моему, это очевидные вещи, которые можно элементарно за минуту найти отладкой механизма печати и за 3 минуты выдрать из типового модуля БСП. Зачем это делать отдельной публикацией — не осознал.

    Reply
  29. Никулин Леонид

    Использовал Ваш метод. Получилось. Работает. Спасибо!

    Reply
  30. Phoenix4565

    а для ЗУПА метод подходит?

    Reply
  31. rutadmeen

    Метод подходит для любой конфы на управляемых формах

    Reply
  32. jobkostya1c8

    Да, хорошая вещь, особенно для УТ 11.1 🙂

    Reply
  33. invertercant

    Использую похожую конструкцию для печатных форм под БСП

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

    Показать

    Reply
  34. malinko.vasiliy

    В бух 3.0.38.55 пришлось добавить еще колонку

    КоллекцияПечатныхФорм.Колонки.Добавить(«ИмяФайлаПечатнойФормы»);

    Reply
  35. kvant-62

    Автору огромный респект. Очень полезная статья.

    Reply
  36. dinopopyys

    Братан ты красавчек реально!!!

    Reply
  37. shetill

    Просто, доступно и главное выручила. А то куча статей и везде или ссылка на платные и не пойми какие обработки или просто флуд и «стёб» «знатаков», над теми кто задал вопрос по отладке ВПФ. Сохранили себе как шаблон.

    Огромное человеческое спасибо.

    Reply
  38. Starikova_NK

    Пользуюсь этим способом, очень довольна!

    Для ЗУП КОРП 3.1.10.50 нужна еще колонка

    КоллекцияПечатныхФорм.Колонки.Добавить(«ИмяФайлаПечатнойФормы»);

    Reply

Leave a Comment

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