1С для .NET. Средства интеграции.




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

33 Comments

  1. Elisy

    Есть еще неперечисленный Elisy .Net Bridge, который давно представлен на Инфостарт с огромным числом примеров использования .Net framework. Думаю, что по степени интеграции с 1С и числу поддерживаемых версий 1С он превосходит все вышеперечисленные методы интеграции.

    Reply
  2. enterra

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

    Reply
  3. Elisy

    (2) Хорошая достойная статья. В подтверждение своих слов ставлю «плюс». Но Elisy .Net Bridge представлен в статье одной внешней обработкой Elisy.LinqTo1CSql.81, которая составляет лишь малую часть продукта. Это меня и смутило. Основой же является Elisy.NetBridge.dll, которая позволяет из 1С обращаться ко всей функциональности .Net Framework.

    Reply
  4. steban
    Типичный недостаток данных способов – возможна низкая скорость при передаче больших массивов данных. В случае COM-соединения данная проблема может быть частично решена путем использования пула соединений.

    неверно.

    или неточно.

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

    Reply
  5. annak2980

    Хорошая статья, в качестве вводного обзора для меня, как новичка в этих вопросах.

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

    Reply
  6. Elisy

    Выводы могу сделать такие: Enterra — лишняя в статье, так как ничего нового не несет, а дублирует доступ к 1С через КОМ. Более того, использование Enterra приведет к появлению ненужного посредника и необходимости знать две объектные модели: одну для 1С, а другую, которую вводит Enterra. 1С с КОМом до этого нормально справлялась.

    Enterra не несет в себе визуальных компонентов, а опирается на .Net-контролы. В связи с этим Enterra уступает визуальным компонентам 1С, специально заточенным на свою объектную модель. Выглядит это достаточно пестро и чудно, как здесь на картинках, особенно в связке с нелокализованными на русский язык контролами сторонних производителей (для OLAP).

    Не вздумайте отображать многострочные объекты 1С (например, регистры сведений), как показано в примерах. Кроме зависания это ничего не вызовет. Реализация же их вывода нормальным образом через виртуальный режим DataGridView (VirtualMode) может занять у вас остаток жизни.

    Reply
  7. AnnaDav

    (4) Да, вы правы. Возможно, не совсем аккуратно сформулировано. Имелось в виду, что использование пула положительно сказывается на скорости COM-соединения в целом (за счет экономии времени (и ресурсов) на получение соединения). Спасибо, что обратили внимание на неточность.

    Reply
  8. AnnaDav

    (6)

    Enterra — лишняя в статье, так как ничего нового не несет, а дублирует доступ к 1С через КОМ

    Enterra SDK, возможно, и не несет ничего нового, но цель не в этом. Использование компонента просто экономит ВАШЕ время на создание .NET оберток + дает некоторые рецепты обращения с 1С из .NET кода

    Более того, использование Enterra приведет к появлению ненужного посредника и необходимости знать две объектные модели: одну для 1С, а другую, которую вводит Enterra

    Не совсем понятно, о какой собственной модели идет речь? Enterra SDK практически не вводит своих новых типов, модель полностью основана на объектной модели 1С

    1С с КОМом до этого нормально справлялась

    1С с КОМом нормально справляется» — сомнений нет. Идея в том – что Enterra SDK дает .NET разработчику объектную модель 1С в удобном и привычном виде, а значит, экономит время и силы на необходимость вникать в детали работы и 1С, и механизмов COM

    Enterra не несет в себе визуальных компонентов, а опирается на .Net-контролы

    90% визульных компонентов опирается на .NET контролы. Очень мало тех, кто создает свои собственные текстбоксы, комбобоксы и т.д. Enterra SDK таки включает некоторый минимальный набор контролов для работы с 1С сущностями, но ценность ее конечно не в контролах, а совсем в другом (см. выше)

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

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

    Reply
  9. enterra

    Есть предложение переместиться с предметным обсуждением компонента в соответствующий раздел на форуме — http://infostart.ru/public/62798/forum/topic/29937/.

    Будем рады продолжить конструктивный диалог. 🙂

    Reply
  10. Elisy

    (8)

    Enterra SDK, возможно, и не несет ничего нового, но цель не в этом. Использование компонента просто экономит ВАШЕ время на создание .NET оберток + дает некоторые рецепты обращения с 1С из .NET кода

    1C.NET Adapter (http://www.gotdotnet.ru/files/406/) экономит время и дает рецепты. А Enterra ничего нового не приносит на этом поприще.

    Не совсем понятно, о какой собственной модели идет речь? Enterra SDK практически не вводит своих новых типов, модель полностью основана на объектной модели 1С

    К каким объектам 1С относятся «Session», «ConfigTreeControl», «DocumentObjectViewControl». А сразу человек узнает, что за «ValueTable» скрывается ТаблицаЗначений?

    Enterra SDK дает .NET разработчику объектную модель 1С в удобном и привычном виде

    Зная .Net-разработчиков, они мягко говоря удивятся и отойдут от этого удивления не скоро от конструкции вида

    string queryText =
    @»ВЫБРАТЬ
    Представление(ЗаказСоставЗаказа.Номенклатура) КАК Номенклатура,
    …
    
    Enterra SDK таки включает некоторый минимальный набор контролов для работы с 1С сущностями

    Не исключаю, что Entera будет расширятся в будущем, но пока то, что есть сейчас сильно не впечатляет (см фото выше).

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

    На основании работы с вашими примерами. Для ваших тестеров — воспроизвести проблему можно так: 1) Взять реальную базу 1С с регистром сведений с >100,0 тысяч записей 2) Открыть пример «Простой проводник по 1С» 3) Выбрать регистр сведений 4) Нажать «Загрузить»

    Reply
  11. Elisy

    (9) В форум меня не пускают: «У вас не достаточно прав на просмотр форума.»

    Reply
  12. enterra
    (9) В форум меня не пускают: «У вас не достаточно прав на просмотр форума

    Теперь Вы приглашены на форум, заходите, будем обсуждать. 🙂

    Reply
  13. OSlike

    Чем Enterra лучше чем web — расширение не очень понятно.

    Reply
  14. pvvpvv

    Обидно. Давайте обсудим дядю васю. Ему будет приятно.

    Reply
  15. pvvpvv

    Не пойму,что продаем? NET — он и в африке NET.

    Reply
  16. I_G_O_R
    Статья посвящена анализу существующих способов и инструментов интеграции .NET приложений с прикладными решениями 1С:Предприятие

    мне кажется это реклама, но для кого? для 1С-ников? врядли, может для .NET программистов? так они в другом месте бывают, например: http://gotdotnet.ru.

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

    Reply
  17. d.snissarenko

    Видимо автор про веб расширение от 1с знает понаслышке, не одним вызовом хранимых процедур и функций он хорош, их можно и в .net создать.

    Пул в 10 соединений к базе выдерживает более 100 клиентских коннектов к iis и больше, все зависит от правильности написания кода.

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

    Вот пример работы веб расширения http://sunrise-ufa.ru , используется только ado.

    Да веб контролы от 1с не блещут красотой и юзабельностью, но кто запрещает их не использовать в своем приложении.

    Reply
  18. AnnaDav

    (13)

    Чем Enterra лучше чем web — расширение не очень понятно

    Как минимум — ценой ))

    К тому же, Web-расширение реализует ADO для 1С, Enterra SDK создает набор классов, идентичный структуре метаданных 1С — то есть дополнительный возможности в виде вызова тех же хранимых процедур + простота использования.

    Еще одно отличие — применение Web-расширения ограничено ASP.NET, Enterra SDK таких ограничений не имеет

    Reply
  19. mini_root

    Мда… буря в стакане 😀

    Вот вам еще один вариант:

    «Интеграция 1С с сервисной шиной OpenESB»

    http://infostart.ru/public/21506/

    И все, дальше рисуй мышкой BPEL процесс. Минусы текущей реализации перечислены в конце статьи.

    Причем ничего инновационного в этом нет — там тот же самый COM(инновация только в попытке вывести это все на уровень BPEL’я) Равно как и ничего нового нету в подстановке в запрос реальных названий таблиц/полей — у меня такая штука оформлена в виде JDBC драйвера, ниче, работает.

    Есть мысли оформить это все в виде опенсорсного проекта + добавить туда же адаптеры к различным MOM’ам.

    >Enterra SDK, возможно, и не несет ничего нового, но цель не в этом. Использование компонента просто экономит ВАШЕ время на создание .NET оберток + дает некоторые рецепты обращения с 1С из .NET кода

    так ли это актуально с выходом DLR и массовым грядущим цветением динамических ЯП на платформе .NET? и писать тогда строки вида:

    (bool)Invoke(currentType, «СодержитТип», new object[] {doubleType})

    уже не придется, вместо них будет:

    currentType.СодержитТип(doubleType)

    Автор статьи скромно умолчал о недостатках своего продукта, а они ровно такие же как и для COM, ибо это COM и есть.

    >Стоимость: 14 500 руб. Необходимое количество лицензий определяется числом разработчиков, одновременно работающих с компонентом.

    Удачи…

    В целом согласен с выводами Elisy в (6).

    P.S. Замечательные форум для детального обсуждения:

    >У вас не достаточно прав на просмотр форума.

    Reply
  20. AnnaDav

    (17)

    Пул в 10 соединений к базе выдерживает более 100 клиентских коннектов к iis и больше, все зависит от правильности написания кода.

    Да, работа с пулом, несоммненно одна из сильных сторон Web-расширения

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

    Только вот не понимаю в чем принципиальное различие в назначении веб-форм и веб-отчетов, созданных в 8.2 и c помощью Web-расширения?

    К тому же, новых релизов Web-расширения не выпускалось уже очень давно, работает оно на старой версии .NET Framework (1.1.) — кажется мне, что все это весьма недвусмысленно свидетельствует о том, что сама 1С не считает данный продукт перспективным.

    Reply
  21. mini_root

    (18 )>Еще одно отличие — применение Web-расширения ограничено ASP.NET, Enterra SDK таких ограничений не имеет

    Я тут хочу страничку на JSP сделать, не подскажите как мне использовать Enterr’у?

    Reply
  22. d.snissarenko

    В итоге, например для меня очень критично иметь пул, а никто кроме 1с веб расширения его предоставить не может, да убогое описание, да собирание инфы по крохам, тем не менее, работает и работает стабильно, кстати ну что вы прицепились к контролам от 1с, получаете запросом DataSet в которой можно хранить туеву гору таблиц и вперед использовать контролы 3.5 фреймворка, ну невозможно использовать кроме как в проектах asp .net

    Reply
  23. AnnaDav

    (21)

    Я тут хочу страничку на JSP сделать, не подскажите как мне использовать Enterr’у?

    Обращайтесь, реализуем для вас требуемый функционал для JSP

    Reply
  24. Лузер

    Могу привести минусы в создании web расширений 1с — такие приложения очень затратны — и внедрение и поддержания выйдет довольно трудоемким для любой фирмы. А для мелких компаний с небольшим бюджетом простым решением служит объединение web и 1с по средством выгрузки и загрузки заказав.

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

    Хотя есть и минусы — мы теряем оперативность в обработке остатков и заказов. Но опять же не в такой мере чтобы переплачивать за решения такие деньги.

    Reply
  25. mini_root

    (23) Это каким же образом? 😀

    Reply
  26. d.snissarenko

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

    Встроенные в 8.1/8.2 веб сервисы

    1с веб расширение

    ну и «костыли»

    Reply
  27. Лузер

    Могу вас заверить что большие компании не используют 1с в качестве основного софта (т.к. 1с хотя бы просто не умеет работать шустра с большим количеством клиентов).

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

    Единственный вариант когда можно задействовать веб приложения 1с или веб приложения другого софта — это удаленный склад или офис с низко пропускным каналам интернета (но и в таких ситуациях есть более комфортные решения).

    Хотя поставить плюс автору за статью стоит (хотя бы за обще ознакомительный материал)!

    Reply
  28. lvadim

    Для полноты картины учитывайте «Корпоративную аналитику для 1С» от Инталева:

    http://www.intalev.ua/index.php?id=26866

    Она выгружает данные в хранилище SQL методами Integration Service, динамически строя пакеты на C##. При этом ключи GUID меняются на Int для скорости работы..

    Правда для соблюдения требований 1С это делается через промежуточную базу, формируемую на ADO (структуры такой же как база 1С), но оно умеет и без…

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

    Стандарт (55 000 рублей за установку на сервер)

    Бизнес (130 000 рублей за установку на сервер)

    Reply
  29. AnnaDav

    (28)

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

    А насчет «Корпоративной аналитики» — все-таки использование OLAP продукта для решения задач интеграции кажется не очень целесообразным…

    Reply
  30. apilyugina

    Компонент теперь распространяется бесплатно, подробности на сайте компании Энтерра http://www.enterra.ru/enterra-net-sdk-1s.html

    Reply
  31. dmitriypr

    Выложили в open source Enterra .Net SDK для 1C

    https://github.com/EnterraInc/1C-.Net-Adapter

    Reply
  32. avz_1C

    Спасибо «Enterra» за open source Enterra .Net SDK для 1C

    Вот бы ещё посмотреть примеры применения данного компонента.

    Я посмотрел код, в компоненте применяется объект V8X.ComConnector (comcntr.dll), поставляемый с платформой 1С.

    А вот было бы здорово, вовсе обойтись без «переходника» от 1С, а сразу обращаться к базе 1С.

    Причем, как к файловой, так и к SQL-ной!

    Как бы это сделать?

    Reply
  33. user1120008

    Ни где не могу найти ни одного примера использования Enterra .net в .net приложении, поделитесь кто нибудь исходником.

    Reply

Leave a Comment

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