При разработке и адаптации типовых конфигураций «1С:Предприятие» программисты часто сталкиваются с необходимостью расширения стандартного функционала. Один из наиболее удобных инструментов для этого — механизм расширений. Однако иногда для подключения современного расширения требуется повысить режим совместимости основной конфигурации. Например, изменить его с 8.3.10 на 8.3.12.
Казалось бы, простое изменение одного свойства в свойствах конфигурации не должно повлиять на работу существующего функционала, ведь сама программная платформа физически новее и поддерживает все старые методы. Но на практике это действие часто приводит к внезапному «осыпанию» интерфейса: перестает открываться рабочее место кассира (РМК), ломается подбор номенклатуры, возникают критические ошибки при авторизации продавцов. Давайте подробно разберем, почему это происходит, как устроена внутренняя механика платформы 1С и как правильно решить эту проблему, не нарушая безопасность системы.
Рассмотрим классическую ситуацию. Разработчик изменяет режим совместимости типовой конфигурации «Управление торговлей», редакция 11.4 (например, старого релиза) с 8.3.10 на 8.3.12. Расширения еще даже не установлены, код не менялся. Но сразу после обновления конфигурации базы данных обычные пользователи с ограниченными правами (кассиры, продавцы) начинают жаловаться на ошибки. При попытке открыть подбор товаров или выбрать продавца система выдает ошибку: «Поле объекта не обнаружено».
Если временно дать этим пользователям полные права или избыточные административные роли (например, право на изменение пользователей или редактирование номенклатуры), ошибка чудесным образом исчезает. Однако это крайне опасный путь. Давать продавцам права на редактирование критически важных справочников ради устранения интерфейсного бага — это грубое нарушение стандартов безопасности и контроля данных.
Главная техническая причина кроется в кардинальном изменении поведения коллекции Элементы управляемой формы при переходе на режим совместимости 8.3.12.
Проанализируем разницу в поведении платформы подробнее:
Если у текущего пользователя нет прав на просмотр или редактирование определенного реквизита (или объекта метаданных, с которым связана команда), платформа автоматически скрывает этот элемент на форме. При этом сам объект элемента управления (например, кнопка или поле ввода) физически остается в коллекции Элементы на клиенте. Он просто невидим для пользователя. Если в коде формы содержится обращение к этому элементу, например:
Элементы.ГруппаПродавец.Видимость = Истина;
Платформа успешно выполняет эту строку, не вызывая никаких исключений, даже если у пользователя нет прав на реквизит «Продавец».
Начиная с режима 8.3.12, в целях оптимизации производительности и повышения безопасности, платформа начинает полностью удалять из коллекции Элементы те объекты, к которым у пользователя нет прав доступа. Элемента физически больше нет в коллекции на клиенте!
Когда управление передается в код управляемой формы, написанный под старые стандарты (совместимость 8.3.10), этот код пытается напрямую обратиться к элементу, которого больше нет в коллекции:
Элементы.ГруппаПродавец.Видимость = Ложь;
Поскольку элемента ГруппаПродавец в коллекции не существует, система мгновенно генерирует критическую ошибку выполнения: «Поле объекта не обнаружено (ГруппаПродавец)». Именно поэтому расширение прав пользователей временно устраняло ошибку: права возвращали элемент в коллекцию, и обращение к нему в коде снова становилось успешным.
Проблема носит массовый характер, поэтому в Библиотеке стандартных подсистем (БСП), на которой построена «Управление торговлей 11.4», был внедрен безопасный паттерн работы с элементами управляемых форм. Вместо прямого изменения свойств элементов программисты 1С перешли на использование специальных процедур-оберток.
Давайте посмотрим на пример безопасного изменения свойств элементов формы с помощью БСП:
// Вместо небезопасного кода:
// Элементы.ИмяЭлемента.Видимость = ЗначениеВидимости;
// Используется безопасный метод общего назначения:
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "ИмяЭлемента", "Видимость", ЗначениеВидимости);
Метод УстановитьСвойствоЭлементаФормы внутри себя устроен очень просто и надежно. Проанализируем его внутреннюю логику:
Процедура УстановитьСвойствоЭлементаФормы(ЭлементыФормы, ИмяЭлемента, ИмяСвойства, Значение) Экспорт
Элемент = ЭлементыФормы.Найти(ИмяЭлемента);
Если Элемент <> Неопределено Тогда
Элемент[ИмяСвойства] = Значение;
КонецЕсли;
КонецПроцедуры
Благодаря методу Найти() система сначала проверяет, присутствует ли вообще элемент управления в коллекции текущего пользователя. Если элемента нет (из-за ограничений прав доступа), метод просто возвращает Неопределено, не вызывая аварийного завершения работы программы. Это позволяет избежать ошибок интерфейса у пользователей с ограниченными ролями.
Помимо изменения поведения коллекции элементов управляемой формы, ручной подъем режима совместимости до 8.3.12 активирует еще несколько важных платформенных изменений, которые могут нарушить работу неадаптированной конфигурации:
СохранениеДанныхПользователя. Если у пользователя (например, продавца в РМК) нет этой роли, попытка сохранить настройки динамического списка или ширину колонок вызовет ошибку доступа.8.3.12 накладывается строгое ограничение на объем передаваемых данных в фоновые задания (не более 2 Гб в сериализованном виде), превышение которого вызывает немедленный отказ системы.Если вы столкнулись с подобными ошибками после изменения режима совместимости, рекомендуется отказаться от «костылей» в виде ручной раздачи прав. Выполните следующие шаги для приведения системы в стабильное и безопасное состояние:
Верните режим совместимости вашей основной конфигурации обратно в исходное состояние (например, 8.3.10). Убедитесь, что все ошибки у продавцов исчезли. Проанализируйте текущий релиз вашей конфигурации «Управление торговлей 11.4».
Самый надежный и правильный способ решить эту проблему — обновить конфигурацию «1С:Управление торговлей» до актуального релиза (начиная с версии 11.4.6.188 и выше). В этих релизах разработчики фирмы 1С официально перевели конфигурацию на режим совместимости 8.3.12.
При этом весь программный код форм, механизмы РМК, подборы товаров и обработчики прав были полностью переписаны и адаптированы под новые стандарты работы с коллекцией Элементы. После официального обновления конфигурации у вас автоматически установится правильный режим совместимости, и ошибки интерфейса при ограниченных правах не возникнут.
Если вы пишете собственный код в расширениях или дорабатываете формы основной конфигурации, никогда не обращайтесь к элементам формы напрямую, если они могут быть скрыты по правам доступа. Всегда используйте безопасные вызовы через методы БСП:
// Пример безопасного отключения доступности кнопки в вашем коде:
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы,
"МояПартнерскаяКнопка",
"Доступность",
Ложь
);
Если вы вынуждены обходиться без БСП, всегда делайте предварительную проверку существования элемента в коллекции управляемой формы перед тем, как прочитать или изменить его свойства:
МойЭлемент = Элементы.Найти("ИмяКнопки");
Если МойЭлемент <> Неопределено Тогда
МойЭлемент.Доступность = Ложь;
КонецЕсли;
Ручной подъем режима совместимости в обход официальных обновлений от разработчиков 1С нарушает внутреннюю логику работы интерфейса управляемых форм для пользователей с ограниченными правами. Единственно верное и безопасное решение — обновить конфигурацию «Управление торговлей» до релиза, где этот режим совместимости поддерживается штатно, а программный код приведен в полное соответствие с требованиями платформы 8.3.12.