Как адаптировать код при обновлении платформы 1С: ФормаКлиентскогоПриложения и ПриАктивизацииОбласти?

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

При обновлении платформы 1С:Предприятие на версии 8.3.14, 8.3.16 и выше многие разработчики сталкиваются с внезапными ошибками в уже существующем и годами работающем коде. Разберем по шагам, почему привычные конструкции перестают функционировать, проанализируем ситуацию с переименованием базовых типов и выясним, как правильно адаптировать конфигурацию под новые требования фирмы «1С».

Почему перестал работать старый код с проверкой типа формы?

Рассмотрим подробнее типичную ситуацию, с которой начинается большинство проблем при обновлении платформы. В старом коде часто можно было встретить конструкцию, которая определяла контекст выполнения и проверяла, является ли текущая форма управляемой, опираясь на строковое представление типа:


ФормаУправляемая = ?(Строка(Форма) = "УправляемаяФорма", Истина, Ложь);
ЭлементыФормы = ?(ФормаУправляемая, Форма.Элементы, Форма.ЭлементыФормы);

Начиная с версии платформы 8.3.14, этот код ломается. Выясним причину: фирма «1С» официально переименовала тип УправляемаяФорма в ФормаКлиентскогоПриложения. Старое название было сохранено исключительно для обратной совместимости, однако оно теперь помечено как устаревшее (Deprecated).

Функция Строка() всегда возвращает актуальное системное представление типа. Теперь для управляемой формы она возвращает строку "ФормаКлиентскогоПриложения". Соответственно, условие Строка(Форма) = "УправляемаяФорма" начинает возвращать ложь, и логика приложения отрабатывает некорректно. Различные анализаторы кода (например, BSL Language Server или SonarQube) также начнут выдавать предупреждение, если увидят в коде упоминание устаревшего типа.

Как правильно переписать проверку типа в 1С

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

Официально рекомендуемый подход — использование функций ТипЗнч() и Тип(). Посмотрим на пример корректного решения, которое не сломается при последующих обновлениях платформы:


// Правильная проверка типа без привязки к строковому представлению
ФормаУправляемая = (ТипЗнч(Форма) = Тип("ФормаКлиентскогоПриложения"));
ЭлементыФормы = ?(ФормаУправляемая, Форма.Элементы, Форма.ЭлементыФормы);

Такой подход гарантирует, что платформа сравнит именно внутренние идентификаторы типов, а не их пользовательские строковые описания. Если вам необходимо проверить тип документа или справочника, также всегда используйте функцию Тип():


Если ТипОснования = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
    // Выполняем действия
КонецЕсли;

Проблема с обработчиком ПриАктивизацииОбласти

Разберем еще одно важное изменение, которое принесла платформа 8.3.14. Изменения коснулись не только глобальных типов, но и обработчиков событий элементов формы. В частности, обработчик расширения поля формы табличного документа, который ранее назывался ПриАктивизацииОбласти, был официально переименован в ПриАктивизации.

Если в ваших формах была прописана логика на выделение ячеек табличного документа, после обновления она просто перестанет вызываться, так как платформа будет искать процедуру с новым именем. Чтобы это исправить, нам потребуется выполнить массовую замену:

  1. Откройте конфигуратор и запустите глобальный поиск по всей конфигурации.
  2. Найдите все вхождения слова ПриАктивизацииОбласти.
  3. Переименуйте эти процедуры в модулях форм на ПриАктивизации.
  4. Важно: убедитесь, что в свойствах самого элемента формы (в палитре свойств) событие также привязано к новому имени процедуры. Зачастую платформа делает это автоматически при обновлении метаданных, но ручная проверка обязательна.

Влияние свойства «Режим совместимости»

Рассмотрим важный нюанс: почему у некоторых разработчиков после установки платформы 8.3.16 старый код продолжает работать, а у других сразу ломается? Ответ кроется в настройке конфигурации «Режим совместимости».

Все перечисленные изменения (и новые имена типов, и новые обработчики) активируются платформой только в тот момент, когда свойство «Режим совместимости» переключается на версию «8.3.14» и выше, либо устанавливается в значение «Не использовать».

Если вы обновили саму платформу, но оставили режим совместимости на уровне 8.3.13 или ниже, платформа заботливо продолжит эмулировать старое поведение: функция Строка() будет возвращать "УправляемаяФорма", а события будут вызываться по старому имени ПриАктивизацииОбласти. Однако мы настоятельно рекомендуем не затягивать с рефакторингом кода, так как рано или поздно режим совместимости придется повышать для использования нового функционала 1С.

Сопутствующие изменения метаданных в версии 8.3.14+

Проанализируем дополнительные изменения платформы, которые также могут потребовать вмешательства программиста при повышении режима совместимости:

  1. В конструкторе запросов (на вкладке «Компоновка данных») колонка «Использовать дочерние» была переименована в «Использовать реквизиты». Это визуальное изменение, но оно может сбить с толку при анализе чужих или старых запросов.
  2. Слово Представление стало зарезервированным именем. Если в вашей конфигурации есть реквизиты табличных частей или реквизиты объектов с именем «Представление», при проверке конфигурации повалятся ошибки. Вам придется переименовывать такие реквизиты (например, в «ПредставлениеСтроки» или «ТекстовоеПредставление») и переписывать код, где они использовались.

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

← На главную