Имея некоторый опыт работы с C#, решил написать внешнюю компоненту для 1script, благо базовый пример был. После нескольких часов работы появилась компонента, позволяющая работать с формами и обрабатывать события. API старался сделать максимально приближенным к 1С.
Во время разработки очень порадовала обратная связь с разработчиками onescript, ответы на вопросы получал очень быстро. Библиотечные методы написаны просто и понятно, ряд вопросов решился просмотром исходных кодов и копипастом (перебор элементов формы в цикле ДляКаждого Элемент Из Коллекции Цикл).
Проект выложен на github, там же лежит бинарник, для более быстрого начала использования. Методы компоненты покрыты тестами, которые так же являются и примерами работы с объектами компоненты. За тесты отдельное спасибо artbear, всегда знает в каком направлении правильно пнуть 😀
Основная задача компоненты — простая работа с формами. Позволяет создать большое количество разных элементов форм. Поддерживается обработка событий элементов. Управление свойствами видимости, доступности и другими. Создан единый интерфейс для работы со значениями элементов (через свойство Значение).
Доступны основные элементы формы и события:
Установка
opm install gui
либо скачать с github https://github.com/ret-Phoenix/oscript-simple-gui
Виды полей
- ПолеВвода — Однострочное текстовое поле;
- ПолеИндикатора — Прогрессбар.
- ПолеКалендаря — Поле для ввода даты
- ПолеНадписи — Надпись (декорация в терминалогии 1С)
- ПолеФлажка — Флажок, имеет статусы: Включен/Выключен
- ПолеТекстовогоДокумента — Многострочный текст
- ПолеСоСписком — Поле со списком (ComboBox)
- ПолеСписка — Поле списка (ListBox)
- ОбычнаяГруппа — Контейнер для группы элементов
- Страница — Страницы
- Кнопка
- ТаблицаФормы — Компонент для отображения объекта ТаблицаЗначений
- ПредставлениеСписка — ListView для отображения объекта ТаблицаЗначений
- ДеревоФормы — Компонент для отображения объекта ДеревоЗначений
Обрабатываемые события
- Форма: ПриОткрытии
- Кнопка: ПриНажатии
- ПолеФормы: ПриИзменении, ПриВыборе (нажат Enter), ПриНажатииНаКнопку (KeyDown)
- ПолеСписка: ПриДвойномКлике
Диалоги, уведомления
- Вопрос
- Предупреждение
- Диалог выбора файла
- Уведомление в трее
Примеры работы с компонентой
Перейдем к работе с компонентой…
Создание формы и вывод надписи
#Использовать gui
Перем Форма;
Процедура ПриСозданииОбъекта()
УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Форма = УправляемыйИнтерфейс.СоздатьФорму();
//# Устанавливаем обработку события ПриОткрытии
Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
Форма.Показать();
КонецПроцедуры
//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
Декорация1 = Форма.Элементы.Добавить("Декорация1", "ПолеФормы", Неопределено);
Декорация1.Вид = Форма.ВидПоляФормы.ПолеНадписи;
Декорация1.Заголовок = "Это действительно работает!";
Форма.Высота = 100;
КонецПроцедуры
Создание формы с кнопкой и обработка события нажатия на кнопку
#Использовать gui
Перем Форма;
Процедура ПриСозданииОбъекта()
УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Форма = УправляемыйИнтерфейс.СоздатьФорму();
//# Устанавливаем обработку события ПриОткрытии
Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
Форма.Показать();
КонецПроцедуры
//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
ПолеВвода1 = Форма.Элементы.Добавить("ПолеВвода1", "ПолеФормы", Неопределено);
ПолеВвода1.Вид = Форма.ВидПоляФормы.ПолеВвода;
ПолеВвода1.Заголовок = "Поле ввода";
ПолеВвода1.Значение = "Значение задано из скрипта";
Кнопка1 = Форма.Элементы.Добавить("Кнопка1", "КнопкаФормы", Неопределено);
Кнопка1.Заголовок = "Нажми меня";
Кнопка1.УстановитьДействие(ЭтотОбъект, "Нажатие", "ПриНажатииНаКнопку1");
КонецПроцедуры
Процедура ПриНажатииНаКнопку1() Экспорт
Форма.Элементы.Найти("ПолеВвода1").Значение = "Значение после нажатия на кнопку";
КонецПроцедуры
Перейдем к более сложному примеру, создадим форму с кнопкой, полем ввода.
Пример работы с выпадающим списком
#Использовать gui
Перем Форма;
Процедура ПриСозданииОбъекта()
УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Форма = УправляемыйИнтерфейс.СоздатьФорму();
//# Устанавливаем обработку события ПриОткрытии
Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
Форма.Показать();
КонецПроцедуры
//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
Данные = Новый Соответствие;
Данные.Вставить("Один", "1");
Данные.Вставить("Два", "2");
Данные.Вставить("Три", "3");
ПолеСоСписком1 = Форма.Элементы.Добавить("ПолеСоСписком1", "ПолеФормы", Неопределено);
ПолеСоСписком1.Заголовок = "Поле со списком";
ПолеСоСписком1.Вид = Форма.ВидПоляФормы.ПолеСоСписком;
ПолеСоСписком1.СписокВыбора = Данные;
ПолеСоСписком1.Значение = "3";
ПолеСоСписком1.УстановитьДействие(ЭтотОбъект, "ПриИзменении", "ПриИзменииЗначения");
Форма.Высота = 80;
КонецПроцедуры
Процедура ПриИзменииЗначения() Экспорт
Сообщить("Новое значение: " + Форма.Элементы.Найти("ПолеСоСписком1").Значение);
КонецПроцедуры
ТаблицаФормы
Функция ПолучитьТЗ()
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("ДатаРождения");
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Код = 1;
СтрокаТЗ.Наименование = "Вася";
СтрокаТЗ.ДатаРождения = Дата(2000,2,1);
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Код = 2;
СтрокаТЗ.Наименование = "Коля";
СтрокаТЗ.ДатаРождения = Дата(2010,5,2);
СтрокаТЗ = ТЗ.Добавить();
СтрокаТЗ.Код = 3;
СтрокаТЗ.Наименование = "Саша";
Возврат ТЗ;
КонецФункции // ПолучитьТЗ()
ПровайдерТЗ = Новый Провайдер;
ПровайдерТЗ.Источник = ПолучитьТЗ();
Поле1 = Форма.Элементы.Добавить("ТаблицаФормы1", "ТаблицаФормы", Неопределено);
Поле1.ПутьКДанным = ПровайдерТЗ;
Поле1.Заголовок = "Провайдер - ТЗ";
Поле1.ПоложениеЗаголовка = УправляемыйИнтерфейс.ПоложениеЗаголовка.Верх;
Поле1.Закрепление = 5;
ДеревоФормы
Функция ПолучитьТЗ()
Дерево = Новый ДеревоЗначений();
Дерево = Новый ДеревоЗначений();
Дерево.Колонки.Добавить("Год");
Дерево.Колонки.Добавить("Месяц");
Дерево.Колонки.Добавить("День");
СтрокаДереваГод = Дерево.Строки.Добавить();
СтрокаДереваГод.Год = 2025;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Jan";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Dec";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваГод = Дерево.Строки.Добавить();
СтрокаДереваГод.Год = 2025;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Feb";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Mar";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваДень = СтрокаДереваМесяц.Строки.Добавить();
СтрокаДереваДень.День = "1";
СтрокаДереваДень.Месяц = "Mar";
СтрокаДереваДень.Год = СтрокаДереваГод.Год;
Возврат Дерево;
КонецФункции
ПровайдерТЗ = Новый Провайдер;
ПровайдерТЗ.ИсточникДерево = Данные;
Поле1 = Форма.Элементы.Добавить("ДеревоФормы1", "ДеревоФормы", Неопределено);
Поле1.ПутьКДанным = ПровайдерТЗ;
Поле1.Заголовок = "Провайдер - Дерево значений";
Поле1.ПоложениеЗаголовка = УправляемыйИнтерфейс.ПоложениеЗаголовка.Верх;
Поле1.Закрепление = 5;
Поле1.ТекущаяСтрока = 1;
Процедуры и функции интерактивной работы
УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Диалоги = УправляемыйИнтерфейс.СтандартныеДиалоги;
Ответ = Диалоги.Вопрос("Тест", РежимДиалогаВопрос.ДаНет, 1, КодВозвратаДиалога.Нет , "Заголовок", КодВозвратаДиалога.Нет);
ТекстПредупреждения = "Текст предупреждения";
Таймаут = 10;
Заголовок = "Заголовок окна";
Диалоги.Предупреждение(ТекстПредупреждения, Таймаут, Заголовок);
Трей = Новый УведомлениеВТрее();
Трей.Заголовок = "Стандартная иконка";
Трей.Текст = "Иконка из ресурсов библиотеки";
Трей.Таймаут = 15;
Трей.Показать();
Возможности компоненты
На самом деле возможностей компоненты значильно больше нежели приведено в примерах, ознакомиться с ними можно на странице github.
Классы
УправляемыйИнтерфейс/ManagedInterface
Свойства
- Версия/Version — Строка — Только чтение — Номер версии;
- СтильЗакрепления/DockStyle
- ВидПоляФормы/FormFieldType
- ВидГруппыФормы/FormGroupType
- ПоложениеЗаголовка/TitleLocation
Методы
- СоздатьФорму/CreateForm — Форма — Создать форму (близка к Управляемой форме)
Форма/Form
Свойства
- ВидПоляФормы/FormFieldType — ВидПоляФормы
- ВидГруппыФормы/FormGroupType
- ПоложениеЗаголовка/TitleLocation
- Заголовок/Caption
Методы
- Показать/Show
- ПоказатьНеМодально/ПоказатьНеМодально
- Элементы/Items
- Возвращаемое значение
- Коллекция с ПолеФормы, ГруппаФормы, КнопкаФормы
- Возвращаемое значение
Элементы/Items
Свойства
Методы
- Количество/Count — Число — Количество элементов
- Найти/Find — Найти элемент по имени элемента
- Параметры
- ИмяЭлемента — Строка
- Возвращаемое значение
- ПолеФормы, ГруппаФормы, КнопкаФормы, Неопределено
- Параметры
- Удалить — Удалить элемент
- Параметры
- ПолеФормы, ГруппаФормы, КнопкаФормы
- Параметры
- Переместить/Move — Переместить элемент
- Параметры
- Элемент — ПолеФормы, ГруппаФормы, КнопкаФормы
- Родитель — ГруппаФормы, УправляемаяФорма — Новый родитель элемента. Может совпадать со старым.
- МестоРасположения — ПолеФормы, ГруппаФормы, КнопкаФормы — Элемент, перед которым нужно разместить перемещаемый элемент. Если не задан, то перемещается в конец коллекции.
- Параметры
- Добавить/Add — Добавить элемент на форму
- Параметры
- ИмяЭлемента — Строка — Уникальное имя элемента
- ТипЭлемента — Строка — Тип элемента (ПолеФормы, ГруппаФормы, КнопкаФормы)
- Родитель — ГруппаФормы, Неопределено — Родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень.
- Параметры
КнопкаФормы/FormButton
Свойства
- Родитель/Parent — ГруппаФормы, УправляемаяФорма — Только чтение — Содержит ссылку на родительский элемент.
- Имя/Name — Строка — Имя кнопки
- Видимость/Visible — Булево — Видимость кнопки
- Доступность/Enabled — Булево — Доступность кнопки
- Заголовок/Title — Строка — Надпись на кнопке
Методы
-
КнопкаНажатие/ButtonClick — deprecated — Обработчик нажатия на кнопку
-
Параметры
- Скрипт — Объект — ссылка на скрипт с обработиком события
- ИмяМетода — Строка — Имя метода обработчика события
Кнопка1 = ЭлементыФормы.Добавить("Кнопка1", "КнопкаФормы", Неопределено); Кнопка1.Заголовок = "Нажми меня"; Кнопка1.КнопкаНажатие(ЭтотОбъект,"ПриНажатииКнопка1");
-
-
УстановитьДействие/SetAction — Устанавливает обработчик события.
- Параметры
- Скрипт — Объект — Ссылка на скрипт с обработчиком события
- ИмяСобытия — Строка — Имя события. Для кнопки только "Нажатие"
- ИмяМетода — Строка — Имя метода для обработчика
- Параметры
- ПолучитьДействие/GetAction — Получает имя установленного обработчика события.
- Параметры
- ИмяСобытия — Строка — Имя события. Для кнопки только "Нажатие"
- Параметры
ПолеФормы/FormField
Свойства
- Значение/Value — Установка и получение значения.
- Вид/Type — ВидПоляФормы
- Имя/Name — Строка
- Видимость/Visible — Булево
- Доступность/Enabled — Булево
- Заголовок/Title — Строка
- ПоложениеЗаголовка/TitleLocation — ПоложениеЗаголовка
- СписокВыбора/ChoiceList — Соответствие
- Родитель/Parent — ГруппаФормы, УправляемаяФорма — Только чтение
- ТолькоПросмотр/ReadOnly — Булево
- Закрепление/Dock
- АвтоматическийРазмер/AutoSize
- Ширина/Width
- Высота/Height
Методы
- УстановитьДействие/SetAction — Устанавливает обработчик события.
- Параметры
- Скрипт — Объект — Ссылка на скрипт с обработчиком события
- ИмяСобытия — Строка — Имя события. Для кнопки только "Нажатие"
- ИмяМетода — Строка — Имя метода для обработчика
- Параметры
- ПолучитьДействие/GetAction — Получает имя установленного обработчика события.
- Параметры
- ИмяСобытия — Строка — Имя события. Для кнопки только "Нажатие"
- Параметры
Обрабатываемые события
- Форма: ПриОткрытии
- Кнопка: ПриНажатии
- ПолеФормы: ПриИзменении, ПриВыборе (нажат Enter)
- ПолеСписка: ПриДвойномКлике
ВидПоляФормы/FormFieldType
- ПолеВвода/InputField
- ПолеИндикатора/ProgressBarField
- ПолеКалендаря/CalendarField
- ПолеНадписи/LabelField
- ПолеФлажка/CheckBoxField
- ПолеТекстовогоДокумента/TextDocumentField
- ПолеСоСписком/ComboBox
- ПолеСписка/ListBox
- ТаблицаФормы / FormTable
- ПредставлениеСписка / ListView
- ДеревоФормы / FormTree
ВидГруппыФормы/FormGroupType
- ОбычнаяГруппа/UsualGroup
- Страница/Page
- Страницы/Pages
ПоложениеЗаголовка
- Авто/Auto
- Верх/Top
- Лево/Left
- Нет/None
- Низ/Bottom
- Право/Right
СтильЗакрепления
- Нет/None
- Верх/Top
- Низ/Bottom
- Лево/Left
- Право/Right
- Заполнение/Fill
ждем кроссплатформенного исполнения
(2) Решение уже кроссплатформенно, работу под Linux проверяли. У меня примеры под Windows, т.к. ничего больше не стоит
Прекрасная работа! На самом деле, это первое, что приходит в голову, после начала работы с onescript — добавить интерактив в виде форм.
Что вы подразумеваете под расширением возможностей конфигуратора?
http://infostart.ru/public/339035/ .
upd: Ой,пропустил
Отличная разработка
(6) А если без шуток, в ближайшее время планирую изменить название этого этого класса. Будут доступны оба варианта, ПростойГУЙ будет deprecated
ПростойГуй звучит, да 🙂
Что за шрифт используете в редакторе?
(9) Стандартный в VSCode: «editor.fontFamily»: «Consolas, ‘Courier New’, monospace»,
(3) Подскажите пожалуйста, а что необходимо сделать для того, чтобы можно было использовать под Linux? Файл oscript-simple-gui.dll ведь не кросс-платформенный.
(11) в gitter ответил на вопрос. Для общественности:
под Linux будет работать под Mono.
Моя либа нормально работает под Linux (проверял @dmpas )
т.е. с точки зрения скриптописателя — разницы нет Windows or Linux
Очень здорово. Но есть предложение по оформлению. Хотелось бы, чтобы стиль отображения формы и элементов управления соответствовал стилю 1С (в идеале чтобы можно было настроить перед открытием формы, например указав нужную редакцию платформы 1С или АВТО — последння, включённая в библиотеку, версия стиля платформы 1С). Неплохо бы и загружать параметры стиля оформления формы из файла и/или из строки.
Ещё одно важное предложение — сделайте загрузку настройки элементов формы из файла и/или строки. В идеале — в формате 1С (причём можно загрузить как формат неуправляемых форм — но это не очень просто, но возможно; так и xml формат управляемых форм — и создать «похожу» расстановку поддерживаемых элементов формы) — вот это действительно круто будет!
И, ещё одно предложение — сделайте несколько встроенных форм — например для диалогов вопроса, предупреждения, ввода/выбора из списка единичного значения, редактирования списка/таблицы/дерева значений. Быстрой регенерации формы, позволяющей ввести набор значений с представлением вида дерева (с иерархие в виде дерева и/или закладок — а на листьях — просто список полей ввода — отображаемых вертикально на форме, с надписями).
1. По оформлению — маловероятно что буду делать, но если кто сделает — PR проверю и приму.
2. Загрузка настройки элементов — была идея, но пока не доходят руки.
3. формы диалогов есть, в тестах примеры обращения. Выбор из ТЗ — дело нескольких строк, пример есть. Дерево есть — формируете обычное дерево и указываете как источник.
Автогенерация — 1 функция которая будет принимать тип, имя и еще ряд свойств — можно самим один раз написать и использовать.
Сейчас первоочередная задача — довести список компонентов до уровня 1С, переработать расположение.
Интересно а почему после компиляции в *.exe форма не открывается? Или открывается на долю секунды и закрывается сразу. Проверял и на ваших примерах и на своем коде.
Хотел небольшую утилиту написать, видимо облом, печалька((
(15) Пока движок oscript не умеет корректно работать с ВК. поэтому поставлять пока можно в виде *.os
Прекрасно, все работает, замечательное расширение мегаразработки OneScript.
Меня страстно интересуют следующие вопросы:
1. Есть ли возможность выводить картинки в поля элементов формы
Например, картинки в ТабличноеПоле.
Я пока тестирую вашу работу, не нашел реализации вывода картинок.
Есть ли вообще такая возможность?
(17) картинки можно использовать в «ПредставлениеСписка» (иконка в строке), больше ничего с картинками нет, не было необходимости
Показать
Подскажите, картинки нужны для формирования отчетов и вывод в форму.
Как это дело можно организовать?
Формирование отчета в поле табличного документа или таблицу управляемой формы и показ оной
(20) Аналога Табличного документа нет, есть только ТабличноеПоле. Как вариант, можно дописать ПолеHTML, пока оно не реализовано.
Я почему заинтересовался вашей разработкой — потому что хотел применить ее для:
1. Создания Win-приложения с формами, минимальной графикой
2. Код в приложении делать на 1с.
3. Минимальная графика должна быть хотя бы в виде отчетов (статических таблиц с картинками или графиками или ….)
Без 3 шага реализовать мало-мальски годное приложение шансов = 0
Согласитесь, что если ваше решение чуток доработать, можно делать полноценные приложения с БД с графикой = конкурент 1с на локальной машине без лицензий.
Я думаю в свободное время засесть за C# покопаться в вашем решении и придумать плагин для использования графики.
Например, вывод картинок в поле HTML — думаю самое простое и быстрое решение.
После шага 3 можно делать даже развлекательные приложения в виде простых игр (табличных, статичная 2d графика)
С применением управляемых форм можно даже сделать браузерные игры.
Преимущества — внутренний код на 1с — огромное (для меня).
Поэтому шаг 3 нужно ОБЯЗАТЕЛЬНО сделать, это АРХИВАЖНО!
(22) Да, работа с ПолеHTML самое простое, но тоже требует времени, пока у меня его нет, переносить возможности поля совсем по минимуму не особо хочется, а на полноценное время выделить пока не могу.
SmartConfigurator .
Диаграммы — тоже хочется. даже знаю какую задачу буду ими решать, опять же — вопрос времени.
Сейчас gui развивается в первую очередь чтобы решать задачи
Многие люди не понимают ГИГАНТСКИЙ шаг OneScript в направлении:
1. БЕСПЛАТНОГО приложения для создания полноценных Win-приложений с БД, с графикой и внутренним кодом на русском языке.
Если привинтить графику к тому что есть, то то, что я выше обозначил — свершится.
Уже все готово, кроме графики:
1. Внутренний код на 1с работает, хотя глючит и есть ошибки
2. Вся изюминка C# и ООП в наличии (расширяемость, свои классы и функции, библиотеки)
3. Есть формы, есть подключение к БД, есть работа с сетью, файлами и много чего…
Осталось САМОЕ ГЛАВНОЕ — минимальная графика в формах.
Тогда данный проект превратится в полноценный редактор бизнес-решений
(24) жалько что столько времени уделяете конкуренту Снегопата.
Не взлетит, по моему мнению.
Снегопат хоть и весь оброс бородой, глючный и некрасивый, но народ к нему привык.
Советую задуматься над моим предложением по доработки графических фишек к OneScript.
К сожалению, сейчас, у меня дикое желание использовать вашу разработку для например игр на 1с.
Но придется привинчивать сторонние плагины C# для реализации графики в формах.
Покопаюсь, поделаю, если получится, отпишусь вам.
Возможно, получится сделать обычный плагин в виде давно известного решения.
Подскажите, в OneScript есть возможность выполнять C# код из 1с кода?
https://msdn.microsoft.com/ru-ru/library/x5wshyk0(v=vs.90).aspx
Что то наподобие
Выполнить(«С# код…») ?
НАпример, берем руководство Микрософт по рисованию фигур и всякой мелочи
Создаем библиотеку в виде функций на 1с для рисования фигур, подключаем ее к решению
и начинаем использовать графику в 1с.
Взлетит такое?
OneScript не позволяет выполнить код c#, но есть возможность работать с .net сборками. Примеры были на github.
(26) Вообще-то, мои скрипты появились за много лет до появления снегопата, фактически с них и начались разработки примочек к конфигуратору. Раньше проект не так сильно развивал как сейчас.
Я даже не помню, когда в последний раз использовал снегопат, т.к. мне приходится работать на последних версиях платформы, нужна стабильность и доступность всегда и везде.
(26) Нашел когда впервые выложил:http://www.1cpp.ru/forum/YaBB.pl?num=1227553473 (24. Ноября 2008)
Добрый день!
А можно добавить примеров с предупреждением и диалогом выбора файла.
Не могу найти
(31)https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/tests/test-QueryBox.os
(32) Не могу победить ДиалогВыбораФайла… Вот где-то туплю, и не пойму где. Можно тоже пример, для «ОсосбоОдаренных»
(33)
Показать
Автор, Вы бы для новичков добавили буквально абзац с пошаговой инструкцией, что и как делать :
1)Что именно качать и откуда
2)Что делать со скачанным
Потому как примеры Ваши из статьи уже не рабочие, и ничего интуитивно понятного я не увидел в процессе подключения. Пока что-то получилось, 2 часа прошло на ровном месте.
Я, конечно, понимаю, что Вы нам ничем не обязаны. Но досадно, от такой хорошей публикации появляется раздражение из-за мелочей.
Также пробовал подключать библиотеку через opm и через ПодключитьВнешнююКомпоненту, но результата 0.
Скрипты запускаются, но не одна форма так не открылась. Перепробовал все примеры.
Очень жаль, что нет актуального материала по подключению этой компоненты. Версия 1CScript 1.0.20.108, ОС Windows 7 x64 запуск через Notepad++ v7.5.7 с плагином NppExec. Кто сталкивался с данной проблемой, прошу помочь. Заранее спасибо!
(35) Приведенные примеры вообще-то работающие. OneScript позволяет по разному работать с плагинами. Насчет обновления материала — согласен, пора бы обновить. На следующей неделе обновлю.
Проблемные мелочи, как правило, связаны с неумением читать документацию 😉
(36) для помощи/решения проблемы принято выкладывать проблемный код, по Вашему посту понять что не так невозможно.
Сейчас компонент активно используется как раз на вашем окружении. А скрипты вообще нужно запускать отдельно, я не знаю как себя ведет Notepad++.
материал актуален, т.к. описанные методы работали и будут работать. даже при использовании библиотеки gui (#использовать gui) происходит загрузка библиотеки как описано в статьеhttps://github.com/ret-Phoenix/oscript-simple-gui/blob/master/oslib/package-loader.os
(38) Спасибо! Проблема решилась после запуска отдельно.
(39) для разработки на OneScript смотрите в сторону MS VisualStudio Code, редактор бесплатен и хорошо развивается, много плагинов для разных языков, основное сообщество OneScript сидит именно на нем и развивает только его.
NotePad++ как бы не казался живым, но все же умирает.
(39) Опишите пожалуйста подробнее, как Вам удалось запустить скрипты с формами из Notepad++?
Написали ведь, запуск отдельно, не из мертвого notepad++
Переходите на нормальный редактор — visual studio code
(42) похоже вы не работали в организациях, где на компьютерах программистов нет администраторских прав.
Как раз в такой работаю. Код на c# пишу в блокноте, сборка через батник.
vscode не требует админских прав. Жду свой комп и будет стоять vscode
(44) спасибо, я был неправ, когда думал что VSCode — это что-то вроде VS (тяжелое, требующее install и кучу прав). У меня всё получилось.
(45) а плагин bsl поставили? Рекомендую.
(46) Спасибо за совет, поставил, стало очень хорошо, правда не хватает цветовой схемы конфигуратора.
Можно пару вопросов по Вашей библиотеке: Каким образом правильно работать с выводимой таблицей значений? В частности я пробовал задать заголовок у объекта ТЗ (который провайдер данных) вот так:
ТЗ.Колонки.Добавить(«Блокировка», Новый ОписаниеТипов(«Булево»), «Блок»);
но у ТЗ на форме выводится заголовок «Блокировка» — я правильно понимаю, что надо как-то обращаться к Элементы.Найти() и потом с ним работать?
Также хотелось бы узнать, будет ли у ТЗ на форме работать отображение флажка и что для этого надо сделать?
Заголовок — тянет имя колонки, почему так было сделано не помню.
Если нужен флажок — «представление списка» позволяет выводить флажки.
(48) спасибо за ответ, а есть ли событие ПриНажатииНаСтроку() с функцией ПолучитьТекущуюКолонку()? И есть ли поддержка свойства ВыделенныеСтроки? Извините, что так много спрашиваю, пытаюсь написать приложение в котором ТЗ на форме — важнейшая часть.
Ещё вопрос вдогонку — а каким образом работает горизонтальное выравнивание в группе? Ваш пример работает правильно, но как только я пытаюсь создать свою группу с двумя кнопками — высота группы сразу становится сокращенной.
(49) Документацию к библиотеке читали? она входит в поставку + на github лежат исходники с документацией.
здесь
https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/tests/test-FormTable.os
https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/tests/test-FormListView.os
Дока по Табличному полю
Примеры здесь:
а можно и так глянуть:https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/oscript-component/ListViewVT/FormListView.cs
(50) Код покажите. можете здесь, можете в гиттер, мы там уже пересекались.
(52) Прошу прощения, закрыл VSCode, заново открыл — и все работает (прямо как чистка кеша в 1С).
(53) Горизонтальное размещение вышло только в прошлом релизе, могут быть косяки.
(54) извините, доку не читал, теперь постараюсь. Нашел интересный момент — два флажка рядом — выводятся один под другим (скриншот прилагаю).
Также заметил интересный момент (так задумано?):
создаю группу, в ней — кнопку, вот так:
Показать
и кнопка не становится элементом формы.
То есть вот так кнопка не находится:
ТекЭлем = Форма.Элементы.Найти(«КнопкаОбновить»);
А вот так — находится:
ГруппаКнопки = Форма.Элементы.Найти(«ГруппаКнопки»);
ТекЭлем = ГруппаКнопки.Элементы.Найти(«КнопкаОбновить»);
Элементы.Найти — ищет только в текущем подчинении, без обработки вложенности, если не ошибаюсь, это родное поведение 1С.
Если у контрола не указать Закрепление — используется вариант TOP
(56) извините, вы не правы — в УФ ЭтаФорма.Элементы.Найти(ИмяЭлемента) — вернет любой элемент, неважно в какой вложенности в группе и странице он расположен.
По поводу закрепления — я пытаюсь вывести на форму ТЗ и под ней — многострочный текст. ТЗ должна занимать всё свободное место, а лог — прямо под ней. Скажите пожалуйста — как это сделать? Делаю вот так:
Показать
Получается см. скриншот
Прошу помощи ещё в одном вопросе — вывел на форму ТЗ (тип — «ТаблицаФормы») — всё прекрасно работает. Пытаюсь изменить тип на «ПредставлениеСписка» — получаю ошибку для ТЗ с одной колонкой (данные — строки) «Input string was not in a correct format». Ошибка выходит в строке ТЗНаФорме.ПутьКДанным = ПровайдерТЗ;
(58) как-то так. Это все копипасты из примеров, прилагаемых к либе
Показать
Большое спасибо за пример, я разобрался — надо помещать всё в группы и группы разберутся, кто в каком порядке выводится.
(60) Да. если смотреть глубже: создается Panel, на нее кладется Label + <НужныйВидЭлементаФормы>. Когда управляешь Закреплением — происходит работа с Panel. И когда их много и они не разбиты на группы — бывает тяжело подобрать нужное состояние.
Для лучшего понимания работы форм — запустите студию, создайте форму и попробуйте руками, через свойство закрепление (Dock) получить нужный результат.
Понимаю, что в 1С это сделано проще, я старался сделать как можно ближе к 1С, но очень сильно бороться с .net поведением, если оно не сходится с 1С не стал.
По поводу ПредставлениеСписка — вопрос остался. Есть Ваш простой демо пример который работает. Но если создать свою ТЗ и в первую колонку положить строку или булево — Input string was not in a correct format. Также непонятно, как можно управлять пометками (они выводятся, но не изменяются мышкой или программно).
(62) Проблему вижу, буду разбираться.
(62) по ПС и первой колонке не числу — там все ясно, и видно из документации:
Поэтому 1 колонкой должно быть число, если получится выделить время на выходных — исправлю.
Если я ещё не надоел — очередной вопрос: вот демо пример поля со списком
Данные = Новый Соответствие;
Показать
Установленное значение ( «3» ) — не отображается на форме и если позже обратиться к полю формы и попытаться получить его значение: получим ошибку «Object reference not set to an instance of an object» — ПолеСоСписком1.Значение
p.s. Также не работает установка свойства Ширина у ПолеФормы если тип — ПолеВвода или ПолеСоСписком
по блоку соответствия, с 1 версии шла ошибка, попутал местами Ключ/Значение. сейчас правильно будет так
Насчет Ширины, повторюсь, по умолчанию стоит закрепление вверх, в таком случае указание ширины — не имеет смысла, закрепление перебивает его.
Можно попробовать сделать через группы.
(68) Продолжаем изучение документации и убираем магию ) (я не злобно, настроение такое)
(69) Спасибо, помогло!
Новый вопрос: Создал поле со списком, всё прекрасно работает, но если в него ввести своё (произвольное) значение, начинает ругаться на:
ScriptEngine.Machine.ExternalSystemException: {Модуль C:OneScriptlibBaseManagementУправлениеБазами.os / Ошибка в строке: 31 / Внешнее исключение (System.NullReferenceException): Object reference not set to an instance of an object.}
Возврат Сервер.Значение;
Сам объект Сервер при этом сохраняет тип значения ПолеФормы.
Простите мою настойчивость, а есть ли (или будет ли) возможность выводить в ТЗ на форме не одну, а несколько колонок с типом булево и видом Флажок? Или хотя бы в «Представление списка» получить работу с одной колонкой флажка?
Скажите пожалуйста, а возможно ли получить имя текущей колонки в ТЗ?
https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/oscript-component/FormTableColumn.cs) .
Получаю текущую колонку через ТЗ.ТекущийЭлемент, а далее не вижу у колонки свойство Имя (искал вот тут:
(71) в ТЗ вообще-то можно сколько угодно булево, или я ошибаюсь? Ограничение не накладывал. Вид флажок — идея хорошая, в issue можно закинуть.
В представлении списка флажок — это 0 колонка, в понимании .net, пока не смотрел что там не так.
(72) заголовок
(74) спасибо, я вспомнил, что Заголовок = Имя.
(73) Речь не о том, что в ТЗ нельзя хранить Булево, а в том, чтобы любая колонка с Булево выводилась бы в виде флажка (не только первая).
Очередной вопрос — а умеет ли форма (прошу прощения если я не не нашёл в документации) обработчик ожидания? Сценарий такой — запускаем на выполнение некую команду (например 1С с приказом выполнить обмен и каждые 10 секунд проверяем — завершился ли обмен, с возможностью у пользователя на форме отменить выполнение?
почему-то в коде ниже установка Ширина у поля формы не работает:
ГруппаУпр = ЭлементыФормы.Добавить(«ГруппаУпр», «ГруппаФормы», Неопределено);
ГруппаУпр.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаУпр.АвтоматическийРазмер = Ложь;
ГруппаУпр.Высота = 42;
Декорация1 = Форма.Элементы.Добавить(«ПодписьГруппДейств», «ПолеФормы», ГруппаУпр);
Декорация1.Вид = Форма.ВидПоляФормы.ПолеНадписи;
Декорация1.Закрепление = УправляемыйИнтерфейс.СтильЗакрепления.Лево; //это не помогло
Декорация1.АвтоматическийРазмер = Ложь; //и это не помогло
Декорация1.Ширина = 10;
Декорация1.Заголовок = «Действия с выделенными базами:»;
И последний вопрос на сегодня — у объекта есть свойство ВыделенныеСтроки. Оно только для чтения, а можно его сделать записываемым? На форме есть ТЗ, я перебираю выделенные строки, меняю их, обновляю ТЗ на форме через ТЗНаФорме.ПутьКДанным = ПровайдерТЗ;
после чего ВыделенныеСтроки слетают…
(77) Обработчик ожидания — как вариант метод Sleep, может что-то уже добавилось в самом OneScript, на какое-то время выпадал из развития проекта.
(78) Киньше issue, как будет время гляну. Добиться желаемого результата не смог. А если я не смог такое за пару минут — скорее всего баг.
(79) конечно можно, жду PR )
Сам пока не знаю когда смогу посмотреть. В первую очередь буду исправлять баги. В свободное время в приоритете SmartConfigurator2.
(82) Извините, а что за PR?
И еще я заметил что если на форме запустить длительное выполнение, то в случае переключения на другую программу и назад — окно замерзает (freeze) и
перестает себя перерисовывать, а в заголовке формы появляется Not Responding.
P.S. А будет ли у поля формы работать ToolTip?
(83) PR — Pull Request, доработка кода.
freeze — это уже операционка +.net
ToolTip — планировалось, даже набросок был сделан, пока не включено в релиз, надо проверять.
(84) Pull Request — извините, дотнетом не владею, буду подождать.
Очень интересно, что скриты 1script можно запускать и из PowerShell Прочитал документацию. Не нашел способа ручного измения окна мышью.
Подскажите пжлст, запускаю форму, как обычно. Мне надо вручную, мышкой ширину менять . Как это сделать?
Или, при запуске устанавливаю ширину 600. Эта ширина — фиксированная Как сделать «резиновую», растягивающуюся форму? Какое свойство, как установить?
(87) Потому что у Вас ВыбраннаяБаза принадлежит группе СтраницаВыборочнаяОчистка. Надо сначала найти в элементах формы СтраницаВыборочнаяОчистка и уже в ней искать ВыбраннаяБаза. Если Вы с таким поведением не согласны — переубеждайте автора компоненты или дописывайте её сами.
(88) пробу так Форма.Элементы.Найти(«ГруппаСтраницы»).ПодчиненныеЭлементы.Найти(«СтраницаВыборочнаяОчистка»).ПодчиненныеЭлементы.Найти(«ПолеСписокБаз»).Значение выдает недоступно
(89) Вот как это делаю я:
ТЗНаФорме = Форма.Элементы.Найти(«ГруппаТЗ»).Элементы.Найти(«Базы»);
На текущий момент, элемент формы ищет только в пределах выбранного родителя. без просмотра подчиненных элементов. Поведение надо менять, сейчас руки не доходят.
Если не хочется заморачиваться с поиском — можете определить элемент как переменную модуля, так вы всегда получите к нему доступ.
(91) возможность работы после компиляции в *.exe не поддерживается? видел, что в (15) уже интересовались, но это было год назад. Изменилось ли что-то?
(92) Нет, никто пока не допилил такую возможность в движке. Обходной вариант есть от Khoreva (создать как ресурс, который потом распаковывается).
(93)
А где описан этот вариант? Хочется воспользоваться.
(94)https://github.com/khorevaa/yaml/blob/develop/src/%D0%9A%D0%BB%D0%B0%D1%81% D1%81%D1%8B/internal/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B/%D 0%92%D0%BD%D0%B5%D1%88%D0%BD%D0%B0%D1%8F%D1%8FDLL_%D0%9F%D0% B0%D1%80%D1%81%D0%B5%D1%80YAML.os
(95) случайно наткнулся на onescript… Вопрос: позволяет ли текущее состояние сделать распространяемое приложение(без установки) с функциями: получить информацию от пользователя(текстовая строка), обработать по алгоритму и вывести информацию в виде таблицы или в виде файла(ворд или пдф)?
(96) Позволяет, рекомендую ознакомиться с документацией.
(66) Никак не пойму в чем дело? ПолеСоСписком не устанавливается Значение если Данные СпискаВыбора сформированы в цикле:
Показать
И далее при интерактивной установке Значения=2 вылетает ошибка «Ссылка на объект не указывает на экземпляр объекта» при обращении
Пробую oscript + gui (новичок). Ubuntu 16.04, Mono 5.2, oscript 1.1.1, gui 1.1.1.2.
При запуске примера example-all-component.os из examples выдает ошибку:
{Модуль /usr/share/oscript/lib/gui/examples/example-all-components.os / Ошибка в строке: 107 / Внешнее исключение (System.NotSupportedException): Specified method is not supported.}
Строка:
После комментирования этой строки и такой же для ПолеСписка1 пример запускается и отрабатывает.
(99) Попробуйте на новом релизе. Указанная Вами сборка очень старая. Сегодня выпустил релиз: 1.1.2.3