Механизм расширения конфигурации в 1С 8.3.6




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

32 Comments

  1. DoctorRoza

    Краткость — сестра таланта!

    Reply
  2. baracuda

    Ссылку бы приложили на документацию.

    Если конечно она существует.

    1С уже привыкла что, документацию за нее пользователи пишут.

    Reply
  3. kuntashov

    Решение реальной прикладной задачи с помощью механизма, а не абстрактный пример — http://infostart.ru/public/359597/

    Reply
  4. dj_serega

    Нормик. Взял на заметку.

    Reply
  5. Bassgood

    (0) По моему публикация получилась скудная, в (3) намного полнее освящена эта тема (на сколько помню, была еще одна статья на эту тему с применением этой возможности для проверки ИНН контрагентов)

    Reply
  6. baracuda

    Ребята, подскажите пожалуйста.

    Допустим я добавил новый реквизит на форму, могу ли я его записывать в регистры сведений?

    Чтоб в дальнейшем по нему отчеты строить?

    Reply
  7. w.r.

    Полгода как уже на сайте 1С http://v8.1c.ru/o7/201410ext/index.htm

    Reply
  8. raminka

    Взял на заметку

    Reply
  9. bondar_vy

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

    Вы этот момент проверяли?

    Reply
  10. binex

    (9) bondar_vy@mail.ru, формы наследуются. Завязка идёт на имена реквизитов. Более того, в случае если подключено несколько расширений, то каждое последующее расширение использует в качестве позаимствованной формы результат предыдущего расширения.

    Reply
  11. lvictor58

    Насколько я понимаю: для возможности создания расширений необходимо для конфигурации отключить режим совместимости (Свойства —> Совместимость —> Режим совместимости = «Не использовать»). А для этого надо отключить поддержку. В противном случае эта опция недоступна. И вся прелесть автоматической поддержки теряется. Или я не там рою?

    Reply
  12. binex

    (11) Так точно. Нюанс упомянут в статье. Механизм на будущие конфигурации. Хотя в БП 3.0 его уже можно употреблять.

    Reply
  13. nixel

    (2) baracuda, вся документация по расширениям есть на ИТС. Причем с примерами более подробными, чем в этой «статье».

    Reply
  14. nixel

    (11) lvictor58, БП 3.0.41 уже без совместимости с 8.3.6. Скоро поднятутся остальные типовые

    Reply
  15. rus128

    Спасибо, познавательно. Но стиль языка довольно низкий, пунктуация местами неверная, плюс опечатка в сообщении в последнем примере (обАРботчика) — как в исходном тексте, так и на скриншоте.

    Reply
  16. DexterMorgan777

    Спасибо за пример. Помогло в одной задачке.

    Reply
  17. Borisych

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

    Reply
  18. леша

    (15) тоже про оБАРботчик заметил )))

    Reply
  19. echo77

    (0) Как я понимаю для конфигураций, у которых режим запуска обычное приложение этот механизм работать не будет?

    Reply
  20. DreamcastMD

    Вот меня давно мучает вопрос, как правильней :

    1. Делать много расширений на каждый измененный объект. (Вижу плюсы, в случае кардинальных изменений от поставщика отвалится только одно это расширение, остальные продолжат работать. Но список используемых расширений может оказаться довольно большим)

    2. Все изменения максимально вносить в одно расширение (может на скорость работы как-либо влияет)

    Reply
  21. Yashazz

    Фигня, а не публикация, прости хосспади. Передран кусок данных с ИТС и всего делов — 66 плюсов в копилку. Копипаст рулит, дааа…

    Где б тут минус поставить, а?

    Reply
  22. binex

    (21) Yashazz, плюсы в копилке погоды не делают. )) Статья, как следствие финального задания известных курсов. )

    Reply
  23. Yashazz

    (22) во-первых, делают. По крайней мере, ещё как делали раньше. Во-вторых, это ведь действительно отрывок из общеизвестной публикации с http://its.1c.ru/db/v837doc#bookmark:dev:TI000001528, причём совершенно непоследовательно вырезанный и без полномасштабного примера, каковой там приведён. В третьих, не понимаю, как публикация на ИС может быть следствием задания с каких-либо курсов, тем более такая куцая и дублирующая общедоступное. Вот если б вы изложили нечто, чего в документации нет — тогда понятно, а это, пардон, зачем?..

    Reply
  24. chuprina_as

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

    Отдельное спасибо за наглядность. Однозначный +.

    Автор, не обращай внимания на хейтеров.

    Reply
  25. pvvpvv

    (0) А Вы пробовали выгрузить конфигурацию?

    Reply
  26. fixin

    Хо, все таки расширения еще не доделаны. Обработчик событий формы — это хорошо. Но если нужно вмешиваться на уровне модуля? Вообще, хорошо что 1с движется в сторону Аспектно-Ориентированного Программирования, но что то как-то неуверенно.

    Reply
  27. SeTIrk

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

    Для того чтобы подправить проверку в 5 по стеку функции приходится копировать все 4 функции до, и править пятую.

    Ну и общие модули по всей видимости по той же причине не возможно редактировать.

    Ждем 8.3.9

    Reply
  28. Evgen2866

    Господа, не подскажите куда покопать?

    Создал расширение в тестовой базе, протестировал, все работает.

    Переношу в рабочую, не работает. Как будто нет вообще никакого расширения.

    Reply
  29. alevnev

    Есть довольно тонкий нюанс при добавлении в расширения справочника (документа), который используется в обработках расширения! Если вместе со справочником не добавлять его формы, то в результате платформа сгенерирует форму автоматически и в основную форму объекта из конфигурации (а не из расширения) Вы не увидите на экране никогда. Столкнулся с такой ситуацией в Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.51.16) + Расширение конфигурации на платформе 1С:Предприятие 8.3 (8.3.9.2170).

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

    Reply
  30. alevnev

    (28) Проверить возможность расширения конфигурации через «Все функции»- Стандартные — Управление расширениями конфигурации.

    Reply
  31. Kuzzka

    Возможно кто то сталкивался с такой проблемой и знает как ее решить:

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

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

    Reply
  32. pvvpvv

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

    Reply

Leave a Comment

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