Как решать повседневные задачи с помощью OneScript

Как решать повседневные задачи с помощью OneScript

Что дальше?

Если вы все-таки решили распиливать монолит, теперь у вас на одну проблему больше 🙂 Обсудим первоочередные затруднения, с которыми мы столкнулись:

  • Каким образом будет происходить оркестрация приложениями. Теперь вам понадобится дополнительная обвязка-приложение, которое будет определять активное приложение на экране пользователя. У нас это Frame Manager, познакомиться с которым можно в докладе или в следующей статье.

  • Глобальные стили и зависимости больше не могут быть глобальными в абсолюте. Вам придется думать, как правильно развести глобальное состояние приложений, будь то window.myVar или глобальный стиль .my-bar. Теперь вам необходимо учитывать, что соседнее приложение может обратиться к вашему состоянию и произойдет что-то неожиданное. Данный пункт применим только к случаям, когда на странице более одного микрофронтенда.

  • Зависимости приложения теперь дублируются. Поясняю: все пакеты ваших приложений находятся в каждом из ваших приложений. Если раньше пользователь загружал vendor.js один раз и пользовался монолитом, то теперь это будут vendor1.js, vendor2.js и т. д. Если сойдутся звезды, то у вас будет полное совпадение всех версий и хэш в названии файла будет одинаковым — тогда браузер достанет файл из кеша. Однако такое совпадение полностью убивает преимущество № 4, да и, скорее всего, эти приложения будут находиться по разным url’ам и файл все равно будет загружен.

Что нужно, чтобы собрать готовое решение

Базово мы используем связку amoCRM Getcourse Sendpulse. Амо фиксирует лиды и все действия по сделкам.

Sendpulse запускает автоворонки на определенных этапах продажи для прогрева лида. Getcourse взяли как популярную платформу для организации процесса обучения. Но можно использовать и любую другую.

Что делать с лидами

Все входящие обращения попадают в CRM-систему. Вот все вариации, которые мы интегрировали с воронкой продаж.

Сейчас читают:  Смотреть кусторезы

Заявки с вебинаров, сайта, групп в соц.сетях, входящие звонки — все в первую очередь попадает в CRM. В нашем случае используем amoCRM.

Что такое 1script?

На конференции Infostart Event 2022 мною был представлен новый скриптовый движок, позволяющий исполнять код на языке 1С:Предприятия, но без самой платформы 1С. Фактически, это новый инструмент автоматизации, не требующий переключения контекста из 1С в абракадабру другого языка и обратно, и который может быть использован специалистами по 1С для автоматизации той или иной рутинной работы внутри операционной системы.

Технически он устроен, как и любой другой скриптовый движок (Python, JScript, PHP). Это интерпретатор, выполняющий текстовые файлы, как правило, в консольном режиме. Преимущество перед другими языками здесь в том, что вы не переключаетесь в чужеродную экосистему, для выполнения задачи.

Вы не тратите время на изучение (или вспоминание) другого языка. Вы просто пишете на 1С. При этом вы не запускаете платформу, вам не нужен лицензионный ключ, вам не нужно выбирать в меню “Файл” внешнюю обработку, которая выполнит нужные действия. Создаете текстовый файл и пишете прямо в нем. Его же запускаете на выполнение.

Кстати, забыл сказать, что это кросс-платформенный инструмент. Вы можете писать скрипты под Linux на языке 1С с той же простотой.

Предлагаю рассмотреть порядок установки и запуска вашего первого скрипта на OneScript. В качестве примера возьмем ту самую задачу с изменением URL для git-репозитория.

Что может быть автоматизировано?

Если вкратце, то практически все, что угодно 🙂 Приведу простой пример. Не так давно на нашем сервере, который управляет git-репозиториями, поменялся URL. Нужно было переключить все локальные копии на моей машине на этот новый адрес. Таких  локальных копий у меня было около 10-ти.

Вручную я должен был войти в каждую папку, набрать там команду git remote, скопировать оттуда старый адрес, преобразовать его в новый и выполнить git remote set-url уже с новым URL.

Я не помню, как все это сделать на Powershell и тем более на BAT/CMD. Более того, я не хочу все это вспоминать. Вместо этого, я взял и написал скрипт на языке 1С. Всего-то перебрать папки из списка, в каждой из них дважды запустить git. Раз плюнуть. Потом скрипт переехал к коллегам, столкнувшимся с той же проблемой.

P. s.

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

Вторая часть доступна по ссылке.

Spa и seo

Боль. Боль. Боль.

Не всё так страшно, но некоторые моменты мы уловили только спустя 7 дней после первых индексаций страниц Яндексом и Google.

Выводить такой продукт с вливанием тысяч рублей в рекламу мы не хотели, потому что сам продукт больше носит и носил имиджевый характер и добавляет нам “пункты” при продажах собственных услуг. Если денег вливать не собирались – значит надо было думать над каким-то решением, которое было бы очевидным, реализуемым, эффективным и незатратным, как по времени, так и по финансам.

Заголовок не был бы заголовком, если бы не содержал ответа – SEO и поисковые системы со своей механикой индексирования.

Но давайте вернёмся к SPA и первой проблеме с которой я столкнулся – индексирование страниц, содержимое которых генерируется JS после загрузки.

Яндекс… кошмар (с 2022 года, поправьте, если ошибусь, Яндекс предлагает дублировать контент с передачей специального параметра и не поддерживает индексацию JS-контента). Google… не проиндексировал (несмотря на то, что индексацию JS-контента поддерживает), хотя Google Search Console показала, что страница отдаётся полностью с нужным содержимым.

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

  • Заголовка;
  • Описания;
  • Предпросмотра скрипта;
  • Тегов.

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

Первым шагом стало генерирование заголовка (title, meta) и описания (description, meta) на стороне сервера с помощью PHP (дальше вы сильно будете смеяться, когда узнаете на каком стеке был и есть сам конструктор).

Тестируем.

Ура! Подхватывает!


Telly: Бесплатный конструктор скриптов продаж. Андрей Шмиг

Но радость в одной части реализации была омрачена печалью в другой части реализации.

Перед запуском у меня была гипотеза, что Яндекс и Google следующие URL будут воспринимать по-разному и считать уникальными:

Но после добавления в индексы через несколько дней, Яндекс и Google начали помечать страницы дубликатами и исключать из поиска.


Telly: Конструктор скриптов продаж. Андрей Шмиг

Тут я был некоторое время в ступоре, но потом быстро осознал, что мне надо перевести URL в такой вид:

Сказано – сделано. Изменения сработали.


 Telly: Бесплатный конструктор скриптов продаж. Андрей Шмиг

На этом мои преключения не закончились, но остальные детали реализации связаны с технологическим стеком. О нём поговорим в следующем блоке.

Tl;dr

От монолита в одном репозитории мы смасштабировались до десятков монорепозиториев с микрофронтендом, которым для клиента управляет Frame Manager.

Схема взаимодействия клиента с микрофронтендом
Схема взаимодействия клиента с микрофронтендом

В шаге от потери бизнеса

Года 2 назад, а судя по посту в ВК – 1 год с копейками:

… закрылся проект Sale Script Gift. Бесплатный конструктор скриптов продаж в течение месяца или двух свернул свои паруса и умер, оставив за собой образ и инструкцию по развёртыванию VM.

Я бы не акцентировал на этом моменте внимание, если бы не тот факт, что на момент закрытия сервиса у нас в личном кабинете было от 60 до 80 скриптов продаж различной сложности и различного объёма. Экспорта в Sale Script Gift предусмотрено не было – голый JSON и понимание того, что данные терять нельзя, иначе будет грустно всем.

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

Выхода на тот момент не было другого, как оперативно поднимать что-то своё и одновременно конвертировать существующий формат хранения сценариев в другой. Да, был всё-таки вариант поднять ту же VM, которую парни оставили в паблике, но на тот момент у нас уже была инфраструктура на PHP / MySQL и начинать разворачивать что-то на Python / Java желания не было от слова совсем.

Героическими усилиями 1 человека за 1 день и 1 ночь был поднят самый ужасный по удобству, но спасительный редактор скриптов продаж (видео-инструкция для сотрудников):


Deep Sales Platform: Конструктор скриптов продаж (версия 1)
Андрей Шмиг

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

Все это чужеродные элементы!

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

Выбор диска для резки болгаркой

Для раскроя шиферного волнистого листа чаще всего применяется универсальная режущая машинка – болгарка. Удобнее всего для этого использовать угловую модель. Для этой цели устройство оснащается двумя видами режущего инструмента:

  1. Диск для камня.
  2. Алмазный универсальный круг.

Выносим продукт из продукта

Рывка сразу не последовало – не успели восстановиться, поэтому начали дорабатывать конструктор внутри платформы и смотреть, как же на это всё реагируют клиенты, руководители команд продаж и сами операторы. До июня-июля 2022 года мы всё пилили и пилили, как платформу Deep Sales Platform, так и конструктор скриптов продаж.

Гвоздь

Способ аналогичен выше рассмотренному – с применением дрели. Однако в отличие от него здесь отверстия проделываются гвоздем с помощью молотка. По нижней части волны в линии отреза по всей длине набиваются дырки с как можно более близким расположением друг ко другу.

Далее лист просто переламывается по этому месту на две части. Для ускорения процедуры раскроя применяется брусок с заранее набитой в ряд серией гвоздей. Использовать для такого метода можно только шиферные гвозди с тупой заточкой острия. Это предотвращает образование трещин в листе по месту прокола.

Декомпиляция скриптов

Общая тема для просьб о помощи в декомпиляциии и декриптованиии скриптов, плагинов и приложений.
Запрещено просить о декомпиляции/декриптовании софта, выставленного на продажу на нашем сайте.

Рекомендации:

  1. Сначала воспользуйтесь поиском по теме и по форуму, возможно его в декомпилированном виде или с исходным кодом уже выкладывали у нас на сайте.
  2. Попытайтесь декомпилировать самостоятельно: CLEO – декриптор, декомпилятор; AHK – распаковщик .exe; LuaJIT – декомпилятор1, декомпилятор2.
  3. Просить о декомпиляции .asi, .sf, .dll, .exe почти бесполезно, часто такие просьбы остаются без ответа и вряд ли вам это что-то даст. Можете попробовать сами, IDA Pro к вашим услугам.
    • Это не касается .exe, которые являются скомпилированными AutoHotKey-скриптами (.ahk).
  4. Добавьте название скрипта к сообщению, если оно известно – это поможет другим пользователям найти его с помощью поиска.
  5. Сообщения по типу “спасибо, помог” по правилам форума считаются флудом и скорее всего будут удалены. Если вам помогли, вы можете нажать кнопку Мне нравится под ответом – это даст понять, что ответ верный.

Дисковая пила

Распилить сайдинговую панель по прямой линии вдоль или поперек можно и дисковой пилой с отрезным кругом. Поперечные резы удобнее делать стационарным инструментом, продольные и диагональные – ручным.

Дрель

Как альтернативный способ, чем можно отпилить шифер, используется засверловка серии рядом расположенных по линии отреза отверстий с помощью дрели с последующим разламыванием по ней листа. При этом чтобы не подвела режущая кромка инструмента из-за твердости структуры материала, необходимо использовать сверла с победитовой напайкой.

Единый сценарий продажи

Мы свели все этапы продажи в один сценарий. С этими четырьмя воронками теперь можно квалифицировать лид, довести его до продажи, оформить рассрочку и отслеживать процесс сбора оплат.


Воронка лидов → Воронка сделок → Воронка рассрочки → Воронка «просрочки».

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

Сделали кастомную интеграцию с Геткурсом. После оплаты — создается кабинет на Геткурсе, и доступы автоматически отправляются клиенту.

Если подсветка не включилась

В Notepad есть странный глюк. Подсветка синтаксиса 1С в нем работает только если файл использует кодировку UTF-8. Поэтому, рекомендуется все скрипты кодировать именно так. Если подсветка после импорта из файла не включилась – нужно переключить кодировку в UTF-8 (меню «КодировкиПреобразовать в UTF-8») и перезапустить блокнот.

Есть решение!

Чтобы сделать скрипт, решающий наши проблемы, не нужно переключаться на другой язык. Нужно писать скрипты прямо на языке 1С!

Инструменты для резки – анализ эффективности при работе с сайдингом

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

Как было

Долгое время в компании был репозиторий с проектом РКО (расчетно-кассовое обслуживание), в котором находилась почти вся функциональность данной аббревиатуры. На картинке показано примерное количество разных блоков, которые пытались жить своими релизными циклами и фича-командами.

Примерная схема монолитного фронтенд-приложения
Примерная схема монолитного фронтенд-приложения

Одна из мыслей, которая приходит при просмотре картинки: «А давайте-ка мы все это распилим на независимые части!». На эту тему я предлагаю порефлексировать.

Как избавиться от дублирования сделок

В данном кейсе поступало по 50 000 регистраций на вебинары в месяц. Чтобы отсортировать и синхронизировать все эти лиды, нужен стабильный скрипт по маппингу лидов.

Маппинг — это синхронизация одинаковых сделок и контактов, чтобы не «плодить» повторяющиеся сделки от одних и тех же клиентов.

Во многих CRM есть эта функция, но мы автоматизировали объединение сделок. Теперь существующие контакты «маппятся» в единую сделку, которая и идет дальше по воронке.

Например, на вебинаре продают продукт, и у пользователя есть куча вариантов совершить целевое действие. Ведущий говорит: кто хочет — переходите по вот этой ссылке; кто хочет супер цену — оставьте заявку вот тут; в конце вебинара те, кто готов купить, могут заполнить вот эту форму.

Можно зарегистрироваться с 3х разных форм. В итоге если человек прошел по всем формам, то мы получаем минимум 3 сделки и «сиди разгребай».

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

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

Какие есть скрипты для настройки хостинга?

Какие существуют скрипты для настройки хостинга? Обращался за услугами к одному администратору, он установил вот эту штуку – web-cp.ru/

Она может:

– создавать домен,

– создавать пользователя в системе (с доступом по FTP в свою папку),

– создавать пользователя mysql,

– устанавливать wordrpess и ещё какие-то движки для созданного сайта (с горем пополам).

Но этот “скрипт” мне показался каким-то сыроватым что ли…

Исходные данные:
– голый VPS на CentOS или Ubuntu.

Нужно:
консольное приложение (а не комбайны вроде ISPManager), которое бы умело:
1. Создавать домены,
2. Создавать пользователей в системе с привязкой к web-папке домена с доступом по SSH/FTP,
3. Устанавливать ПО по выбору (MySQL или Percona, Nginx, различные версии PHP).

Буду рад, если поделитесь, кто чем пользуется и какие у этого плюсы/минусы?

Коротко о главном

Необходимость распилить шиферный лист возникает в разных бытовых случаях – от монтажа и ремонта кровли до создания придомовых декораций. При этом необходимо позаботиться о правильной организации работ – прежде всего с точки зрения защиты от асбестоцементной пыли рабочего персонала с помощью средств индивидуальной защиты и окружающего пространства. Место контакта режущего инструмента с шифером должно постоянно смачиваться.

Для раскроя материала применяются следующие инструменты и способы:

  • Болгарка с диском для камня или алмазным кругом.
  • Ручная дисковая пила.
  • Электролобзик.
  • Дрель.
  • Монтажный или бытовой нож.
  • Ножовка для дерева или металла.
  • Гвоздь.

Ровный шиферный материал раскраивается таким же электроинструментом, но при этом лучше ломается. Кроме того, при использовании любых средств распила материала важно соблюдать правила техники безопасности.

Механические способы

При отсутствии подходящих электроинструментов раскрой шифера можно выполнить механическим путем с применением следующих простейших средств:

  • Ножовка по дереву или металлу
  • Монтажный нож
  • Гвоздь

Рассмотрим детально, как происходит процедура в каждом конкретном случае.

Монтажный нож

Разрезать шиферный лист также можно с помощью бытового или монтажного ножа. Для этой цели линию отреза прочерчивают острием по прямолинейной планке. Процедура выполняется до тех пор, пока глубина отметки не достигнет 2/3 его толщины.

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

Настраиваем запуск скрипта

NppExec работает следующим образом:

  • Нажимаем кнопку F6 и в открывшемся окне вводим команду для запуска. Жмем ОК и она выполняется. Результат будет выведен в отдельную всплывающую панель
  • Далее, жмем Ctrl F6 и предыдущая команда запускается еще раз

То есть, нам нужно в окне запуска ввести команду oscript $(FULL_CURRENT_PATH) и нажать ОК. В консоли будет выведен результат работы того скрипта, который сейчас открыт в блокноте.

На этом настройка рабочего окружения закончена. Это было несложно:

  1. Установили Notepad
  2. Установили подсветку синтаксиса
  3. Установили плагин NppExec и настроили команду запуска текущего скрипта
  4. Профит
Итак, поскольку скрипт – это одноразовая программа, то мы не заморачиваемся с настройками. Все пути можно жестко прописать прямо в скрипте:
РабочийКаталог ="C:DocumentsGITs";
ОбойтиВсеРепозитарииВКаталоге(РабочийКаталог);

Теперь создаем процедуру «ОбойтиВсеРепозитарииВКаталоге»

// Перерегистрация репозитариевПроцедура ОбойтиВсеРепозитарииВКаталоге(Знач РабочийКаталог);
	
	Каталоги = НайтиФайлы(РабочийКаталог,"*.*",Ложь);ДляКаждого НайденныйФайл Из Каталоги ЦиклЕсли НайденныйФайл.ЭтоКаталог()Тогда
			ОбработатьКаталог(НайденныйФайл.ПолноеИмя);КонецЕсли;КонецЦикла;КонецПроцедуры

Ну и дело за малым – запустить гит для получения и изменения URL в процедуре «ОбработатьКаталог»

Немного экономики

Мы у себя в работе используем OneScript для самых разных задач. От автоматизации развертывания баз 1С и синхронизации исходников конфигураций в git, до расчета покрытия кода тестами. Код наших скриптов также расположен в git, и любой 1С-ник компании может при желании что-то доработать. Язык знаком всем и не требует дополнительных навыков.

Производительность кода по нашим оценкам, как минимум, не хуже 1С. На некоторых задачах OneScript быстрее почти в 2 раза, на некоторых – примерно одинаково. Радикального проигрыша 1Script в скорости по сравнению с 1С мы пока не наблюдали.

Сейчас, в пору кризисов и санкций в Сети все чаще попадаются предложения по экономии на лицензиях для Windows, есть success-story по переводу части парка машин на Linux. Если посчитать лицензии Microsoft по текущему курсу, то переезд на Линукс выглядит все более привлекательным.

Если вы строили автоматизацию на Powershell, то он станет у вас камнем преткновения. OneScript работает под Linux и вы можете автоматизировать свою деятельность независимо от того, какая ОС применяется (или будет применяться в будущем) в вашей компании.

Ножницы по металлу

Как и другие ручные инструменты, ножницы нельзя использовать при работе с пластиком в холодное время года, так как при резке ими материал может трескаться. И это не единственное условие для достижения хорошего результата. Также в инструкции рекомендуется выбирать ножницы с минимальной толщиной режущих частей и не допускать их полного смыкания.

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

Совет! Резать сайдинг ножницами поперек панели лучше снизу вверх, чтобы самая сложная и толстая замковая часть оказалась в конце.

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

Но всегда есть риск растрескивания панелей, их смятия в местах изгиба рельефа, сплющивания профиля замка. Особенно если резать тонкий металл или хрупкий пластик плохого качества.

Ножовка по дереву или металлу

Самое простое и доступное механическое средство для раскройки шифера – это ножовка. Это может быть один из трех вариантов:

  1. По металлу.
  2. По дереву.
  3. Для пенобетонных блоков.

Чтобы порезать шифер с помощью ножовки, необходимо следить, чтобы лист не перегибался, иначе он может сломаться. Кроме того, место контакта режущей части инструмента с материалом требуется периодически смачивать водой. Однако при этом техника раскроя стандартна и не отличается особой сложностью.

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

  • Материал полотна. Пила для дерева изготавливается из обычной стали, для металла – из высокопрочного сплава. Чем больше объем работ, тем прочнее должно быть полотно.
  • Габариты зубцов. Инструмент для металла оснащается зубьями высотой не более 1 мм, для древесины – от 4 мм. Чем тверже распиливаемый материал, тем прочнее должны быть зубья, а такие характеристики сохраняются только при небольших размерах.
  • Угол заточки зубьев. У пилы по дереву зубцы расставлены в стороны и заточены со всех краев. Инструмент для металла оснащен зубьями только с заточенными кончиками.

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

Для выполнения небольшого объема работы по раскрою можно применять пилу по древесине, для большего объема – лучше использовать ножовки по металлу или пенобетону. Однако пила с крупногабаритными зубьями пилит быстрее, а с мелкими аккуратнее и точнее. В целом, пилить волновой шифер с помощью ножовки достаточно трудоемко и долго по времени – в сравнении с работой электроинструментом.

Совет! При неизбежности применения только ручной пилы для обработки большого количества шифера следует использовать модель со съемными полотнами и периодически по мере забивки зубьев менять их.

Ножовка по металлу

Ножовка или пила с очень мелким зубом подходит только для поперечной резки из-за небольшой длины рабочего полотна. У этого инструмента слишком много недостатков, не позволяющих использовать его при больших объемах работ.

  • Малая скорость и высокая трудоемкость выполнения раскроя.
  • Трудность распила панелей вдоль и под углом.
  • Невозможность изготовления фигурных вырезов.
  • Гибкое полотно уходит в сторону на изгибах и многослойных участках.
  • Резать пластиковый сайдинг можно только при плюсовой температуре.

Нужно ли?

Первый вопрос, конечно же, о целесообразности потратить множество человеко-часов на распил проекта на несколько поменьше. Рассмотрим на нашем примере все за и против по каждому из следующих утверждений:

Тезис

Почему это хорошо

Почему это плохо

Одновременные, но бизнесово не связанные задачи перестают блокировать друг друга при релизе

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

Этот пункт можно относительно спокойно решить с помощью TBD и фича-флагов

Уменьшение связности кода

Грамотная организация кода позволит вынести общую функциональность в библиотеки и назначить ответственных, а настроенные процессы — как в команде, так и технические — закрепят разделение

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

Выделение логических частей продукта в проекты с целью повышения ответственности (ownership) за кодовую базу. Этот пункт актуален для больших команд, которые работают в одном репозитории. Часто в мастер-ветке бывает 5, 10, а то и больше пулл-реквестов (ПР), которые могут конфликтовать друг с другом

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

В монолите можно организовать код по библиотекам или разделам, на которых также появятся ответственные. Дополнительно можно создать и соблюдать определенные договоренности по работе с git flow

Возможность менять стек отдельной части

Команда как владелец приложения определяет свой стек — например, может поменять state-менеджер, обновить библиотеку до последней версии или, наоборот, зафиксировать ее. Отмазки «так исторически сложилось» со временем пропадут

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

Возможность заморозить часть приложения

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

— Кто сломал такую-то функциональность на этом релизе?

— Это соседняя команда. Они сказали, что ревью прошло, все протестировано и доехало до прода.

Правда знакомо? 🙂

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

Рефакторинг маленьких приложений происходит быстрее

У вас есть некоторое ломающее изменение, и нужно мигрировать со старой версии на новую. Например, повысить версию Ангуляра (хотя со схематиками это одна радость). У вас варианты: 

  1. Засесть на большой срок за миграцию одного монолита, по дороге что-то потерять или сломать, потому что ПР будет очень большим

  2. Мигрировать по проекту: ПРы и вероятность что-то потерять ниже — за счет меньшей кодовой базы

Рефакторинг монолита можно проводить частями, для больших миграций могут помочь скрипты, codemod и схематики. В таком случае весь проект будет 100% переведен и технического долга не останется

Сокращение времени выполнения тестов, линтов и так далее — за счет уменьшения кодовой базы

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

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

После прочтения пунктов у вас наверняка загорелись глаза, потому что пунктов «За» больше, и вы бежите распиливать проект. Но нужно учесть, что, если ваша команда небольшая, например из двух-трех человек, такой «распил» вам скорее навредит, чем поможет.

Особенности организации работ

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

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

Именно этот главный специфический аспект обуславливает следующие требования к организации работ по тому, как, чем и при каких обстоятельствах пилить шифер:

  • Мастер, выполняющий резку, должен находиться в средствах индивидуальной защиты. Это прежде всего респиратор, очки или маска, перчатки и спецодежда из плотной ткани.

Применение электроинструмента

Шиферный лист можно распиливать не только болгаркой, но и некоторыми другими видами электроинструмента. Это прежде всего:

  • Ручная дисковая пила.
  • Электролобзик.
  • Дрель.

Разберем особенности их применения более подробно.

Продукт в продукте

На тот момент у нас была собственная платформа для ведения аутсорсинга продаж через холодные звонки – Deep Sales Platform. Она и сейчас есть, но сильно отличается от первой версии и от самого Скорозвона (будете смеяться, но на тот момент и на него у нас денег не было – только своими силами что-то вытаскивали из инструментов).

В ней есть такие вещи как:

  • Автоматизированные финансовые начисления за звонки операторам и за достижения целей по воронке продаж;
  • Возможность строить неограниченное количество воронок продаж;
  • Загружать большие объёмы баз контактов и обзванивать их в полуавтоматическом режиме;
  • Разрабатывать скрипты продаж;
  • Управлять командой сотрудников;
  • Слушать аудио-записи в режиме реального времени;
  • и прочее и прочее и прочее.

Пару скриншотов для любопытных:


Deep Sales Platform: Детализация по звонкам Андрей Шмиг

Первый продукт работает до сих пор и мы его активно используем, но вот развивать перестали из-за стека… В какой-то момент PHP (Symfony) MySQL стал болью для поддержки. В планах стоит задача перенести на другой стек и возобновить доработки, потому что видим потребность в таком решение от малого бизнеса, который к нам обращается или небольших колл-центров, которые хотят запуститься.

В этой платформе у нас и начал зарождаться второй продукт – конструктор скриптов продаж.

Каждую недели коллеги приходили с жалобами и пожеланиями по редактору, который мы выкатили за 1 день и 1 ночь – неудобная навигация, мелкий шрифт, разрабатывать неудобно, переносить неудобно, копировать нельзя, случайное движение и слетает зум, чтобы ориентироваться – нужно помнить структуру. Одним словом мы каждую неделю копили силы на новый рывок.

Промежуточные цели

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

Мы были в ситуации, когда от инструмента зависело наше существование, а теперь, когда всё позади и один бизнес может поддерживать другой, мы хотим помочь тем, кому этот инструмент может пригодиться.

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

Так же у этой статьи есть ещё несколько целей:

  • Получить обратную связь и пожелания по продукту;
  • Найти партнёров (скриптологов и колл-центры) для подключения, как к Deep Sales Platform с предоставлением заказов, так и к Telly для продажи скриптов в интернет-магазине;
  • Поддержать тех, кто просто делает.

Благодарю за внимание!

Хорошего вам утра / дня / вечера / ночи!

Разделение

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

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

  1. На каждую из логических частей создаем новое полноценное приложение. Если встречаются переиспользуемые сущности, то копируем их в новый проект. Звучит абсурдно, но никто не будет спорить, что это самый быстрый вариант. Однако копировать общий код из репозитория в репозиторий совсем не круто, поэтому чуть прокачаем метод.

  2. На каждую из логических частей создаем новое полноценное приложение и отдельно выносим общую кодовую базу в некий foundation. Это может быть отдельный (моно)репозиторий или директория libs у вас в проекте. И вот здесь возникает еще один нюанс: вынести-то мы вынесли, а как теперь обратно в проект подключить?

    • Самый простой вариант — положить библиотеки в репозиторий вашего проекта. Способ применим, если вы распиливали монолит в одну монорепу. Например, по такому алгоритму работает Nx Workspace. Таким образом вы можете работать со своими библиотеками, не переключаясь с проекта. Однако минусом будет тот факт, что конкретно в этот момент вы можете использовать только текущую версию библиотеки. Вы не можете ее зафиксировать, повысить или понизить, а любое изменение библиотеки соседними разработчиками автоматически применится на ваш проект.

    • Чуть посложнее: на каждый релиз вашего приложения можно создавать отдельную ветку в foundation и указывать ее название в package.json. В принципе готово. Теперь после установки зависимостей у вас будет загружена именно та версия общего кода, которую вы указали, а все дополнительные настройки можно сделать через tsconfig.json.

    • git submodule / subtree — вариант чуть посложнее, так как, кроме простого указания ссылки на репозиторий, придется еще чуть-чуть отладить его работу. У этого варианта есть огромный плюс перед предыдущим: можно прямо в своем проекте изменять исходники библиотек и пушить их в репозиторий. Еще плюс по сравнению с первым пунктом — всегда можно зафиксироваться на определенном коммите и изменение общего кода не затронет ваш проект.

    • Сложный вариант — настроить публикацию вашего общего кода как npm-библиотек, при этом заранее разбив его на пакеты. Декомпозиция нужна, чтобы изменение функциональности проходило дозированно. Вот что я имею в виду: если разработчик меняет работу с авторизацией обратно несовместимо в пакете auth и повышает версию с 1.0.0 до 2.0.0, а второй разработчик хочет поменять название в баннере для платежной системы, который каким-то чудом оказался в этом же пакете, то он выпустит уже 2.0.1, но применить его не сможет, пока не обновит в своем проекте авторизацию, которая ему в общем-то и не нужна. Здесь же можно придумать различные релиз-кандидаты, альфа-/бетаверсии и т. д. Если вас это заинтересовало — рекомендую посмотреть Lerna.

  3. Заново построить SPA. Если у вас ранее был SPA, вы, скорее всего, хотите его вернуть, чтобы у пользователя не было перезагрузки страницы, одно состояние и тому подобные плюсы одностраничного приложения. Вам придется разработать обертку над своими приложениями, которая будет всем этим заниматься. Напомню, что у нас этим занимается Frame Manager, о котором в скором времени тоже расскажем. Если очень упрощать, то вам понадобится функциональность, которая будет сопоставлять массив продуктов с массивом путей и изменять состояние страницы в зависимости от пути. В качестве шины для передачи состояния можно придумать массу решений: window.myVar,localStorage,sessionStorage,CustomEvent,postMessage и так далее.

  4. Если ваш проект использует технологию серверного рендеринга (SSR), вам также стоит продумать изменения архитектуры. Будьте готовы запрашивать разные части с разных серверов и склеивать их в единое приложение для пользователя. Минусом такого подхода может быть возросшая нагрузка на серверы вашей компании. Также стоит отметить, что, если части вашего приложения будут собираться воедино с помощью iframe, это может вызвать проблемы с SSR.

Резка плоского шифера

Быстро, аккуратно и эффективно распилить плоский шифер можно при помощи следующих инструментов:

  1. Болгарки.
  2. Ручной дисковой пилы.
  3. Электролобзика.

Кроме того, его намного легче сломать по углубленной прямой выемке, чем волновой аналог. Толщина листа может варьироваться в рамках 4-10 мм. При этом свойства асбестоцемента у него полностью сохраняются. Поэтому все рекомендации по выбору режущего инструмента и технике обработки для него сохраняются такими же, как для волновой версии.

Рекомендации по безопасности

При раскрое шиферного материал необходимо соблюдать ряд правил по технике безопасности:

  1. Надежно защищать органы дыхания, глаза и кожу от попадания шиферной пыли.
  2. При необходимости для предотвращения шумового воздействия на органы слуха использовать наушники.
  3. Работу выполнять на улице – так чтобы стороны, куда дует ветер, не находились люди, животные, предметы.
  4. При резке шифера болгаркой, дисковой пилой и электрическим лобзиком требуется соблюдать нормы по безопасности, характерные для обращения с электромеханикой.

Рекомендация! Чтобы уменьшить пылеобразование и ломкость материала, за два-три часа перед раскроем шиферный лист необходимо замочить. Для этого по разметочной линии укладывается смоченная в воде полоска ткани.

Реноватор

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

При резке реноватором не образуются искры, не греется кромка, поэтому, если выбирать, чем резать металлосайдинг, лучшего инструмента не найти. Он легко справится и с виниловыми панелями. Конечно, скорость работы у него ниже, чем у болгарки, но качество выше.

Ручная дисковая пила

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

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

  • Направление движения должно быть строго по намеченной линии.

Синхронизация

Под термином «микрофронтенд» в этой статье я подразумеваю тип приложений, способных работать как самостоятельно, так и в рамках другого приложения-оболочки. Проще всего представить это на примере приложения, в котором есть iframe с другим сайтом. Реализацию микрофронтенда для библиотек мы рассмотрим в одном из следующих материалов.

Синхронизация сделок

Чтобы перейти из вебинарной воронки в продажу, нужно определить потребность клиента в продукте.

Сначала пользователь приходит на вебинар, и его посещение фиксируется. Далее фиксируется заполнение формы по определенной ссылке. Оба этих этапа лид проходит самостоятельно, и в CRM карточка автоматически движется по воронке.

Менеджер отдела продаж подключается на этапе, когда пользователь оставил заявку. Тут мы уже знаем, что у него есть интерес к продукту, и нам остается узнать, готов ли он его купить.

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

Скрипты – наше все!

Что такое скрипт или, по-другому, сценарий? Это простой текстовый файл с кодом, который можно выполнить непосредственно. Без компиляции, без построения промежуточных выполняемых модулей – прямо из текстовика.

Скрипт – это часто одноразовая программа, которая сделает вам нужную работу. Ее просто накидать, просто запустить, просто получить результат.

На windows традиционно была нехватка мощных средств автоматизации с помощью скриптов. Я знаю, что есть виртуозы BAT-файлов, которые могут творить с ними чудеса, но все же овладение этим инструментом занятие не для слабонервных.

Кроме того, на windows есть система Windows Script Host (WSH) которая позволяет уже писать более-менее функциональные скрипты на VBScript или JS, однако, когда дело доходит до работы с кириллицей – начинаются шаманские пляски с бубном.

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

Ну и в Linux, конечно, очень распространен скриптинг. Развитая система родных shell-скриптов, которыми можно делать практически любую автоматизацию системы, в Linux дополняется возможностью подключить любой другой скриптовый язык.

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

Сложности в нарезке сайдинга

Независимо от материала изготовления, сайдинговые панели имеют сложный фигурный профиль. Одна из их продольных кромок имеет замок, а вторая – ответную часть, защелкивающуюся в паз, и полосу с перфорацией для крепления к каркасу. Видимая часть панелей рельефная и может состоять из одной, двух или трех одинаковых по форме волн. А их толщина не превышает 1,2 мм.

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

Случаи, когда требуется резать шифер

Задача по распиловке шиферного листа возникает в следующих случаях:

  • Монтаж новой кровли – редко-когда удается уложить на стропильную систему кратное число листов. Кроме того, их часто приходится подрезать по вдоль или с углов.
  • При ремонте давно эксплуатируемой крыши зачастую приходится укладывать не целый лист, а фрагмент с определенной вырезкой.
  • Сооружение крыши сложной архитектурной формы. Листы требуется вырезать под всеми возможными углами.
  • Создание элементов кровельной защиты для труб, дымоходов, вентиляционных аэраторов и т. п.
  • Вырезка из старых листов элементов декоративного оформления и защиты грядок, клумб, теплиц и прочих садово-огородных сооружений.

Советы

Вот мы и прошли весь тернистый путь от принятия решения до его реализации. Мы приняли недостатки каждого метода и получили преимущества от реализации, описанные выше. Пробежимся быстренько по tips&tricks, которые помогли нам в работе:

  1. Подумайте несколько раз, действительно ли вам будет полезен микрофронтенд? Пока мы общаемся с вами в рамках этой статьи, вы, скорее всего, еще не начали распил, а значит, есть время одуматься 🙂

  2. Если это ваш первый «распил», будьте готовы просидеть за его выполнением долгое время. Это может показаться сверхкапитанским советом, но лучше взять времени с запасом, чтобы не доставлять неудобства соседним командам, которые, скорее всего, тоже поменяют свои рабочие процессы на это время, чтобы при переносе ничего из нового не потерялось.

  3. Если у вас большая компания, будьте готовы выделить на поддержку такого решения команду или человека. Опять-таки, кажется, что распил и сбор — это конечный процесс, но на большом количестве приложений он может обернуться в самописное решение, которое можно улучшать до бесконечности: от плавности переходов между приложениями до кеширования состояния каждой составляющей.

  4. Если ваша цель — декомпозировать проект более одного раза, то задокументируйте все процессы настройки, чтобы другая команда пошла уже по проторенной дороге, а не набивала шишки заново. В худшем случае вы можете получить несколько решений микрофронтенда в одной компании/продукте.

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

Технологический стек: от фреймворков до железа

Наша платформа Deep Sales Platform изначально разрабатывалась на PHP MySQL. 3 года назад делалась на коленке, как решение, которое впервые спасло бизнес от гибели. В качестве спасительного круга – Symfony.

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

Если на начальном этапе развития проекта Deep Sales Platform был на Symfony Twig, то затем стал на Symfony (REST API) Twig Vue.js. После нескольких итераций Twig выкинул совсем и остался на стеке Symfony Vue.js. Следующей итерацией frontend стал полностью SPA Symfony (REST API) на backend.

Во-первых поддерживать такие решения проще, а во вторых разрабатывать такие решения быстрее. Обкатав единожды такую механику работы небольшая команда, следуя ей, может сильно ускориться в выпуске продуктов запараллелив frontend и backend. У SPA есть свои нюансы с которыми мы столкнулись при разработке, но не было такого, что бы не решилось.

Когда на frontend у тебя JavaScript, а на backend PHP MySQL, то бывает сложно поддерживать две “модели мышления” и различные подходы к архитектуре приложений, поэтому желание свести всё к чему-то одному логичное.

Я рисковал, сильно рисковал, но решил переносить конструктор на стек Node.js Vue.js Vuetify MongoDB, потому что к тому моменту мы сильно увязли (в хорошем смысле этого слова) в JS и тянуть хвостом Deep Sales Platform на PHP становилось тяжело.

В процессе разработки конструктора на связке PHP MySQL стали проявляться проблемы MySQL и задачи, которые требовалось решать в конструкторе – они не совсем подходили друг другу.

И если начинать что-то с нуля, так начинать на все 100%… Если раньше был Apache PHP FPM, то тут я решил – nginx. И я скажу, что ни единой минуты не пожалел о своём выборе, когда дело заходило до конфигурации проксирования запросов на ноду, кеширования и прочего.

Так как изначально мы Deep Sales Platform разворачивали на Selectel, то и Telly было решено там же развернуть. И там и там у нас крутится CentOS 7.0.

По железу сейчас такое:

  • vCPU 1 ядро;
  • RAM 2 Гб;
  • SSD 15 Гб;

И по цене – 1 490 руб / мес.

Детализация для любопытных:


Telly: Бесплатный конструктор скриптов продаж
Андрей Шмиг

Технологии мы “утрясли” и на ближайшую перспективу их менять не собираемся. Deep Sales Platform, как я уже говорил, тоже будем переводить на новый стек.

Тинькофф бизнес

Мы в Тинькофф выбрали несколько вариантов.

Исторически первым распилом был вынос части Тарифов в отдельный репозиторий. На тот момент ключевой целью было обкатать процесс безболезненного разделения функциональности от монолита и дальнейший релиз на продакшен без проблем для пользователя. При этом общий код был в отдельном репозитории, который публиковался в виде npm-пакетов.

Дальше были другие проекты, процесс оттачивался и ускорялся, но в какой-то момент мы поняли, что даже приложения, которые уже были вынесены, стали слишком большими и неплохо было бы их еще раз декомпозировать. Перед нами встал вопрос: «Делать это таким же образом, как раньше, или пересмотреть подход?» Почему напрашивался пересмотр:

В итоге подход был пересмотрен на пилотном проекте: мы стали использовать Nx. Теперь части приложения выносились в apps/, а их пересекающийся код обобщался в libs/. Это позволило решить первые две потребности команд, но только усилило третью.

Устанавливаем плагины

Существует огромное количество удобных плагинов для NPP. Все они удобным образом устанавливаются через менеджер плагинов, запускаемый из меню «Плагины – Plugin Manager – Show Plugin Manager»

Для разработки скриптов наиболее полезным является плагин NppExec. Он позволяет, не выходя из блокнота, запускать какое-либо приложение и наблюдать его консольный вывод непосредственно в окне Notepad .

Для разработчика скриптов это означает, что он пишет скрипт, нажимает кнопку и видит результат работы скрипта сразу же, в окне блокнота. Этим обеспечивается быстрый цикл разработки в стиле «Написал-Нажал-Посмотрел результат»

Устанавливаем в менеджере плагинов флажок возле NppExec и запускаем установку. После установки в меню “Плагины” появится пункт NppExec. В подменю этого пункта рекомендуется установить флажок “Follow ($CURRENT_DIRECTORY)”. При запуске скрипта на выполнение он автоматически будет стартовать в той директории, где лежит файл запускаемого скрипта.

Установка интерпретатора.

OneScript имеет открытый исходный код и доступен в публичном репозитарии на bitbucket.

Чем меньше воронок — тем лучше

У нашего клиента были отдельные воронки продаж под каждый продукт. Работало это так:

Заявки не понятно куда «кидать», а если это звонок — тем более. Все интеграции цепляются к одной воронке: потом менеджер сидит и распределяет сделки по нужным воронкам.

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

Лучше внедрить дополнительные функции и свести все процессы в одну воронку, чем «плодить» одинаковые воронки на каждый продукт отдельно.

Электролобзик

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

  1. Полотно должно обладать достаточной твердостью и мелкими зубьями – как, например, у экземпляров для обработки камня.
  2. В ходе работы режущий инструмент не должен соприкасаться ни с чем, кроме шиферного листа.
  3. Подача шпинделя должна быть переключена на как можно более низкую скорость.
  4. Раскрой материала должен осуществляться как можно аккуратнее и точнее – без малейшего надавливания, так как впоследствии это может привести к сколу кромки.

Заключение

За минувший год 1Script вырос из исследовательского проекта в продукт, успешно применяемый в реальных бизнес-решениях. Это полноценный независимый кросс-платформенный интерпретатор языка 1С. Исходные коды открыты. Справка по доступным классам и глобальным процедурам доступна и постоянно обновляется.

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

Писать скрипты – это просто, а главное – эффективно. Автоматизируйтесь! Пусть страх перед незнакомыми языками программирования больше не останавливает вас.

Оставьте комментарий