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




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

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 не будет опубликован. Обязательные поля помечены *