Дисклеймер
Статья написана по результату 2х-дневного взаимодействия с 1С:Исполнитель в режиме выходных дней. Поэтому по мере появления новых деталей будет дополняться или переписываться. Прошу отнестись с нисхождением и в комментариях накидывать полезную информацию.
Предыстория
В нашей конфигурации есть такой кейс, регулярно туда загружают большое количество файлов .xml (.gsfx) с содержимым локальных сметных расчетов. Куда и как используются эти данные не столь важно (мы ведь помним, что это предыстория). Есть и есть...
В какой-то момент в конфигурации появился "анализатор", это такая обработка, которая регулярно изучает содержимое известных ей каталогов, обрабатывает лежащие в них файлы, информацию вносит в определенные регистры. А далее, пользователь на основании этих данных принимает определенные решения.
Часть этой истории нашла отражение в статье про работу с файловой системой методами Асинх , но полноценно Асинх методы не решают проблему. Поиск файлов, это лишь часть работы. Далее система должна определить, это xml или gsfx; если файл подходит, надо проверить наличие в нем определенных маркеров (по содержимому), чтобы пользователю подсказать более корректные действия. Так вот, все эти действия вполне можно выполнить на клиенте, без необходимости передачи файла на сервер. Ну почти можно, об этом небольшая ремарка ниже.
Так вот, подключение обработки ожидания + асинх методы в целом выполняются "как будто" в фоне, но фризы мыши и некоторые подвисания все равно есть, а хотелось бы, чтобы это выполнялось совсем "в фоне", без артефактов.
Сложность выбора (и эффект Даннинга – Крюгера)
Продумывая варианты реализации, мне в голову пришло две идеи
- запуск еще одного сеанса 1С (подсказал товарищ)
- плюсы: одна кодовая база, понятная реализация
- минусы: лицензия
- вопросы: контроль сеанса, фоновый режим (без окна приложения)
- сторонняя программа/скрипт (вспомнилось из опыта развлечений в devops)
- плюсы: не требует лицензии, скрытый режим
- минусы: разная кодовая база, реализация http-сервиса
- вопросы: возможность установки
Отправлять файлы для анализа на сервер не рассматривался. Они могут быть туда отправлены и будут даже, но только после того как будут проанализированы. Тут задача другая, файлы надо проверить и частично прочитать, чтобы дать пользователю возможность заглянуть в некоторые важные параметры, не открывая файл. А также помочь понять, какой файл требует какой-то обработки, а какой нет.
А вот тут, более опытный читатель возможно предложит такой вариант решения, до которого на тот момент я не додумался. И я буду очень рад выслушать альтернативные варианты реализации задачи. И большая просьба, если предлагаете другие варианты, плюсы и минусы честно. Ну и оценку времени накачки минимальными знаниями для реализации
В итоге был выбран вариант скриптовой реализации. С запуском из под клиента 1С. Если клиент не запущен, если работа скрипта не требуется, он и не выполняется. Зачем дергать систему лишний раз. Ну и поскольку я решил с тем как делать, оставалось определиться с набором инструментов. Ибо время обдумывания подошло к концу.
Инструменты:
- javascript - знаю, но активно использовал достаточно давно
- python - не знаю, ну вот прямо почти никак
- ... - с другими вариантами не около 1С тут все, подсказывайте
- onescript - честно скажу, поскольку ограничение по времени 1-2 дня, был в приоритете. Близко, понятно, доступно. Андрею Овсянкину и всем разработчикам в проекте респектище
- 1С:Исполнитель - вспомнился не сразу, но потом немного погуглив и почитав про версию 2.0 плюс изучив документацию, я соблазнился наличием portable версии и решил попробовать. Была и еще одна причина посмотреть, что это такое, так сказать на будущее
Все сообщество onescript, прошу пинать не сильно и не долго. Возможно со временем появится оба варианта, ибо наличие возможности запуска в macos - весомое преимущество.
Опять таки, для внимательного читателя. А у onescript есть (будет) portable версия?
Установка и настройка
По состоянию на конец сентября 2022 официальная версия 1С:Исполнитель это 2.0 (бета) и документация по ней расположена тут. Скачать дистрибутив можно на портале 1C:Обновление программ, однако по состоянию на 26.09.2022 доступ к дистрибутиву (как я понял) есть только у партнеров 1С, а также клиентов имеющих стандартную подписку на ИТС
Явно напрашивается вопрос, а доступ для разработчиков? За разъяснениями обратился в телеграмм-канале, думаю ответят в ближайшее время.
Описание установки и использования выполнено хорошо, проблемы не вызвало. Тем более, если имели дело с Visual studio code проблем не вызывает вовсе. Поэтому сколь-либо подробно данный процесс описывать не вижу смысла. Единственное скажу, сначала я купился на portable версию и не поставил OpenJDK 11. И думал если поставить плагин, указать путь к portable версии, то плагин будет работать.
Однако, документацию читать надо внимательнее )))
Для работы плагина требуется 64-разрядная Java Platform, Standard Edition версии 11.
Ну собственно и все, перезапускаем VSC, создаем файл sbsl, пишем
метод Скрипт()
Консоль.Записать("Здравствуй, Мир!")
;
Собственно на этом и все, вы в игре... Моя же задача только начала набирать обороты.
На что обратить внимание
Собственно, начинать я рекомендую с того, что прочитать основные отличия языка 1С:Исполнителя от встроенного языка «1С:Предприятия». То, что сразу бросилось в глаза человеку "привыкшему к 1С"
- Регистрозависимый. Даже не знаю хорошо это или плохо, это факт
- Нет окончаний КонецЕсли, КонецФункции и т.п., вместо них ";", ну и соответственно нет ";" в конце простых конструкций. Мне нравится
- Статическая типизация. Сначала вам будет больно, потом вы привыкнете, потом проникнетесь, потом не захотите жить без нее
- Нет деления Функция или Процедура, есть Метод. И поверьте, вам этого хватит
И чем больше я читал документацию в процессе реализации задачи, тем меньше мой код был похож на 1С. Особенно мои выходные сделала "лямбда". Сдается мне, этот синтаксический сахар заставит не одного 1С-ника вспотеть. Но благодаря сообществу я таки разобрался с этой штукой. Не буду утверждать, что понял ее полностью...
Просто небольшой пример:
// пример лямбда-выражения и его использования
// Маркер1 = "а1,а2", Маркер2 = "а3,а4"
пер Подстроки = (Стр: Строка) -> Стр.Разделить(",")
знч а1 = Подстроки(Маркер1) // а1 = ["а1","а2"]
знч а2 = Подстроки(Маркер2) // а2 = ["а3","а4"]
//--------------------------------------------------------------
// обычный метод без лямбда-выражения
метод Подстроки(Стр: Строка): Массив<Строка>
возврат Стр.Разделить(",")
;
Базовые типы
В принципе тут ничего особенного, ну разве что, "простые типы" с точки зрения платформы 1С, это объекты в исполнителе. Вот пример типа "Строка" как объект:
знч А: Строка = "" // переменная А - это строка, простой тип
А.ВВерхнийРегистр() // но у него есть методы
.ВНижнийРегистр() // а еще эти методы могут вызываться один за другим
.Сократить() // то есть перетекать друг в друга
Кроме этого, например в строке можно использовать выражения интерполяции.
// Полная форма - %{выражение}
пер Длина = 100
пер Ширина = 30
пер Сообщение = "Площадь равна %{Длина * Ширина} м2"
И еще я не сразу обратил внимание на тип Закрываемое. Все мы знаем, что в 1С есть объекты, которые хорошо бы после использования закрыть, а еще лучше уничтожить (сжечь, а пепел развеять). Например это: ЧтениеДанных. Так вот, тут я не сразу обратил внимание на этот указатель в описании свойств и методов. В итоге сначала не совсем понимал, что от меня хотят ошибки в терминале. А потом "как понял". В общем если что, я вас предупредил.
Операции
Здесь основные особенности:
- в сравнении "==" это "=", "!=" это "<>" ну или "НЕ ... = ..."
- можно писать "А += 1" и это все равно что "А = А + 1"
- тернарный оператор выглядит так "<выражение условия> ? <выражение истина> : <выражение ложь>"
- проверка на тип выполняется при помощи операции "это"
- использование "!" и "?." как возможность не заботиться о возможных "Неопределено" в цепочке вызова, просто как говорится, наслаждайтесь результатом или ловите исключение
Например:
// переменная А может быть строкой или Неопределено
пер А: Строка?
// если А это строка, тогда ДлинаА это число равное длине строки
// если А == Неопределено, тогда ДлинаА равна Неопределено тоже
знч ДлинаА = А?.Длина()
// если А это строка, результат аналогичный
// но если А == Неопределено, будет вызвано исключение
знч ДлинаА = А!.Длина()
Инструкции
Немного интересного тут выглядит так:
- для 1С:Исполнитель инструкция "Импорт" не применяется
- есть конструкция "Выбор... Когда..."
- "ИначеЕсли" пишется раздельно "иначе если"
- инструкции цикла идентичны платформе 1С, кроме того факта, что не надо писать КонецЦикла (и ; в конце)
- "попытка - поймать - вконце - ;" и это еще не все, рекомендую почитать повнимательнее
Коллекции
Сначала я не нашел структуру, потом не понял, что такое множество. А потом просто прочитал документацию. Объявление структуры - это просто "мое почтение". Хотел бы в 1С такое + конечно же с типами переменных "знч" и "пер". И типизацией... в общем вот вам просто пример:
перечисление ТипВремени
Работа,
Отдых,
Веселье
;
структура Тест
пер ТипВремени: ТипВремени = ТипВремени.Работа
пер Длительность: Число = 0
пер Начало: ДатаВремя
пер Конец: ДатаВремя
;
Всякое интересное
- регулярные выражения. Работать с ними удобно. Каких-то пожеланий пока не имею. Скорее бы и в платформе было
- чтение zip без необходимости распаковки в ФС, то есть сразу в поток данных. Хотелось бы уже и в платформу это
- в описаниях объекта Файлы есть упоминание MacOs, но вроде бы исполнитель не работает под маками, к чему бы это
- лямбда-выражения удобная вещь, но это скорее удобство, чем необходимость. Более того, в руках особо "талантливых" ребят, можно написать такое красивое...
- не хватает возможность сворачивать области в коде или я не нашел
- объект ЧтениеДанных имеет метод "ПропуститьДо" и в случае передачи массива маркеров невозможно понять на каком маркере остановилось чтение. А ведь вернуться назад не получится. В итоге вместо "ПропуститьДо" используешь "ПрочитатьДо", но мне что-то подсказывает, что пропуск был бы эффективнее
- а что там с публичными и приватными методами? подождем "Импорт" и увидим?
Итоги и один вопрос
Я перенес практически всю логику анализатора файлов в скрипт и он успешно обменивается информацией через rest-интерфейс с конфигурацией. Сейчас осталось решить некоторые вопросы: адаптировать и проверить работу в Linux; продумать как правильнее организовать вызов скрипта и его контроль (логирование); реализовать интерфейс установки и настройки 1С:Исполнитель в конфигурации; придумать как быть с Mac-оводами; доработать rest интерфейс и продумать организацию доступа скрипта к нему....
Но что касается 1С:Исполнитель, то кратко: мне понравилось. И в целом, его можно использовать. Главное не привыкнуть к хорошему. Ведь потом вы вернетесь в платформу и там вас будет ждать гадание на кофейной гуще, а не придет ли вам в параметр публичного метода какая-нибудь кракозябра вместо ожидаемого типа. Ну и крайне интересно, как же же там оно в 1С:Элемент.
Ну и один вопрос меня интересует. Как бы то ни было, мы опять имеем дело с закрытым продуктом без возможности создания собственных модулей вне объектной модели исполнителя. Или я что-то не понял?
Обещанное: об Асинх методах замолвите слово
Когда появились Асинх методы, мир был другим. Трава была не настолько зеленая, а в мире 1С набирал обороты большой монстр ОписаниеОповещения. И сообщество отнеслось к методам осторожно, я бы даже сказал как-то без энтузиазма. А ведь наконец-то код, мог стать обратно простым и лаконичным. И стал, но не для всех.
Казалось бы, Асинх методы особенно востребованы в режиме работы веб-клиента. Но тут незадачливого пользователя ждал подвох. Достаточно открыть синтаксис-помощник по методам Асинх объекта ЧтениеДанных, чтобы понять, веб-клиент почему-то был обделен. Хотя аналогичные методы с обработчиками оповещения веб-клиентом поддерживались. Сдается мне, это просто упущение 1С. Ведь если бы были конкретные ограничения по работе с файлами, то не было бы никаких методов. И по состоянию на версию платформы 8.3.23, увы, всё удовольствие от использования Асинх методов испытать не получится. А хотелось бы.
Особенно меня доставил момент, что именно в ЧтениеДанных эти методы ну вот прямо были очень долгожданными.
Пасхалка
В документации есть рекомендации. И как минимум одну из них я нарушил. Какую?