v82 управляемые формы: способ вывода excel листа на управляемую форму с перехватом некоторых событий экселя.




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

28 Comments

  1. Kuzja_R

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

    Reply
  2. MarSeN

    OWC — Office Web Component. Это бесплатный пакет от MS Office который реализует вывод в частности екселя в HTML.

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

    Спасибо

    Reply
  3. Rustig

    (0) сложновато для понимания для чего это нужно, и в части реализации много всего надо увязывать.

    У меня вопрос: все ли возможности Эксель можно использовать при таком встраивании в 1С?

    Reply
  4. MarSeN

    to: Rustig

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

    В этой статье я попытался описать/показать на примере способ выложить на форму ActivX и работать с ним, в том числе и перехватывать/передавать события «актива» для обработки в 1С. Это может быть не не только ексель.

    В моей практике использовал подход в бюджетировании. Сужествовала настройка щаблона (екселя: определение активных областей с привязкой к ним типов 1С) и последующее заполнение в доступные поля информацией с последующим проведением (данные помещались в регистры). Причем настройка была универсальная. Отмечалась область(ти) экселя и им присваивался тип/вид/предопределенное значение и т.п.

    С объектом эексель листа доступные все необходимые методы и свойства (перебор, доступность ячейки, считывание/помещение данных и т.п.). Что касается событий — основные я выложил в примере и описал.

    Спасибо за проявленный интерес.

    Reply
  5. deemaa

    статья хорошая, вот только как быть в случае использования 8.3 с линуксом на клиенте? activeX уже не канает…

    Reply
  6. MarSeN

    to: deemaa

    Да, с Linux явно проблема…

    Успокаивает то что в ближайшее время большинство будет работать под виндой, а там глядишь и 1С что-нить придумает )

    Reply
  7. kereo

    (4) а почему не использовались таблицы 1С?

    Reply
  8. MarSeN

    to: kereo

    Дело в том что для того чтобы организовать пересчет калькулируемых ячеек в MXL нужно серьезно поработать программисту и всегда это будет «фиксировано» алгоритмами. Используя лист экселя настроить калькулируемые колонки может любой пользователь мало-мальски знающий ексель. Далее его можно уже сохранять в шаблон/подгружать в документ, вводить нужные (статические данные) и считывать информацию из листа екселя на форме для постинга/сохранения этих данных в 1С.

    Если Вы готовы удовлетворить каждый «чих» пользователя можно использовать MXL. Я за универсальные решения.

    Спасибо за вопрос

    С уважением

    Сергей Марченко

    Reply
  9. Rustig

    (4), (5), (7) конструкция to: Rustig не работает.

    Если бы я не посмотрел новые комментарии, я бы не узнал, что вы ответили мне.

    А если бы вы использовали конструкцию (3), мне пришло бы уведомление на эл. ящик.

    В моей практике использовал подход в бюджетировании. Сужествовала настройка щаблона (екселя: определение активных областей с привязкой к ним типов 1С) и последующее заполнение в доступные поля информацией с последующим проведением (данные помещались в регистры). Причем настройка была универсальная. Отмечалась область(ти) экселя и им присваивался тип/вид/предопределенное значение и т.п.

    Дело в том что для того чтобы организовать пересчет калькулируемых ячеек в MXL нужно серьезно поработать программисту и всегда это будет «фиксировано» алгоритмами. Используя лист экселя настроить калькулируемые колонки может любой пользователь мало-мальски знающий ексель. Далее его можно уже сохранять в шаблон/подгружать в документ, вводить нужные (статические данные) и считывать информацию из листа екселя на форме для постинга/сохранения этих данных в 1С.

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

    Reply
  10. kereo

    (9) Rustig, я так подозреваю, что разгадка кроется вот в этой таинственной фразе

    щаблона (екселя: определение активных областей с привязкой к ним типов 1С)

    Только вот чтобы это значило? Ссылки на справочники в экселе?

    Reply
  11. MarSeN

    (9),(10)

    Если вы обсуждаете мое решение, о котором я вскользь упомянул в комментариях, то совершенно верно: ячейки екселя в шаблоне «типизировались» (справочник/перечисление/…/Число/Ячейка данных из 1С и т.п), задавались предопределенные значения справочников/перечислений…. прямо в шаблоне ексель. Соответственно на основании этого шаблона создавался документ с уже с частично заполненными данными и ожиданием заполнения оставшихся.

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

    Спасибо

    Reply
  12. Stamper

    вмемориез! автору балловсколькохош

    а ведь часто требуют «сделайте мне как в Excel»

    Reply
  13. SERJ_1CC

    Интересная вещь, однозначно пригодиться, спасибо за решение…

    Reply
  14. MarSeN

    (13)

    Пожалуйста, SERJ_1CC

    формой благодарности может послужить «+» к этой статье )

    Reply
  15. Sairys

    Хорошая статья, очень интересная и занимательная, автору спасибо.

    Reply
  16. KroVladS

    Разъясните плиз.

    Могу ли я легально использовать OWC, без установленного/купленного MS Office?

    Reply
  17. gavrikprog

    Помогите, кому скучно… 🙂

    Есть вроде веб компонент для MS Project.

    pjgrid11.ocx Отображает сведения о задаче, расписание и диаграмму Ганта.

    Но пока что-то не осилил его.

    Сам компонент

    http://www.microsoft.com/ru-ru/download/details.aspx?id=20488

    Дока

    http://msdn.microsoft.com/ru-ru/library/ff407962(v=office.14).aspx

    Reply
  18. MarSeN

    (16) как я понимаю — Да. Но я не юрист )

    Reply
  19. sergbsv

    Как добавить возможность открыть и сохранить файл из 1С ?

    Reply
  20. bubu

    прям как в микроинвесте

    Reply
  21. MarSeN

    (19) Файл должен быть xml. Я точно не помню методы, но на вскидку можно прочитаьь и записать непосредсьвенно XMLData

    Reply
  22. MarSeN

    (20) конфа на УФ? если да, то какая фирма писала, кто аввтор?

    Reply
  23. sergbsv

    конфа самодельная на 100%,

    автор я

    Reply
  24. sergbsv

    да на УФ, вэб-клиент

    Reply
  25. MarSeN

    Кто пояснит, за что раздают мани в этом посте?

    Reply
  26. MarSeN

    (23) sergbsv, вопрос «конфа на УФ? если да, то какая фирма писала, кто автор?» был адресован bubu(20) )

    Reply
  27. bayce

    По-моему отличная вещь.

    Если клиенты платят, то почему бы не сделать и Excel на форме.

    Reply
  28. German_Tagil

    подумаю

    Reply

Leave a Comment

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