Навеяно темой «Определение порядка расчета связанных формул»
Посмотрел, почитал, подумал… а ведь это могло бы пригодиться не только для цифиръ.
Реализация автора не особо понравилась… уж слишком все сложно. Рекурсия - медленно.
Хотелось что-то:
Переменная("a","1");
Вычисляется("b","{a}+1");
Или
Переменная("ПолныеПрава", Истина);
Переменная("МАРЬИВАННА", яПользователь("МарьИванна"));
Вычисляется ("МогуЧтоУгодно", "{ПолныеПрава} ИЛИ {МАРЬИВАННА}");
Если ПолучитьПеременную("МогуЧтоУгодно") Тогда
Сообщить("Красавчик");
КонецЕсли;
И тут осенило!
Недавно ковыряясь в одном боте c javascript-ом, наткнулся на новое для меня понятие – «вычисление зависимых переменных». То есть была объектная модель, по которой строилось представление. «Все ок. Это же шаблонизатор!» скажут многие, но это не так. В отличие от шаблонизатора изменения в модели сразу же приводило к изменению представления – работала так называемая реактивность. Да 1С – не торт, но должна же быть и в нем возможность – сделать это…
Первые версии работали не ахти чтобы адекватно и быстро, да и сейчас, глядя на код, я не в большом восторге; главное - все считалось. Началась погоня за оптимизацией: отслеживание зависимости и зависимых, обновление только при изменении данных, индексация ТЗ, устранение дорогих операций, внедрение отложенных вычислений.
Время работы сокращалось, но и возможностей для оптимизаций становилось меньше. Последними стали манипуляции с исходными формулами: меняем буквенное наименование переменной – на номер… и всё в шоколаде.
Управляемое приложение… печаль. Ведь все, что я делал – это было на обычных формах, УФ – не прощает. Переписываю код для работы в клиентском окружении, выношу весь код в отдельную обработку, чтобы лишние переменные не мешали и было проще подключать к клиентскому коду. Вот теперь все.
Баги остались, куда же без них, но хотелось бы выслушать мнение людей.
Синтаксис вычислений:
ВычислениеФормул.Переменная("Переменная", "Значение"); // Создание переменной
ВычислениеФормул.Вычисляется("ИмяПеременной", "Формула", ОтложеноеВычисление); // Создание переменной с формулой
ВычислениеФормул.Коснуться("ИмяПеременно") ;// запустится обновление связанных переменных
ВычислениеФормул.УстановитьЗначениеПараметра("Переменная", "Значение"); // установить значение переменной и обновление зависимых
ВычислениеФормул.ПолучитьОбновленныеДанные() ;// получение измененных переменных после установки значения – соответствие с данными типа: имяпеременной-ключ и новым значением
ВычислениеФормул.Get("Переменная");//получить переменную по имени
Синтаксис формул:
Имена переменных в фигурных скобочках –
"{я переменная с пробелами}*{аябезпробелов}"
Значение переменных без отслеживания –
"|этаФормулаНеУзнаетЧтоПеременнаяПоменяласьНоЗначениеИспользует|*{АЭтуОтследитПриИзменении}"
Вычисления формул происходят в контексте формы встроенной обработки…но можно обмануть:
ВычислениеФормул = ПолучитьФорму("ВнешняяОбработка.ВычислениеФормул.Форма",,ЭтаФорма);
ВычислениеФормул.Вычисляется("МегоФорма", "ЭтаФорма.ВладелецФормы");
ВычислениеФормул.Вычисляется("ФункцияМегоЭкспорт", "{МегоФорма}.ЭкспортнаяФункция({ПарамПамПам})");
Придумать можно много всего...
Код основной обработки в макете с именем "Макет" =) логично
Сама обработка является примером использования вычислений переменных:
открывается недоступной - через 5 секунд заканчивается таймер и форма становится доступной, еще через 5 секунд происходит заполнение формулами таблиц и их вывод... после изменения ячейки на форме - происходит перерасчет всех подчиненных формул.