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




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

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