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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

35 Comments

  1. WKBAPKA

    за труды

    Reply ↓
  2. Lyns_owner

    Интересная публикация. Не совсем понятно, зачем, но все-равно интересно))

    Reply ↓
  3. Жолтокнижниг

    Смысл: ускорение разработки/отладки печатных форм, а также помощь при переносе кода из модуля документа в модуль внешней печ. формы.

    Reply ↓
  4. cdb

    поправьте в описании публикации слова Прозьба и отличтя.

    Reply ↓
  5. DoctorRoza

    Плюс за работу .. жудем ждать дальнейшей доработки

    Reply ↓
  6. PiotrLoginov

    Если можно поинтересоваться: управляемые формы поддерживаются? Инструкция по выдиранию с помощью обработки какой-нибудь простенькой формы из типовой конфы будет? Заранее спасибо за ответ.

    Reply ↓
  7. Жолтокнижниг

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

    По поводу описания: позже появится.

    Reply ↓
  8. ksai

    (3)

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

    Вот про это можно поподробнее? Конкретно про цель и средства?

    а насчет вот этого:

    ускорение разработки/отладки печатных форм

    создать форму обработки, на нее реквизит СсылкаНаОбъект и кнопку с вызовом функции Печать() из модуля объекта. Обработку открывать через Файл->Открыть в предприятии и отлаживать сколько душе угодно. Куда уж проще и быстрее?

    Reply ↓
  9. Жолтокнижниг

    (8) ksai,

    Обработку открывать через Файл->Открыть в предприятии и отлаживать сколько душе угодно

    А потом закрывать, переходить в конфигуратор, дописывать, сохранять, снова открывать, проверять, ну или кнопка переоткрыть.

    создать форму обработки, на нее реквизит СсылкаНаОбъект и кнопку с вызовом функции Печать() из модуля объекта

    Никто не мешает, но зачем делать постоянно одни и те же действия каждый раз. Когда можно их автоматизировать и упростить. Обработка позволяет быстрее найти нужный метод печати, необходимые доп. методы/переменный и используемый макет. А потом соединить все это в одну обработку.

    Я просто предлагаю еще один инструмент, а использовать его или нет ваше дело.

    Reply ↓
  10. PiotrLoginov

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

    Reply ↓
  11. Жолтокнижниг

    (10) PiotrLoginov, управляемые как я уже писал пока не поддерживаются. По поводу «Если есть возможность, доведите данный инструмент до ума.» хотелось бы услышать предложения других пользователей.

    Reply ↓
  12. Новенький_2209
    Никто не мешает, но зачем делать постоянно одни и те же действия каждый раз.

    А кто мешает ОДИН раз сделать эталон, и копированием из него получать рыбу будущей вн.печ.формы. Это делается за несколько секунд. Опять же кнопка Переоткрыть. Если все это в рыбе — вы только докидываете ваши процедуру и сохраняете, и пере-открываете.

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

    Reply ↓
  13. Жолтокнижниг

    (12) Новенький_2209, Смысл работать/допиливать не шаблон, а готовую обработку. В идеале должна получиться обработка, которая вытягивает из конфы необходимые методы для дальнейшей их модификации в обработке.

    Reply ↓
  14. Новенький_2209

    (13) успехов =)

    Reply ↓
  15. Жолтокнижниг

    (14) Новенький_2209, Вот еще бы придумать как, а то выгружать всю конфигурацию в папку не хочется, не думаю, что это будет оправдано.

    Reply ↓
  16. tehas

    очень интересная задумка, плюсую!

    Reply ↓
  17. ~gekK@~

    будет полезно иметь

    Reply ↓
  18. Светлый ум

    Очень полезная публикация. Применяю для обучения новичков в 1с. Ускоряет процесс обучения, и позволяет более быстро, молодым специалистам разобраться в механизме доработки ВнешПечатныхФорм.

    Reply ↓
  19. sorb

    Хочу такое же для УФ под БСП!

    Reply ↓
  20. SeiOkami

    Жолтокнижниг, молодец! Плюсую

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

    Сейчас покапаюсь в твоей =)

    Reply ↓
  21. SeiOkami

    Подключение автоматическое — это круто)

    Reply ↓
  22. SeiOkami

    На мой взгляд отличия таковы: моя работа заточена под быстрый перенос печатной формы из типовой во внешнюю, а данная на редактирование и отладку в режиме предприятие

    Reply ↓
  23. sytkosa

    Вот бы ещё кто адаптировал это под управляемый интерфейс под УТ 11.

    Reply ↓
  24. SeiOkami

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

    Reply ↓
  25. friday1

    да да)) народ просит управляемые) очень полезная штука, спасибо)

    Reply ↓
  26. AlexO

    (3)

    так и какое ускорение, окромя автоформирования Макет = ПолучитьМакет() и Область = ПолучитьОбласть() ?

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

    Иначе — будет больше условностей, ограничений и неявных «это элементарно, можно же догадаться», известных автору обработки, но не известных использующему.

    Reply ↓
  27. AlexO

    (25) friday1,

    народ пусть сначала вообще с 1с разберется, а потом лезет в УФ.

    Reply ↓
  28. AlexO

    (24) SeiOkami,

    вся «иная логика» в ПФ УФ — скопировать пару модулей для инициализации.

    Остальное — все то же самое и строго по индивидуальному заданию.

    Reply ↓
  29. SeiOkami

    (28) AlexO, ну вполне возможно, я же говорю, что не вникал в это дело =)

    Вот моя версия — http://infostart.ru/public/158517/

    Может кому будет интересно )

    Reply ↓
  30. Жолтокнижниг

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

    Reply ↓
  31. Bassgood

    Мне кажется не покатит, не будет пользоваться популярностью у программистов, действительно быстрее создать ВПФ через конфигуратор, нежели работать с кодом процедур печати в пользовательском режиме.

    Reply ↓
  32. Zas1402

    нужная вещь в хозяйстве

    Reply ↓
  33. makas

    Спасибо!

    Reply ↓
  34. Alfer

    Спасибо Автору — меня устраивает во всем — а некоторые моменты возьму на вооружение для дальнейшего использования

    Reply ↓
  35. CaSH_2004

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

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

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

    Reply ↓

Leave a Comment

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