Формы для 1script

Программирование - Инструментарий

В последнее время для задач, связанных с администрированием 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

См. также

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

Ещё одно важное предложение - сделайте загрузку настройки элементов формы из файла и/или строки. В идеале - в формате 1С (причём можно загрузить как формат неуправляемых форм - но это не очень просто, но возможно; так и xml формат управляемых форм - и создать "похожу" расстановку поддерживаемых элементов формы) - вот это действительно круто будет!

И, ещё одно предложение - сделайте несколько встроенных форм - например для диалогов вопроса, предупреждения, ввода/выбора из списка единичного значения, редактирования списка/таблицы/дерева значений. Быстрой регенерации формы, позволяющей ввести набор значений с представлением вида дерева (с иерархие в виде дерева и/или закладок - а на листьях - просто список полей ввода - отображаемых вертикально на форме, с надписями).
14. Сергей (ret-Phoenix) 318 25.09.17 21:04 Сейчас в теме
1. По оформлению - маловероятно что буду делать, но если кто сделает - PR проверю и приму.
2. Загрузка настройки элементов - была идея, но пока не доходят руки.
3. формы диалогов есть, в тестах примеры обращения. Выбор из ТЗ - дело нескольких строк, пример есть. Дерево есть - формируете обычное дерево и указываете как источник.
Автогенерация - 1 функция которая будет принимать тип, имя и еще ряд свойств - можно самим один раз написать и использовать.
Сейчас первоочередная задача - довести список компонентов до уровня 1С, переработать расположение.
15. Дмитрий Синичников (DmitrySinichnikov) 135 20.10.17 15:16 Сейчас в теме
Интересно а почему после компиляции в *.exe форма не открывается? Или открывается на долю секунды и закрывается сразу. Проверял и на ваших примерах и на своем коде.
Хотел небольшую утилиту написать, видимо облом, печалька((
16. Сергей (ret-Phoenix) 318 20.10.17 19:15 Сейчас в теме
(15) Пока движок oscript не умеет корректно работать с ВК. поэтому поставлять пока можно в виде *.os
17. Петр Лунегов (pvlunegov) 109 26.10.17 21:34 Сейчас в теме
Прекрасно, все работает, замечательное расширение мегаразработки OneScript.
Меня страстно интересуют следующие вопросы:
1. Есть ли возможность выводить картинки в поля элементов формы
Например, картинки в ТабличноеПоле.

Я пока тестирую вашу работу, не нашел реализации вывода картинок.
Есть ли вообще такая возможность?
18. Сергей (ret-Phoenix) 318 27.10.17 10:48 Сейчас в теме
(17) картинки можно использовать в "ПредставлениеСписка" (иконка в строке), больше ничего с картинками нет, не было необходимости
19. Сергей (ret-Phoenix) 318 27.10.17 10:52 Сейчас в теме
Процедура Тест_Должен_УстановитьВидТаблица() экспорт
	ПолучитьФорму();
	
	ПровайдерТЗ = Новый Провайдер;
	ПровайдерТЗ.Источник = ПолучитьТЗ();
	
	Поле1 = Форма.Элементы.Добавить("ТаблицаФормы1", "ПредставлениеСписка", Неопределено);
	Поле1.Представление = Поле1.ВидыПредставлений.Таблица;
	Поле1.ПутьКДанным = ПровайдерТЗ;
	Поле1.Заголовок = "Провайдер - ТЗ";
	Поле1.ПоложениеЗаголовка = УправляемыйИнтерфейс.ПоложениеЗаголовка.Верх;
	Поле1.Закрепление = УправляемыйИнтерфейс.СтильЗакрепления.Заполнение;
	
	Поле1.ОтображатьСетку = Истина;

	Поле1.КолонкаСИндексомИзображения = 0;

	Изображения = Поле1.МаленькиеИзображения;
	Изображения.Добавить("c:\Users\ushakov\Downloads\gconfeditor.ico");
	Изображения.Добавить("c:\Users\ushakov\Downloads\gconfeditor.ico");
	//Изображения.Добавить("c:\Users\ushakov\Documents\СтрелкаВлево.png");

	Изображения = Поле1.БольшиеИзображения;
	Изображения.Добавить("c:\Users\ushakov\Documents\32.ico");
	Изображения.Добавить("c:\Users\ushakov\Documents\32.ico");
	//Изображения.Добавить("c:\Users\ushakov\Documents\СтрелкаВлево.png");
	
	//
	Строки = Поле1.ВыделенныеСтроки;
	Для каждого Стр Из Строки Цикл
		Сообщить(Стр);
	КонецЦикла;
	
	Ожидаем.Что(Форма.Элементы.Найти("ТаблицаФормы1")).Существует();
	
	Форма.Показать();	
КонецПроцедуры
Показать
20. Петр Лунегов (pvlunegov) 109 27.10.17 14:56 Сейчас в теме
Подскажите, картинки нужны для формирования отчетов и вывод в форму.
Как это дело можно организовать?
Формирование отчета в поле табличного документа или таблицу управляемой формы и показ оной
21. Сергей (ret-Phoenix) 318 27.10.17 15:35 Сейчас в теме
(20) Аналога Табличного документа нет, есть только ТабличноеПоле. Как вариант, можно дописать ПолеHTML, пока оно не реализовано.
22. Петр Лунегов (pvlunegov) 109 27.10.17 15:43 Сейчас в теме
Я почему заинтересовался вашей разработкой - потому что хотел применить ее для:
1. Создания Win-приложения с формами, минимальной графикой
2. Код в приложении делать на 1с.
3. Минимальная графика должна быть хотя бы в виде отчетов (статических таблиц с картинками или графиками или ....)

Без 3 шага реализовать мало-мальски годное приложение шансов = 0

Согласитесь, что если ваше решение чуток доработать, можно делать полноценные приложения с БД с графикой = конкурент 1с на локальной машине без лицензий.

Я думаю в свободное время засесть за C# покопаться в вашем решении и придумать плагин для использования графики.
Например, вывод картинок в поле HTML - думаю самое простое и быстрое решение.
24. Сергей (ret-Phoenix) 318 27.10.17 15:46 Сейчас в теме
(22) Да, работа с ПолеHTML самое простое, но тоже требует времени, пока у меня его нет, переносить возможности поля совсем по минимуму не особо хочется, а на полноценное время выделить пока не могу.
Диаграммы - тоже хочется. даже знаю какую задачу буду ими решать, опять же - вопрос времени.
Сейчас gui развивается в первую очередь чтобы решать задачи SmartConfigurator.
26. Петр Лунегов (pvlunegov) 109 27.10.17 15:53 Сейчас в теме
(24) жалько что столько времени уделяете конкуренту Снегопата.
Не взлетит, по моему мнению.
Снегопат хоть и весь оброс бородой, глючный и некрасивый, но народ к нему привык.

Советую задуматься над моим предложением по доработки графических фишек к OneScript.

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

Покопаюсь, поделаю, если получится, отпишусь вам.

Возможно, получится сделать обычный плагин в виде давно известного решения.
29. Сергей (ret-Phoenix) 318 27.10.17 16:08 Сейчас в теме
(26) Вообще-то, мои скрипты появились за много лет до появления снегопата, фактически с них и начались разработки примочек к конфигуратору. Раньше проект не так сильно развивал как сейчас.

Я даже не помню, когда в последний раз использовал снегопат, т.к. мне приходится работать на последних версиях платформы, нужна стабильность и доступность всегда и везде.
pvlunegov; +1 Ответить
30. Сергей (ret-Phoenix) 318 27.10.17 16:11 Сейчас в теме
(26) Нашел когда впервые выложил: http://www.1cpp.ru/forum/YaBB.pl?num=1227553473 (24. Ноября 2008)
pvlunegov; +1 Ответить
23. Петр Лунегов (pvlunegov) 109 27.10.17 15:45 Сейчас в теме
После шага 3 можно делать даже развлекательные приложения в виде простых игр (табличных, статичная 2d графика)
С применением управляемых форм можно даже сделать браузерные игры.
Преимущества - внутренний код на 1с - огромное (для меня).

Поэтому шаг 3 нужно ОБЯЗАТЕЛЬНО сделать, это АРХИВАЖНО!
25. Петр Лунегов (pvlunegov) 109 27.10.17 15:49 Сейчас в теме
Многие люди не понимают ГИГАНТСКИЙ шаг OneScript в направлении:
1. БЕСПЛАТНОГО приложения для создания полноценных Win-приложений с БД, с графикой и внутренним кодом на русском языке.

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

Уже все готово, кроме графики:
1. Внутренний код на 1с работает, хотя глючит и есть ошибки
2. Вся изюминка C# и ООП в наличии (расширяемость, свои классы и функции, библиотеки)
3. Есть формы, есть подключение к БД, есть работа с сетью, файлами и много чего...

Осталось САМОЕ ГЛАВНОЕ - минимальная графика в формах.

Тогда данный проект превратится в полноценный редактор бизнес-решений
27. Петр Лунегов (pvlunegov) 109 27.10.17 15:59 Сейчас в теме
Подскажите, в OneScript есть возможность выполнять C# код из 1с кода?
Что то наподобие
Выполнить("С# код...") ?
НАпример, берем руководство Микрософт по рисованию фигур и всякой мелочи https://msdn.microsoft.com/ru-ru/library/x5wshyk0(v=vs.90).aspx
Создаем библиотеку в виде функций на 1с для рисования фигур, подключаем ее к решению
и начинаем использовать графику в 1с.
Взлетит такое?
28. Сергей (ret-Phoenix) 318 27.10.17 16:04 Сейчас в теме
OneScript не позволяет выполнить код c#, но есть возможность работать с .net сборками. Примеры были на github.
31. Алексей _ (iolko) 174 25.01.18 12:53 Сейчас в теме
Добрый день!
А можно добавить примеров с предупреждением и диалогом выбора файла.
Не могу найти
33. Алексей _ (iolko) 174 05.02.18 06:32 Сейчас в теме
(32) Не могу победить ДиалогВыбораФайла... Вот где-то туплю, и не пойму где. Можно тоже пример, для "ОсосбоОдаренных"
34. Сергей (ret-Phoenix) 318 05.02.18 21:55 Сейчас в теме
(33)
#Использовать gui

Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(Режим);
	
ДиалогВыбораФайла.Каталог = "c:\";
Если ДиалогВыбораФайла.Выбрать() Тогда
	Сообщить(ДиалогВыбораФайла.Каталог);
КонецЕсли;
Показать


https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/oscript-component/FileDialog.cs
https://github.com/ret-Phoenix/oscript-simple-gui/blob/master/oscript-component/FileDialogMode.cs
35. bulpi bulpi (bulpi) 128 24.02.18 20:43 Сейчас в теме
Автор, Вы бы для новичков добавили буквально абзац с пошаговой инструкцией, что и как делать :
1)Что именно качать и откуда
2)Что делать со скачанным

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