При работе в современных конфигурациях на базе платформы 1С:Предприятие 8.3, таких как ERP Управление предприятием 2, Зарплата и управление персоналом 3.1 или Комплексная автоматизация 2, пользователи часто сталкиваются с внезапным прерыванием работы. Ошибка возникает даже у тех сотрудников, чей функционал никак не связан с расчетом заработной платы — например, у кладовщиков, менеджеров по продажам или системных администраторов. Текст ошибки указывает на проблему с правами доступа к объекту РегистрСведений.ДатыВступленияВСилуНА.
В данной статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизмы платформы, приводящие к сбою, и рассмотрим несколько способов решения проблемы: от оперативного исправления через расширение до установки официальных патчей от разработчика.
Для начала проанализируем ситуацию и поймем, что это за регистр и почему к нему обращается программа. Регистр сведений ДатыВступленияВСилуНА (Нормативных Актов) был введен разработчиками 1С для управления логикой перехода на новые законодательные нормы. В частности, в нем хранится информация о датах начала использования единого регистрационного номера СФР (Социального фонда России) и других ключевых изменениях в законодательстве.
Почему же ошибка возникает у пользователя с ролью «Кладовщик»? Казалось бы, складской учет никак не пересекается с нормативными актами СФР. Проанализируем стек вызова, представленный в тексте ошибки:
ТекущиеДелаСлужебный инициирует сбор информации о задачах пользователя.ЗарплатаКадрыПовтИсп.ДатаВступленияВСилуНА().ДатыВступленияВСилуНА.Так как в типовых профилях доступа для многих ролей (склад, продажи, закупки) права на этот «зарплатный» регистр изначально не были предусмотрены, происходит отказ в доступе (нарушение прав), и программа аварийно завершает выполнение задачи.
Если нам нужно быстро понять, какие роли вообще имеют доступ к этому объекту в текущей конфигурации, воспользуемся инструментами разработчика. Рассмотрим, как быстро найти нужную роль через Конфигуратор:
РегистрСведений.ДатыВступленияВСилуНА.Как правило, это роли, связанные с настройкой персонифицированного учета или кадровыми данными. Однако простое добавление таких ролей кладовщику — плохая практика, так как это даст ему избыточный доступ к персональным данным сотрудников.
Если официальное обновление конфигурации отложено, а работать нужно сейчас, создадим небольшое расширение. Это позволит нам точечно добавить права только на чтение одного конкретного регистра, не меняя типовую конфигурацию и не снимая её с поддержки. Разберем этот процесс по шагам:
ИсправлениеПравСФР).РегистрСведений.ДатыВступленияВСилуНА (нажать правой кнопкой на объекте в основной конфигурации — «Добавить в расширение»).ЧтениеДатВступленияВСилуНА_Точечно.После создания роли её необходимо назначить пользователям. Рассмотрим подробнее, как это сделать наиболее эффективно:
Вместо назначения роли каждому пользователю вручную, лучше создать новый Профиль групп доступа, включить в него нашу новую роль из расширения и добавить этот профиль в общую Группу доступа (например, «Все пользователи»). Это автоматически решит проблему для всех сотрудников организации сразу.
Фирма «1С» оперативно выпускает исправления для подобных массовых ошибок. Эти исправления называются патчами (или расширениями исправлений). Посмотрим, как проверить наличие патча для вашей версии программы:
Для ошибки с регистром ДатыВступленияВСилуНА в версиях ERP 2.5.12, 2.5.17 и аналогичных ЗУП выпускались патчи с идентификаторами вида EF_60009949 или EF_00_00615467. Суть этих исправлений обычно заключается в том, что обращение к регистру в общем модуле оборачивается в привилегированный режим, как показано в примере ниже:
// Пример логики, которую вносит патч в общий модуль
УстановитьПривилегированныйРежим(Истина);
Выборка = РегистрыСведений.ДатыВступленияВСилуНА.Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Привилегированный режим позволяет коду считывать данные из базы данных без проверки прав текущего пользователя, что полностью устраняет ошибку НарушениеПравДоступа.
Если вы предпочитаете программное решение через расширение без изменения прав, можно перехватить вызов проблемной функции. Рассмотрим пример кода в расширении для модуля ЗарплатаКадрыПовтИсп:
&Вместо("ДатаВступленияВСилуНА")
Функция Испр_ДатаВступленияВСилуНА(ИмяНА)
УстановитьПривилегированныйРежим(Истина);
Результат = ПродолжитьВызов(ИмяНА);
УстановитьПривилегированныйРежим(Ложь);
Возврат Результат;
КонецФункции
Этот метод считается максимально корректным, так как он не расширяет права пользователей в явном виде, а лишь позволяет служебному механизму «Текущие дела» получить необходимые технические даты для корректной отрисовки интерфейса.
Подводя итоги, проанализируем, какой путь выбрать:
Важно помнить, что при следующем крупном обновлении конфигурации (например, переход на новый релиз, где эта ошибка исправлена в коде) созданные вами расширения или патчи могут стать неактуальными. Не забывайте проводить аудит установленных исправлений после каждого обновления системы.