Exception EAccessViolation при использовании КОМАНДА_БЛАНКА("RECALC")

пользователь
Регистрация: 17.06.2015

Добрый день!

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

Можно присваивать значения граф в функции ввода, но тогда для каждого бланка придется писать свою функцию, т.к. названия граф отличны и их очень много. Гораздо проще это делать в формульном разделе самого бланка.

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

Что делаю не так? Может есть другое решение задачки?

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 сек.

Вложения
модератор
Регистрация: 06.09.2007

С графой вывода - плохой вариант.
Надо запрещать пересчет при вычислении граф вывода, т.к. иначе аварийного завершения не избежать.

Я попробовал в конец функции ВЫБ_СЧ добавить КОМАНДА_БЛАНКА("RECALC").
Так пересчитывает и ошибки не возникает.
Вроде решает поставленную задачу - функция выбора универсальная, от конкретного бланка не зависит.

пользователь
Регистрация: 17.06.2015

Я попробовал в конец функции ВЫБ_СЧ добавить КОМАНДА_БЛАНКА("RECALC").
Так пересчитывает и ошибки не возникает.

Ошибки-то нет, но в графу вывода ничего не подставляется. А в повторном вызове функции подставляется предыдущее значение.
Не решена задачка :( 

пользователь
Регистрация: 17.06.2015

Эврика! Общая переменная. Можно и аттрибут, но писанины больше.
Test.ibl
ПЕРЕМ ТИП_СТРОКА: кодвыбсч;
                         
ФУНКЦИЯ ТИП_ЛОГИКА: ВЫБ_СЧ(ПЕРЕМ ТИП_СТРОКА:х)
х=ВЫБОР_СЧЕТА(х,НЕТ); 
УСТ_АТРИБУТ("$пред_расч","ДА");
кодвыбсч=?(СЧЕТ_СУЩ(х),х,"");
КОМАНДА_БЛАНКА("RECALC");
ВЫБ_СЧ=СЧЕТ_СУЩ(х);
КОНЕЦ_ФУНКЦИИ
Формульный раздел
ИСПОЛЬЗОВАТЬ("Test");
Код_г_к=кодвыбсч; Код_г_к1=кодвыбсч; Код_г_к2=кодвыбсч;
папраз=АТРИБУТ("$пред_расч");
ЕСЛИ папраз="ДА" ТО УСТ_АТРИБУТ("$пред_расч",""); СООБЩЕНИЕ("Стоп"); СТОП; КОНЕЦ_ЕСЛИ
СООБЩЕНИЕ("Ок");

Спасибо за часть идеи) Может еще кому пригодиться.

модератор
Регистрация: 06.09.2007

Общая переменная.

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

Наиболее простым решением мне кажется добавление новой команды "DELAYED_RECALC", чтобы выбор в графе отработал до конца, а только потом происходил пересчет бланка.

Другая альтернатива - это добавить новую опцию для граф и событий "Пересчет бланка", которая будет перекрывать существующие 3 опции (Обновление бланка, ...).

пользователь
Регистрация: 17.06.2015

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

Согласен. 
Но, пока других решений нет, попробую через СПИСОК_АТРИБУТОВ("$",С), где каждая строка из 2-х частей: <название графы>разделитель<значение>    

модератор
Регистрация: 06.09.2007

Но, пока других решений нет, попробую через СПИСОК_АТРИБУТОВ("$",С), где каждая строка из 2-х частей: <название графы>разделитель<значение>   

Так можно выкрутиться благодаря функции ИМЯ_ГРАФЫ.