Как исправить ошибку «Поле объекта не обнаружено (периоддействия)» при формировании Расчетного листка в 1С:ЗУП 3.1?

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

При работе в программе 1С:Зарплата и управление персоналом (редакция 3.1) бухгалтеры и расчетчики периодически сталкиваются с неприятной ситуацией: при формировании отчета «Расчетный листок» система внезапно завершает работу аварийно и выводит диагностическое сообщение:

"в настройку отчета "Расчетный листок" внесены критичные изменения. отчет не будет сформирован. поле объекта не обнаружено (периоддействия)"

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

Выясняем причину: технический анализ ошибки

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

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

В этот момент СКД в целях оптимизации запроса к базе данных динамически перестраивает временные таблицы. Так как флаг вывода периодов отключен, СКД считает колонку ПериодДействия избыточной и полностью исключает её из результирующего набора данных (таблицы ДанныеОтчета).

Однако далее в работу вступает программный код общего модуля ЗарплатаКадрыОтчеты, а именно функция ВывестиТелоРасчетногоЛистка. В ней разработчики предусмотрели проверку на наличие сторнирующих записей (исправлений прошлых периодов), чтобы корректно отразить их в макете:


Если СтрокаНачислений.Сторно = Истина И СтрокаНачислений.ПериодДействия = СтрокаНачислений.МесяцНачисления Тогда
    // Определенная логика обработки сторно-записей
КонецЕсли;

Проанализируем эту строку кода подробнее. Если у сотрудника в выбранном месяце есть сторнирование (например, в январе сторнировали ошибочный больничный за декабрь), то свойство СтрокаНачислений.Сторно принимает значение Истина. Программа переходит к вычислению второй части условия и пытается прочитать значение свойства СтрокаНачислений.ПериодДействия. Но так как СКД исключила эту колонку из выборки, этого поля физически нет в структуре данных! Программа мгновенно спотыкается и выдает ошибку: поле объекта не обнаружено (периоддействия).

Почему ошибка возникает избирательно по подразделениям или месяцам?

Если в выбранном подразделении или в выбранном месяце ни у одного из сотрудников не было сторно-записей (перерасчетов), первая часть условия СтрокаНачислений.Сторно = Истина возвращает Ложь. По правилам логики языка 1С, вычисление всего выражения прекращается, программа даже не пытается обратиться к несуществующему полю ПериодДействия, и отчет формируется без сбоев. Но стоит появиться хотя бы одной сторно-записи по любому сотруднику подразделения, как отчет по всему подразделению перестает строиться.

Способ 1. Быстрое решение в пользовательском режиме (без изменения кода)

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

Нам необходимо принудительно заставить СКД вернуть колонку ПериодДействия в выборку данных. Разберем по шагам, как это сделать:

  1. Откройте отчет «Расчетный листок» (раздел «Зарплата» — «Отчеты по зарплате»).
  2. Нажмите кнопку «Настройки...» в шапке отчета.
  3. В открывшемся окне переключите вид настроек в режим «Расширенный» (переключатель внизу окна).
  4. Перейдите на вкладку «Оформление» или найдите в списке настроек флаг «Выводить периоды начислений».
  5. Установите данный флаг (поставьте галочку).
  6. Нажмите кнопку «Закрыть и сформировать».

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

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

Данная проблема является задокументированной ошибкой фирмы «1С» (код ошибки: 10193016). Она присутствовала в релизах линейки 3.1.4.х и некоторых ранних сборках 3.1.5.х и 3.1.6.х.

Самое надежное и правильное решение — обновить конфигурацию «Зарплата и управление персоналом» до актуального релиза. Ошибка была полностью устранена разработчиками начиная с релиза 3.1.5.212 и во всех последующих ветках (3.1.6, 3.1.7 и новее). После применения обновления вы сможете безболезненно отключать флаг вывода периодов начислений, и отчет будет формироваться корректно в любых ситуациях.

Способ 3. Локализация проблемного сотрудника

Если вы не хотите выводить периоды начислений в листах (например, этого требует регламент компании) и при этом не можете обновиться, вы можете временно локализовать сотрудника, у которого зафиксировано сторно-начисление:

  1. Попробуйте сформировать расчетные листки по более мелким группам или подчиненным подразделениям.
  2. Если ошибка воспроизводится на конкретном подразделении, сформируйте отчет по каждому сотруднику этого подразделения по отдельности.
  3. Когда вы выявите «проблемного» сотрудника, по которому отчет выдает ошибку, сформируйте его листок отдельно с включенной галочкой «Выводить периоды начислений».
  4. Для всех остальных сотрудников подразделения вы сможете распечатать лаконичные расчетные листки без вывода периодов.

Способ 4. Исправление кода программистом (для нетиповых конфигураций)

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

Рассмотрим, как скорректировать код общего модуля ЗарплатаКадрыОтчеты в функции ВывестиТелоРасчетногоЛистка, чтобы избежать аварийного завершения работы.

Для безопасного обращения к свойству объекта, которое может отсутствовать, мы можем применить конструкцию Попытка ... Исключение или проверить наличие свойства. Рассмотрим пример безопасного кода:


// Создаем переменную для безопасного хранения периода действия
ПериодДействияЗначение = Неопределено;

Попытка
    // Пытаемся прочитать свойство. Если его нет в СКД, произойдет переход в блок Исключение
    ПериодДействияЗначение = СтрокаНачислений.ПериодДействия;
Исключение
    // Свойство отсутствует в текущей выборке данных, оставляем Неопределено
    ПериодДействияЗначение = Неопределено;
КонецПопытки;

// Корректируем условие проверки с использованием безопасной переменной
Если СтрокаНачислений.Сторно = Истина 
   И ПериодДействияЗначение = СтрокаНачислений.МесяцНачисления Тогда
    // Логика обработки сторно-записей
КонецЕсли;

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

← На главную