Как правильно проверить наличие свойства JavaScript-объекта из кода 1С и избежать ошибок

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в 1С с использованием Поля HTML документа программисты часто сталкиваются с необходимостью передавать данные между встроенным языком 1С и JavaScript. Одной из самых распространенных проблем является обращение к свойству объекта, которое еще не инициализировано или вовсе отсутствует. В таких случаях 1С может выбросить исключение «Поле объекта не обнаружено», а выполнение скрипта прервется. Использование конструкции Попытка...Исключение в коде 1С считается «плохим тоном», если ситуацию можно обработать логически. В этой статье мы разберем, как элегантно и надежно проверять существование реквизитов объектов JavaScript.

Анализируем проблему: почему возникает ошибка?

Когда мы обращаемся к parentWindow или напрямую к объектам на странице через Документ.defaultView, платформа 1С выступает в роли моста. Если вы обращаетесь к Объект.Свойство, и Объект равен undefined или null в контексте JS, COM-интерфейс (в случае старого движка Internet Explorer) или движок Chromium сразу сигнализируют об ошибке доступа. Нам необходимо убедиться, что вся цепочка объектов существует, прежде чем считывать конечное значение.

Способ 1. Использование тернарного оператора в 1С

Если мы работаем на стороне 1С и уже получили ссылку на некий объект из JavaScript, самым простым способом будет использование встроенной функции ?(). Это позволяет избежать обращения к свойству, если сам объект не определен. Проанализируем пример кода:


// Предположим, j — это объект, полученный из JS
// Нам нужно безопасно получить значение свойства k
Результат = ?(j = Неопределено, Неопределено, j.k);

Этот метод хорош для простых проверок, но у него есть ограничение: если j существует, а k — нет, 1С все равно может выдать ошибку при попытке обращения к j.k. Поэтому для глубокой проверки этот метод нужно комбинировать с логикой на стороне JS.

Способ 2. Проверка на стороне JavaScript через оператор &&

Рассмотрим более продвинутый подход. Мы можем делегировать проверку самому движку JavaScript, используя логическое «И» (&&). В JS это выражение возвращает первое «ложное» значение или последнее «истинное».


// В коде JavaScript
var i = j && j.k;

Как это работает? Если j не существует (равно null или undefined), выполнение остановится на первом операнде, и переменная i получит значение undefined. Если j есть, JS попробует взять j.k. В 1С при вызове через Вычислить() (или Evaluate) вы получите либо значение свойства, либо Неопределено, что не вызовет падения системы.

Способ 3. Современный подход: Опциональная цепочка (Optional Chaining)

Если ваша конфигурация работает на современных версиях платформы (8.3.14+), где используется движок Chromium, вы можете использовать синтаксис ECMAScript 2020. Это максимально лаконичный способ:


// Синтаксис ?. позволяет не проверять каждый уровень вложенности вручную
var index = polygon?.properties?.index;

Если хотя бы один элемент в цепочке (polygon или properties) отсутствует, выражение просто вернет undefined, не вызывая ошибку ReferenceError. Это идеальный вариант для работы с индексами полигонов или другими динамическими данными на картах.

Способ 4. Использование оператора in и hasOwnProperty

Выясним причину, по которой иногда недостаточно просто проверить на undefined. В JS свойство может существовать, но быть равным null или 0. Если нам принципиально знать, определено ли поле в принципе, лучше использовать оператор in.

Разберем, как это реализовать через метод ВыполнитьСценарий в 1С:


СкриптПроверки = "function checkProp(objName, propName) {
|    var obj = window[objName];
|    if (obj && propName in obj) {
|        return true;
|    }
|    return false;
|}";
Элементы.ПолеHTML.ВыполнитьСценарий(СкриптПроверки);
Существует = Элементы.ПолеHTML.Вычислить("checkProp('myPolygon', 'index')");

Если Существует Тогда
    // Теперь обращение безопасно
    Значение = Элементы.ПолеHTML.Документ.defaultView.myPolygon.index;
КонецЕсли;

Способ 5. Сериализация в JSON (самый стабильный метод)

Проанализируем ситуацию: вам нужно передать из JavaScript в 1С сложный объект со множеством свойств. Вместо того чтобы проверять каждое свойство через parentWindow, гораздо надежнее превратить объект в строку на стороне JS и разобрать её в 1С.

Шаги реализации:

  1. На стороне JavaScript преобразуем объект в строку: JSON.stringify(myObject).
  2. Передаем эту строку в 1С (например, через скрытое поле или как результат функции).
  3. В 1С используем штатные средства работы с JSON.

// На стороне 1С
СтрокаJSON = Элементы.ПолеHTML.Вычислить("JSON.stringify(polygon)");
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеОбъекта = ПрочитатьJSON(ЧтениеJSON);

// Теперь мы работаем со Структурой 1С
Если ДанныеОбъекта.Свойство("index") Тогда
    Сообщить("Индекс полигона: " + ДанныеОбъекта.index);
КонецЕсли;

Преимущество этого метода: Метод Свойство() у структуры 1С никогда не вызывает критических ошибок. Вы полностью защищены от особенностей движков Internet Explorer или Chromium.

Важные технические нюансы

Рассмотрим подробнее различия в поведении платформ:

Подводя итог, можно сказать: наиболее профессиональным подходом является проверка наличия данных на стороне JavaScript (используя && или ?.) и возврат в 1С либо готового значения, либо специального флага. Это делает код чистым, избавляет от громоздких конструкций Попытка...Исключение и обеспечивает стабильную работу интерфейса вашей программы.

← На главную