Внешняя печатная форма Заказ Покупателя (ЗаказПокупателя.epf) для Управление Торговлей 10.3




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

23 Comments

  1. Cyberboy

    Maniac — Жду с нетерпением!

    Reply
  2. Dimasik2007

    (3) Ждем-с

    Reply
  3. iov

    (3) Слово не воробей…. Ждемс..

    Reply
  4. hakim-aka

    (2) Не понятно?! Попробую объяснить в чем экономия времени. Автор честно и доходчиво сказал, что его обработка — это «типовой» код помещенный во внешнюю обработку. Если у кого то возникает потребность в новой печатной форме на базе существующей типовой печатной формы, то эта обработка избавляет разработчика от первоначальной, подготовительной работы по выносу типового кода из конфигурации в epf-файл. Можно конечно сказать, что это всего час работы… А можно сказать что это целый час работы.. 🙂

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

    Reply
  5. soda

    Вообщем 1С давно пора подумать о том что бы сделать подобное афтоматом 🙂

    Reply
  6. ya-esm

    Спасибо Автору большущее!! Я не большой профессионал в 1С и самостоятельно переписать код в объекте модуля у меня никак не получилось, прочитала миллион рекомендации, а все-равно не разобралась. Уже договорилась с программистами 1С, что они мне подготовят внешнюю форму за 3 тысячи рублей!!! И тут наткнулась на эту форму — и всё теперь в шоколаде! 😎 ))Леплю макеты счетов и заказов какие мне удобно: с логотипом и без, с печатью и подписью и без них, ну и т.д.

    Reply
  7. tessaq

    Самому внешнюю форму написать не получилось. А тут нашел. Большое автору спасибо.

    Reply
  8. RakovskiyK

    а ну-ка и я попробую =)

    Reply
  9. kg0

    При обращении выдает ошибку:

    Не удалось сформировать внешнюю печатную форму!

    Ошибка при вызове метода контекста (Выполнить): {(9, 3)}: Поле не найдено «ЗаказПокупателя.Количество»

    <<?>>ЗаказПокупателя.Количество КАК Количество,

    УТ 10.3.8.9

    Reply
  10. evg300183

    Здравствуйте, подскажите а контактное лицо будет входить в печатную форму или нет и как возможно его туда добавить?

    Reply
  11. evg300183

    2) Не понятно?! Попробую объяснить в чем экономия времени. Автор честно и доходчиво сказал, что его обработка — это «типовой» код помещенный во внешнюю обработку. Если у кого то возникает потребность в новой печатной форме на базе существующей типовой печатной формы, то эта обработка избавляет разработчика от первоначальной, подготовительной работы по выносу типового кода из конфигурации в epf-файл. Можно конечно сказать, что это всего час работы… А можно сказать что это целый час работы..

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

    полностью согласен — тоже плюсую

    Reply
  12. evg300183

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

    Reply
  13. makskov

    (17) evg300183, Полагаю без явных оснований, что работать в УПП она не сможет, но попробуйте. Я не пробовал.

    Reply
  14. wwizard

    Супер. Вау. Боже мой. Оно заработало на моей конфигурации: «Управление торговлей для Украины», редакция 2.3. Разработка конфигурации: «ABBYY Ukraine», 2003-2009 (2.3.12.1).

    Вопрос:

    Можно ли в ней сделать:

    1. Чтобы табличка с заказом, выводилась дважды, (скажем чуть ниже) — как ее скопировать?

    2. Чтобы в табличке добавился столбец: «Номенклатура» как в самой форме?

    3. Чтобы выводились коментарии

    Проискав эту весчь в течении трех дней, думал что уже не найду. И вот нашел. Спасибо огромное Автору. Тут на форуме нет похожей. А вытащитьиз стандарнтой нет возможности.

    Reply
  15. wwizard

    У меня просто нет слов, как я доволен что нашел такую форму. перелопатив ну просто весь интерне. Сорри что повторяюсь, НО, ОНО РАБОТАЕТ! и не ищет какуюто «КПП»… Супер.

    Reply
  16. wwizard

    Замечательно, я сделал на основе ее форму комплектации номенклатуры заказа, без цен.

    Reply
  17. 6630

    Спасибо автору. не мог понять как написать запрос для получения Данных для печатной формы

    Reply
  18. Bassgood

    (0) Я тоже ничего не понимаю — что тут нового или доработанного? Может теперь станем выкладывать на Инфостарт все имеющиеся в типовых конфигурациях печатные формы?

    В интернете полно информации по созданию и подключению внешних печатных форм к типовым конфигурациям, какой смысл в этой публикации?

    (11) ya-esm, жадные программисты Вам попались видать, раз запрашивали аж 3к руб. за простое копирование типовой печатной формы заказа…

    (16) evg300183, перенос кода процедур и функций, связанных с печатью формы любого документа, во внешнюю обработку занимает минут 15 (30 — для навороченных форм), но никак не целый час кто имеет хоть небольшой опыт их доработки.

    (20) wwizard, это уж Вам придется самим копаться в коде и дорабатывать ее =)

    (23) 6630, интересно за что спасибо, если Вы ее не скачали? =)

    Reply
  19. wwizard

    (24) Zigfridish, 🙂 а чем я тогда пользуюсь?

    Reply
  20. BalVlad

    Спасибо! Мне нужно было сделать ВПФ «Заказ покупателя» с изменением единиц измерения и в результате количеством и ценой для КА. Взял Вашу форму и засчитал поля как хотели менеджеры. Плюс!

    Reply
  21. kite2

    Замечательно! Подошло к современной УПП! Спасибо!

    Reply
  22. kite2

    Кстати, Maniac не рубит! Не всегда можно сделать внешнюю печатную форму путем копирования кода процедуры Печать(). Иногда это очень сложно. Может в конкретном случае и просто, а с некоторыми макетами — это очень трудно, т.к. код разбросан по всей УПП.

    Reply
  23. stas1kbob

    подошла к последней КА. Автору спасибо.

    Reply

Leave a Comment

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