Exception EAccessViolation при использовании КОМАНДА_БЛАНКА("RECALC")
Добрый день!
Появилась задачка: после выборе счета универсальной функцией в графе бланка необходимо занести это значение в другие графы ввода.
Можно присваивать значения граф в функции ввода, но тогда для каждого бланка придется писать свою функцию, т.к. названия граф отличны и их очень много. Гораздо проще это делать в формульном разделе самого бланка.
Попробовал запускать бланк на пересчет через поле вывода. Все получается, вот только после пересчета бланка программа снимается: (см. Рис.). Пробовал останавливать расчет в середине и доводить до конца, результат тот же. Стенд прилагается.
Что делаю не так? Может есть другое решение задачки?
Trace:
23.12.2024 09:08:21.872 ["TEST.IBL"].ВЫБ_СЧ("")
23.12.2024 09:08:23.995 ["TEST.IBL"].ВЫБ_СЧ -> ДА, время выполнения: 2.124 сек.
23.12.2024 09:08:24.001 ["TEST.IBL"].ПРЕД_РАСЧЕТ(ДА)
23.12.2024 09:08:24.021 Запуск : Бланк "Тест", "TEST.BLW"
23.12.2024 09:08:24.021 ["TEST.IBL"].ПРЕД_РАСЧЕТ(НЕТ)
23.12.2024 09:08:24.022 ["TEST.IBL"].ПРЕД_РАСЧЕТ, время выполнения: 0.000 сек.
23.12.2024 09:08:27.897 ["TEST.IBL"].ПРЕД_РАСЧЕТ(ДА)
23.12.2024 09:08:27.897 ["TEST.IBL"].ПРЕД_РАСЧЕТ, время выполнения: 0.000 сек.
23.12.2024 09:08:27.899 Завершение: Бланк "Тест", "TEST.BLW", время выполнения 3.878 с.
23.12.2024 09:08:27.908 ["TEST.IBL"].ПРЕД_РАСЧЕТ, время выполнения: 3.910 сек.
- 76 просмотров
Спасибо, посмотрю.
С графой вывода - плохой вариант.
Надо запрещать пересчет при вычислении граф вывода, т.к. иначе аварийного завершения не избежать.
Я попробовал в конец функции ВЫБ_СЧ добавить КОМАНДА_БЛАНКА("RECALC").
Так пересчитывает и ошибки не возникает.
Вроде решает поставленную задачу - функция выбора универсальная, от конкретного бланка не зависит.
Ошибки-то нет, но в графу вывода ничего не подставляется. А в повторном вызове функции подставляется предыдущее значение.
Не решена задачка :(
Эврика! Общая переменная. Можно и аттрибут, но писанины больше.
Test.ibl
ПЕРЕМ ТИП_СТРОКА: кодвыбсч;
ФУНКЦИЯ ТИП_ЛОГИКА: ВЫБ_СЧ(ПЕРЕМ ТИП_СТРОКА:х)
х=ВЫБОР_СЧЕТА(х,НЕТ);
УСТ_АТРИБУТ("$пред_расч","ДА");
кодвыбсч=?(СЧЕТ_СУЩ(х),х,"");
КОМАНДА_БЛАНКА("RECALC");
ВЫБ_СЧ=СЧЕТ_СУЩ(х);
КОНЕЦ_ФУНКЦИИ
Формульный раздел
ИСПОЛЬЗОВАТЬ("Test");
Код_г_к=кодвыбсч; Код_г_к1=кодвыбсч; Код_г_к2=кодвыбсч;
папраз=АТРИБУТ("$пред_расч");
ЕСЛИ папраз="ДА" ТО УСТ_АТРИБУТ("$пред_расч",""); СООБЩЕНИЕ("Стоп"); СТОП; КОНЕЦ_ЕСЛИ
СООБЩЕНИЕ("Ок");
Спасибо за часть идеи) Может еще кому пригодиться.
Недостаток такого подхода, если в бланке несколько таких граф для ввода счетов.
Тогда опять функция завязывается на имя конкретной переменной, а на каждую графу нужна своя общая переменная и своя функция.
Наиболее простым решением мне кажется добавление новой команды "DELAYED_RECALC", чтобы выбор в графе отработал до конца, а только потом происходил пересчет бланка.
Другая альтернатива - это добавить новую опцию для граф и событий "Пересчет бланка", которая будет перекрывать существующие 3 опции (Обновление бланка, ...).
Согласен.
Но, пока других решений нет, попробую через СПИСОК_АТРИБУТОВ("$",С), где каждая строка из 2-х частей: <название графы>разделитель<значение>
Так можно выкрутиться благодаря функции ИМЯ_ГРАФЫ.
Только через ее, родимую, все и делается)