Веб-разработка на 1Script. Глава 1




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

97 Comments

  1. palsergeich

    Продолжайте, интересно.

    Думаю в течение месяца с головой погрузится в oscript, на горизонте маячат несколько задач….

    Reply
  2. nixel

    (1) погружайся, Паш, погружайся 🙂 Там много интересного, как в веб-части, так и в более привычном девопсе

    Reply
  3. JohnyDeath

    Фундаментально!

    В закладки и подписки!

    Reply
  4. Evil Beaver

    Маленькое замечание: парсер инфостарта оборачивает гиперссылки в свой redirect.php. Поэтому код страницы _mainLayout.cshtml отображается искаженно.

    <link rel=»stylesheet» ref=»https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.13/semantic.min.css»/>

    Вот правильный код линка (он же в исходниках гитхаба). Атрибут href пришлось переименовать, чтобы обмануть парсер 🙂

    Reply
  5. spacecraft

    Попытка скрестить asp.net core с onscript.

    Смотрится не плохо.

    А почему не взять в качестве frontend vue.js? А backend использовать onscript. И без прослойки asp.net. Вроде как более перспективное направление может получиться.

    Reply
  6. Evil Beaver

    (5) Можно и взять. Почему сейчас нет — в статье написано.

    Reply
  7. spacecraft

    (6) я не про использование в качестве шаблонизатора. А как полноценный фреймворк.

    На onscript попытаться сделать аналог nuxt.js. С серверным рендерингом.

    Reply
  8. 🅵🅾️🆇

    В целом здорово, в закладки, в частном — стоит сравнить под нагрузкой с питоном, node.js, ну или на худой конец с php.

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

    ЗЫ: Да, Я знаю, что 1с код довольно странно компилируется в процессе, но как мне кажется, сравнивать стоит именно с интерпретируемыми языками, с байткодом точно не сравниться (да и в вебе мало бэкэнда на нем).

    Reply
  9. Evil Beaver

    (8) Уже сравнивали. Скорость такая же как у ПХП. Питону тоже нет причин быть сильно быстрее. Нода применяет JIT-компиляцию в машинный код, поэтому будет наверняка побыстрее, но отдельно с нодой не сравнивали.

    с байткодом точно не сравниться

    Что вы понимаете под термином байткод? И у 1С, и у 1Скрипт, и у Питона, и у Java есть байткод. Вы про который байткод говорите?

    Reply
  10. Evil Beaver

    (7) Можно, думаю. И серверсайд-рендер react тоже можно прикрутить, не вопрос. Там всего-лишь middleware добавить в цепочку обработки.

    Reply
  11. Boris_1c

    Круто-круто. Следим за проектом затаив дыхание!

    Reply
  12. bonv

    (0) Сервер синхронный и/или асинхронный?

    Reply
  13. bonv

    (8)

    В целом здорово, в закладки, в частном — стоит сравнить под нагрузкой с питоном, node.js, ну или на худой конец с php.

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

    В сервисах с высокой нагрузкой, как правило сервера приложений (python, noda.js и т.д.) напрямую никто не выставляет. Поднимают несколько серверов приложений и проксируют их через nginx (или ему подобные). Таким образом можно повысить производительность и надежность.

    Опять же время выполнения кода на питоне или на 1С принципиально не отличается. Основное время затрачивается на операции ввода-вывода. И вот здесь уже асинхронные сервера могут существенно вырваться вперед.

    Reply
  14. comol

    (0)

    Reply
  15. CSiER

    Спасибо, статья навеяла воспоминания по студенческим каникулам — php, smarty, борьба с ТТУК 🙂

    Reply
  16. Evil Beaver

    (12) сервер асинхронный, но код конкретного контроллера выполняется в одном потоке на http-запрос. Асинхронный io с НачатьЧтение в стиле 1С можно сделать хоть сейчас, но у меня рука не поднимается копировать этот сатанизм.

    Reply
  17. Evil Beaver

    (14) я ждал этой картинки! Редко встретишь ее на инфостарте. Считаю за комплимент )

    Reply
  18. Evil Beaver

    (13) еще бы 1С выпустила гуманный API для асинхронных операций…

    Reply
  19. artbear

    (18)

    гуманный API для асинхронных операций

    В мемориз 🙂

    Reply
  20. tsukanov

    Плюсую за творческую упоротость, но идея не очень непонятна )

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

    Народу хочешь не хочешь придется шевелиться, наблюдая как его знания обесцениваются.

    Непонятно следующее:

    Какая целевая аудитория?

    Ведь это решение за пределами экосистемы 1С и разработчику на платформе оно ничего не дает.

    Ну а если речь о полноценной веб-разработке, то язык 1С как он есть, для этого имхо слабо подходит.

    Любая технология призвана решать четкую конкретную задачу.

    Какую задачу решает эта технология? И если решает, то в чем преимущество перед другими технологиями?

    ps Не исключаю что уже объяснялось. Возможно пропустил

    Reply
  21. infosoft-v

    Огромное уважение к автору этого проекта и ко всей «команде oScript». Коллеги, вы всегда меня вдохновляете. Спасибо вам.

    После того, как язык bsl укоренился на десктопе, на сервере, в мобилках и в вебе, может быть попробовать исполнить его на embedet платформах?

    Как пример, есть такой проект Espruino (JavaScript на микроконтроллерах)

    Микроконтроллер с кодом на bsl отправляет телеметрию на сервер который написан на OScript откуда 1С Предприятие забирает данные уже не звучит как фантастика.

    Reply
  22. Evil Beaver

    (20) эта технология решает целый спектр задач. Перечислять поленюсь. Например, одна из них: Я (персонально я) смогу писать веб-приложения, получая удовольствие от процесса. Сейчас ни на одной из тех экосистем, которые я пробовал, этого не происходит. Если за мной это смогут делать другие 1С-ники — то задача уже будет выполнена выше плана.

    И это только одна из целей.

    Reply
  23. tsukanov

    (22) А ну если джаст фо фан, то почему бы и да )

    Reply
  24. 🅵🅾️🆇

    (9)

    Уже сравнивали.

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

    Нода применяет JIT-компиляцию в машинный код

    Слышал, что 1с делает также.

    Что вы понимаете под термином байткод?

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

    Питоша с JS — интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.

    Reply
  25. spacecraft

    (24)

    Питоша с JS — интерпретируются

    python интерпретирует не всегда. Как правило первый раз. И пытается этот код скомпилировать в си. Что при повторном использовании может быть быстрее java кода.

    Reply
  26. 🅵🅾️🆇

    (13)

    В сервисах с высокой нагрузкой, как правило сервера приложений (python, noda.js и т.д.) напрямую никто не выставляет. Поднимают несколько серверов приложений и проксируют их через nginx (или ему подобные).

    Благодарю за ликбез. Но при неудачном выборе инструмента, все одно дорого по железу/потдержке выходит наверное?

    И вот здесь уже асинхронные сервера могут существенно вырваться вперед.

    С асинхронностью у 1с бяда, особенно на стороне клиента. Пока есть только для файловых потоков и обработчик ожидания.

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

    Ничего лучше подобного костыля не придумал, а решения в гугле для УФ в принципе нет.

    Скрытый текст
    Reply
  27. 🅵🅾️🆇

    (25) Таких тонкостей не знаю, но вроде как в питоне надо явно задавать участки, что подлежат такой компиляции, все остальное статически компилируемое.

    Reply
  28. comol

    (22)

    Я (персонально я) смогу писать веб-приложения

    Андрей ты нас обманываешь :), если осилил свой хм… интерпретатор? Написать, то уж web приложение явно проблем не вызовет 🙂

    Reply
  29. Evil Beaver

    (28) жабоскрипт ацтой. Не люблю на нем писать

    Reply
  30. Evil Beaver

    (23) just for fun — наиболее доходчивое объяснение для скептиков вроде тебя )

    Прагматические цели тоже есть.

    Reply
  31. Evil Beaver

    (24)

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

    Статьи нет, есть наш чат в gitter. Там обсуждалось.

    Слышал, что 1с делает также.

    Нет, не делает. Если я ошибаюсь — просьба дать пруфлинк.

    Ну в данном случае я имел ввиду машинный код, который исполняется напрямую, то во что компилируют теже плюсы.

    Машинный код <> Байткод. Принципиально разные вещи.

    Питоша с JS — интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.

    Вот это — тотальная абракадабра и незнание матчасти.

    Reply
  32. 🅵🅾️🆇

    (31)

    Машинный код <> Байткод. Принципиально разные вещи.

    Описочка, очевидно имел ввиду машинный.

    Вот это — тотальная абракадабра и незнание матчасти.

    Просвяти где не прав.

    Reply
  33. Evil Beaver

    (32)

    Питоша с JS — интерпретируются, Java исполняется на VM, у 1с, вроде как, препроцессор режет то что там наваяли в конфигураторе и отдает компилятору в реальном времени.

    Начнем с того, что Питон и JS — это языки у которых несколько реализаций. Каждая реализация работает по-своему.

    Наиболее популярная реализация Питона — это CPython. Я не очень хорошо ее знаю, в моей картине мира она компилируется в байт-код, который затем исполняется виртуальной машиной. Точно так же делает 1С, PHP, Ruby и 1Script.

    JS имеет также несколько реализаций, современные из которых (скажем V8 от Google) сначала также компилируются в промежуточный код, а он, в свою очередь — превращается в машинный код, там где это возможно. Это называется JIT-компиляцией. По тому же принципу работает C# и Java. В результате, современные JS-программы работают довольно шустро. Но это заслуга реализации движка. Запустите этот же код на старых реализациях JS и никакой скорости не будет, хотя «язык» — один и тот же. Node.JS использует, насколько я знаю, движок V8, хотя, вроде как, туда можно поставить Chakra или еще что-то. Не в курсе на 100%.

    Теперь насчет 1С. Что-то такое мелькало про JIT в 1С, но я так и не понял — было это в реале или мне приснилось.

    Примененный термин «VM» для Java справедлив в равной степени для всех скриптовых языков, в т.ч. и для 1Script. Чистых «интерпретаторов», которые бы не использовали промежуточное представление в виде байт-кода, сейчас среди мейнстримных скриптовых движков нет, насколько мне известно.

    Reply
  34. Evil Beaver

    (21) Сюда Филиппов сейчас тоже вставит картинку с троллейбусом 🙂

    Reply
  35. tsukanov

    (30) Ну если берешься защищать цели, то нужно их озвучивать ) Или тупо сразу говорить, что делаешь джаст фо фан, чтоб не парили мозг.

    Объяснять полезность чего-то сложно, да. Иногда даже самому себе )

    ps Не обращай внимание на мои придирки. Дотошность мое проклятье.

    Reply
  36. Evil Beaver

    (35)

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

    ты меня раскусил ))

    Reply
  37. tsukanov

    (36) будто кто-то иначе делает )))

    Reply
  38. 🅵🅾️🆇

    (33)

    Начнем с того, что Питон и JS — это языки у которых несколько реализаций. Каждая реализация работает по-своему.

    Наиболее популярная реализация Питона — это CPython. Я не очень хорошо ее знаю, в моей картине мира она компилируется в байт-код, который затем исполняется виртуальной машиной.

    Начнем с того, что вот этот ваш CPython и есть ИНТЕРПРЕТАТОР. Он читает что вы там написали и прям в процессе транслирует в байткод и исполняет.

    Собстно это и называется ИНТЕРПРЕТАЦИЕЙ. А уже КОМПИЛЯЦИЕЙ называют когда программулина сначало перегоняется целиком в машинный код, а затем уже исполняется.

    Так что зря вы так грубо и с плеча дураком обзываетесь)))

    Про 1с мне точно также приснилось, про что и написал.

    Как это вижу Я: препроцессор режет наши писульки в соответсвии с дерективами, переводит в некое промежуточное состояние и отдает кусочки в процессе такому же сорту CPython’а, который, когда от него требуется, уже компилирует и исполняет.

    Reply
  39. Evil Beaver

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

    Компилятор — это создатель другого представления исходного кода, которое затем исполняет машина (реальная или нет).

    В такой терминологии Питон, 1С и 1Скрипт — это НЕ интерпретаторы

    Reply
  40. spacecraft

    (38)

    Начнем с того, что вот этот ваш CPython и есть ИНТЕРПРЕТАТОР. Он читает что вы там написали и прям в процессе транслирует в байткод и исполняет.

    Собстно это и называется ИНТЕРПРЕТАЦИЕЙ. А уже КОМПИЛЯЦИЕЙ называют когда программулина сначало перегоняется целиком в машинный код, а затем уже исполняется.

    Даже классический CPython, который не имеет встроенного JIT-компилятора, имеет оптимизатор, который сохраняет в байт-код (расширения .pyc). И уже повторно запускается именно байт-код.

    Reply
  41. bonv

    (25) Наиболее распространенная реализация CPython компилирует код в байт-код.

    JIT-компилятор, про который видимо идет речь, используется, например, в реализации PyPy, но она имеет свои ограничения.

    Reply
  42. 🅵🅾️🆇

    (39) Придеться вас огорчить)

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

    Reply
  43. spacecraft

    (42) не смущает, что в приведенной статье сплошные противоречия?

    Этак можно прийти к тому, что и С++ это интерпретатор компилируемого типа. Ведь программа выполняется «виртуальной машиной» (операционной системой).

    Reply
  44. spacecraft

    (42)

    где бы я не встречал упоминания питонов-яваскриптов, всегда где то рядом есть слово «интерпретатор».

    уникальность именно python в том, что он разрывает шаблон устоявшихся понятий чистых компилятор/интерпретатор.

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

    В тоже время позволяет и скомпилировать в байт-код, для более быстрого выполнения.

    Reply
  45. bulpi

    Автор, не знаю, куда это писать. Начиная с версии 1.0.18 1script не работает на win32 . Это так и должно быть ?

    Reply
  46. nixel

    (45) на какой из win32?

    для работы 1.0.18 и старше требуется .Net Framework >= 4.5.2. Как следствие в трубу улетела Windows XP

    Reply
  47. baton_pk

    (45) https://github.com/EvilBeaver/OneScript/issues

    сюда писать. Если там молчим, не стесняться напоминать.

    Ещё сюда: https://gitter.im/EvilBeaver/OneScript

    отказались от поддержки винХР — это было. а от вин32 не отказывались.

    Reply
  48. Evil Beaver

    (42) Я может чего не понял, но приведенная статья подтверждает мою терминологию, а не опровергает ее. Что конкретно в ней должно было меня огорчить?

    Reply
  49. Evil Beaver

    (43) Ага, отличный пример бредовых ГОСТ-ов, прямо вспомнил лекции в институте, которые устарели за 10 лет до моего туда поступления.

    Reply
  50. bonv

    (26)

    Благодарю за ликбез. Но при неудачном выборе инструмента, все одно дорого по железу/потдержке выходит наверное?

    Железо — зависит от задачи. Возможно бэкенд на С/С++ будет лучшим решением.

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

    Ничего лучше подобного костыля не придумал, а решения в гугле для УФ в принципе нет.

    Зачем это?

    Можно же сразу в ПриСозданииНаСервере установить строку

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Параметры.Свойство(«НомерСтроки») Тогда
    НомерСтроки = Параметры[«НомерСтроки»];
    Элементы.Оборудование.ТекущаяСтрока = Объект.Оборудование[НомерСтроки].ПолучитьИдентификатор();
    КонецЕсли;
    
    КонецПроцедуры

    Показать

    Reply
  51. Nenaviju1C

    Что то навеяло asp.net …

    На чем реализован механизм?

    Reply
  52. Nenaviju1C

    Вопрос снят, выше увидел коммент по .net

    Reply
  53. 🅵🅾️🆇

    (50) При создании на сервере и при открытии (до того как форма отрисовалась у клиента) «ТекущаяСтрока» еще не установлена и находиться в значении «Неопределено». Установить значение то можно, но толку от этого будет 0 и все одно после открытия перезапишется единицей.

    Вот такие вот неожиданные костыли))) Честное слово, Я не был пьян, когда ваял сей велосипед)))

    Reply
  54. Evil Beaver

    Между тем, призовой фонд в 20 sm до сих пор не разыгран

    Reply
  55. bonv

    (53) Ну собственно я тоже попробовал прежде, чем писать (пробовал на 8.3.12)

    Reply
  56. 🅵🅾️🆇

    (55) Странные дела.

    8.3.11, Вин сервер 2008, УФ, Тонкий клиент, Такси, Самописная конфигурация на базе БСП.

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

    Пришлось выдумывать такой велосипед.

    Reply
  57. nixel

    (51) дык там низом и есть ASP.Net

    Reply
  58. VRStalker

    Ошибка (закладка?) в статье, приводящая к ошибке…

    Создадим файл ЦентральныеСерверы.os в папке src/model/classes.

    Правильно в src/model/modules

    Reply
  59. Evil Beaver

    (58) Спасибо, исправил

    Reply
  60. stilet

    А как отлаживать код? Здесь все понимают, что 50% работы с кодом (более менее сложным) — это отладка.

    Reply
  61. Evil Beaver

    (60) Отладчик пока не включен в веб-движок. Стандартный 1script отлаживается, здесь на данный момент еще не реализовано.

    Reply
  62. Evil Beaver

    Вознаграждение в пользу yuraer

    Reply
  63. yuraer

    (62) Моё решение.

    В файле src/views/agents/Index.cshtml добавляем кнопку в таблицу

    <tr>
    <td><a asp-action=»edit» asp-route-id=»@row.Идентификатор»>@row.Идентификатор</a></td>
    <td>@row.СетевоеИмя</td>
    <td>@row.Порт</td>
    <td>@row.Режим</td>
    <td><a asp-action=»delete» asp-route-id=»@row.Идентификатор»><i class=»remove icon»></i></a></td>
    </tr> 

    где указываем вызов функции «delete» и значение маршрута «@row.Идентификатор»

    и название колонки

     <tr>
    <th>Идентификатор</th>
    <th>Сетевое имя</th>
    <th>Порт</th>
    <th>Режим</th>
     <th>Удалить</th>
    </tr>

    и добавляем функцию удаления в src/controllers/agents.os

    Функция Delete() Экспорт
    
    Идентификатор = ЗначенияМаршрута[«id»];
    Если Идентификатор = Неопределено Тогда
    Возврат Перенаправление(«/agents/index»);
    КонецЕсли;
    
    ТЗ      = ЦентральныеСерверы.ПолучитьСписок();
    Элемент = ТЗ.Найти(Идентификатор, «Идентификатор»);
    
    Если Элемент = Неопределено Тогда
    Возврат КодСостояния(404);
    КонецЕсли;
    
    ТЗ.Удалить(Элемент);
    ЦентральныеСерверы.Записать(ТЗ);
    
    Возврат Перенаправление(«/agents/index»);
    
    КонецФункции

    Показать

    Reply
  64. Hokum

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

    открываем git-bash , добавляем пару строчек

    git config —global user.name «Мое имя»

    git config —global user.email мое.мыло@gmail.com

    Запилил функцию удаления, получилось почти так же как в решении выше.

    Потом подумал, что одно неосторожное движение и мы удалили запись.

    Сделал еще формочку с подтверждением.

    С интересом жду продолжения.

    Reply
  65. Evil Beaver

    (64) Не затруднит ли вас отправить данные доработки пулреквестом вот сюда: https://github.com/EvilBeaver/odminus ?

    Здесь будет разрабатываться конечное приложение.

    Reply
  66. Hokum

    (65) Я пока не знаю как это делается. В ближайшее время разберусь и отправлю.

    Reply
  67. Rashid80

    Отличное пособие, осталось понять — для кого оно?

    Типичный 1С-ник очень далек от Web и MVC-концепции (которая к слову уже не так актуальна). Т.е. да, он будет писать русские комманды, но по факту это просто обертка над ASP.NET MVC.

    Те кто хоть немного знакомы с веб-разработкой, для чего им писать на этой обертке? Проще взять Питон или Го и ОЧЕНЬ быстро получить бэкенд. Без всяких Model View Controller. Роутинг там реализован без всяких созданий подпапок и конкретных имен файлов с конкретными методами — т.е. гибко

    Reply
  68. JohnyDeath

    (67) по-моему всё 1С строится на MVC. Нет?

    Т.е. да, он будет писать русские комманды, но по факту это просто обертка над ASP.NET MVC.

    Так и сама 1С — это просто обертка над С++

    Я — один из тех «для кого это». И я также активно использую oscript движок как язык для сценариев больших и не очень.

    Мне в свое время надоело каждый раз при написании какой-то консольной утилиты или плеваться на cmd или вспоминать как оно там в PowerShell сделано. А здесь — знакомый до боли язык и обороты, который плюс ко всему легко переносится из платформы в скрипт.

    Reply
  69. dumsik

    Андрей, возможность запуска веб-движка в виде службы windows в будущем будет предусмотрена?

    Reply
  70. dumsik

    Возможность запуска веб-движка в виде службы windows в будущем будет предусмотрена?

    Reply
  71. Evil Beaver

    (67) Евгений ниже ответил, я вряд-ли смогу лучше. Да, это обертка над Х. И 1Script это обертка над Y. Да, можно взять Питон, Павершел, VBScript, Батники. Но зачем?

    Reply
  72. Evil Beaver

    (70) Нет. А зачем это нужно? Внутри веб-сервера это работает иначе. И вообще, предполагается контейнеризация. Для чего нужна именно служба?

    Reply
  73. dumsik

    (72) тогда наверное я не совсем до конца понял как все будет работать. Я думал, что web-движок oscript это отдельный web сервер запускаемый через OneScript.WebHost.exe и тогда логично, что OneScript.WebHost.exe должен уметь стартовать как служба потому-что он должен стартовать при старте системы и служба подходит для этого идеально. Получается я не прав и теперь предполагаю, что web-движок oscript будет работать под IIS. Можете подробнее рассказать как будет разворачиваться web-движок oscript в продуктиве, вот хотя бы на примере «odminus».

    Reply
  74. Evil Beaver

    (73) я предпочитаю разворачивать в docker. А так — гуглить на тему aspnet core + iis

    Reply
  75. Rashid80

    (71)

    1)Чтоб не переключаться постоянно с русского на английский и обратно

    2)Обертка не дает всего что дает исходный ASP.NET MVC. Т.е. придется ждать пока в обертку добавят еще одну обвязку или же дергать .net классы напрямую. Но зачем тогда вообще обертка?

    Reply
  76. Evil Beaver

    (75) Затем же, зачем и весь 1script вообще. Для удобства. Как уже писал выше — в первую очередь меня лично, а вообще — для любого 1С-ника.

    Reply
  77. dumsik

    (74) и в продуктиве тоже docker?

    Reply
  78. Evil Beaver

    (77) Есть ряд устойчивых отраслевых мифов:

    * Java тормозит

    * Плазма падает

    * На 1С нельзя сделать {enter your text}

    * Docker не готов к продуктиву

    * Венде капец

    Все примерно одного уровня достоверности.

    Reply
  79. dumsik

    (78) Спасибо, пошел смотреть docker. За oscript спасибо отдельное, разработчики 1с очень быстро привыкают к автоматизации своей деятельности с его помощью. Oscript-web тоже сразу всем понравился из-за легкого старта. В общем очень нужное дело делаете.

    Reply
  80. Evil Beaver

    (79) И вам спасибо за отзыв!

    Reply
  81. bulpi
    Git не захотел коммитить первоначальный образ, оказалось что его надо как минимум настроить.

    открываем git-bash , добавляем пару строчек

    git config —global user.name «Мое имя»

    git config —global user.email мое.мыло@gmail.com

    Увы, даже после этих действий у меня движок не запустился.

    D:MyProg1scriptServersConsolesrc>d:MyProg1scriptoswebOneScript.WebHost.exe

    Необработанное исключение: System.TypeInitializationException: Инициализатор типа «System.Diagnostics.DiagnosticSourceEventSource» выдал исключение. —> System.MissingMethodException: Метод не найден:

    «Void System.Diagnostics.Tracing.EventSource..ctor(System.Diagnostics.Tracing.EventSourceSettings)».

    в System.Diagnostics.DiagnosticSourceEventSource..ctor()

    в System.Diagnostics.DiagnosticSourceEventSource..cctor()

    — Конец трассировки внутреннего стека исключений —

    в System.Diagnostics.DiagnosticListener..ctor(String name)

    в Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices()

    в Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()

    в OneScript.WebHost.Program.Main(String[] args)

    Reply
  82. Evil Beaver

    (81) это какие-то системные ругательства. .NET Framework точно хороший стоит? И приложение откуда брали — скачивали или из исходников собирали?

    Reply
  83. bulpi

    (82) Все делал по инструкции.

    choco install –y dotnet4.6.1

    Приложение и движок скачивал в архивах и распаковывал.

    Возможно, дело в системе windows7. Вы ведь не под ней делали ?

    Reply
  84. Evil Beaver

    (83) не под ней, но вряд ли причина в этом. Скорее всего, не подхватился нужный фреймворк или он как-то криво установился. Это системная ошибка, не относящаяся по большому счету к 1Script.

    Бинарники 1script сами собирали, или скачанные?

    Reply
  85. bulpi

    (84)

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

    Reply
  86. minimajack

    (44)

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

    как и многие другие включая и javascript и java

    Reply
  87. pfilyk

    (29) согласен, но есть же еще TypeScript как пример

    Reply
  88. ilyav

    (81) Такая же ошибка на windows server 2012 r2

    Reply
  89. Evil Beaver

    (88) Вы движок из исходников собираете или с гитхаба берете готовый?

    Reply
  90. ilyav

    (89) Разобрался и дам всем совет на будущее, на windows server по умолчанию стоят две версии net framework 3.5 и 4.5 , удалил версию 3.5 и все запустилось. Видимо по умолчанию скрипт запускается под 3.5 почему то.

    Reply
  91. markgenuine

    А почему не использовать язык Golang с шаблонами, там все проще и быстрее.

    Тем более Docker написан на нем.

    Reply
  92. Evil Beaver

    (91) конечно можно и нужно всем использовать только тот язык, который вы считаете нужным.

    Пардон за наброс, просто я регулярно слышу этот вопрос и много раз на него отвечал в Интернетах и лично.

    Reply
  93. koln

    Прорабатывал данный пример и заметил, что процедуру

    Процедура Записать(Знач ТЗ) Экспорт
    
    Текст = Новый ЗаписьТекста(мПутьКФайлуНастроек);
    Запись = Новый ПарсерJSON;
    Текст.Записать(Запись.ЗаписатьJSON(ТЗ));
    Текст.Закрыть();
    мСодержимое = Неопределено;
    
    КонецПроцедуры

    Показать

    необходимо размещать до раздела «Полноценный CRUD», т.к. без нее не происходит запись о новом сервере (вываливает ошибку).

    Reply
  94. Evil Beaver

    (93) Поясните, пожалуйста, что значить «До раздела Полноценный CRUD»?

    Reply
  95. koln

    (94) По тексту, в модуле «ЦентральныеСерверы» до раздела «Полноценный CRUD» описаны только два метода:

    Функция Add() Экспорт
    
    Если ЗапросHttp.Метод = «POST» Тогда
    ТЗ = ЦентральныеСерверы.ПолучитьСписок();
    Элемент = ТЗ.Добавить();
    ЗаполнитьДанные(Элемент);
    ЦентральныеСерверы.Записать(ТЗ);
    Возврат Перенаправление(«/agents/index»);
    КонецЕсли;
    
    Возврат Представление(«Item»);
    
    КонецФункции
    
    Процедура ЗаполнитьДанные(Знач Элемент)
    
    ДанныеФормы = ЗапросHttp.ДанныеФормы;
    Элемент.Идентификатор = ДанныеФормы[«Идентификатор»];
    Элемент.СетевоеИмя = ДанныеФормы[«СетевоеИмя»];
    Элемент.Порт = ДанныеФормы[«Порт»];
    Элемент.Режим = «RAS»;
    
    КонецПроцедуры
    

    Показать

    Ниже в демонстрации идет пример, где записываются данные при создании нового «Агента кластера». Однако сам метод «Записать» реализован по тексту уже ниже, в разделе «Полноценный CRUD».

    Reply
  96. Evil Beaver

    (95) Возможно. У меня предложение — оформлять замечания сразу в виде улучшений пуллреквестами на гитхаб. Тогда сообщество сможет обсудить и прокомментировать конкретные строки кода и принять их в общий продукт. Репо Одминуса на гитхабе: https://github.com/EvilBeaver/odminus

    Reply
  97. user848544

    Прошу помощь.

    Возникает ошибка при запуске opm

    PS E:GITSServersConsolewebapp-template-mastersrc> opm install -l

    ПРЕДУПРЕЖДЕНИЕ — При локальной установке параметр -dest игнорируется

    КРИТИЧНАЯОШИБКА — {Модуль C:Program Files (x86)OneScriptlibopmsrccoreКлассыОписаниеПакета.os /

    Ошибка в строке: 66 / Не задана версия пакета}

    Reply

Leave a Comment

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