Ошнуров Андрей | Программист | Предприниматель

«РусскийФокс — 1С-подобный язык программирования»

Новый язык 1С-подобный объектно-ориентированный язык программирования РусскийФокс (интерпретатор), FreeWare. Удобен для обучения (Размер платформы 14Мб, инсталляции не требует. Разрабатывается на FoxPro 9) Удобен для системных администраторов: писать сценарии для командной строки. Операционная система WinXP и выше. На данный момент из синтакс-помошника учебной версии 1С реализованы все функции работы со строками, все функции работы со значениями типа Дата, функции преобразования значений (число, строка, дата). Пока отсутствует отладчик, но реализованы операторы ПОПЫТКА, ИСКЛЮЧЕНИЕ, КОНЕЦПОПЫТКИ; В ближайшее время планируется создать объекты для работы с DBF-файлами (с CDX индексами), объект для работы с MySQL-сервером, генерация отчетных форм на основе шаблонов OpenOffice и LibreOffice (либо на MS Excel), создание экранных форм ввода данных, создания меню, объекты типа строка ввода, кнопки, таблица, чекбоксы и т.д.. Особое внимание будет уделено взаимодействию с платформой 1С. Доклад будет посвящен краткому обзору возможностей и демонстрации примеров написания кода.

"Мигаем" интерфейсом, или цепочки асинхронных вызовов

Программирование - Практика программирования

Как, не блокируя интерфейс, привлечь внимание пользователя к интерфейсным элементам. Или, попросту говоря, "мигнуть" чем-то.

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

Речь здесь идёт, конечно же, о процедуре ПодключитьОбработчикОжидания().

Напомню синтаксис процедуры: 

ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)

, причём, если указывать интервал меньше секунды, запуск процедуры обязан быть однократным. Вот здесь мы и теряем контроль над потоком исполнения и теряем возможность его "кастомизировать" (гибко, индивидуально настроить).

Но это ограничение легко обходится.

Чтобы не растекаться мыслею по древу, сразу приведу простой пример и объясню его.

 
 Магия :)

 Допустим, у нас на форме есть табличный документ и мы хотим "мигнуть" 5 раз какой-то его областью.

////////////////////
//
// "Мигнём" областью Табличного документа 5 раз, с интервалом в полсекунды
//
////////////////////

&НаКлиенте
Процедура ПомигатьОбластью(Команда)
	
	мфСколькоРазМигать = 3; // Счётчик. Реквизит формы, "видимый" в процедурах обработчиков ожидания
	
	ПодключитьОбработчикОжидания("ПоказатьВыделениеОбласти", 0.1, Истина); // Можно и напрямую вызвать
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьВыделениеОбласти()
	
	Область = Объект.ТД.Область(мфПерваяСтрокаДанных, мфПерваяКолонкаДанных, мфПоследняяСтрокаДанных, мфПоследняяКолонкаДанных);
	
	Граница = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Двойная);
	
	Область.Обвести(Граница, Граница, Граница, Граница); // Обводим область
	
	мфСколькоРазМигать = мфСколькоРазМигать - 1; // Декремент счётчика
	
	ПодключитьОбработчикОжидания("УбратьВыделениеОбласти", 0.5, Истина); // Соединяем цепочку асинхронных вызовов
	
КонецПроцедуры

&НаКлиенте
Процедура УбратьВыделениеОбласти()
	
	Область = Объект.ТД.Область(мфПерваяСтрокаДанных, мфПерваяКолонкаДанных, мфПоследняяСтрокаДанных, мфПоследняяКолонкаДанных);
	
	Граница = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
	
	Область.Обвести(Граница, Граница, Граница, Граница); // Снимаем обведение области
	
	Если мфСколькоРазМигать > 0 Тогда
		ПодключитьОбработчикОжидания("ПоказатьВыделениеОбласти", 0.5, Истина); // Повторяем столько, сколько осталось по счётчику
	КонецЕсли;
	
КонецПроцедуры

Основное требование только в том, чтобы переменная-счётчик мфСколькоРазМигать была "видна" из процедур, которые мы запускаем асинхронно. В данном случае переменная — это реквизит формы.

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

  • Обходим ограничение на повторяемость вызовов процедуры со значениями интервала меньше секунды;
  • Имеем возможность формировать цепочки разной длины и сложности:
    • подключать обработчик ожидания непосредственно в самой процедуре обработчика ожидания;
    • сделать, чтобы такие процедуры подключали друг друга;
    • организовать более сложную структуру цепочек вызовов;
    • бесконечно усложнять вариативность управления вызовами (например, изменять внутри вызовов не только их счётчики, но и значения интервалов, стили оформления (чтобы радугой переливалось 🌈).

Несмотря на простоту описанного метода, в нём скрыт немалый потенциал.

В 2017-м году более гибко управлять поведением программы — это современно.

См. также

Комментарии
Сортировка: Древо
1. kraynev-navi 363 06.09.17 21:10 Сейчас в теме
1С могло бы уже наконец, что-то платформенное добавить в наш интерактивный век.
Вот еще на тему привлечения внимания: анимация фона https://infostart.ru/public/330799/
4. Yashazz 2255 07.09.17 11:01 Сейчас в теме
(1) 1С соорудила нахрен не нужную систему внутренних оповещений, а потом сообразила, что с её помощью таки можно "мигать интерфейсом". Читайте зазеркалье. Десяти лет не пройдёт, как будет нам щастье.

По сути публикации - ничего нового.
5. GreenDragon 07.09.17 21:23 Сейчас в теме
(4) Таки не 1С сообразила с морганием интерфейсом, а топикстартер. 1С дала сервер взаимодействия, если читать зазеркалье. По сути статья о некоем резиновом костыле (гибком решении), который вполне себе может прекратить работать с любым релизом. Причём обрезание возможности указывать нецелочисленные значения в параметрах вызова с 99% вероятностью даже не будет заявлено в фиксах. В общем, на свой страх и риск.

P.S. Есть что-то неуловимо схожее у этой статьи и тем анекдотом про удаление аппендикса ложкой...
6. Yashazz 2255 07.09.17 23:15 Сейчас в теме
7. Chrizt 233 08.09.17 12:38 Сейчас в теме
(5) Не думаю, что интерфейсные "мигания" настолько важны, чтобы отслеживать выпиливание нецелочисленных значений интервала.
Пример для того и дан, чтобы показать всю несерьёзность использования. А то, если кого-то понесёт костылить из этого что-то более серьёзное...
например, распараллелить умножение матриц друг на друга.


А если отвалится "мигалка" - да ну и хрен бы с ней!
2. brr 182 07.09.17 09:06 Сейчас в теме
3. protexprotex 169 07.09.17 10:17 Сейчас в теме
Хорошо было бы чтоб была возможность из 1С запустить несколько потоков с барьерной синхронизацией - например, распараллелить умножение матриц друг на друга.
8. bonv 105 08.09.17 14:58 Сейчас в теме
(3) матрицы умножайте во внешней компоненте или в крайнем случае запросом. Но уж точно не встроенным языком
9. protexprotex 169 08.09.17 16:17 Сейчас в теме
(8) Ну а так я о том и пишу - сделали бы команду умножения матриц друг на друга. Хотя, это уже к 1С-ке мало как относится.
10. Krasnyj 1228 09.09.17 00:30 Сейчас в теме
Мигание интерфейсом - чем плохо, например, мигнуть нужной кнопкой, когда пользователь жмет не туда? :)
11. Chrizt 233 10.09.17 04:12 Сейчас в теме
Статья с Хабра:
"Параллелизм против многопоточности против асинхронного программирования: разъяснение".
Может помочь лучше понять, чем отличаются все три понятия и в каких случаях используются.
12. Бубузяка 62 13.09.17 09:17 Сейчас в теме
Прикольно.
Однако, "съезжает" ТекущаяОбласть в "мигающую" ячейку, неудобно. Проверил на форме. Фокус клавиатуры в формах не переместился на "мигалку". Можно применять.
13. sa1m0nn 22 14.09.17 19:06 Сейчас в теме
Оставьте свое сообщение