Простая отладка внешних обработок




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

68 Comments

  1. awk

    Круто! А изменения внесенные в обработку то же сами погрузятся или все равно нужно выгружать-загружать?

    Может все-таки допилить хранилище внешних обработок на предмет наличия отладки?

    Reply
  2. EvilDoc

    я же писал — в помощь самым маленьким =)

    Reply
  3. pumbaE

    (1) awk, не понял эту мысль.

    Reply
  4. DrAku1a

    Для клиент-серверной базы, нужно чтобы процедура в общем модуле выполнялась на стороне клиента или сервер был переведен в режим отладки, иначе на точке останова этого останова не произойдет.

    Reply
  5. zfilin

    (1) awk, А не надо вносить изменения. Явно только для отладки.

    Конечно, если что-то долго писать и отлаживать, то не удобно. А если по-быстрому посмотреть «что делается», то пойдет.

    Reply
  6. mikmike

    Это не панацея на все случаи жизни, но как еще один вариант — очень даже подойдет.

    Reply
  7. knigula

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

    Reply
  8. Gida

    Очень неудобное решение! во-первых необходимо снимать конфигурацию с поддержки, что не всегда допустимо

    во-вторых — гораздо проще в самой обработке вначале процедуры запихнуть какую-то ошибку в попытке, а в конфигураторе поставить останавливать по ошибке, таким образом меняете только саму обработку и больше ничего 😉

    Reply
  9. qwed557

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

    Reply
  10. EvilDoc

    (9) Сохранить изменения, обновить в справочнике внешних обработок — это как минимум 2 нажатия мышкой, не большая проблема, капля времени. Все же поможет проверить получение параметров, к примеру, что невозможно при методе рисования формы и выбора объекта в поле ввода.

    (8) Внимательней читайте, ничего снимать с потдержки не надо =)

    Reply
  11. pumbaE

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

    Reply
  12. rwn_driver

    В принципе проблемы отладки внешних обработок решаются через выгрузку в файл и запуск через «Файл-Открыть». Если обработка связана с каким-то документом или справочником, то достаточно ввести реквизит с нужным типом и вывести его на форму (для выбора), а в саму обработку встроить проверку получения параметра (для установки значения этого реквизита при вызове обработки из документа/справочника).

    Reply
  13. pumbaE

    (12) rwn_driver,

    Для тех же печатных форм, обработок табличных частей и прочих внешних обработок будет удобно вести отладку таким образом, проверяя сразу взаимодействие с базой, а не рисовать форму обработки и открывать ее непосредственно
    Reply
  14. fomix

    (11) pumbaE, Попробовал использовать для отладки доп.параметр как показано у автора на рисунке.

    Ну,во-первых, для 8.2, чтобы отловить данный параметр, надо указывать в строке доп.параметров «/C debug;». Во-вторых, подключенную внешнюю обработку открыть для отладки форму обработки в конфигураторе таким образом не получилось! Возможно таким образом можно отлаживать только подключенные внешние печатные формы. Не пробовал… Хотя для этого можно ипользовать и более изящный способ!

    Reply
  15. pumbaE

    (14) fomix,

    1. попробуйте вместо «ПараметрыСеанса» указать «ПараметрЗапуска» .

    Если (НЕ ПустаяСтрока(ПараметрЗапуска)) И (Найти(ПараметрЗапуска, «debug;») > 0) Тогда
    лСтрокаИсключения = «debugMode»;
    ВызватьИсключение лСтрокаИсключения;
    КонецЕсли;

    2. В параметры запуска передается в режиме запуска Отладки, т.е. запускаете по F5 . Этот метод не подходит если хотите к чужому сеансу подключиться.

    Reply
  16. EvilDoc

    (15) Интересный способ, посмотрю на досуге =) Спасибо за интересный вариант

    Reply
  17. peterxx

    Для обработок — нормально. Для печатных форм лучше взять себе за правило создавать форму со ссылкой на обрабатываемый объект на ней. Дело минуты. И не нужно будет плясок с бубнами.

    Reply
  18. chmv

    Неправильное решение. Есть отладчики печатных форм

    Reply
  19. pumbaE

    (17) peterxx, ссылочный объект составного типа — запаришься выбирать во время отладки.

    (18) обязательно, только Отладчики печатных форм, отладчики заполнения ТЧ и т.д.

    Reply
  20. EvilDoc

    (18) Чего это неправильное? Вполне удобное. А про отладчики я ни чего не слышал. Статья ориентирована на «самых маленьких» чтобы упростить им их нелегкую долю. А мы с вами и без отладки напишем все что надо

    Reply
  21. Новиков

    (14) fomix,

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

    Просто это фича. От одного релиза платформы к другому поведение платформы меняется. В каком то релизе этот трюк срабатывает, в каком-то — нет. В свое время, вдоволь помучавшись с отладкой (видимо как и автор), я юзал обработки отладки от Поручика. Потом, были какие-то и там сложности, но какие — не вспомню с лету. Сейчас совсем сурово отлаживаю — рисую форму и отткуда уже дергаю методы вызова из БСП. Так и отлаживаю в последнее время. Но Поручику за его помогалки все равно спасиба!

    Reply
  22. chmv

    Поищи отладчики на этом форуме. Очень удобно

    Reply
  23. rwn_driver

    (12) rwn_driver,

    А что нужно «рисовать»? Просто создать основную форму и вывести на неё единственный реквизит (с набором нужных типов) для выбора.

    Reply
  24. Stim213

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

    Выполнить(«абра-кадабра») и включить в отладке остановку по ошибке.

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

    Reply
  25. CeHbKA

    (24) тоже пользуюсь методом ошибки 🙂 но автор, всёравно, молодец 😉

    Reply
  26. EvilDoc

    (25) Спасибо =) Делюсь своим метобом просто =) Прост в исполнении и для понимания =)

    Reply
  27. mbm

    Добавлю свои пять копеек …

    При разработке внешних печатных форм сразу в конец добавляю две строчки типа:

    //СсылкаНаОбъект = Документы.РеализацияТоваровУслуг.ПолучитьФормуВыбора().ОткрытьМодально();

    //Печать().Показать();

    Подчеркнутое — поменяйте на нужное.

    Если нужно отладить — достаточно раскомментарить эти строки и запустить как обычную обработку.

    Reply
  28. EvilDoc

    А что за метод ошибки? Просвятите плиз. Не в курсе просто. Из сообщений не понял ни чего

    Reply
  29. mikhailovaew

    (28) имеется в виду то, что описано в посте (24) — засунуть явно ошибочное выражение в попытку-исключение.

    Reply
  30. EvilDoc

    (29) Спасибо =)

    Reply
  31. smielka

    Спасибо.

    Reply
  32. AlexO

    (11) pumbaE,

    Почему-то 1Сники не используют всех возможностей конфигуратора

    Это не «возможность», это — фича, особеность работы конфигуратора.

    (12) rwn_driver,

    В принципе проблемы отладки внешних обработок решаются через выгрузку в файл и запуск через «Файл-Открыть».

    Не всегда, и, тем более, не «в принципе». В УФ может отработать, а может — не отработать. Как недоплатформа 8.2-8.3 «захочет».

    Reply
  33. baracuda

    Пробую САБЖ на 8.3.6. че то не получается, ничего не изменилось с тех пор??

    В справочнике снешние обработки теперь появилась к кнопка ОТЛАДКА. Как ей пользоваться?

    Reply
  34. baracuda

    Пожалуй вот самый оптимальный вариант, если САБЖ не подходит.

    http://www.obrabotki.com/otladka-bsp-1s/

    Reply
  35. EvilDoc

    8.3.6 — проверил — работает. Соответственно нужна либо клиентская процедура в общем модуле, либо файловая база либо сервер 1с в режиме отладки (-debug)

    Reply
  36. EvilDoc

    (36) VovkaPutin, я о том же — только я не предлагаю искать функцию общего модуля — я предлагаю ее вызвать.

    Ну и еще — если отладка на сервере не включена то все это только для клиентских функций обработки и в клиентской общем модуле 😉

    Reply
  37. serg1983

    не работает ни одно ни другое.Подскажите пожалуйста для чего нужен режим отладки во в дополнительной обработке

    Reply
  38. EvilDoc

    (38) serg1983, Работает) У вас сервер в редиме отладки?

    Поп оводу БСПшного механизма отладки внешних обработок — не подскажу — пока не доводилось сталкиваться

    Reply
  39. serg1983

    Не совсем понимаю «сервер в режиме отладки». Ноутбук платформа 1с 8.3.5.1443 Конфигурация «Бухгалтерия предприятия 3.0» базовая. При остановке на ошибке останавливается на модуле конфигурации где открывает форму внешней обработке. В саму внешнюю обработку ни как не хочет вставать. Пробовал как в процедуре НаСервере так и НаКлиенте.

    Reply
  40. EvilDoc

    (40) serg1983, база файловая/серверная?

    Reply
  41. EvilDoc

    Ни когда неработал с базовой. Вы попадаете отладчиком в общий модуль? Шаг отладки делаемнажатием f11 (не f10). Сложно угадать почему у вас не получается — у меня все работает

    Reply
  42. КРТЩ

    у меня не работает. то есть не заходит в обработку. пичаль

    Reply
  43. КРТЩ

    (42) ERP2.0 на выходе из процедуры F11 не попадает в обработку.

    Reply
  44. EvilDoc

    (44) КРТЩ, Можно подробнее? Файловая/серверная, сервер в режиме отладки или нет?

    Какую процедуру и в каком общем модуле используете? Завтра днем проверю — только у меня ERP 2.1

    Reply
  45. КРТЩ

    (45) подробнее файловая 1С:ERP Управление предприятием 2.0 (2.0.10.115)

    1С:Предприятие 8.3 (8.3.6.2152)

    клиент без разницы

    процедура ОМ ОбщегоНазначения ЭтоСсылка()

    Reply
  46. WITUM

    1С:Предприятие 8.3 (8.3.6.2152)

    тоже не работает метод

    Останавливается в Функции общего назначения, нажимаю F11 ….. обработка проходит в обычном режиме

    Не делает шага, не останавливается, а просто продолжает отработку.

    Reply
  47. 7OH

    Если я верно понимаю, то на платформе ниже 8.3.7 шагнуть из отладчика на клиенте внутрь внешнего файла на сервере невозможно (в виду того, что файл находится на другом компе).

    Reply
  48. Wefast

    Что то я не пойму как мне отдалить внешнюю печатную форму для управляемых форм.

    Где мне вызвать общий модуль, если никакой формы нет. А какой либо ф-ии события в модуле объекта нет.

    Reply
  49. ccserg

    чот нифига не работает у меня

    Reply
  50. Crazy_Max

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

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

    Если автору не лень, пусть добавит эту информацию, чтобы народ не маялся пустыми надеждами, а сразу добавлял возможность запускать внешнюю обработку через «Файл-открыть» и там уже отлаживать.

    Reply
  51. VovkaPutin

    (51), еще вариант есть:

    Поставить отладку на паузу в конфигураторе, нажать кнопку печать в предприятии, в отладке, нажимать кнопку F11, так дойдешь до нужной строчки обработки

    Reply
  52. Crazy_Max

    (52) А ты прям проверил, или так просто написал, «знаючи»? 🙂

    Reply
  53. EvilDoc

    (51)

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

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

    Если автору не лень, пусть добавит эту информацию, чтобы народ не маялся пустыми надеждами, а сразу добавлял возможность запускать внешнюю обработку через «Файл-открыть» и там уже отлаживать.

    Да — да, даже с включеным режимом отладки на сервере этот способ теперь не работает. Напишу об этом в теме. Спасибо.

    Reply
  54. VovkaPutin

    (53), постоянно пользуюсь

    Reply
  55. sims089

    Так как отладить внешнюю обработку заполнения тч?

    По комментам, как понял все описанные способы уже не работают??

    Reply
  56. sims089

    Все нашел способ) Не знаю, можно ли здесь давать ссылки на другие ресурсы?

    Reply
  57. EvilDoc

    (57) Если это интересно и полезно — конечно)

    Reply
  58. sims089
    В модуль ДополнительныеОтчетыИОбработки вносим следующие изменения:
    Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт
    …
    // Было:
    // ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, ,
    //    БезопасныйРежим);
    // Стало:
    ИмяОбработки = Менеджер.Создать(«c:МояОбработка.epf», Ложь);
    ИмяОбработки = «ИмяМоейОбработки»; // ИМЯ(!) Внешней обработки,
    которую Вы отлаживаете, как оно задано в конфигураторе
    …
    
    Процедура ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные,
    ПараметрыРегистрации, РезультатРегистрации)
    …
    // Было:
    // ВнешнийОбъект = Менеджер.Создать(РезультатРегистрации.ИмяОбъекта);
    // Стало:
    ВнешнийОбъект = Менеджер.Создать(«c:МояОбработка.epf», Ложь);

    Показать

    Здесь ссылка на источник

    Reply
  59. sims089

    Главное запустить конфигуратор от имени администратора и можно в процессе отладки сохранятся в обработках. Вообще удобная штука!!

    Reply
  60. Xershi

    Сделал как и советовал автор.

    Вызываю процедуру в своем общем модуле куда передаю все параметры из статьи http://infostart.ru/public/558559/, плюс саму форму обработки и все больше танцев с бубнами не нужно!

    Reply
  61. fktrc171

    (61) Не могу найти ни модуля ДополнительныеОтчетыИОбработки , ни справочника Дополнительные отчеты и обработки . Работаю в Бухгалтерии 2.0. Платформа 8.3.9.2033. Очень хочется научиться заходить в отладчике во внешнюю обработку. Подскажите поподробнее, пож-та.

    Reply
  62. Xershi

    (62) это объекты БСП, в 2.0 обычные формы и там их еще нет. Там другой механизм и толстом клиенте эти танцы с бубном не нужны!

    Reply
  63. VovkaPutin

    (63)попробуй при открытие формы вставить код: ВызватьИсключение(«а»);

    Reply
  64. Xershi

    (64) я для УФ нашел еще проще решение, просто написать форму и вызывать обработку из файла, тогда проблем с отладкой не возникает! А ваш метод работает только для толстого клиента обычного приложения, для УФ на БСП это не работает, т.к. обработка не сохраняется на жесткий диск, а сидит в памяти!

    Reply
  65. AlexO

    (18) давно уже с 8.2.какой-то поздней версии для УФ все отладчики ВПФ и ТЧ можно выкинуть — 1С стала все писать в адресное хранилище и брать оттуда, т.е все в памяти хранится в виде BLOB.

    Теперь — либо доп.формочку в обработку и выбирать обрабатываемый объект, либо — вводить обработку в конфигурацию — и отлаживать оттуда.

    И то не факт, что все получится.

    ———-

    Кстати, можно не попасть в некоторые процедуры между общими КЛИЕНТСКИМИ модулями (на Клиенте которые). Вызов есть, выполнение — есть, а попасть нельзя. Очередной прикол.

    Платформа 8.3.11, следовательно, минимум до неё этот глюк с древних времен 1С, новее пока нет.

    Reply
  66. lisiy12345

    (59) пробовал все способы, только этот способ из всех описаных оказался рабочим для отладки доп.отчетов и обработок.

    (8.3.10.2667) УФ

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

    варианты с остановкой по исключению срабатывают. но модуль вн.обработки не открывается для отладки.

    Reply
  67. denmax

    Для УФ на БСП последних версий работает это https://infostart.ru/public/916110/

    Reply
  68. InJey

    (24)Спасибо реально работает везде без проблем! Лазил искал решение долго, а оказалось все просто!

    Reply

Leave a Comment

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