Создание новой внешней печатной формы под управляемое приложение с нуля (для начинающих)




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

40 Comments

  1. TrinitronOTV

    спасибо за подробный рассказ формирования внешней печатной формы

    Reply
  2. serpent

    За труды «5», за оЧепятки «4».

    «…Распика о получении товаров»

    Подкорректируйте.

    Reply
  3. Hitchenson91

    Подредактировал.

    Reply
  4. necropunk

    Было же уже вроде

    http://infostart.ru/public/286059/

    Reply
  5. Hitchenson91

    Я вижу по ссылке копирование счета.

    Reply
  6. monkbest

    Статье плюс.

    Можете воспринять мое сообщение как спам, но тут написал про все варианты внешних обработок под УФ (заполнения таб части, печати, печать с предварительным открытием формы, печать с выводом в ворд, опен офис….)

    http://prosto1s.ru/index.php/oblako-tegov/13-vneshnyaya-obrabotka

    Reply
  7. Hitchenson91

    (6) monkbest, я не против пусть народ обчитается, мне в свое время не хватало таких материалов.

    Reply
  8. monkbest

    (7) мне тоже:) с помощью документации к стандартным подсистемам на ИТС писал свои обработки, затрахался и решил выложить на всеобщее обозрение

    Reply
  9. SemenovaMarinaV

    Полезно.

    Reply
  10. tindir

    Весело. Если честно, то статья бесполезная.

    Если для новичков, то не хватает подробного разбора для чего нужны чудо строки:

    ПараметрыРегистрации.Вставить(«БезопасныйРежим», ЛОЖЬ);

    ПараметрыРегистрации.Вставить(«Версия», «1.0»);

    и где же «ВызовСерверногоМетода», «ОткрытиеФормы» и т.д.

    А такой пример давно есть на ИТС.

    Да,да,да…»все уже было на ИТС», но если бы вы подробно раскрутили механизм разработки хотя бы более мене сложной внешней обработки, то этого точно на ИТС не было.

    Reply
  11. monkbest

    (10) tindir, а можете ссылку на its дать?

    Reply
  12. Поручик

    (4) Их уже куча с 2011 года.

    Просто автор (0) в первый раз столкнулся с конфой на БСП и радостно побежал гордиться в интернеты.

    Reply
  13. Yashazz

    (12) Целиком согласен. И, что характерно, толковых именно «статей» среди них нет. Есть огрызки с ИТС вкупе с мешаниной на основе собственных поделок. Сплошь доработка чужих шаблонов и копипаст, никакой нормальной теории даже хотя бы в объёме ИТС. А уж чтоб разжевали специфику работы с, например, «ВызовКлиентскогоМетода» для обработки заполнения — мечты, мечты… Самому, что ли написать, ибо осточертело наблюдать это однообразное дилетантство…

    Reply
  14. monkbest

    (13) Yashazz, уровень ИТС никому не нужен, его можно на ИТС прочитать, нужна «новизна», хотя что-то никто ссылку на ИТС так и не скинул. Видимо, её никто в глаза сам не видел:)

    Нужна «быстрая» инструкция, чтобы при разработке печ.формы тратить время не на познания тонкостей БСП, а на рисование красивого макета и правильного кода.

    Никому не надо понимать «ВызовКлиентскогоМетода», надо простое правило: цель 1 — код 1, цель 2 — код 2… а почему, зачем — не интересно многим.

    Нужно проще: открываем свою форму до формирования макета — клиентский вызов, не открываем — серверный и два образца/шаблона, чтобы забыть это БСП как страшный сон и заниматься творчеством.

    Я в своих статьях старался придерживаться принципа «быстрой подсказки», жалко IS не разрешает публиковать то, что уже где-то опубликовал.

    Reply
  15. monkbest

    (12) Поручик, а Вы в курсе, что печатные формы образца 2011 не работают в БП 3.0 и ЗУП 3.0 образца конца 2013ого? БСП не стоит на месте

    Reply
  16. Yashazz

    (14) monkbest, вам что, настолько лень или вы искать совсем не умеете? http://its.1c.ru/db/bspdoc#content:22:1:issogl2_созданиеновогоотчетаилиобработки

    Совершенно никто не призывает копаться в глубинах, это для энтузиастов. Но в энцатый раз наблюдать некие огрызки вместо статей, за которые навешано сотни плюсов, притом что даже воспользоваться этими горе-публикациями иной раз трудно (начато за здравие, кончено за упокой, или понадёргано отовсюду и хаотично перемешано). Лучше, чем подано на ИТС, я просто не видел.

    А если кому-то надо не только разжевать, но и в рот положить — то неясно, что этот кто-то делает на форуме профессиональных разработчиков.

    Никому не надо понимать «ВызовКлиентскогоМетода»

    — ну, вы за всех-то не говорите. Тупым быдлокодерам, может, и не нужно, а грамотному специалисту очень даже понадобится.

    Reply
  17. Yashazz

    (17) Я не вижу тут статьи. Я вижу незаконченный ошмёток некоего частного примера.

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

    разжевана теория, примера — нет

    Вам того куска кода мало? Чего ещё не хватает-то? Есть пример и более чем достаточный.

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

    Reply
  18. Hitchenson91

    Боже, даже и не думал что тут будут писать столь профессиональные и крупные тролли. Даже рейтинг вырос в 3 раза) спасибо.

    Reply
  19. shmellevich

    Если уже столько плюсов, то наверно в топике шото есть, за что можно поставить плюс 😉

    Reply
  20. webester

    (20)Мне иногда кажется, что надо просто, взять цикл статей, (работа с переключателями, скд, запросы, еще что нить, из топа за год) немного изменить их(сделав из одной штук 10), добавляя одни детали и убирая другие и собственно публиковать их раз в месяц, так что бы статья про внешние обработки выходила к примеру раз в год-полгода. Гарантированно все будут в плюсе, гарантированно, ее будут читать те кто дальше главной страницы смотреть не умеет. И гарантированно, будут отзывы «нууу не знаю как вам, а мне статья пригодилась.» Просто потому что на главной. Ну или я не знаю, к чему такой восторг, к вещам которые гуглится за 10минут.

    Reply
  21. andrey_name_912

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

    Reply
  22. Hitchenson91

    Будем надеяться я хоть немного сократил эти 10 минут. хотя бы до 2-3.

    Reply
  23. Yashazz

    (20) shmellevich, уверяю вас, кроме кривого перепоста статьи с ИТС и вырванных из контекста огрызков, тут нет ничего.

    (22) Ага, именно. И плюсов будет немерено. Потому что тупых и ленивых кодеров завсегда больше, чем профи, и постепенно ИС превращается даже не в «лягушатник» для начинающих, а в ухудшенную копию жёлтых книжек и ИТС. Лень людям напрягаться, лень, вот и того, кто их лень поощряет, как автор этой простигосподи «статьи», плюсят… Детский сад.

    Эй, «умники», а кто мне навскидку скажет, можно ли использовать псевдомодальные вызовы вроде ПоказатьПредупреждение, в клиентском вызове, например, заполнения на основании? Или вы все дальше печати не заглядывали?

    Reply
  24. Hitchenson91

    Статья для начинающих ) не понимаю почему у вас с поручиком так полыхнуло в заду.

    Reply
  25. Hitchenson91

    Когда мне мой работодатель(который платит мне деньги за знания) скажет изучи

    вот эту ху.. можно ли использовать псевдомодальные вызовы вроде ПоказатьПредупреждение, в клиентском вызове, например, заполнения на основании? Или вы все дальше печати не заглядывали?

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

    Reply
  26. tindir

    (11) monkbest, вот тут. причем не с комментариями в коде, а с разбором что куда и когда=) имхо когда кинули в меня конфой с новым бсп я пользовался этим. Да как говрили чуть позже, что «потерял» время. Но программирование без таких «потерь» времени перестает быть программированием=) если человек начинает думать, что он все знает в языке, то он просто изучил только одну плоскость и дальше не хочет выходить. ИМХО кнеш=)

    Reply
  27. zse

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

    Reply
  28. belochkaNN

    Да, недавно только сама столкнулась с той же проблемой — создания ВПФ на УФ. Была неприятно удивлена множеством необходимых и непонятных модулей, которые нужно написать, чтобы просто добавить форму в список внешних печатных форм.

    Reply
  29. zse

    Для меня «новый подход к созданию внешних печантых форм на 8.3» — это памятник дебильной юзабилити (да простят меня разработчики 8.3).

    Скажите — разве это так трудно спрятать код для подключения непосредственно в штатную обработку по подключению внешних обработок и печатных форм?

    Мне кажется — это явный признак того, что проектирование уже идет само по себе безо всякого проекта и напоминает просто латание огромных гнилых дыр.

    Reply
  30. webester

    (24)Конкуренция она делает свое черное дело 🙂 если вы специалист и понимаете «можно ли использовать псевдомодальные вызовы вроде ПоказатьПредупреждение, в клиентском вызове», то вы работаете быстрее и качественнее, спите дольше и зарабатываете больше, бонусом поднимаете себе самооценку при выходе таких статей. А чайник который не умеет гуглить глядишь и заработает на 2тр больше. Профит очевиден и для всех 🙂 А то, что для кого то открытием стала технология подключения внешних печатных форм, так это его временные трудности, он перешагнет через это как и вы когда то.

    Reply
  31. monkbest

    (24) Yashazz,

    время идет, поколения меняются. Кто-то тут из старичков и диплодоков брызжет слюной, мол «тупые», мол «почитать лень». А Вы себя помните, когда только пришли на работу, в первый раз открыли 1С и Вам поручили создать Вашу ПЕРВУЮ печатную форму?

    Не знаю как Вы, а я начинал с 7.7, там было все проще, минимум заморочек, простые структуры данных, проще начинать было. А нынешнее поколение стартует с «этой» БСП и они ищут помощи в инете. Для них покорение БСП, как откровение, как победа над самим собой. И они не следят за лентой инфостарта уже 10 лет, они не в курсе, что где-то там, 100500 постов глубже лежит их подсказка, они её 10 лет назад не добавили в избранное.

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

    В заголовке четко написано: «для начинающих», зачем пришли, если считаете себя выше этого?

    Про простые вещи тоже надо писать.

    Reply
  32. SemenovaMarinaV

    Любопытно, но не более

    Reply
  33. jaroslav.h

    Спасибо, я всегда ЗА такие публикации, ведь профи кажется, что все это должны уже знать но профи тоже когда то были «детьми» поэтому пускай просто пропускают такие публикации если не нравится и да, профи, вы тоже когда то делали что то первый раз и я уверен, что вам так же хотелось с кем то поделиться этим, хотя всякие бывают ). Спасибо.

    Reply
  34. jaroslav.h

    (32) monkbest, абсолютно верно, просто в точку, я отношу себя не к новичку даже, а просто к начинающему и мне очень нужны такие публикации и я бы тоже гордился если бы что то получилось и хочу сказать, что это и делаю, просто не хочу злить себя, выкладывать для меня сложные, а для кого то элементарные вещи на такие ресурсы, что бы потом в комментариях не писать одно и тоже, я просто с семьей своей порадовался об этом, обсудили и доволен ), а такие публикации НУЖНЫ и ваш комментарий очень в тему.и авторов такие публикаций я более уважаю чем того кто напишет мол «это элементарно или человек просто первый раз открыл для себя что то» и не задумываясь, что он тоже начинал с азов и т.д.

    Reply
  35. tindir

    ПриступСтарперстваМодеОн

    В свое время «вошел» в 1с по собственной глупости. «Зря ты, Вадим, пожарку на складу отключил на ночь для обновление сервера. зрярязря….» В общем остался без работы по причине отсутствия самой работы. =) А кушать хочеться + практику для вуза надо закрыть. Пришел на другое пердприятие со словами «Да,да,да я знаю что такое 1с8.2». На самом деле не сталкивался ни разу. За 2 недели были прочитаны полностью пособие разработчику и пару трудов Радченко. И был как раз написан «первый отчет». Да не просто отчет=) по незнанке был сделан свой механизм отборов. А отчет представлял из себя кросс-таблицу с расшифровками по клику=) И как бы веселье было в том, что спросить не у кого. Как то так.

    ПриступСтраперстваМодеОфф

    Так о чем я. Да, не спорю, что живем мы в постмодерновом информационном пространстве, что создало явление «клиповости» сознания. Когда надо «вот сейчас и быстро (без смс)». НО это не знание. =) Я не считаю себя гуру или батей программирования, да и 1С тоже (вон с грамматикой и пунктуацией тоже не все ок), но зачем плодить сущность? Есть миста, в которой ветки новых сообщений замыкаю ссылками на посты 2010 года. =) «Исчите, да обрясчите». А вот о «псевдомодальные вызовы» я даже не слышал. было бы круто если показали где почитать и что это…хотя нет…не нужно…если я правильно понял посыл то как то так.=)(32)

    Reply
  36. SemenovaMarinaV

    Я ошиблась. Все-таки помогло

    Reply
  37. Bacemo

    Для начинающих самое то. +

    Reply
  38. vicmos

    (24) Yashazz,

    Оччень хорошо сидеть на одном проекте, и заниматься бантиками по оптимизации кода, его красоты и прочей имитацией трудовой деятельности,

    каждому свое, с таким мнением я столкулся лет 15 назад, теперь — время деньги

    Reply
  39. vicmos

    спасибо за статью, все просто и доходчиво

    Reply
  40. Hitchenson91

    еще чуток и будет 100 подписок) неплохо для 1ой статьи)

    Reply

Leave a Comment

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