Расширение конфигурации. Создаем печатную форму для документа.




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

29 Comments

  1. Angry

    Почему Вы применяете метод «Вместо»?

    По хорошему тут надо применять «После». для того что бы можно было корректно обновлять.

    Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали.

    Reply
  2. haso.itrp

    (1)

    Так же не плохо бы описать как настроить профиль безопасности что бы такие расширения работали

    актуально. где об этом можно почитать(посмотреть)?

    Reply
  3. niko11s

    (1) Про профиль безопасности я говорил

    «При добавлении расширения необходимо снять галочку «Безопасный режим, имя профиля безопасности» иначе при запуске 1с мы получим следующее уведомление:»

    А если применить «После» вообще ничего работать не будет — пункты меню задвоятся.

    Reply
  4. Angry

    (3)

    А если применить «После» вообще ничего работать не будет — пункты меню задвоятся.

    Так не надо типовой код копировать ) , там надо только «добавки» написать.

    Опускайте

    //

    // Здесь идет код типовой процедуры Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)

    //

    И у Вас всё получится.

    (3)

    Про профиль безопасности я говорил

    Я заметил. Просто добавил, что это полезно указать более подробно. Т.к. расширения сейчас очень актуальная тема. Буквально на прошедшем семинаре 1Сникам говорил, что нет методических материалов, как правильно делать в т.ч. доп. печатные формы.

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

    Reply
  5. niko11s

    (4) В принципе, Вы правы. С &после будет правильнее.

    Reply
  6. kolya_tlt

    (0) нафига это надо? чем печатная форма не угодила?

    Reply
  7. niko11s

    (6) Хотя бы тем, что процесс разработки и отладки намного проще.

    Reply
  8. niko11s

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

    Reply
  9. kolya_tlt

    (7) мой процесс разработки выглядит как редактирование запроса и макета, думаю в вашем случае он не проще.

    (8) какая из возможностей расширений (старыхновых) используетсядемонстрируется в статье?

    Reply
  10. TODD22

    (8)

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

    В чём именно странность?

    Reply
  11. niko11s

    (9) новые возможности — это те, которые появились в 8.3.9.

    Reply
  12. niko11s

    Вы же не будете спорить, что процесс отладки кода в расширениях проще? (можно запустить отладчик и работать с ним, как и при отладке обычной конфы)

    Reply
  13. Brawler

    ИМХО, использовать расширения, для изготовления печатных форм, это как по слону стрелять дробиной…

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

    Reply
  14. baracuda

    (13)Бред сивой кабылы. Что вам мешает напихать в форму в отдельное расширение?

    Почему наш народ так отчаянно противится всему новому? Лучше бы сами попробовали САБЖ где нить, может тогда поймете для чего они делались.

    Reply
  15. Brawler

    (14) Может быть бы сначала сами подумали, что уже целая армия пользователей знает о существовании обработок, а теперь вы еще их «убогих» хотите научить и каким-та расширениям неведомым?

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

    Reply
  16. &rew

    Тут как посмотреть. Надо мне, например, ответственного за выписку документов поменять. Зачем я буду создавать отдельную ВПФ, когда я в расширение «пихну» модуль менеджера, там его обработаю и все.

    Reply
  17. DoctorRoza

    (16) Комрад Brawler верно говорит, такую задачу лучше решать через ВПФ! Опять же, вопрос поддержки, один — написал, второй будет тянуть, ВПФ всегда проще отладить и изменить! Ну и опять же, в конторах любят иметь набор ПФ, которые отрабатывают по разному. Ну и какой шлак, тогда будет внутри?

    Reply
  18. Vovan1975

    Спасибо!

    Очень познавательно.

    Reply
  19. Vovan1975

    (15) Вы попробуйте отделить суп от мух.

    Вам продемонстрировали внятный пример «как сделать свое расширение»(суть), на примере создания печатной формы(частность). Почему Вы сосредоточились на частности?

    Автор не про печатные формы писал а про расширения конфигураций.

    Reply
  20. AlX0id

    (14)

    Попробуйте на досуге доработать запрос в печатной форме, и тогда поймете, чем же лучше ВПФ ) Уж как минимум тем, что не надо втаскивать в нее стомильонов объектов заради одного запроса..

    Reply
  21. a45

    (20) Запрос (его текст) можно сделать в модуле внешней обработке, дальше копипастом в расширение.

    Reply
  22. &rew

    Подождите, Господа. Тут речь идет не о том, через какое место лучше делать. Человек сказал что можно вот так. А как делать оптимальнее, зависит от задачи и от ЗУНов каждого конкретного прогера.

    Reply
  23. rasdag

    Не помешало бы расширение закинуть что бы на нее глазами посмотреть

    Reply
  24. niko11s

    (23) Так в статье весь код есть. Хотя можно и выложить.

    Reply
  25. apostal86

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

    Reply
  26. apostal86

    (25) Хотя, признаюсь честно, что через расширения больше как-то нравится.

    Reply
  27. r1000

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

    Reply
  28. Anteros

    (4)

    Всем привет. А можно про &После немного поподробней? В каком смысле «Опускайте»?

    Reply
  29. Angry

    (28) При использовании «После» не нужно копировать типовой код, он и так исполнится, а только затем добавленный нами..

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

    Reply

Leave a Comment

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