gifts2017

Формы для 1script

Опубликовал Сергей (ret-Phoenix) в раздел Программирование - Инструментарий

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

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

Во время разработки очень порадовала обратная связь с разработчиками onescript, ответы на вопросы получал очень быстро. Библиотечные методы написаны просто и понятно, ряд вопросов решился просмотром исходных кодов и копипастом (перебор элементов формы в цикле ДляКаждого Элемент Из Коллекции Цикл).

Проект выложен на github, там же лежит бинарник, для более быстрого начала использования. Методы компоненты покрыты тестами, которые так же являются и примерами работы с объектами компоненты. За тесты отдельное спасибо artbear, всегда знает в каком направлении правильно пнуть :D

Примеры работы с компонентой

Перейдем к работе с компонентой...

Создание формы и вывод надписи

Перем Форма;

Процедура Инициализация()

    //# Загружаем внешнюю компоненту
    ПодключитьВнешнююКомпоненту("oscript-simple-gui.dll");

    ПростойГУИ = Новый ПростойГУИ();
    Форма = ПростойГУИ.СоздатьФорму();

    //# Устанавливаем обработку события ПриОткрытии
    Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
    Форма.Показать();

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

//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
    
    Декорация1 = Форма.Элементы.Добавить("Декорация1", "ПолеФормы", Неопределено);
    Декорация1.Вид = Форма.ВидПоляФормы.ПолеНадписи;
    Декорация1.Заголовок = "Это действительно работает!";

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

Инициализация();

Создание формы с кнопкой и обработка события нажатия на кнопку

Перем Форма;

Процедура Инициализация()

    //# Загружаем внешнюю компоненту
    ПодключитьВнешнююКомпоненту("oscript-simple-gui.dll");

    ПростойГУИ = Новый ПростойГУИ();
    Форма = ПростойГУИ.СоздатьФорму();

    //# Устанавливаем обработку события ПриОткрытии
    Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
    Форма.Показать();

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

//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
    
    ПолеВвода1 = Форма.Элементы.Добавить("ПолеВвода1", "ПолеФормы", Неопределено);
    ПолеВвода1.Вид = Форма.ВидПоляФормы.ПолеВвода;
    ПолеВвода1.Заголовок = "Поле ввода";
    ПолеВвода1.Значение = "Значение задано из скрипта";

    Кнопка1 = Форма.Элементы.Добавить("Кнопка1", "КнопкаФормы", Неопределено);
    Кнопка1.Заголовок = "Нажми меня";
    Кнопка1.УстановитьДействие(ЭтотОбъект, "Нажатие", "ПриНажатииНаКнопку1");

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

Процедура ПриНажатииНаКнопку1() Экспорт
    Форма.Элементы.Найти("ПолеВвода1").Значение = "Значение после нажатия на кнопку";
КонецПроцедуры

Инициализация();

Перейдем к более сложному примеру, создадим форму с кнопкой, полем ввода.

Пример работы с выпадающим списком
Перем Форма;

Процедура Инициализация()

    //# Загружаем внешнюю компоненту
    ПодключитьВнешнююКомпоненту("oscript-simple-gui.dll");

    ПростойГУИ = Новый ПростойГУИ();
    Форма = ПростойГУИ.СоздатьФорму();

    //# Устанавливаем обработку события ПриОткрытии
    Форма.УстановитьДействие(ЭтотОбъект, "ПриОткрытии", "ПриОткрытииФормы");
    Форма.Показать();

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

//# Обработка события первого открытия формы
Процедура ПриОткрытииФормы() Экспорт
    
    Данные = Новый Соответствие;
    Данные.Вставить("Один", "1");
    Данные.Вставить("Два", "2");
    Данные.Вставить("Три", "3");

    ПолеСоСписком1 = Форма.Элементы.Добавить("ПолеСоСписком1", "ПолеФормы", Неопределено);
    ПолеСоСписком1.Заголовок = "Поле со списком";
    ПолеСоСписком1.Вид = Форма.ВидПоляФормы.ПолеСоСписком;
    ПолеСоСписком1.СписокВыбора = Данные;
    ПолеСоСписком1.Значение = "3";
    ПолеСоСписком1.УстановитьДействие(ЭтотОбъект, "ПриИзменении", "ПриИзменииЗначения");

    Форма.Высота = 80;

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

Процедура ПриИзменииЗначения() Экспорт
    Сообщить("Новое значение: " +  Форма.Элементы.Найти("ПолеСоСписком1").Значение);
КонецПроцедуры

Инициализация();

Возможности компоненты

На самом деле возможностей компоненты значильно больше нежели приведено в примерах, ознакомиться с ними можно на странице 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

ВидГруппыФормы/FormGroupType

  • ОбычнаяГруппа/UsualGroup
  • Страница/Page
  • Страницы/Pages

ПоложениеЗаголовка

  • Авто/Auto
  • Верх/Top
  • Лево/Left
  • Нет/None
  • Низ/Bottom
  • Право/Right

СтильЗакрепления

  • Нет/None
  • Верх/Top
  • Низ/Bottom
  • Лево/Left
  • Право/Right
  • Заполнение/Fill

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Артур Аюханов (artbear) 01.08.16 17:07
2. Антонио (Fragster) 01.08.16 17:38
ждем кроссплатформенного исполнения
3. Сергей (ret-Phoenix) 01.08.16 17:43
(2) Решение уже кроссплатформенно, работу под Linux проверяли. У меня примеры под Windows, т.к. ничего больше не стоит
AntoShiK86; Fragster; +2 Ответить 1
4. Александр Губанов (gubanoff) 02.08.16 11:59
Прекрасная работа! На самом деле, это первое, что приходит в голову, после начала работы с onescript - добавить интерактив в виде форм.
5. Игорь Пашутин (Alien_job) 02.08.16 12:07
Что вы подразумеваете под расширением возможностей конфигуратора?
upd: Ой,пропустил http://infostart.ru/public/339035/.
6. Brr (brr) 02.08.16 15:34
7. Сергей (ret-Phoenix) 02.08.16 15:37
(6) А если без шуток, в ближайшее время планирую изменить название этого этого класса. Будут доступны оба варианта, ПростойГУЙ будет deprecated
8. Артур Аюханов (artbear) 03.08.16 11:08
9. Николай Князев (HDRX) 03.08.16 11:39
Что за шрифт используете в редакторе?
10. Сергей (ret-Phoenix) 03.08.16 12:26
(9) Стандартный в VSCode: "editor.fontFamily": "Consolas, 'Courier New', monospace",
11. kav kav (alexkmbk) 09.09.16 17:21
(3) ret-Phoenix, Подскажите пожалуйста, а что необходимо сделать для того, чтобы можно было использовать под Linux? Файл oscript-simple-gui.dll ведь не кросс-платформенный.
12. Сергей (ret-Phoenix) 09.09.16 20:26
(11) в gitter ответил на вопрос. Для общественности:
под Linux будет работать под Mono.
Моя либа нормально работает под Linux (проверял @dmpas )
т.е. с точки зрения скриптописателя - разницы нет Windows or Linux