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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *