При работе с программными продуктами «1С:Предприятие» в веб-клиенте пользователи и разработчики иногда сталкиваются с нетипичными ошибками JavaScript, которые прерывают работу интерфейса. Одной из наиболее резонансных проблем в последних версиях платформы (8.3.24.1342, 8.3.24.1586, 8.3.25.1336 и др.) стала ошибка "Cannot set properties of undefined (setting 'j')". Давайте подробно разберем, почему она возникает и какими способами ее можно устранить или обойти.
Проанализируем ситуацию: ошибка проявляется исключительно в браузере (веб-клиент) при попытке открыть форму отчета или обработки, содержащую элемент управления Табличный документ. Как правило, этот документ связан с КомпоновщикомНастроек системы компоновки данных (СКД).
Техническая причина кроется в критическом баге внутреннего JavaScript-движка платформы 1С. В обфусцированном коде клиентской части (файл 1c-clnt.js) переменная (в данном случае обозначенная как j) пытается получить доступ к объекту, который еще не был инициализирован в DOM-дереве браузера. Это происходит из-за рассинхронизации процессов отрисовки формы и выполнения скриптов платформы, отвечающих за привязку данных СКД к визуальному полю табличного документа. Ошибка особенно часто проявляется в браузерах на движке Chromium (Google Chrome, Яндекс.Браузер, Microsoft Edge).
Дополнительно стоит отметить, что версии платформы, в которых замечена эта ошибка, часто имеют проблемы с механизмом Тестирования и Исправления (ТИИ), который может аварийно завершаться при проверке логической целостности регистров расчета.
Если конфигурацию необходимо эксплуатировать здесь и сейчас, а обновить платформу нет возможности, рассмотрим наиболее эффективный обходной путь. Проблема возникает при попытке отобразить ТабличныйДокумент непосредственно на форме. Чтобы избежать этого, мы можем выводить результат отчета в отдельное окно.
Разберем реализацию этого метода. Вместо использования реквизита формы, связанного с элементом управления, мы создаем новый объект ТабличныйДокумент в коде и вызываем его отображение программно. Посмотрим на пример кода:
// Пример программного вывода отчета во внешнее окно
&НаКлиенте
Процедура СформироватьОтчет(Команда)
ТабДок = Новый ТабличныйДокумент;
СформироватьОтчетНаСервере(ТабДок);
// Используем метод Показать вместо отображения на форме
ТабДок.ТолькоПросмотр = Истина;
ТабДок.Показать("Результат отчета");
КонецПроцедуры
При таком подходе платформа формирует отчет в отдельном всплывающем окне браузера, что позволяет избежать обращения к некорректно инициализированным свойствам элементов основной формы.
Проанализируем стабильность релизов. Если использование метода Показать() неудобно для пользователей, единственным надежным решением будет использование более ранней, стабильной версии платформы. Практика показывает, что откат до версии 8.3.23.1688 полностью устраняет проблему, так как в этой ветке механизмы рендеринга веб-клиента работают иначе.
Важно: Перед откатом платформы обязательно убедитесь, что режим совместимости вашей конфигурации позволяет работать на версии 8.3.23, и что новые механизмы (если они использовались) не будут нарушены.
Фирма «1С» зарегистрировала данную проблему (например, под номером 00188610). Если вы столкнулись с этой ошибкой, необходимо проверить наличие свежих обновлений в ветках 8.3.24 и 8.3.25.
Рассмотрим версии, в которых ожидается или уже внесено исправление:
В некоторых случаях удается «обмануть» скрипты платформы, изменив структуру формы. Попробуем выполнить следующие действия:
КомпоновщикаНастроек попробуйте изменить состояние флага "Использовать всегда" (в некоторых случаях снятие или, наоборот, установка этого флага меняет порядок инициализации объектов в веб-клиенте).Мы выяснили, что ошибка setting 'j' является следствием недоработки в коде платформы 1С. Если вы не можете оперативно обновить платформу до исправленных версий (8.3.24.1667+ или 8.3.25.1764+), наиболее стабильным «костылем» будет программный вывод отчета через ТабДок.Показать(). Это позволит пользователям продолжать работу в веб-клиенте без фатальных ошибок JavaScript.