Интерактивные TUI элементы в OneScript

20.05.24

Разработка - OneScript

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

На самом деле, не так много создается CLI приложений на OneScript. Грустно это или весело? Это печально. Тут есть много причин, вдаваться в которые я не буду, но заострю внимание на одной конкретно

Что мы привыкли видеть в приложениях для командной строки? С одной стороны, это гибкие и легко автоматизируемые решения, чем, собственно, и подкупают. Однако, если посмотреть с другой - это высокий порог вхождения, сложные описания действий, очень часто с большим количеством опций/аргументов и в целом RTFM, которым не каждый пользователь захочет заниматься. Можно ли сделать по-другому? Можно - и даже на OneScript!
 

На создание этой статьи меня вдохновил проект Charm. В него входит несколько репозиториев, которые представляют из себя инструменты для создания красивых и интерактивных CLI приложений на Go. Я сам на Go не пишу, но там были очень убедительные гифки


 

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

 

Как это работает?

 

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

  • Мы выводим текстовые данные на экран и запоминаем, что вывели
  • Начинаем слушать кнопки управления или ожидать какие-нибудь другие события
  • При отлове нажатия/события перерисовываем все заново, но с изменением нужных нам элементов

 

Варианта перерисовки, которые мне удалось реализовать в OneScript, всего два: перерисовка всего экрана через полную очистку и перерисовка текущей строки через возврат каретки. Начнем с последнего

 

Основные действия и анимации

 

Определимся с тем, какие инструменты вообще нам доступны из OneScript. В первую очередь, это возможность работы с потоком вывода консоли. Т.е. со stdout

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

 

Создадим на основе потока вывода новый объект ЗаписьДанных (запись данных тоже как в 1С, если кто-то не знаком с OneScript)
 

	Кодировка    = Консоль.КодировкаВыходногоПотока;
	ПотокВывода  = Консоль.ОткрытьСтандартныйПотокВывода();
	ЗаписьВывода = Новый ЗаписьДанных(ПотокВывода, Кодировка);

 

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

Для примера, попробуем вывести в одну строку текст разного цвета. Это невозможно сделать при помощи стандартного Сообщить(), который часто используется как самый простой способ вывода данных, но зато можно с использованием ЗаписатьСимволы
 

Кодировка    = Консоль.КодировкаВыходногоПотока;
ПотокВывода  = Консоль.ОткрытьСтандартныйПотокВывода();
ЗаписьВывода = Новый ЗаписьДанных(ПотокВывода, Кодировка);

Консоль.ЦветТекста = ЦветКонсоли.Желтый;
ЗаписьВывода.ЗаписатьСимволы("Это");

Консоль.ЦветТекста = ЦветКонсоли.Зеленый;
ЗаписьВывода.ЗаписатьСимволы(" разноцветный");

Консоль.ЦветТекста = ЦветКонсоли.Красный;
ЗаписьВывода.ЗаписатьСимволы(" текст");

Консоль.ЦветТекста = ЦветКонсоли.Белый;


 

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

Процедура ВывестиТекстВТекущуюСтроку(Знач Текст, Знач Цвет = "", Знач ВНачало = Ложь) Экспорт
	
    Если НЕ ЗначениеЗаполнено(Цвет) Тогда
        Цвет = ЦветКонсоли.Белый;
    КонецЕсли;
	
    Если ТипЗнч(Цвет) = Тип("Строка") Тогда
        Консоль.ЦветТекста = ЦветКонсоли[Цвет];
    Иначе
        Консоль.ЦветТекста = Цвет;
    КонецЕсли;
	
    Если ВНачало Тогда
        ЗаписьВывода.ЗаписатьСимволы(Символы.ВК);
    КонецЕсли;
	
    ЗаписьВывода.ЗаписатьСимволы(Текст);
	
    Цвет = ЦветКонсоли.Белый;

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

 

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

 

Теперь что-нибудь с этим сделаем. Первое, что мне пришло на ум - прогресс-бар. Добавим новую функцию

 

Редактор статей Инфостарта блокирует псевдографику, так что если вы видите нечто вроде `12 или `16, то это коды всяких разных символов - на гифках они будут видны нормально

 

Процедура ВывестиПрогрессбар(Текущее, Максимальное, ДлинаСтроки = 30, Заголовок = "Прогресс") Экспорт
	
	Префикс  = Заголовок + " `12;";
	Постфикс = "`16;";
	
	ТекущийПоказатель = Цел(Текущее / Максимальное * ДлинаСтроки);
	Буфер   = "";
	Счетчик = 0;
	
	Пока Счетчик < ДлинаСтроки Цикл
		Буфер = Буфер + ?(Счетчик < ТекущийПоказатель, ТаблицаСимволов["Блок"], " ");
		Счетчик = Счетчик + 1;
	КонецЦикла;
	
	ВывестиТекстВТекущуюСтроку(Префикс, , Истина);
	ВывестиТекстВТекущуюСтроку(Буфер, ЦветКонсоли.Зеленый);
	ВывестиТекстВТекущуюСтроку(Постфикс);
	
КонецПроцедуры

 

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

В самом конце выводим по порядку:

  • Заголовок с левой границей (с признаком того, что начинать надо с начала текущей строки - т.е. заместить старое значение)
  • Сам прогресс-бар (буфер)
  • Правую границу 

 

Посмотрим, как оно работает. Напишем небольшой цикл для теста:

 

Н = 0;

Пока Н <= 400 Цикл

	Заголовок = "Прогресс [" + Строка(Н) + "/" + "800" + "] ";

	ВывестиПрогрессбар(Н, 400, 30, Заголовок);
	Приостановить(1000);

	Н = Н + 80;

КонецЦикла;



 

Таким же образом можно выводить разнообразные спинеры и зацикленные анимации, просто запоминая их положение между итерациями
 

Перем ПозицияСпиннера;


Функция Спиннер() Экспорт
	
	МассивПоложений = Новый Массив;
	МассивПоложений.Добавить("(o    )");
	МассивПоложений.Добавить("( o   )");
	МассивПоложений.Добавить("(  o  )");
	МассивПоложений.Добавить("(    o)");
	МассивПоложений.Добавить("(  o  )");
	МассивПоложений.Добавить("( o   )");

	ИзменитьПозициюСпиннера(МассивПоложений.ВГраница());
	Возврат МассивПоложений[ПозицияСпиннера];
	
КонецФункции

Процедура ИзменитьПозициюСпиннера(Крайний)
	
	Если ПозицияСпиннера >= Крайний Тогда
		ПозицияСпиннера = 0;
	Иначе
		ПозицияСпиннера = ПозицияСпиннера + 1;
	КонецЕсли;
	
КонецПроцедуры

ПозицияСпиннера = 0;

Для Н = 0 По 20 Цикл
	ВывестиТекстВТекущуюСтроку(Спиннер(), ЦветКонсоли.Малиновый, Истина);
	Приостановить(500);
КонецЦикла;

 

Получение данных

 

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

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

 

Функция ОпределитьВвод(Счетчик, Максимальный, Минимальный = 0)
    
    Влево   = 37;
    Вправо  = 39;
    Ввод    = 13;
    Вверх   = 38;
    Вниз    = 40;
    ЭтоВвод = Ложь;
    Клавиша = Консоль.Прочитать();
    
    Если Клавиша = Влево ИЛИ Клавиша = Вверх Тогда
        
        Счетчик = ?(Счетчик = Минимальный, Счетчик, Счетчик - 1);
        
        
    ИначеЕсли Клавиша = Вправо ИЛИ Клавиша = Вниз Тогда
        
        Счетчик = ?(Счетчик = Максимальный, Счетчик, Счетчик + 1);
        
    ИначеЕсли Клавиша = Ввод Тогда
        
        ЭтоВвод = Истина;
        
    Иначе
        
        ЭтоВвод = Ложь;
        
    КонецЕсли;
    
    Возврат ЭтоВвод;
    
КонецФункции

 

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

 

Теперь определим саму функцию выбора значения
 

Функция ПоказатьВыборЗначения(МассивВариантов, Вопрос = "Выберите значение:", ТекущийИндекс = 0) Экспорт
    
    
    Крайний = МассивВариантов.ВГраница();
    Вопрос = СокрЛП(Вопрос) + "    ";
    
    ВывестиТекстВТекущуюСтроку(Вопрос, ЦветКонсоли.Бирюза, Истина);
    
    Для Н = 0 По Крайний Цикл

        ЭтотВыбран = Н = ТекущийИндекс;

        Курсор = ?(ЭтотВыбран, "`58; ", "  ");
        Цвет   = ?(ЭтотВыбран, ЦветКонсоли.Зеленый, ЦветКонсоли.Белый);

        ВывестиТекстВТекущуюСтроку(Курсор, Цвет);
        ВывестиТекстВТекущуюСтроку(МассивВариантов[Н] + "  ");

    КонецЦикла;
    
    Если НЕ ОпределитьВвод(ТекущийИндекс, Крайний) Тогда
        Ответ = ПоказатьВыборЗначения(МассивВариантов, Вопрос, ТекущийИндекс);
    Иначе
        Ответ = МассивВариантов[ТекущийИндекс];
    КонецЕсли;
    
    Возврат Символы.ПС + Ответ;
    
КонецФункции

 

Функция рекурсивная: если наш предыдущий метод ОпределитВвод() вернул Истина - значит пользователь нажал Enter и значение можно вернуть. В противном случае функция вызывает саму себя с изменившимся там же (в ОпределитьВвод) ТекущимИндексом. В цикле Н = 0 По Крайний определяется, какой элемент сейчас выбран - он помечается треугольником и другим цветом консоли (вспоминаем наш вывод слов разного цвета в одной строке)

 

Пробуем запустить
 

МассивВариантов = Новый Массив;
МассивВариантов.Добавить("Красный");
МассивВариантов.Добавить("Желтый");
МассивВариантов.Добавить("Зеленый");

Вопрос = "Какой ваш любимый цвет?";

Сообщить(ПоказатьВыборЗначения(МассивВариантов, Вопрос));

 

 

Перерисовка всего экрана

 

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

 

Консоль.Очистить();

 

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

ТаблицаСимволов = Новый Соответствие();	
ТаблицаСимволов.Вставить("УголокЛевоВерх", "_56;");
ТаблицаСимволов.Вставить("УголокЛевоНиз", "_62;");
ТаблицаСимволов.Вставить("УголокПравоВерх", "_59;");
ТаблицаСимволов.Вставить("УголокПравоНиз", "_65;");
ТаблицаСимволов.Вставить("Перекрестье", "_80;");
ТаблицаСимволов.Вставить("ТВверх", "_77;");
ТаблицаСимволов.Вставить("ТВниз", "_74;");
ТаблицаСимволов.Вставить("ТВлево", "_71;");
ТаблицаСимволов.Вставить("ТВправо", "_68;");
ТаблицаСимволов.Вставить("ЛинияГоризонтальная", "_52;");
ТаблицаСимволов.Вставить("ЛинияВертикальная", "_53;");
ТаблицаСимволов.Вставить("Курсор", "`58; ");

 

Далее нам необходим метод, который будет определять ширину колонок таблицы в соответствии с их содержимым

 

Функция ОпределитьШиринуКолонокТаблицы(ТаблицаЗначений)
	
	СоответствиеШириныКолонок = Новый Соответствие();
	Запас = 2;
	
	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
		Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
			
			Имя = Колонка.Имя;
			Ширина = СоответствиеШириныКолонок[Имя];
			
			Если НЕ ЗначениеЗаполнено(Ширина) Тогда
				Ширина = СтрДлина(Имя) + Запас;
				СоответствиеШириныКолонок.Вставить(Имя, Ширина);
			КонецЕсли;
			
			ТекущаяШирина = СтрДлина(СтрокаТаблицы[Имя] + Запас);
			
			Если ТекущаяШирина > Ширина Тогда
				СоответствиеШириныКолонок.Вставить(Имя, ТекущаяШирина);
			КонецЕсли;
			
		КонецЦикла;
	КонецЦикла;
	
	Возврат СоответствиеШириныКолонок;
	
КонецФункции

 

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

Далее определим функцию, для вывода одной строки таблицы

 

Функция СформироватьСтрокуТаблицы(ТаблицаЗначений, СоответствиеШириныКолонок, СтрокаТЗ = "")
	
	ТекущаяСтрока = "";
	ШапкаВерх = "";
	ШапкаНиз  = "";
	ШапкаСред = "";

	Счетчик = 0;
	Всего   = ТаблицаЗначений.Колонки.Количество();
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		
		Если Счетчик = 0 Тогда
			РазделительВерх = ТаблицаСимволов["УголокЛевоВерх"];
			РазделительНиз  = ТаблицаСимволов["УголокЛевоНиз"];
			РазделительСред = ТаблицаСимволов["ТВправо"];
		ИначеЕсли Счетчик = Всего Тогда
			РазделительВерх = ТаблицаСимволов["УголокПравоВерх"];
			РазделительНиз  = ТаблицаСимволов["УголокПравоНиз"];	
			РазделительСред = ТаблицаСимволов["ТВлево"];
		Иначе
			РазделительВерх = ТаблицаСимволов["ТВниз"];
			РазделительНиз  = ТаблицаСимволов["ТВверх"];
			РазделительСред = ТаблицаСимволов["Перекрестье"];
		КонецЕсли;	

		Значение = ?(ЗначениеЗаполнено(СтрокаТЗ), СтрокаТЗ[Колонка.Имя], Колонка.Имя);
		Лево = Истина;
		Ширина = СоответствиеШириныКолонок[Колонка.Имя] + 2;
		СекцияШапки = "";
		
		Пока СтрДлина(Значение) > СтрДлина(СекцияШапки) Цикл
			СекцияШапки = СекцияШапки + ТаблицаСимволов["ЛинияГоризонтальная"];
		КонецЦикла;
		
		Пока СтрДлина(Значение) < Ширина Цикл
			Значение = ?(Лево, " " + Значение, Значение + " ");
			СекцияШапки = СекцияШапки + ТаблицаСимволов["ЛинияГоризонтальная"];
			Лево = НЕ Лево;
		КонецЦикла;
		
		ТекущаяСтрока = ТекущаяСтрока + ТаблицаСимволов["ЛинияВертикальная"] + Значение;
		ШапкаВерх     = ШапкаВерх + РазделительВерх + СекцияШапки;
		ШапкаНиз      = ШапкаНиз  + РазделительНиз  + СекцияШапки;
		ШапкаСред     = ШапкаСред + РазделительСред + СекцияШапки;

		Счетчик = Счетчик + 1;
	КонецЦикла;
	
	ТекущаяСтрока = ТекущаяСтрока + ТаблицаСимволов["ЛинияВертикальная"];
	ШапкаВерх = ШапкаВерх + ТаблицаСимволов["УголокПравоВерх"];
	ШапкаНиз  = ШапкаНиз + ТаблицаСимволов["УголокПравоНиз"];
	ШапкаСред = ШапкаСред + ТаблицаСимволов["ТВлево"];

	Возврат Новый Структура("ТекущаяСтрока,ШапкаВерх,ШапкаСред,ШапкаНиз", ТекущаяСтрока, ШапкаВерх, ШапкаСред, ШапкаНиз);
	
КонецФункции

 

Она достаточно объемная, но ничего сложного в ней нет: большая часть действий направлена на определение символов псевдографики, которыми нужно "рисовать" в данный момент

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

 

Ну и наконец перейдем к основной функции вывода

 

Функция ПоказатьТаблицу(ТаблицаЗначений, ВыборСтроки = Ложь, ТекущийИндекс = 0) Экспорт
	
	Консоль.ЦветТекста = ЦветКонсоли.Белый;
	Консоль.Очистить();

	СоответствиеШириныКолонок = ОпределитьШиринуКолонокТаблицы(ТаблицаЗначений);
	СтруктураШапок  = СформироватьСтрокуТаблицы(ТаблицаЗначений, СоответствиеШириныКолонок);
	
	Сообщить("  " + СтруктураШапок["ШапкаВерх"]);
	Сообщить("  " + СтруктураШапок["текущаяСтрока"]);
	Сообщить("  " + СтруктураШапок["ШапкаСред"]);
	
	Счетчик = 0;
	Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
		
		Выбрана = ТекущийИндекс = Счетчик;

		Если ВыборСтроки Тогда
			Указатель = ?(Выбрана, ТаблицаСимволов["Курсор"], "  ");
			Консоль.ЦветТекста = ?(Выбрана, ЦветКонсоли.Зеленый, ЦветКонсоли.Белый);
		Иначе
			Указатель = "  ";
		Конецесли;
		
		СтруктураСтроки = СформироватьСтрокуТаблицы(ТаблицаЗначений, СоответствиеШириныКолонок, СтрокаТаблицы);
		Сообщить(Указатель + СтруктураСтроки["ТекущаяСтрока"]);
		Счетчик = Счетчик + 1;
		
	КонецЦикла;
	
	Консоль.ЦветТекста = ЦветКонсоли.Белый;
	Сообщить("  " + СтруктураШапок["ШапкаНиз"]);

	Ответ = ТаблицаЗначений[ТекущийИндекс];

	Если ВыборСтроки Тогда
		Крайний = ТаблицаЗначений.Количество() - 1;
		
		Если НЕ ОпределитьВвод(ТекущийИндекс, Крайний) Тогда
			Ответ = ПоказатьТаблицу(ТаблицаЗначений, ВыборСтроки, ТекущийИндекс);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

 

Пройдем её по шагам:

  1. Устанавливаем цвет и очищаем вывод консоли
  2. Определяем ширину колонок таблицы
  3. Вызываем СформироватьСтрокуТаблицы() без СтрокиТЗ -> получаем шапку
  4. Выводим на экран 3 элемента. Под "шапками" здесь подразумеваются горизонтальные линии таблицы
  5. Для каждой строки выводим либо строку таблицы, либо строку таблицы с указателем, если она сейчас выбрана - не забываем, что наша задача не просто отрисовка таблицы, но и возможность выбрать строку
  6. Выводим ШапкаНиз - это нижняя горизонтальная линии таблицы
  7. Делаем рекурсивыный вызов для выбора значения, как мы это делали ранее при создании меню

 

Попробуем теперь вызвать наш метод

 

ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("Имя");
ТЗ.Колонки.Добавить("Фамилия");
ТЗ.Колонки.Добавить("ЛюбимыйЦвет");

СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Имя          = "Петр";
СтрокаТЗ.Фамилия      = "Петров";
СтрокаТЗ.ЛюбимыйЦвет  = "Красный";

СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Имя          = "Иван";
СтрокаТЗ.Фамилия      = "Иванов";
СтрокаТЗ.ЛюбимыйЦвет  = "Желтый";

СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Имя          = "Алексей";
СтрокаТЗ.Фамилия      = "Алексеев";
СтрокаТЗ.ЛюбимыйЦвет  = "Малиновый";

Ответ = ПоказатьТаблицу(ТЗ, Истина);
Сообщить("Любимый цвет пользователя " + Ответ.Имя +  " - " + Ответ.ЛюбимыйЦвет);

 

 

Вот так вот незамысловато

 

В заключение


Возвращаясь к вопросу CLI приложений на OneScript:


Что имеем не храним, потерявши — плачем

 

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

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

 

Спасибо за внимание!

 

 Мой GitHub:     https://gitub.com/Bayselonarrend 
 Лицензия MIT:   https://mit-license.org

onescript CLI UI TUI софт приложение cmd terminal OS Oscript 1Script

См. также

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1489    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2925    ardn    2    

7

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

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

23.09.2024    667    0    stopa85    4    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3966    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

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

17.06.2024    5797    bayselonarrend    5    

61

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

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

25.03.2024    2960    bayselonarrend    3    

42

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    6120    kamisov    23    

65

OneScript Программист Бесплатно (free)

Думаете, на OneScript неудобно создавать сложные инфраструктурные приложения? Ошибаетесь. Благодаря фреймворку ОСень за последний год экосистема библиотек, упрощающих написание собственных приложений, существенно выросла. Расскажем о самых передовых технологиях OneScript. Спойлер: будет много рефлексии, мета-аннотаций, желудей, напильников и дубов с завязями.

21.11.2023    4572    NikitaIvanchenko    16    

49
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Nikola23 706 20.05.24 13:04 Сейчас в теме
Back to 1970s)
адуырщдв; dimaster; +2 Ответить
2. bayselonarrend 2137 20.05.24 13:07 Сейчас в теме
(1) Ну как бы да, но как бы и нет) Классика всегда в моде
Прикрепленные файлы:
3. SerVer1C 817 20.05.24 15:31 Сейчас в теме
напомнило
Прикрепленные файлы:
dimaster; +1 Ответить
4. iolko 321 20.05.24 16:51 Сейчас в теме
Даешь OneScript Commander!
dimaster; bayselonarrend; +2 Ответить
12. v3132 33 21.05.24 10:04 Сейчас в теме
(4) Просто бомба (на мой взгляд)!
5. artbear 1565 20.05.24 17:32 Сейчас в теме
(0) Хорошая статья, отличная работа!

вообще в пакетах 1скрипт уже есть библиотека, реализующая часть из обсуждаемого
- https://github.com/240596448/cli-selector

Интерактивный выбор значений в консоли
- Реализация класса ВыборВКонсоли для интерактивного мульти- или одиночного выбора значений в консоли.

- Операция мультивыбора возвращает массив выбранных значений.
- При одиночном выборе - выбранное значение.
- Для пунктов меню реализована возможность задавать начальную отметку и доступность изменения пункта меню
Прикрепленные файлы:
Altez; pavlov_dv; bayselonarrend; +3 Ответить
6. artbear 1565 20.05.24 17:35 Сейчас в теме
(5) а еще есть библиотека от этого же автора https://github.com/240596448/coloratos
Прикрепленные файлы:
bayselonarrend; +1 Ответить
7. bayselonarrend 2137 20.05.24 18:37 Сейчас в теме
8. gybson 20.05.24 22:49 Сейчас в теме
Штош, пора расчехлять наработки прошлого века по ASCII-интерфейсам с тенями и эффектами нажатия :)
11. SerVer1C 817 21.05.24 09:11 Сейчас в теме
(8) Теперь можно пробовать делать цветную ASCII графику, а не черно-белую
Прикрепленные файлы:
9. vano-ekt 124 21.05.24 06:10 Сейчас в теме
ждём игр
Прикрепленные файлы:
10. PerlAmutor 155 21.05.24 06:57 Сейчас в теме
Напомню еще одну тему, где я в комментариях выложил ссылки на ролики Textual (TUI для Python) https://infostart.ru/1c/articles/1617468/

https://www.youtube.com/watch?v=Dt70oSID1DY
13. yermak 51 22.05.24 13:08 Сейчас в теме
Для бэкендера все привычно. Многие знакомые мне программисты кодят на vim (neovim) пользуясь консолью. Тот же VSCode в рабочей области держит открытую консоль в которой постоянно приходиться что то вводить.
14. GarriSoft 152 25.05.24 10:15 Сейчас в теме
Два вопроса:
1. В примерах запускается exe файл, как компилировать готовые скрипты в exe файл?
2. Как работать со сканером ШК (в режиме эмуляции клавиатуры) интересует как консольный вариант, так и в GUI?
15. GarriSoft 152 25.05.24 10:25 Сейчас в теме
Первый вопрос снимается, командой:
oscript -make <ваш_сценарий.os> <имя_файла.exe>
НО интересный момент, после компиляции файла, он удаяется через несколько секунд, ОС Windows 10, что может быть?
16. bayselonarrend 2137 25.05.24 10:30 Сейчас в теме
(14)
2. Как работать со сканером ШК (в режиме эмуляции клавиатуры) интересует как консольный вариант, так и в GUI?


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

Что подразумевается под консольным вариантом и GUI не совсем понятно
17. GarriSoft 152 25.05.24 10:34 Сейчас в теме
(16)
>Что подразумевается под консольным вариантом и GUI не совсем понятно
В консоли действительно работает вариант Консоль.Прочитать(), я так понимаю читать нужно, до появления символа Enter, это и будет ШК, тут все понятно, спасибо.

GUI - через графический интерфейс OneScriptForms
18. bayselonarrend 2137 25.05.24 10:36 Сейчас в теме
(17)
GUI - через графический интерфейс OneScriptForms


В таком случае не знаю, никогда не работал с OneScriptForms
Оставьте свое сообщение