Почему изменение режима совместимости в УТ 11.4 вызывает ошибки в РМК и как их правильно исправить

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке и адаптации типовых конфигураций «1С:Предприятие» программисты часто сталкиваются с необходимостью расширения стандартного функционала. Один из наиболее удобных инструментов для этого — механизм расширений. Однако иногда для подключения современного расширения требуется повысить режим совместимости основной конфигурации. Например, изменить его с 8.3.10 на 8.3.12.

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

В чем суть проблемы: симптомы и первая ложная помощь

Рассмотрим классическую ситуацию. Разработчик изменяет режим совместимости типовой конфигурации «Управление торговлей», редакция 11.4 (например, старого релиза) с 8.3.10 на 8.3.12. Расширения еще даже не установлены, код не менялся. Но сразу после обновления конфигурации базы данных обычные пользователи с ограниченными правами (кассиры, продавцы) начинают жаловаться на ошибки. При попытке открыть подбор товаров или выбрать продавца система выдает ошибку: «Поле объекта не обнаружено».

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

Технический анализ: что меняется в платформе при переходе на режим совместимости 8.3.12

Главная техническая причина кроется в кардинальном изменении поведения коллекции Элементы управляемой формы при переходе на режим совместимости 8.3.12.

Проанализируем разницу в поведении платформы подробнее:

  1. Поведение в режиме совместимости 8.3.10 и ниже:

    Если у текущего пользователя нет прав на просмотр или редактирование определенного реквизита (или объекта метаданных, с которым связана команда), платформа автоматически скрывает этот элемент на форме. При этом сам объект элемента управления (например, кнопка или поле ввода) физически остается в коллекции Элементы на клиенте. Он просто невидим для пользователя. Если в коде формы содержится обращение к этому элементу, например:

    Элементы.ГруппаПродавец.Видимость = Истина;

    Платформа успешно выполняет эту строку, не вызывая никаких исключений, даже если у пользователя нет прав на реквизит «Продавец».

  2. Поведение в режиме совместимости 8.3.12 и выше:

    Начиная с режима 8.3.12, в целях оптимизации производительности и повышения безопасности, платформа начинает полностью удалять из коллекции Элементы те объекты, к которым у пользователя нет прав доступа. Элемента физически больше нет в коллекции на клиенте!

    Когда управление передается в код управляемой формы, написанный под старые стандарты (совместимость 8.3.10), этот код пытается напрямую обратиться к элементу, которого больше нет в коллекции:

    Элементы.ГруппаПродавец.Видимость = Ложь;

    Поскольку элемента ГруппаПродавец в коллекции не существует, система мгновенно генерирует критическую ошибку выполнения: «Поле объекта не обнаружено (ГруппаПродавец)». Именно поэтому расширение прав пользователей временно устраняло ошибку: права возвращали элемент в коллекцию, и обращение к нему в коде снова становилось успешным.

Как эту проблему решили разработчики фирмы 1С

Проблема носит массовый характер, поэтому в Библиотеке стандартных подсистем (БСП), на которой построена «Управление торговлей 11.4», был внедрен безопасный паттерн работы с элементами управляемых форм. Вместо прямого изменения свойств элементов программисты 1С перешли на использование специальных процедур-оберток.

Давайте посмотрим на пример безопасного изменения свойств элементов формы с помощью БСП:


// Вместо небезопасного кода:
// Элементы.ИмяЭлемента.Видимость = ЗначениеВидимости;

// Используется безопасный метод общего назначения:
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ИмяЭлемента", "Видимость", ЗначениеВидимости);

Метод УстановитьСвойствоЭлементаФормы внутри себя устроен очень просто и надежно. Проанализируем его внутреннюю логику:


Процедура УстановитьСвойствоЭлементаФормы(ЭлементыФормы, ИмяЭлемента, ИмяСвойства, Значение) Экспорт
    Элемент = ЭлементыФормы.Найти(ИмяЭлемента);
    Если Элемент <> Неопределено Тогда
        Элемент[ИмяСвойства] = Значение;
    КонецЕсли;
КонецПроцедуры

Благодаря методу Найти() система сначала проверяет, присутствует ли вообще элемент управления в коллекции текущего пользователя. Если элемента нет (из-за ограничений прав доступа), метод просто возвращает Неопределено, не вызывая аварийного завершения работы программы. Это позволяет избежать ошибок интерфейса у пользователей с ограниченными ролями.

Другие подводные камни режима совместимости 8.3.12

Помимо изменения поведения коллекции элементов управляемой формы, ручной подъем режима совместимости до 8.3.12 активирует еще несколько важных платформенных изменений, которые могут нарушить работу неадаптированной конфигурации:

Пошаговая инструкция по правильному решению проблемы

Если вы столкнулись с подобными ошибками после изменения режима совместимости, рекомендуется отказаться от «костылей» в виде ручной раздачи прав. Выполните следующие шаги для приведения системы в стабильное и безопасное состояние:

Шаг 1. Откат изменений и анализ версии

Верните режим совместимости вашей основной конфигурации обратно в исходное состояние (например, 8.3.10). Убедитесь, что все ошибки у продавцов исчезли. Проанализируйте текущий релиз вашей конфигурации «Управление торговлей 11.4».

Шаг 2. Обновление конфигурации до актуального релиза

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

При этом весь программный код форм, механизмы РМК, подборы товаров и обработчики прав были полностью переписаны и адаптированы под новые стандарты работы с коллекцией Элементы. После официального обновления конфигурации у вас автоматически установится правильный режим совместимости, и ошибки интерфейса при ограниченных правах не возникнут.

Шаг 3. Адаптация собственного кода в расширениях

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


// Пример безопасного отключения доступности кнопки в вашем коде:
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
    Элементы, 
    "МояПартнерскаяКнопка", 
    "Доступность", 
    Ложь
);

Если вы вынуждены обходиться без БСП, всегда делайте предварительную проверку существования элемента в коллекции управляемой формы перед тем, как прочитать или изменить его свойства:


МойЭлемент = Элементы.Найти("ИмяКнопки");
Если МойЭлемент <> Неопределено Тогда
    МойЭлемент.Доступность = Ложь;
КонецЕсли;

Резюме

Ручной подъем режима совместимости в обход официальных обновлений от разработчиков 1С нарушает внутреннюю логику работы интерфейса управляемых форм для пользователей с ограниченными правами. Единственно верное и безопасное решение — обновить конфигурацию «Управление торговлей» до релиза, где этот режим совместимости поддерживается штатно, а программный код приведен в полное соответствие с требованиями платформы 8.3.12.

← На главную