Closed agithubber2 closed 10 months ago
Начать надо с выяснения статуса транзакции, в которой делался снимок. Далее нужно понять, что в общем случае выявить, поместить в снимок и затем воссоздать все данные базы, влияющие на результат запроса - может быть очень сложно. Однако в подавляющем большинстве случаев это удается сделать. Ощутимая сложность возникает в транзакциях, особенно незафиксированных, т.к. в них образуется много свежих и часто нефинализированных на момент создания снимка данных. Такие данные почти сразу после снимка могут дозаписаться или откатиться.
Задача https://www.hostedredmine.com/issues/950712 пытается решить часть таких проблем путем включения в снимок ссылочных объектов, на которые указывают параметры запроса, чтобы обеспечить в момент выполнения запроса точно те же состояния объектов, которые были в момент снимка.
Покажи параметры запроса и особенно подробно содержимое коллекции из параметра _ОбъектыДанныхТранзакции.
Спасибо за ответ, вот все параметры (только параметр "Организация" стёр из соображений приватности):
Повторяю, нужен статус транзакции. При открытии снимка сделанного в транзакции, программа открывает анализ журнала регистрации, чтобы в частности его показать.
Пример
Коллекцию _ОбъектыДанныхТранзакции нужно показать через исследователь, т.к. она содержит не редактируемые в полях ввода значения. Показал на видео https://github.com/tormozit/RDT1C/assets/11896251/9068846c-2667-426b-9b11-123eff359c46
На твоей картинке вместо одного из объектов отображается "Неопределено". Нашел возможную причину в коде. Исправлю. https://www.hostedredmine.com/issues/968836 После этого вероятно исчезнет ошибка "Значение не является значением объектного типа (Метаданные)"
Молодчина! Спасибо!
Исправлено в 6.91
Приветствую. Поставил 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)}: Если Не ВыполнитьОбработчикПередВыполнениемЗапроса() Тогда
Скрины все аналогичны предыдущим, только отличие ниже:
Кстати, до меня дошло, что означало предупреждение ИР: что на момент снимка была активна транзакция, и что если в этой транзакции были созданы/изменены некие объекты, которые использованы в запросе для снимка, и после снимка где-то в коде транзакция была отменена, то результат запроса снимка потом, естественно, будет другим. При этом, ИР, естественно, не может знать наперёд, была ли транзакция зафиксирована после в коде, или нет, поэтому код в обработчике "Перед выполнением" закомментирован. Естественно, нужно просто разкомментировать этот код, и никакая моя доп. команда типа "Зафиксировать транзакцию " здесь абсолютно не нужна.
Вижу что из массива пропало значение "Неопределено", как я и обещал. Так что мое исправление этой проблемы работает. Но получается она не являлась причиной ошибки "Значение не является значением объектного типа (Метаданные)".
Нужен текст обработчика "Перед выполнением запроса"
Текст обработчика, который я разкоммнтил:
НачатьТранзакцию(); Для Каждого ИмитаторОбъекта Из Параметры._ОбъектыДанныхТранзакции Цикл ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); КонецЦикла;
Стек вызовов, на всякий случай:
Код, где ошибка: на последней строке, потому что параметр "НаборЗаписей" имеет значение Неопределено:
Добавь в обработчике в начале цикла "Сообщить(ИмитаторОбъекта)" и покажи сообщения
Код: НачатьТранзакцию(); Для Каждого ИмитаторОбъекта Из Параметры._ОбъектыДанныхТранзакции Цикл Сообщить(ИмитаторОбъекта); ирОбщий.ЗаписатьОбъектЛкс(ИмитаторОбъекта,,,, Истина, Истина, Истина, Истина); КонецЦикла;
Но сообщения никакого нет:
Ошибку воспроизвел.
Проблема в том, что у тебя включен режим "На сервере". В этом режиме сложные параметры пока не умеют мигрировать. Поэтому очищаются. Теперь проблема понятна.
Точку останова поставил в самом начале Процедура ЗаписатьОбъектЛкс:
Сразу на входе в эту проц. Объект - уже Неопределено:
Пока отожми кнопку "На сервере" и ошибка уйдет.
Кнопку отжал, ошибка исчезла, Сообщить везде сообщает
Но результат запроса пустой, как если бы обработчика "Перед выполнением" не было вообще.
Создал задачу https://www.hostedredmine.com/issues/968852
Исправлено в 6.92
Доброе утро! Мне кажется, ничего не исправлено: в смысле, я по-прежнему получаю точно тот же (пустой) результат выполнения снимка, хотя в реальном модуле результат запроса совсем другой. Единственное отличие - это то, что я получаю сообщение "Обработчик перед выполнением запроса выполнен на клиенте из-за наличия сложного параметра _ОбъектыДанныхТранзакции", которое , возможно, объясняет мне, почему пустой результат, но хотелось бы именно непустой результат.
В самом первом ответе я кажется подробно объяснил почему результат может отличаться. Самая частая причина - незафиксированные изменения в регистрах.
Это понятно. Но тогда, значит, я был прав, когда в телеграм-чате технической поддержки ИР (кстати, я прошу прощения, если был несдержан и слишком категоричен), когда я говорил, что ИР не позволяет отлаживать (многие) запросы из именно ЗУП! Или я что-то не так понимаю??
Сделаю еще сохранение движений документов https://www.hostedredmine.com/issues/969199 Но опять же это лишь шаг в очень длинном пути приближения к созданию снимка всех измененных в транзакции данных.
Отличная новость, спасибо! На мой субъективный взгляд, это самое насущное , полезное и перспективное направление развития замечательного пакета ИР, которое сделало бы ИР подлинным лидером на рынке средств разработки для 1с!
Сделано в 6.94
Сергей, доброе утро! Пока есть, наверно, какая-то ошибка, получаю в отладчике:
Еще бы текст ошибки
Ошибка на команду в отладчике "ирОбщий.От(Запрос)":
{ИнструментыРазработчикаTormozit ОбщийМодуль.ирОбщий.Модуль(26645)}: Значение не является значением объектного типа (Движения)
Функции "ИнформацияОбОшибке()", "ПодробноеПредставлениеОшибки" - все возвращают пустые значения:
Ошибку воспроизвел https://www.hostedredmine.com/issues/969324
Исправлено в 6.94.2
Ура! Работает!! Класс!! Сергей, молодчина!! Твои Инструменты Разработчика - безусловно! - ЛИДЕР на рынке средств разработки для 1С!
Программное окружение
Платформа: 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, но описание там слишком лаконично и не понятно, как именно пользоваться этим