При переходе на новые релизы платформы 1С:Предприятие, в частности на ветку 8.3.16 (например, 8.3.16.1148), разработчики часто сталкиваются с неприятным поведением стандартных механизмов компоновки данных. Одной из наиболее критичных проблем является внезапный отказ работы расшифровки ресурсов в отчетах. Пользователь, как обычно, совершает двойной клик по ячейке, видит стандартное окно «Выбор поля», выбирает нужный разрез аналитики, но после этого ничего не происходит — окно просто закрывается, а новый отчет с детализацией не строится.
В рамках данной статьи мы подробно разберем, почему возникает этот «глюк», проанализируем технические причины сбоя на уровне платформы и рассмотрим несколько способов решения: от быстрого «костыля» до методологически верного подхода.
Для начала проанализируем ситуацию с технической точки зрения. В версии 8.3.16 компания 1С внесла существенные изменения в механизмы взаимодействия клиентского приложения и сервера при обработке расшифровки. Основная проблема кроется в асинхронности и управлении временными хранилищами.
Когда мы работаем с расшифровкой, платформа генерирует уникальный идентификатор (UUID) данных расшифровки и помещает их во временное хранилище. В проблемных релизах платформы при вызове стандартной функции ОткрытьФорму связь между родительским отчетом и вызываемой формой расшифровки может «теряться». Это происходит из-за некорректной обработки кэша метаданных или из-за того, что форма расшифровки не получает фокус и права на чтение данных из адреса расшифровки, переданного в параметрах.
Также стоит отметить, что в 8.3.16 усилилась чувствительность к свойству формы ДанныеРасшифровки. Если в схеме компоновки данных (СКД) не задано автозаполнение или программно не инициализированы параметры формы, стандартный механизм просто прерывает выполнение, считая, что данных для вывода нет.
Рассмотрим решение, предложенное участниками сообщества. Как выяснилось опытным путем, использование модального вызова формы заставляет платформу жестко фиксировать контекст выполнения и блокировать интерфейс, что «спасает» связь с данными расшифровки.
Разберем пример кода, который позволяет обойти проблему. Если стандартный вызов ОткрытьФорму перестал приносить результат, мы можем заменить его на ОткрытьФормуМодально. Рассмотрим, как подготовить структуру параметров для корректного формирования расшифровки:
ПараметрыФормы = ?(ДополнительныеПараметры = Неопределено, Новый Структура, ДополнительныеПараметры);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("КлючВарианта", Неопределено);
ПараметрыФормы.Вставить("ПредставлениеВарианта", "Расшифровка");
ПараметрыФормы.Вставить("Расшифровка", ОписаниеОбработкиРКД);
// Вместо неработающего в 8.3.16 ОткрытьФорму:
// ОткрытьФорму(ИмяОтчета + ".Форма.ФормаОтчетаУправляемая", ПараметрыФормы, , , , , , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
// Используем модальный вызов:
ОткрытьФормуМодально(ИмяОтчета + ".Форма.ФормаОтчетаУправляемая", ПараметрыФормы);
В данном примере ОписаниеОбработкиРКД — это структура или адрес во временном хранилище, содержащий данные для расшифровки. Важно понимать, что метод ОткрытьФормуМодально является устаревшим (deprecated). Мы крайне не рекомендуем использовать его как постоянное решение, так как он не будет работать в веб-клиенте при определенных настройках браузера и полностью заблокирован в мобильных решениях.
Проанализируем более корректный способ исправления. Ошибка в 8.3.16 часто связана с тем, что новая форма не понимает, в каком контексте она открывается. Чтобы исправить это без модальности, нам нужно в процедуре ОткрытьФорму явно передать владельца. Владельцем должна выступать форма, из которой инициирована расшифровка.
Посмотрим на пример правильного вызова:
// Третьим параметром передаем ЭтаФорма
ОткрытьФорму(ИмяОтчета + ".Форма.ФормаОтчетаУправляемая",
ПараметрыФормы,
ЭтаФорма, // Владелец
Истина, // Уникальность
,
,
,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
Когда мы передаем ЭтаФорма в качестве владельца, платформа связывает время жизни данных расшифровки во временном хранилище с временем жизни обеих форм. Это предотвращает преждевременную очистку данных, из-за которой окно «Выбор поля» могло закрываться впустую.
Иногда программный код абсолютно верен, но расшифровка все равно не работает. В релизе 8.3.16.1148 замечены случаи некорректного кэширования схем компоновки. Выясним, что нужно проверить в настройках самого отчета:
%AppData%\1C\1Cv8. Часто именно старые индексные файлы мешают корректной передаче UUID расшифровки между окнами.Подводя итог, можно сказать, что проблема неработающей расшифровки на платформе 8.3.16 — это результат совокупности факторов: ошибок в управлении памятью платформы и перехода на асинхронные модели работы.
Если вам нужно срочно вернуть работоспособность отчетности для пользователей, используйте способ с ОткрытьФормуМодально. Однако, если вы планируете долгосрочную поддержку системы и работу через веб-интерфейс, рассмотрите возможность перехода на немодальные вызовы с использованием ОписаниеОповещения и обязательной передачей владельца формы.
Помните, что расшифровка в СКД — это мощный инструмент аналитики, и его стабильная работа напрямую зависит от того, насколько корректно передаются ДанныеРасшифровки из текущего контекста в открываемое окно отчета. Регулярно проверяйте актуальность релизов платформы, так как компания 1С оперативно выпускает исправления для подобных критических ошибок в последующих патчах.