Вывод печатных форм с запросом данных в форму "Печать документов" из подсистемы БСП "Печать".




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

12 Comments

  1. docerman

    Вот спасибо. Очень помогло.

    Reply
  2. SuhoffGV

    Подскажите пожалуйста — при создании печатной формы в конфигурации у Вас есть функция ПолучитьПараметрыПечати() в которой вы определяете заголовок формы

    ПараметрыПечати.Вставить(«ЗаголовокФормы», «Печатная форма»);                    //Один из параметров, для формы «Печать документа».

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

    И второй вопрос, Сделал внешнюю печатную форму для заказа клиента (конфигурация КА2) «Заявка». При попытке её сохранить 1с присваивает ей имя «Заявка» (без номера и даты). Типовые печатные формы, встроенные в конфу 1с сохраняет в файлы правильно. С номером и датой документа в названии файла.

    Как, во внешней печатной форме, заставить 1с давать файлу имя с датой и номером документа?

    Конфигурация Комплексная автоматизация 2.2, на БСП 2.3

    Reply
  3. sam40a_1

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

    Reply
  4. konyavka

    Спасибо, очень помогло в создании своей внешней формы с вводом параметров.

    Reply
  5. romku

    Спасибо. Интересно.

    Вообще тем, кто будет разбираться, советую почитать в коде, описание к этой функции:

    ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();

    Там подробно описано и примеры есть.

    Reply
  6. dsv_nsk

    Оно спасибо за труды конечно.

    Только для будущих статей пожелание — ссылок поменьше между вариантами реализации.

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

    Reply
  7. newvideo

    странная статья в которой не указана версия БСП.

    что такое ? ОбщийМодульПечатнаяФорма.ОбработкаКомандыПечатиПечатнойФормы

    у меня нет такого БСП 2.3.2.53

    Reply
  8. Team leader

    Хороший — рабочий пример для ВПФ //+1

    Единственное, добавил бы реквизит ссылка на объект и соответственно заменил бы инициализацию для «ОбъектыНазначения»:

    ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
    
    //Заменил на: —>
    ОбъектыНазначения = Новый Массив;
    СсылкаНаОбработку = РеквизитФормыВзначение(«Объект»);
    СсылкаНаОбъект    = СсылкаНаОбработку.СсылкаНаОбъект;
    ОбъектыНазначения.Добавить(СсылкаНаОбъект);
    //<—
    

    Показать

    Reply
  9. Ella_Iv

    Выдает ошибку

    «Для объекта не определена форма по умолчанию, соответствующая текущему режиму запуска. Объект: «Печатная форма»

    (встраиваемая)

    Что не так?)

    Reply
  10. Cosmit

    такая ситуация 1С BAS ERP (2.1.8.1) для Украины

    БСП 2.3.2.53

    делаю внешний отчет со своей печатно формой

    отборы настройки и т д

    и пробую выводить на печать процедурами из БСП

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

    Показать

    Помогите разобраться что не так

    Reply
  11. Asenka

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

    Reply
  12. DmitryKSL

    Объясните, как получилось разместить на форме еще одну кнопку печати?

    Reply

Leave a Comment

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