1C + .NET Framework 2.0




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

38 Comments

  1. Abadonna

    Автор, помести файл для скачивания, иначе публикация будет снята.

    Reply
  2. salexdv

    Требуем файл и примеры использования! ❗

    Reply
  3. Abadonna

    2 minikos. За что плюс?!!! За картинку? Так и до бана недалеко…

    Reply
  4. Abadonna

    Даю автору время до 20.00 Москвы для прикрепления файла. Потом обработка будет удалена

    Reply
  5. Арчибальд

    (3) А вот компенсирую его 👿

    Reply
  6. Tone2010

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

    Reply
  7. Арчибальд

    (6) Воспитательный минус снимаю.

    Reply
  8. Ёпрст

    Не появляется вкладка в параметрах.

    Reply
  9. Abadonna

    (6) Вопрос снят. На будущее: при перестройке портала возможны глюки, желательно проверять после заливки. Выйди с ИС и опять зайти на свою разработку.

    Что касается minikos — всё в силе, чтобы не глядя не плюсовал

    Reply
  10. Abadonna

    +(9)А вот я не глядя плюс поставлю 😀 Ибо люблю, когда не 1С-код

    Reply
  11. Dimasik2007

    Под восьмерку планируется?

    Reply
  12. Ёпрст

    Тем кто скачал, у кого ЭТО заработало вообще ?

    Reply
  13. Арчибальд

    (12)А никто не говорил, что ОНО еще и работать будет 😀

    Reply
  14. Tone2010

    >>А никто не говорил, что ОНО еще и работать будет smile:D

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

    Reply
  15. Tone2010

    Портал глючный не работает

    Reply
  16. Tone2010

    Не работает редактирование коменнтов

    Reply
  17. Ёпрст

    (14) закладка не появляется, фреймворк стоит… ошибок при создании объекта нет.

    конфа девственно чистая, без единого объекта

    Reply
  18. Ёпрст

    +17 и еще, желательно примерчик хоть какой нить кинуть, хоть в стиле «хеллоу-ворд»

    Reply
  19. Tone2010

    >>+17 и еще, желательно примерчик хоть какой нить кинуть, хоть в стиле «хеллоу-ворд»

    Процедура ПриОткрытии()

    ок=ПодключитьВнешнююКомпоненту(«AddIn.LanguageCSharp»);

    Если ок=0 Тогда

    Сообщить(«Не удалось подключить компоненту «);

    КонецЕсли;

    CSharp =СоздатьОбъект(«AddIn.LanguageCSharp»);

    CSharp.ДобавитьСборкуВФайлКонфигурации(КаталогИБ()+»myconfig.xml»,КаталогИБ()+»PluginsC#mytestclass.dll»);

    CSharp.ЗагрузитьСборкиИзФайла(КаталогИБ()+»myconfig.xml»);

    Сообщить(CSharp.Справка()); //Получим информацию по загруженным сборкам

    //CSharp.Test(«Проверка»); //Проверка метода сборки

    КонецПроцедуры

    >>закладка не появляется, фреймворк стоит… ошибок при создании объекта нет.

    >>конфа девственно чистая, без единого объекта

    Закладка появится после, CSharp =СоздатьОбъект(«AddIn.LanguageCSharp»);

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

    Reply
  20. Tone2010

    Формат файла конфигурации (кодировка UTF-8)

    <Plugins>

    <Assembly>

    <File>E:TestPluginsC#Price.cs</File>

    <References>

    <Identity>System.dll</Identity>

    <Identity>System.Data.dll</Identity>

    <Identity>System.Drawing.dll</Identity>

    <Identity>System.Web.dll</Identity>

    <Identity>System.Web.Services.dll</Identity>

    <Identity>System.Windows.Forms.dll</Identity>

    <Identity>System.Xml.dll</Identity>

    <Identity>E:ТестPluginsC#TestPrice.dll</Identity>

    </References>

    </Assembly>

    <Assembly>

    Код
    using System; using PluginsCSharp; /* //Класс для доступа к контексту 1С public class Context1C { public object Функция(string ИмяФункции,object [] ПараметрыФункции); public object Функция(string ИмяФункции); public void Процедура(string ИмяПроцедуры); public void Процедура(string ИмяПроцедуры,object [] ПараметрыПроцедуры); public object Свойство(string ИмяСвойства,object УстанавливаемоеЗначение); public void ОбработкаВнешнегоСобытия(string bstrSource, string bstrMessage, string bstrData); public void УстановкаРазмераБуфераОчередиСообщений(int размер); public int ПолучитьРазмерБуфераОчередиСообщений(); public void ОчиститьБуферОчередиСообщений(); public void УстановитьСтрокуСостояния(string ТекстСтрокиСостояния); public void СброситьСтрокуСостояния(); } */ //ВАЖНО!!! //Имена Методов и Свойств не должны повторяться в рамках коллекции всех загружаемых сборок namespace MyPlugin //Имя окружения может быть любым { //Все методы и свойства класса должны быть public, для доступа из 1С public class LanguageExtender //Имя класса любое { //Необходимо объявить поле типа контекст 1С в публичном доступе (public ОБЯЗАТЕЛЕН, без него не будет работать) public Context1C context = null; //Класс для доступа к контексту 1С (объявлен в PluginsCSharp) //Конструктор класса обязан инициализировать контекст 1С public LanguageExtender() { context = new Context1C(); } //..... Далее следует ваш произвольный код public string MyFunction() { return "Hello World!!!"; } public string MyProperty { get { return "Hello World!!!"; } } public string КаталогБазыДанных { get { if(context!=null) return context.Function("КаталогИБ",null).ToString(); return null; } } public string КаталогПрограммы { get { if(context!=null) return context.Функция("КаталогПрограммы").ToString(); return null; } } } }

    Показать полностью

    <References>

    <Identity>c:Program Files1Cv77_25BinPluginsCSharp.exe</Identity>

    </References>

    </Plugins>

    Reply
  21. Ёпрст

    (19) Не появляется..

    ЗЫ: читать описалово, пока еще умею.

    Reply
  22. Ёпрст

    +21

    Сообщить( СоздатьОбъект(«AddIn.LanguageCSharp»)) = OLE._Component1C

    Закладки как не было, так и нет.

    Reply
  23. Tone2010

    Вот рабочий вариант:

    Процедура ПриОткрытии()

    ок = ПодключитьВнешнююКомпоненту(«AddIn.LanguageCSharp»);

    Если ок = 0 тогда

    Сообщить(«Неудалось загрузить внешнюю компоненту»);

    КонецЕсли;

    pluginsCSharp = СоздатьОбъект(«AddIn.LanguageCSharp»);

    КонецПроцедуры

    Reply
  24. Ёпрст

    (23) ну вот, с загрузкой вк — появилось..

    Reply
  25. marsohod

    Кажется, намечается что-то интересное 🙂 спасибо.

    Не сочтите за дерзость 😉 но еще бы *.als к нему 🙂

    Reply
  26. Elisy

    Данная разработка, случайно, не аналог

    http://www.forum.mista.ru/topic.php?id=322712

    ?

    Reply
  27. Tone2010

    (26) Ни с автором ни с самой разработкой не знаком, очень похоже по задумке кстати. Я упор делал на метод ВыгрузитьСборки(), пришлось с ним повозиться. Это надо было для автоматического обновления модулей (сборок) через инет, соответственно, чтоб обновить надо выгрузить из памяти, а это работа с доменами приложений, мне мозг напрягла очень сильно… Это пробная попытка скрестить 1С с дотнетом, поэтому если что то не работает, кидаете лог в личку с описанием. Лог находится в «Администрирование->Просмотр событий», ну и за размером лога следите.

    Reply
  28. Elisy

    (27) Я ни в коем случае не обвиняю в чем-либо. Мне эту ссылку давали в контексте моих разработок c .Net.

    Может по автоматическому обновлению из Интернет пригодится следующее:

    AppDomain.CreateDomain содержит вариант с AppDomainSetup-параметром. А AppDomainSetup в свою очередь содержит свойство ShadowCopyFiles, который позволяет обновление без выгрузки домена.

    Reply
  29. Tone2010

    (28) Вы меня не поняли, проблемы с доменами приложений НЕТ, она решена. Иначе бы метода «ВыгрузитьСборки» не было :). Привычка чистить за собой осталась даже с появление .NET, так что увольте.

    Reply
  30. sss999

    а можешь просто написать,конкретную любую простенькую ситуацию,где это может пригодиться,а то я как то только на 1с проглю,и совсем не понимаю для чего нужно то что ты сделал..

    Reply
  31. sss999

    ниче не понял для чего это)но парень старался,потому +

    Reply
  32. Tone2010

    (31)

    Я использую, для работы с Веб-сервисами. SOAP слышал? Так вот обертка на .NET для таких вещей делается за полминуты, а из 1С-ки ты продолбаешся долго, опять только COM поможет быстро решить задачу. Таки Regex вуаля пожалуйста он есть в .NET. Работа с сетью, сокеты? HttpRequest-ы, ftp, мыло и прочее — всё есть. Ты скажешь что под половину перечисленного есть решение готовое, ну и слава богу, первое правило не навреди (работает не трогай). Делалось для тех, кто уже пишет на .NET, но ещё приходится решать задачи для 1С. Т.е. прежде всего я делал для себя….

    Reply
  33. quick

    Штука прикольная, можно еще COM обьект на питоне или vbs юзать без фреймворков для доп функций

    Reply
  34. Romella

    Зачетная штука, респект.

    Reply
  35. Tone2010

    В связи с жадностью и не понятным мотивам авторов сего ресурса, оставляю сию публикацию до конца 2011 года, потом удалю и участвовать в этом не собираюсь…

    Reply
  36. vitaliy.ermolenko

    а жадность в чём заключается? денег за размещение вроде еще не надо платить или уже всё поменялось? и по-моему автор решает платная его разработка или нет.

    Reply
  37. Tone2010

    Жадность заключается в том что имея чем поделится я не могу пользоваться публикациями других…. так чтобы скачать даже твою публикацию мне необходимо иметь какие-о виртуальные деньги.

    Reply
  38. lelusha

    и мне как-то не очень понятно… но видно что сложно и многообещающе)

    Reply

Leave a Comment

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