Как исправить ошибку прав доступа при формировании расчетного листка в 1С:ЗУП на PostgreSQL?

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

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

Симптомы и анализ проблемы

Ошибка проявляется при компоновке отчета и сопровождается следующим диагностическим сообщением в журнале или окне программы:

В настройку отчета "Расчетный листок" внесены критичные изменения. Отчет не будет сформирован. У пользователя недостаточно прав на исполнение операции над базой данных.

Проанализируем ключевые особенности поведения системы в этот момент:

  1. Ложное сообщение о правах: Сообщение о правах доступа формируется перехватчиком исключений системы компоновки данных (СКД). При возникновении любой низкоуровневой ошибки СУБД внутри типового обработчика ПриКомпоновкеРезультата общего модуля ЗарплатаКадрыОтчеты система маскирует реальную проблему запроса стандартной фразой о правах.
  2. Специфика СУБД: Проблема воспроизводится исключительно в клиент-серверном режиме под управлением СУБД PostgreSQL. В файловом режиме или при работе с MS SQL Server отчет формируется без сбоев.
  3. Кадровые особенности сотрудников: Ошибка возникает не по всей организации, а только по отдельным сотрудникам — как правило, уволенным ранее (например, по совместительству) и принятым повторно, либо при наличии кадровых изменений с незаполненной датой увольнения.

Техническая причина (ошибка 40000543)

Выясним причину на уровне исходного кода конфигурации. В общем модуле ЗарплатаКадрыОбщиеНаборыДанныхБазовый для расчета приоритета рабочего места используется математическое выражение с перемножением составляющих даты:


ГОД(КадровыеДанныеСотрудников.ДатаУвольнения) * 100000000 
+ МЕСЯЦ(КадровыеДанныеСотрудников.ДатаУвольнения) * 10000 
* ДЕНЬ(КадровыеДанныеСотрудников.ДатаУвольнения) * 100

Если поле ДатаУвольнения не заполнено (в платформе 1С это значение по умолчанию 0001-01-01), транслятор запросов платформы при работе с PostgreSQL генерирует SQL-конструкцию, вызывающую переполнение числовых типов или исключение при обработке граничной даты. СУБД прерывает транзакцию, а СКД выдает ложное сообщение о правах.

Способ 1. Исправление текста запроса в общем модуле

Рассмотрим прямое исправление исходного кода, если требуется оперативно восстановить работоспособность отчета без ожидания полного обновления конфигурации.

  1. Откроем конфигуратор и найдем общий модуль ЗарплатаКадрыОбщиеНаборыДанныхБазовый.
  2. Найдем фрагмент формирования поля ПриоритетРабочегоМеста:

| ВЫБОР
| КОГДА КадровыеДанныеСотрудников.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка)
| ТОГДА 9999999999
| ИНАЧЕ ГОД(КадровыеДанныеСотрудников.ДатаУвольнения) * 100000000 + МЕСЯЦ(КадровыеДанныеСотрудников.ДатаУвольнения) * 10000 * ДЕНЬ(КадровыеДанныеСотрудников.ДатаУвольнения) * 100
| КОНЕЦ + КадровыеДанныеСотрудников.ВидЗанятости.Порядок КАК ПриоритетРабочегоМеста
  1. Заменим проблемное вычисление на безопасную конструкцию с функцией РАЗНОСТЬДАТ:

| ВЫБОР
| КОГДА КадровыеДанныеСотрудников.ВидЗанятости = ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка)
| ТОГДА 9999999999
| ИНАЧЕ РАЗНОСТЬДАТ(ВЫБОР
| КОГДА КадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(1900, 1, 1)
| ИНАЧЕ КадровыеДанныеСотрудников.ДатаУвольнения
| КОНЕЦ, ДАТАВРЕМЯ(1900, 1, 1), ДЕНЬ) * 100
| КОНЕЦ + КадровыеДанныеСотрудников.ВидЗанятости.Порядок КАК ПриоритетРабочегоМеста

После сохранения конфигурации и обновления базы данных расчетный листок начнет корректно формироваться по всем сотрудникам за любые периоды.

Способ 2. Применение патча через расширение конфигурации

Чтобы не снимать конфигурацию с полной поддержки поставщика, перенесем исправление в расширение:

  1. Создадим новое расширение конфигурации с назначением «Адаптация» или «Исправление».
  2. Добавим в расширение общий модуль ЗарплатаКадрыОбщиеНаборыДанныхБазовый.
  3. Переопределим процедуру/функцию формирования наборов данных с помощью аннотации &Вместо или &ИзменениеИКонтроль, подставив исправленный текст запроса с вычислением разности дат.

Способ 3. Обновление конфигурации до актуального релиза

Разработчики фирмы «1С» устранили ошибку 40000543 в релизе 3.1.3.157. Если информационная база находится на типовой поддержке, наиболее правильным долгосрочным решением будет обновление конфигураций «1С:ЗУП» или «1С:ЗГУ» до релиза 3.1.3.157 или более актуальных версий ветки 3.1.

← На главную