Расширения конфигураций 1С: учимся перехватывать методы




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

43 Comments

  1. vaxhab

    (1) Неужели все так плохо ? Собираюсь переходить на расширения .

    Reply
  2. mrXoxot

    Полезные советы для разработки расширения можно посмотреть тут:

    http://infostart.ru/public/442003/

    Reply
  3. splxgf

    Да все нормально с расширениями, единственное придется переделывать обработчики УстановитьВыполнениеПослеОбработчиковСобытия у старых расширений, которые под 8.3.7 писались. Иначе система вылетает.

    А так расширение пережило три платформы и обновление УТ с 11.1 по ERP 2.2.

    Reply
  4. rozer

    (4)

    Иначе система вылетает.

    да, но не всегда — на когда запустил ДО 2.1 на 8.3.9 после 8.3.8 переделывал только в формах записей регистров сведений ибо ,да,вылетало… в формах же доков и в справочниках — все ок

    Reply
  5. Yashazz

    (2) Ну как сказать… Если у вас парочка безобидных изменений в дизайне формы или перегрузка скромного события элемента формы, то ещё прокатит. А вот замахнётесь на большее — ждёт вас дорога, вымощенная жёлтыми граблями.

    После того, как несколько релизов 8.3.9 кряду вообще падали при попытке сохранить изменения в расширении, мне всё стало окончательно ясно.

    (3) Ну хватит уже пиариться на ровном месте, а?

    Reply
  6. signum2009

    (6) Лично я и вижу расширения, как возможность делать мелкие допилы клиентам, которые не хотят снимать конфигурацию с поддержки…которые касаются больше удобства работы…

    Reply
  7. Новиков

    Спасибо, хорошая статья!

    Reply
  8. decdmb

    Кто-нибудь пробовал убирать у ERP 2.2 режим совместимости? Как себя ведет база, есть ли глюки?

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

    Reply
  9. Vladimir Litvinenko

    Главная проблема работы с расширениями — необъективная оценка количества предстоящих доработок разработчиками/внедренцами. Исходя из посыла «да нам же всего несколько кнопочек изменить на форме» начинается работа с расширениями. Количество доработок растет, расширения продолжают использоваться исходя из посыла «мы же уже используем расширения, давайте уже через них продолжать».

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

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

    Конечно в этот момент можно избавиться от одного из животных в зоопарке технологий и грамотно перенести все изменения в конфигурацию. Ведь дальше придется «ухаживать» за двумя зверями — и расширениями и доработками в самой типовой конфигурации. Убирать за ними, кормить, как-то мирить друг с другом, чтобы они ничего не сломали в процессе совместной работы, добавлять в вакансии на Хэдхантере еще одну строчку в список требований к разработчикам.

    По хорошему так и нужно сделать. Но Гетерогенность знает, что люди ленивые, боятся трогать то, что хоть как-то работает, у них всегда «нет времени», а начальство не способно оценить необходимость рефакторинга в этот критичный для отказа от лишней технологии момент времени. Доработки изменений, произведенных через расширения, продолжают делаться через расширения. Доработки выполненные в конфигурации — продолжают делаться в конфигурации. Главный враг архитектуры корпоративного ПО прочно закрепляется на захваченном плацдарме.

    В общем лучше хорошо подумать, прежде чем начинать использовать узкоспециализированную технологию. Если есть риск того, что структуру объектов придется менять или добавлять новые объекты БД, есть необходимость часто и без проблем запускать отладку, есть люди, понимающие как изначально менять конфигурацию без проблем для последующего обновления, то лучше сразу принять решение не плодить зоопарк. Переопределяемые модули, программную модификацию форм и подписки на события никто у нас не забирал. Если компания небольшая и сотрудникам важно чтобы конфигурация обновлялась одной кнопкой и сейчас и всегда в будущем, серьезных изменений точно не будет (действительно уверены?), то зоопарка не будет и с расширениями.

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

    Reply
  10. splxgf

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

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

    Reply
  11. signum2009

    (12) У меня есть сценарии к этим видео, если кому интересно, могу выложить в виде отдельного поста…

    Reply
  12. lavrov.online

    Платформа 8.3.10.2580. Почему-то не работает подобный функционал.

    В модуле формы при создании на сервере есть процедура ОбновитьИтоги()

    В расширении формы в модуле формы пытаюсь «врезаться» в нее и пишу

    &Перед(«ОбновитьИтоги»)
    Процедура Тест()
    а=1;
    КонецПроцедуры

    Но не заходит. Аналогичное происходит при попытке врезаться в типовые методы объекта. Я что-то делаю не так?

    Reply
  13. Anchoret

    (1)

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

    Reply
  14. lavrov.online

    (15) Дело было в галочке «Безопасный режим» в настройках расширения.

    Reply
  15. avk72

    Хорошая статья!

    Только, по моему, перехват методов работает при совместимости 8.3.9 и выше

    Reply
  16. sonGodv

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

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

    УТ11.3

    Reply
  17. EugeneSemyonov

    Добрый день. А кто-нибудь перехватывал методы когда нужно параметр добавить? Сейчас в режиме совметимости 8.3.10 получил следующее сообщение от предприятия:

    Ошибка применения модуля «РасшИнфСообщенияСАртикулом ОбщийМодуль.НоменклатураКлиентСервер.Модуль». Список параметров метода «РасшИнфСообАрт_ПредставлениеНоменклатуры» не соответствует методу «ПредставлениеНоменклатуры».

    в ERP 2.4.

    Кто знает как правильно расширять методы, если нужно добавить параметров?

    Поделитесь, пожалуйста, опытом.

    Reply
  18. kivals

    (20) ИМХО что-то не то с постановкой задачи — зачем Вам добавлять параметры?

    Механизм, прописанный в модуле/форме, о Ваших дополнительный параметрах ничего не знает, значит — использовать их не будет, т.е. всегда должно использоваться значение параметра по умолчанию.

    Таким образом пишите себе свою процедуру с дополнительным параметром:

    Процедура МоеВнутреннее_ПредставлениеНоменклатуры(…, МойНовыйПараметр = Неопределено)
    …
    КонецПроцедуры

    и вызываете его из перехваченного метода — без параметра или с каким-то предопределенным значением:

    &Вместо(ПредставлениеНоменклатуры)
    Процедура РасшИнфСообАрт_ПредставлениеНоменклатуры(…)
    МоеВнутреннее_ПредставлениеНоменклатуры(…, «ХХХ»);
    КонецПроцедуры
    

    А в своем коде — обращайтесь к своей процедуре, где этот параметр присутсвует:

    МоеВнутреннее_ПредставлениеНоменклатуры(…, «ААА»);
    Reply
  19. kivals

    (21) Вчера ответил — сегодня столкнулся.

    При переходе в режим совместимости 8.3.7 или выше (если конфигурация была ниже) — сталкиваемся с изменением реквизитов у методов ПередЗакрытием (формы) и ПередЗавершениемРаботыСистемы (модуль упр. приложения) в связи вот с этим: https://xn—-1-bedvffifm4g.xn--p1ai/news/2017-03-21-how2-correctly-close-forms-and-applications/

    Таки действительно вопрос остается открытым…

    Reply
  20. Rain88

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

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

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

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

    Reply
  21. Yashazz

    Из последних новостей: решил я после энного перерыва посмотреть — может, случилось чудо и 1С хоть что-то сделало нормально ранее чем через 5 лет после анонса.

    И что? И получаю такие чудеса с разделением областей, что словами не описать. Режим разделения по расширению изменить не даёт, обновить не даёт, на реальное наполнение базы (используется ли разделение или нет) плюёт. Глючит всеми мыслимыми способами.

    Решил, у меня руки кривые — но нет, в сети звучат вопросы на эту и сходные темы. И все без ответов, что характерно. Один из попавших под руку пруфлинков: https://www.forum.mista.ru/topic.php?id=817891

    Релиз был 8.3.12 из последних

    Так что несогласных с моим первым утверждением милости просим набивать шишки)))

    Reply
  22. Yashazz

    (24) с их помощью можно очень «здорово» нарываться на проблемы в неожиданных местах и заваливать проекты

    Reply
  23. sonGodv

    (25) Главное задекларировать возможность, чтобы привлечь внимание. А работает это или нет, вопрос уже третий

    Reply
  24. VmvLer

    При работе с расширениями использую принцип «не использовать в них самые новые возможности минимум полгода».

    Например, «сегодня» добавили возможность добавлять регистры оборотов в расширения — великолепно.

    Я буду следить за этим ноу-хау, но не использовать его минимум полгода, пока это новшество не «вылижут»

    А более «старые» возможности расширения использую без проблем — нытикам привет, вы, по-моему, слишком категоричны.

    что касается описанной в этой статье технологии расширения печати, то я считаю, что для таких ситуаций проще и понятнее

    использовать механизмы БСП (дополнительные печатные формы) — они дадут тот же результат с меньшими затратами.

    Reply
  25. creatermc

    (26) Конечно многое зависти от версии платформы и бсп, но курс 1С явно прослеживается в разработке возможностей расширения как независимого изменения типовой конфигурации

    Reply
  26. sonGodv

    (28) В 2007 году появилось динамическое обновление. Прошло 11 лет. недавно обновил динамически думал достаточно ждать. В итоге вылез косяк с формой списка справочника номенклатура)

    Reply
  27. VmvLer

    (30) в чем он выражался?

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

    динамическое обновление использую часто и густо лет 5 — риски, конечно, есть всегда. Но ведь их можно минимизировать, если включать мозг. тьху тьху тьху

    Reply
  28. sonGodv

    (31) Выражался в том, что дерево папок номенклатуры выглядело некорректно, двоилось, троилось, размножалось. Из всего помогало, только удаление папки из профиля пользователя. Через время появлялось снова

    Reply
  29. sonGodv

    (31) В составе обновления был только один общий модуль. Как еще тут включить мозг?

    Reply
  30. asdfgcom

    Фиг знает что делать с переходом на 8.3.13. В расширении были справочники и регистры. Получился заколдованный круг.

    Область действия расширения встала в Разделение данных. Конфигурация пишет, что использовать Разделение данных нельзя. Изменить область действия в режиме совместимости с 8.3.11 нельзя. Снимаю совместимость — «нельзя установить область действия расширения конфигурации в значение РазделениеДанных в иинформационной базе, не используещей разделение данных».

    Удалось как-то запустить включив режим совместимости 8.3.11 в расширении и в конфигурации. Получаю потерю таблиц.

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

    Reply
  31. simgo83

    (34) Я вышел так из положения. Создал новое расширение с Областью действия Информационная база, и объединил со старой, за исключением свойств.

    Reply
  32. asdfgcom

    (35) Объединял, но не посмотрел на свойства… Спасибо за подсказку. Буду смотреть.

    Reply
  33. axl007

    (35)А можно подробнее про объединение? Тоже столкнулся с такой проблемой — в расширении есть данные и надо как-то изменить область действия без их потери.

    Reply
  34. simgo83

    (37) все просто, также как и с конфигурацией, нужное расширение сохраняешь на диск, добавляешь новое и объединяешь как и конфигурацию из внешнего файла, сняв галку только со свойств.

    Reply
  35. axl007

    (38)Я так и делал. При удалении старого расширения, данные пропадают.

    Reply
  36. simgo83

    (39) мои расширения не имеют регистров, реквизитов и т.д., поэтому мне проще. Как вариант можно попробовать исправить расширение через редактор XML, «но это не точно».

    Reply
  37. simgo83

    (39) Посмотри здесь может поможет

    https://github.com/oscript-library/cfe2cf

    Reply
  38. alexeyvs77

    (29) Возможно ли добавить в расширение подписку на событие, если этой подписки нет в основной конфигурации?

    Reply
  39. alexeyvs77

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

    Правда, база самописная, сущностей немного и пользователей — 40-50 максимум. Платформа 8.3.10 и 8.3.13

    Reply
  40. creatermc

    (42) Конечно нет, расширение только позволяет расширить имеющуюся ну никак не заменить основную конфигурацию

    Reply
  41. alexeyvs77

    (44) «…с помощью расширений можно не теряя полный типовой функционал основного поставщика производить изменения или расширения имеющийся конфигурации…»

    Стало быть, далеко не всегда это утверждение верно

    Reply
  42. user872840

    (44) Документ новый добавить можно, справочник можно, план обмена можно.

    А Подписку на событие — нельзя!

    Логика 1С.

    Reply
  43. Niki_Pro

    Платформа 8.3.12

    &Вместо («Функция1»)
    Функция Расш1_Функция1(парам) экспорт
    Перем1 = ПродолжитьВызов(парам);
    Возврат Перем1;
    КонецФункции

    Вылетает ошибка

    Ошибка при вызове метода контекста (ПродолжитьВызов)

    Перем1 = ПродолжитьВызов(Форма);

    по причине:

    Вызов метода разрешен только в методах с аннотацией «Вместо»

    Вот вам и расширения… А самый прикол в том, что один раз отработало нормально

    Reply

Leave a Comment

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