gifts2017

Рекурсия = зависимость от рекурсии от рекурсии от рекурсии от рекурсии...

Опубликовал Евгений Ванжула (minimajack) в раздел Программирование - Практика программирования

А что если мы введем свои переменные?

Навеяно темой «Определение порядка расчета связанных формул»

Посмотрел, почитал, подумал… а ведь это могло бы пригодиться не только для цифиръ.

Реализация автора не особо понравилась… уж слишком все сложно. Рекурсия  - медленно.

Хотелось что-то:

Переменная("a","1");
Вычисляется("b","{a}+1");

Или

Переменная("ПолныеПрава", Истина);
Переменная("МАРЬИВАННА",  яПользователь("МарьИванна"));
Вычисляется ("МогуЧтоУгодно", "{ПолныеПрава} ИЛИ {МАРЬИВАННА}");
Если ПолучитьПеременную("МогуЧтоУгодно") Тогда
Сообщить("Красавчик");
КонецЕсли;

И тут осенило!

Недавно ковыряясь в одном боте c javascript-ом, наткнулся на новое для меня понятие – «вычисление зависимых переменных».  То есть была объектная модель, по которой строилось представление. «Все ок. Это же шаблонизатор!» скажут многие, но это не так. В отличие от шаблонизатора изменения в модели сразу же приводило к изменению представления – работала так называемая реактивность.  Да 1С – не торт, но должна же быть и в нем возможность – сделать это…

Первые версии работали не ахти чтобы адекватно и быстро, да и сейчас, глядя на код, я не в большом восторге;  главное - все считалось. Началась погоня за оптимизацией: отслеживание зависимости и зависимых, обновление только при изменении данных, индексация ТЗ, устранение дорогих операций, внедрение отложенных вычислений.  

Время работы сокращалось, но и возможностей для оптимизаций становилось меньше. Последними стали манипуляции с исходными формулами: меняем буквенное наименование переменной – на номер… и всё в шоколаде.

Управляемое приложение… печаль. Ведь все, что я делал – это было на обычных формах, УФ – не прощает. Переписываю код для работы в клиентском окружении, выношу весь код в отдельную обработку, чтобы лишние переменные не мешали и было проще подключать к клиентскому коду.  Вот теперь все.

Баги остались, куда же без них, но хотелось бы выслушать мнение людей.

 

Синтаксис вычислений:

ВычислениеФормул.Переменная("Переменная", "Значение"); // Создание переменной
ВычислениеФормул.Вычисляется("ИмяПеременной", "Формула", ОтложеноеВычисление); // Создание переменной с формулой
ВычислениеФормул.Коснуться("ИмяПеременно") ;// запустится обновление связанных переменных
ВычислениеФормул.УстановитьЗначениеПараметра("Переменная", "Значение"); // установить значение переменной и обновление зависимых
ВычислениеФормул.ПолучитьОбновленныеДанные() ;// получение измененных переменных после установки значения – соответствие с данными типа: имяпеременной-ключ и новым значением
ВычислениеФормул.Get("Переменная");//получить переменную по имени

Синтаксис формул:

Имена переменных в фигурных скобочках –

"{я переменная с пробелами}*{аябезпробелов}"

Значение переменных без отслеживания – 

"|этаФормулаНеУзнаетЧтоПеременнаяПоменяласьНоЗначениеИспользует|*{АЭтуОтследитПриИзменении}"

 

Вычисления формул происходят в контексте формы встроенной обработки…но можно обмануть:

ВычислениеФормул = ПолучитьФорму("ВнешняяОбработка.ВычислениеФормул.Форма",,ЭтаФорма);
ВычислениеФормул.Вычисляется("МегоФорма", "ЭтаФорма.ВладелецФормы");
ВычислениеФормул.Вычисляется("ФункцияМегоЭкспорт", "{МегоФорма}.ЭкспортнаяФункция({ПарамПамПам})");

Придумать можно много всего...

Код основной обработки в макете с именем "Макет" =) логично

Сама обработка является примером использования вычислений переменных:

открывается недоступной - через 5 секунд заканчивается таймер и форма становится доступной, еще через 5 секунд происходит заполнение формулами таблиц и их вывод... после изменения ячейки на форме - происходит перерасчет всех подчиненных формул.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Проверка УФ
.epf 14,55Kb
21.11.15
2
.epf 0.0.0.0001 14,55Kb 2 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений Ванжула (minimajack) 19.11.15 16:26
Комментарии приветствуются.
2. Сергей Ожерельев (Поручик) 21.11.15 00:21
Пошёл читать Ильдаровича.
3. Евгений Ванжула (minimajack) 21.11.15 10:39
(2) Поручик, вся соль в отложенных вычислениях и перерасчет при необходимости.
Это как установить видимость - но при этом знать на какие элементы повлияло изменение параметра.
Примеры:
установит значение переменной
Переменная("Переменная", СложныйЗапрос());

установит формулу в вычисляемую переменную и сразу ее расчитает:
Вычисляется ("Переменная", "СложныйЗапрос()");

установит формулу в вычисляемую переменную при этом значение вычислится только по требованию:
Вычисляется ("Переменная", "СложныйЗапрос()", Истина);


в самих функциях можно делать обращение к другим переменным и тогда при изменении этой переменной произойдет перерасчет:
Функция СложныйЗапрос()
//Запрос
Параметр.установить("Параметр", Get("ИзменяемыйПараметр"))
// Возврат результат запроса
КонецФункции
...Показать Скрыть
4. bulpi bulpi (bulpi) 27.11.15 01:04
Автор, хотелось бы несколько строк на тему : на хрена все это. А то ведь мы мыслей не читаем.
5. Евгений Ванжула (minimajack) 27.11.15 12:38
(4) bulpi - код понадобится исключительно разработчикам. Там где необходимы реактивные вычисления, кеширование промежуточного результата, обновление исключительно при изменениях и т.п.
пример
Переменная("Переменная", 4.3);
Вычисляется ("Целое", "Цел({Переменная})");
Вычисляется ("Копейки", "ПолучениеКопеек({Переменная})");


и дальше в коде

Параметр.установить("Переменная", 5.3)


получаем изменения только {Переменная} и {Целое} - копейки не оповестят об изменении
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа