Изменение режима совместимости в крупных типовых конфигурациях 1С, таких как 1С:ERP Управление предприятием или 1С:Управление торговлей, — это ответственный шаг, который часто сопровождается неожиданным поведением системы. Одной из наиболее коварных проблем, с которой сталкиваются разработчики при переходе на режим совместимости 8.3.9 и выше (вплоть до 8.3.13), является внезапное исчезновение стандартных колонок, таких как Ссылка и Дата, из динамических списков документов (например, в журнале безналичных платежей).
В результате пользователи с ограниченными правами сталкиваются с неприятной ошибкой выполнения кода в общих модулях, например:
ОбщийМодуль.УправлениеПечатьюКлиентСервер.Модуль(61): Поле объекта не обнаружено (Ссылка)
При этом под полными правами администратора система продолжает работать абсолютно корректно, а аналогичные запросы в системе компоновки данных (СКД) отрабатывают без каких-либо замечаний. Выясним причину этой технической "мистики" и разберем подробные шаги по устранению проблемы.
Для того чтобы понять, почему ломается логика работы платформы, проанализируем поведение оптимизатора запросов и механизмов разграничения прав доступа на уровне записей (RLS):
1. Проблема неявных английских псевдонимов системных полей. Начиная с версии платформы 8.3.9, изменились правила парсинга произвольных запросов в динамических списках. Если в тексте запроса для системных реквизитов явно не заданы русские псевдонимы (например, написано просто Выбрать Документ.Ссылка вместо жесткого сопоставления Выбрать Документ.Ссылка КАК Ссылка), то при компиляции запроса платформа может автоматически сопоставить этим полям их англоязычные внутренние идентификаторы (Ref вместо Ссылка, Date вместо Дата). Из-за этого привязка элементов формы к реквизитам списка ломается, так как свойство ПутьКДанным элементов формы ожидает русскоязычные наименования.
2. Особенности работы оптимизатора RLS (ограничения доступа). Это объясняет, почему у администратора базы данных всё работает нормально, а у обычного пользователя вылетает ошибка. Для пользователей с ограниченными правами платформа "на лету" модифицирует исходный запрос динамического списка, чтобы наложить условия RLS. При перестроении такого запроса оптимизатор RLS в новых версиях платформы (без включенного режима совместимости с 8.3.8) некорректно обрабатывает поля без явных псевдонимов и просто исключает их из выборки или окончательно заменяет на англоязычные аналоги.
3. Программное изменение текста запроса. Очень часто в процедурах вида ПриСозданииНаСервере разработчики программно переопределяют или дополняют текст запроса динамического списка. Любая подобная динамическая модификация текста запроса без явного указания псевдонимов полей приводит к тому, что платформа теряет соответствие колонок таблицы формы и полей выборки базы данных.
Рассмотрим пошагово методы устранения этой ошибки.
Это основное и наиболее надежное решение, позволяющее зафиксировать связи полей динамического списка на уровне метаданных формы.
СписокПлатежей).Ссылка, Дата, Номер) установлены явные русские псевдонимы. Зададим их вручную, если они пусты. Пример правильного сопоставления в тексте запроса:
ВЫБРАТЬ
ДокументПлатежноеПоручение.Ссылка КАК Ссылка,
ДокументПлатежноеПоручение.Дата КАК Дата,
ДокументПлатежноеПоручение.Номер КАК Номер
ИЗ
Документ.ПлатежноеПоручение КАК ДокументПлатежноеПоручение
ПутьКДанным для колонок "Ссылка" или "Дата" очистилось, укажем его заново (например, Список.Ссылка).Иногда оптимизатор RLS все равно пытается исключить неиспользуемые, по его мнению, на форме поля из результирующего пакета данных, передаваемого на клиент. Чтобы гарантировать наличие поля Ссылка на клиенте для корректного выполнения процедур печати, настроим принудительное получение данных.
Ссылка и Дата.Эта настройка гарантирует, что даже если колонки физически не отображаются на форме или скрыты пользователем через настройки видимости, платформа принудительно передаст значения этих полей с сервера на клиент.
Проанализируем программные нюансы, которые могут возникнуть при переходе на платформу 8.3.10 без использования режима совместимости. Ошибки могут возникать в кодовых конструкциях, использующих метод ПравоДоступа().
Если в коде конфигурации активно проверяются права доступа на реквизиты объектов с помощью конструкции:
Если ПравоДоступа("Редактирование", Метаданные.Документы.ПлатежноеПоручение) Тогда
// Логика обработки
КонецЕсли;
При отключенном режиме совместимости на платформе 8.3.10 могут периодически возникать системные сбои вида "Право ... неприменимо к...".
Рекомендуется использовать проверенные релизы платформы ветки 8.3.11 и выше, где разработчики 1С устранили основные коллизии оптимизатора RLS и приведения типов динамических списков к английской локализации. Если у вас нет возможности оперативно обновить платформу, используйте комбинацию Способа 1 и Способа 2 — это гарантированно решит проблему на любом релизе платформы выше 8.3.9.