Application Error в БД_РЕДАКТОР при использовании обработчиков "Фильтр" и "Сортировка"
При работе с функцией БД_РЕДАКТОР через ВЫРАЖЕНИЕ при клике на кнопки "Фильтр" и "Сортировка" получаем "Application Error" (см. рис.) и программа снимается. Версия 8.880. Вариант 1 работает, варианты 2 и 3 нет как в компиляторе, так и в интерпретаторе.
Пример:
//ОПЕРАЦИЯ Тесты: БД_РЕДАКТОР <__bd_redaktar>
ОПЕРАЦИЯ Тесты: БД_РЕДАКТОР
ВЫЧИСЛИТЬ
ИСПОЛЬЗОВАТЬ("Common","Edit.ibl");
// Вариант 1.
Д=SQL_ОТКРЫТЬ("RSJK010_KANTR.DB");
н=БД_РЕДАКТОР(Д,"Арганiзацыi",[*"KOD":"Код":10,"NAZVA_MV4":"Наименование":50],1,ДА,ДА,ДА,ДА,[Ф: ("Edit","PAMN001_Ф")]);
Д.ЗАКРЫТЬ;
// Вариант 2.
загр="Организации";
Д=SQL_ОТКРЫТЬ("RSJK010_KANTR.DB");
СОЗДАТЬ(С,ТИП_СПИСОК);
С.ДОБАВИТЬ("БД_РЕДАКТОР(ДАВ,ЗАГ,[");
С.ДОБАВИТЬ("*""KOD"":""Код"":10,");
С.ДОБАВИТЬ("""NAZVA_MV4"":""Наименование"":50");
С.ДОБАВИТЬ("],1,ДА,ДА,ДА,ДА");
С.ДОБАВИТЬ(",[Ф: (""Edit"",""PAMN001_Ф"")]");
С.ДОБАВИТЬ(")");
//нн=ВЫБОР(С,"","",150,1,ДА,НЕТ,НЕТ,ДА);
ОПРЕДЕЛИТЬ("Common"); ОПРЕДЕЛИТЬ("Edit"); ОПРЕДЕЛИТЬ("ДАВ",Д); ОПРЕДЕЛИТЬ("ЗАГ",загр); Ок=ВЫРАЖЕНИЕ(С,н);
Д.ЗАКРЫТЬ;
// Вариант 3.
загр="Организации";
Д=SQL_ОТКРЫТЬ("RSJK010_KANTR.DB");
рр="БД_РЕДАКТОР(ДАВ,ЗАГ,[*""KOD"":""Код"":10,""NAZVA_MV4"":""Наименование"":50],1,ДА,ДА,ДА,ДА,[Ф: (""Edit"",""PAMN001_Ф"")])"; ОТЛАДКА(рр);
ОПРЕДЕЛИТЬ("Common"); ОПРЕДЕЛИТЬ("Edit"); ОПРЕДЕЛИТЬ("ДАВ",Д); ОПРЕДЕЛИТЬ("ЗАГ",загр); Ок=ВЫРАЖЕНИЕ(рр,н);
Д.ЗАКРЫТЬ;
КОНЕЦ
// "Edit.ibl":
ФУНКЦИЯ ТИП_SQL ТИП_ЛОГИКА: PAMN001_Ф(ПЕРЕМ ТИП_СТРОКА:заг)
ИСПОЛЬЗОВАТЬ("Common");
ОТЛАДКА("заг="+заг); заг="Новый заголовок";
PAMN001_Ф=ДА;
КОНЕЦ_ФУНКЦИИ
- 85 просмотров
Здравствуйте!
Ваше сообщение подтвердилось.
В функции ВЫРАЖЕНИЕ вызов любых методов ТИП_БД, ТИП_SQL и ТИП_ФАЙЛ приводит к аварийному завершению.
Минимальный пример:
[code] бд0 = SQL_ОТКРЫТЬ("test.dbf") ОПРЕДЕЛИТЬ("бд", бд0) текст = "" успех = ВЫРАЖЕНИЕ("бд.ФАЙЛ", текст) [/code]
Исправление войдет в октябрьскую версию платформы 8.8105.
P.S. Подозреваю, что вызов БД_РЕДАКТОР через функцию ВЫРАЖЕНИЕ выполняется для динамического формирования списка столбцов.
В современном Инфо-Бухгалтере 8 есть для этого специальное семейство функций, в частности БД_ДОБАВИТЬ_СТОЛБЕЦ. Добавлены эти функции были в 2020 году в версии 8.849. При использовании этого относительно нового механизма необходимость в вызове через ВЫРАЖЕНИЕ отпадет.
День добрый!
Спасибо за ответ!
Вне всяких подозрений:) Действительно вызов через ВЫРАЖЕНИЕ используется для динамического формирования, но не только столбцов, а и режимов редактирования, обработчиков событий и дополнительных параметров, которые, к сожалению, задаются в явном виде.
Еще в середине нулевых я ушел от использования БД_РЕДАКТОР в формульных разделах написанием универсальных браузеров ibx c фильтрацией, многоуровневостью и т.п. для каждой БД, которые вызывались через единственную функцию с соответствующими параметрами.
Лет 6 назад мне надоело писать процедуры ibx для инициализации и браузеров для каждой новой БД. Я реализовал идею единых инициализации и браузера для всех БД, с сохранением параметров и структуры БД в 2-х таблицах. Теперь для создания, изменения структуры БД достаточно внести ее в список баз данных с описанием индекса, многоуровневости, обработчиков для каждого уровня, сортировки, специальных обработчиков событий, предпроцессорами обработки данных, а также описать поля со всеми параметрами и функциями выбора в другой таблице. И здесь без "ВЫРАЖЕНИЕ" никак не обойтись. Напрягает только то, что выполнение происходит в режиме интрепретатора.
С нетерпением жду новую версию.
P.S. Есть у меня еще функция динамической настройки вида браузера во время редактирования (видимость, размеры, доступность полей). Реализовано коряво: через кнопку "ОК" в особом режиме задаваемом в определениях. Было бы замечательно добавить обработчик с кнопкой "Настройка" (аналогично "Фильтр") или в контекстное меню.
А в чем проблема? Вызов единственной функции (БД_РЕДАКТОР) происходит быстро и в режиме интерпретатора, и в режиме компилятора. Какие-то ресурсы тратятся на подключение библиотек через ОПРЕДЕЛИТЬ, но на современных компьютерах о этом можно забыть.
Сейчас большой сегмент IT плотно использует питон, который по сути интерпретируемый язык. В науке, робототехнике, машинном обучении и биг дата - это сейчас язык номер один. Цена вопроса об интерпретаторах сильно упала с ростом производительности железа.
Проблема только в размере индекса для индексных переменных и использовании операторов ВЫБОР ( ) # :ИНАЧЕ КОНЕЦ_ВЫБОРА, СБРОС и т.п. Приходится переписывать часть кода или создавать подобный функционал для интерпретатора.
Да, такие ограничения есть.
По сути в интерпретаторе нет индексной переменной как отдельной сущности.
Имя переменной просто склеивается: ц!1 и ц1 - это одна и та же переменная.