Формы для 1script
В последнее время для задач, связанных с администрированием 1С или расширением возможностей конфигуратора, стал использовать 1script (onescript). Движок оказался очень удобным и приятным, но чего-то не хватало, а именно работы с формами. В ряде скриптов использовать GUI было бы предпочтительней параметров командной строки, тем более если с этим работать конечному пользователю.
- Описание
- Подробнее
Описание
Имея некоторый опыт работы с 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;
ДеревоФормы

Функция ПолучитьТЗ()
Дерево = Новый ДеревоЗначений();
Дерево = Новый ДеревоЗначений();
Дерево.Колонки.Добавить("Год");
Дерево.Колонки.Добавить("Месяц");
Дерево.Колонки.Добавить("День");
СтрокаДереваГод = Дерево.Строки.Добавить();
СтрокаДереваГод.Год = 2016;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Jan";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "Dec";
СтрокаДереваМесяц.Год = СтрокаДереваГод.Год;
СтрокаДереваГод = Дерево.Строки.Добавить();
СтрокаДереваГод.Год = 2017;
СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить();
СтрокаДереваМесяц.Месяц = "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
