infostart-hub / toolkit

Infostart Toolkit
https://infostart.ru/marketplace/toolkit/
73 stars 7 forks source link

Ошибка при работе конструктора с пустым запросом #465

Closed d-hurricane closed 2 years ago

d-hurricane commented 2 years ago

Описание ошибки При работе конструктора запроса с пустым запросом иногда падает платформа. Ситуации, когда может возникнуть падение:

Текст ошибки:

{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"

Ошибка воспроизводится как в улучшенном конструкторе запроса, так и в штатном тонкого клиента.

Окружение: Infostart Toolkit PROF 2.3.0

Платформа: 8.3.17.1989 (Linux x86-64) Режим БД: клиент-серверный

Конфигурация: Управление нашей фирмой, редакция 1.6 (1.6.25.236) Основной режим запуска: Управляемое приложение Режим совместимости: Версия8_3_16 Версия БСП: 3.1.4.368

Клиент: ОС: Windows x86-64 (Microsoft Windows 10 version 10.0 (Build 17763)) Язык: ru Режим запуска: Управляемое приложение

d-hurricane commented 2 years ago

Есть подозрение, что это проблема сериализации/десериализации объекта СхемаЗапроса, которая содержит пустой текст запроса. Мне удалось воспроизвести эту проблему на следующем примере (платформа 8.3.17.1989):

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()

    Если ПустаяСтрока(АдресСхемы) Тогда
        Схема = Новый СхемаЗапроса;
        АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
    Иначе
        Схема = ПолучитьИзВременногоХранилища(АдресСхемы);
    КонецЕсли;

КонецПроцедуры

Здесь при первом нажатии на кнопку схема помещается во временное хранилище формы, при повторном - извлекается. И непосредственно при попытке извлечения платформа падает. Возможно, тут еще важную роль играет передача управления с клиента на сервер и обратно.

d-hurricane commented 2 years ago

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

  1. Сгенерировать при начале работы с конструктором какой-нибудь уникальный запрос, например так: УникальныйЗапрос = СтрШаблон("ВЫБРАТЬ ""%1""", Новый УникальныйИдентификатор)
  2. Во всех местах, где схема помещается в хранилище проверить, не пустой ли у нее текст запроса. И если пустой, то перед помещением установить УникальныйЗапрос.
  3. Во всех местах извлечения схемы из хранилища проверять, не равен ли текст запроса уникальному. И если так, очищать после получения схемы ее текст запроса.
Evg-lylyk commented 2 years ago

Не удается воспроизвести Насколько я знаю это непонятная проблема с кэшем и подобное, наталкивался иногда, но стабильно она не воспроизводится