tormozit / RDT1C

Подсистема "Инструменты разработчика" для платформы 1С 8
http://devtool1c.ucoz.ru
88 stars 8 forks source link

Результат выполнения сохранённого снимка запроса не совпадает с реальным результатом выполнения его в модуле. #519

Closed agithubber2 closed 10 months ago

agithubber2 commented 11 months ago

Программное окружение

Платформа: 8.3.19.1770 Режим БД: клиент-серверный Конфигурация. Название: Зарплата и управление персоналом, редакция 3.0 (3.0.18.82) Конфигурация. Основной режим запуска: Управляемое приложение Конфигурация. Вариант встроенного языка: Русский Конфигурация. Режим управления блокировкой данных: Управляемый Конфигурация. Режим совместимости: Версия8_3_15 Конфигурация. Режим использования синхронных вызовов: Использовать Конфигурация. Версия БСП: 202 Конфигурация. Использовать обычные формы в управляемом приложении: Нет Инструменты разработчика. Версия: Расширение 6.90.2e Инструменты разработчика. Инструмент: Прочее Инструменты разработчика. Перехват клавиатурного ввода: Да Инструменты разработчика. Объекты на сервере: Да Инструменты разработчика. Асинхронность запрещена: Нет Инструменты разработчика. Разрешены имитаторы: Да Расширения. ИнструментыРазработчикаTormozit (6.90.2e) Клиент. Приложение: Управляемое приложение 64б Клиент. Проверка модальных вызовов: Нет Клиент. Язык интерфейса конфигурации: ru Клиент. Язык интерфейса системы: ru Клиент. Отладка разрешена: Да Клиент. Постоянный кэш метаданных: Да Клиент. ОС: Майкрософт Windows 10 Корпоративная LTSC 64-разрядная Русский Клиент. ОС от имени администратора: Нет Клиент. ОС выполнение BAT: Да Клиент. ОС Текущая кодовая страница: 866 Клиент-Сервер. Пинг: Локальный Сервер. ОС: Майкрософт Windows 10 Корпоративная LTSC 64-разрядная Русский Сервер. Процесс: 64б Сервер. Отладка: tcp

Воспроизведение проблемы При попытке отладить сохранённый для отладки снимок пакетного запроса получаю сообщение: "В обработчике "Перед выполнением запроса" размещен отключенный код по восстановлению незафиксированных изменений на момент снимка. При использовании в нем нефиксируемой транзакции созданные в ней временные таблицы будут недоступны." Во-первых, непонятно, что точно означает это предупреждение. Я его понял так, что разкомментировал и добавил к коду ниже: НачатьТранзакцию(); Для Каждого ИмитаторОбъекта Из Параметры._ОбъектыДанныхТранзакции Цикл ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); КонецЦикла; Команду : ЗафиксироватьТранзакцию(); При последующей попытке выполнить запрос, получаю сообщение об ошибке: "Значение не является значением объектного типа (Метаданные)", подробно это:

{ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(15679)}: ОбъектМД = НаборЗаписей.Метаданные(); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(14675)}: НаборЗаписейПослеЗагрузкиИзТаблицыЗначенийЛкс(Объект); {(6)}: ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(1230)}: Выполнить(_ТекстДляВыполнения); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирСервер.Модуль(418)}: Результат = ирОбщий.ВыполнитьАлгоритм(_ТекстДляВыполнения, _АлгоритмОбъект, _Режим, _П0, _П1, _П2, _П3, _П4, _П5, _П6, _П7, _П8, _П9); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(3503)}: ирСервер.ВыполнитьАлгоритм(ТекстДляВыполнения,,, СтруктураПараметров, СнимокЗапроса); {(1)}:КонтекстВыполнения.ВыполнитьЛокальноКодПередВыполнениемЗапроса(ТекстДляВыполнения, ЛиСинтаксическийКонтроль) {ИнструментыРазработчикаTormozit Обработка.ирПлатформа.МодульОбъекта(6830)}: ИнформацияОбОшибке = Вычислить("КонтекстВыполнения." + МетодВыполнения + "(ТекстДляВыполнения, ЛиСинтаксическийКонтроль)"); {ИнструментыРазработчикаTormozit Обработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(2900)}: мПлатформа.ВыполнитьПрограммныйКодВКонтексте(КонтекстВыполнения, МетодВыполнения, ТекстДляВыполнения, ЛиСинтаксическийКонтроль); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(7194)}: Результат = ПолеТекстаПрограммы.ВыполнитьПрограммныйКод(); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(1938)}: Если Не ВыполнитьОбработчикПередВыполнениемЗапроса() Тогда `

Если не разкомментировать код во вкладке "Перед вып. запроса", то запрос возвращает пустой результат, скорее всего, по причине того, что среди параметров запроса есть параметр "ВременныйРегистратор" со значением вида "НаборыЗаписей["Начисления"].Отбор.Регистратор.Значение)".

При этом в реальном модуле запрос возвращает другой непустой результат.

Ожидаемое поведение Как я понимаю, проблема как-то решена в Task #950712, но описание там слишком лаконично и не понятно, как именно пользоваться этим

tormozit commented 11 months ago

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

Задача https://www.hostedredmine.com/issues/950712 пытается решить часть таких проблем путем включения в снимок ссылочных объектов, на которые указывают параметры запроса, чтобы обеспечить в момент выполнения запроса точно те же состояния объектов, которые были в момент снимка.

Покажи параметры запроса и особенно подробно содержимое коллекции из параметра _ОбъектыДанныхТранзакции.

agithubber2 commented 11 months ago

Спасибо за ответ, вот все параметры (только параметр "Организация" стёр из соображений приватности): Screenshot_1

tormozit commented 11 months ago

Повторяю, нужен статус транзакции. При открытии снимка сделанного в транзакции, программа открывает анализ журнала регистрации, чтобы в частности его показать.

Пример изображение

Коллекцию _ОбъектыДанныхТранзакции нужно показать через исследователь, т.к. она содержит не редактируемые в полях ввода значения. Показал на видео https://github.com/tormozit/RDT1C/assets/11896251/9068846c-2667-426b-9b11-123eff359c46

agithubber2 commented 11 months ago

Screenshot_2

Screenshot_4

Screenshot_3

tormozit commented 11 months ago

На твоей картинке вместо одного из объектов отображается "Неопределено". Нашел возможную причину в коде. Исправлю. https://www.hostedredmine.com/issues/968836 После этого вероятно исчезнет ошибка "Значение не является значением объектного типа (Метаданные)"

agithubber2 commented 11 months ago

Молодчина! Спасибо!

tormozit commented 11 months ago

Исправлено в 6.91

agithubber2 commented 11 months ago

Приветствую. Поставил 6.91, но ошибка почему-то не исчезла.

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

Значение не является значением объектного типа (Метаданные) {ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(15757)}: ОбъектМД = НаборЗаписей.Метаданные(); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(14753)}: НаборЗаписейПослеЗагрузкиИзТаблицыЗначенийЛкс(Объект); {(6)}: ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(1247)}: Выполнить(_ТекстДляВыполнения); {ИнструментыРазработчикаTormozit ОбщийМодуль.ирСервер.Модуль(418)}: Результат = ирОбщий.ВыполнитьАлгоритм(_ТекстДляВыполнения, _АлгоритмОбъект, _Режим, _П0, _П1, _П2, _П3, _П4, _П5, _П6, _П7, _П8, _П9); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(3504)}: ирСервер.ВыполнитьАлгоритм(ТекстДляВыполнения,,, СтруктураПараметров, СнимокЗапроса); {(1)}:КонтекстВыполнения.ВыполнитьЛокальноКодПередВыполнениемЗапроса(ТекстДляВыполнения, ЛиСинтаксическийКонтроль) {ИнструментыРазработчикаTormozit Обработка.ирПлатформа.МодульОбъекта(6905)}: ИнформацияОбОшибке = Вычислить("КонтекстВыполнения." + МетодВыполнения + "(ТекстДляВыполнения, ЛиСинтаксическийКонтроль)"); {ИнструментыРазработчикаTormozit Обработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(2913)}: мПлатформа.ВыполнитьПрограммныйКодВКонтексте(КонтекстВыполнения, МетодВыполнения, ТекстДляВыполнения, ЛиСинтаксическийКонтроль); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(7195)}: Результат = ПолеТекстаПрограммы.ВыполнитьПрограммныйКод(); {ИнструментыРазработчикаTormozit Обработка.ирКонсольЗапросов.Форма.Форма.Форма(1939)}: Если Не ВыполнитьОбработчикПередВыполнениемЗапроса() Тогда

Скрины все аналогичны предыдущим, только отличие ниже: Screenshot_1

Кстати, до меня дошло, что означало предупреждение ИР: что на момент снимка была активна транзакция, и что если в этой транзакции были созданы/изменены некие объекты, которые использованы в запросе для снимка, и после снимка где-то в коде транзакция была отменена, то результат запроса снимка потом, естественно, будет другим. При этом, ИР, естественно, не может знать наперёд, была ли транзакция зафиксирована после в коде, или нет, поэтому код в обработчике "Перед выполнением" закомментирован. Естественно, нужно просто разкомментировать этот код, и никакая моя доп. команда типа "Зафиксировать транзакцию " здесь абсолютно не нужна.

tormozit commented 11 months ago

Вижу что из массива пропало значение "Неопределено", как я и обещал. Так что мое исправление этой проблемы работает. Но получается она не являлась причиной ошибки "Значение не является значением объектного типа (Метаданные)".

tormozit commented 11 months ago

Нужен текст обработчика "Перед выполнением запроса"

agithubber2 commented 11 months ago

Текст обработчика, который я разкоммнтил: НачатьТранзакцию(); Для Каждого ИмитаторОбъекта Из Параметры._ОбъектыДанныхТранзакции Цикл ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); КонецЦикла;

Стек вызовов, на всякий случай: Screenshot_2

Код, где ошибка: на последней строке, потому что параметр "НаборЗаписей" имеет значение Неопределено: Screenshot_3

tormozit commented 11 months ago

Добавь в обработчике в начале цикла "Сообщить(ИмитаторОбъекта)" и покажи сообщения

agithubber2 commented 11 months ago

Код: НачатьТранзакцию(); Для Каждого ИмитаторОбъекта Из Параметры._ОбъектыДанныхТранзакции Цикл Сообщить(ИмитаторОбъекта); ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); КонецЦикла;

Но сообщения никакого нет: Screenshot_4

tormozit commented 11 months ago

Ошибку воспроизвел.

tormozit commented 11 months ago

Проблема в том, что у тебя включен режим "На сервере". В этом режиме сложные параметры пока не умеют мигрировать. Поэтому очищаются. Теперь проблема понятна.

agithubber2 commented 11 months ago

Точку останова поставил в самом начале Процедура ЗаписатьОбъектЛкс: Сразу на входе в эту проц. Объект - уже Неопределено: Screenshot_5

tormozit commented 11 months ago

Пока отожми кнопку "На сервере" и ошибка уйдет.

agithubber2 commented 11 months ago

Кнопку отжал, ошибка исчезла, Сообщить везде сообщает Screenshot_6

Но результат запроса пустой, как если бы обработчика "Перед выполнением" не было вообще.

tormozit commented 11 months ago

Создал задачу https://www.hostedredmine.com/issues/968852

tormozit commented 11 months ago

Исправлено в 6.92

agithubber2 commented 11 months ago

Доброе утро! Мне кажется, ничего не исправлено: в смысле, я по-прежнему получаю точно тот же (пустой) результат выполнения снимка, хотя в реальном модуле результат запроса совсем другой. Единственное отличие - это то, что я получаю сообщение "Обработчик перед выполнением запроса выполнен на клиенте из-за наличия сложного параметра _ОбъектыДанныхТранзакции", которое , возможно, объясняет мне, почему пустой результат, но хотелось бы именно непустой результат.

tormozit commented 11 months ago

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

agithubber2 commented 11 months ago

Это понятно. Но тогда, значит, я был прав, когда в телеграм-чате технической поддержки ИР (кстати, я прошу прощения, если был несдержан и слишком категоричен), когда я говорил, что ИР не позволяет отлаживать (многие) запросы из именно ЗУП! Или я что-то не так понимаю??

tormozit commented 11 months ago

Сделаю еще сохранение движений документов https://www.hostedredmine.com/issues/969199 Но опять же это лишь шаг в очень длинном пути приближения к созданию снимка всех измененных в транзакции данных.

agithubber2 commented 11 months ago

Отличная новость, спасибо! На мой субъективный взгляд, это самое насущное , полезное и перспективное направление развития замечательного пакета ИР, которое сделало бы ИР подлинным лидером на рынке средств разработки для 1с!

tormozit commented 11 months ago

Сделано в 6.94

agithubber2 commented 11 months ago

Сергей, доброе утро! Пока есть, наверно, какая-то ошибка, получаю в отладчике: Screenshot_1

tormozit commented 11 months ago

Еще бы текст ошибки

agithubber2 commented 11 months ago

Ошибка на команду в отладчике "ирОбщий.От(Запрос)":

{ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(26645)}: Значение не является значением объектного типа (Движения)  

Функции "ИнформацияОбОшибке()", "ПодробноеПредставлениеОшибки" - все возвращают пустые значения:

Screenshot_1

tormozit commented 11 months ago

Ошибку воспроизвел https://www.hostedredmine.com/issues/969324

tormozit commented 10 months ago

Исправлено в 6.94.2

agithubber2 commented 10 months ago

Ура! Работает!! Класс!! Сергей, молодчина!! Твои Инструменты Разработчика - безусловно! - ЛИДЕР на рынке средств разработки для 1С!