Как исправить ошибку Значение не является значением объектного типа (ИспользованиеПериода) при начислении зарплаты в 1С

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

При работе с конфигурациями на базе 1С:Зарплата и управление персоналом 3.1 (включая специализированные решения, такие как Зарплата и кадры образовательной организации) пользователи и программисты могут столкнуться с критической ошибкой при проведении документа «Начисление зарплаты и взносов». Текст ошибки обычно выглядит так: {ОбщийМодуль.РасчетЗарплатыРасширенный.Модуль(275)}: Значение не является значением объектного типа (ИспользованиеПериода). В этой статье мы подробно разберем, почему возникает эта проблема, как ее диагностировать с помощью отладчика и как исправить данные в информационной базе.

Анализ технической причины ошибки

Рассмотрим ситуацию, когда конфигурация не обновлялась, но за определенный месяц (например, июнь) расчет перестал работать. Ошибка «Значение не является значением объектного типа» в языке 1С означает, что программа пытается обратиться к свойству (в данном случае ИспользованиеПериода) переменной, которая на самом деле является Неопределено или имеет примитивный тип.

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

  1. Собирает массив всех видов расчета (начислений), которые присутствуют в документе.
  2. Одним запросом получает реквизиты этих начислений и помещает их в структуру Соответствие, где ключом выступает ссылка на начисление.
  3. Циклом обходит таблицу начислений документа и пытается извлечь настройки для каждого конкретного вида расчета.

Ошибка возникает на следующем участке кода:


Если РеквизитыНачислений[Строка.Начисление].ИспользованиеПериода <> Перечисления.ВариантыИспользованияПериодаНачисления.ПериодДействия Тогда
    // Логика обработки дат
КонецЕсли;

Если в таблице документа есть строка, в которой поле Начисление пустое или содержит некорректную (битую) ссылку, то попытка получить данные по этому ключу РеквизитыНачислений[Строка.Начисление] вернет Неопределено. Соответственно, обращение к свойству .ИспользованиеПериода у значения Неопределено вызывает исключение.

Как найти проблемные данные в документе

Выясним причину появления такой строки. Чаще всего это происходит из-за некорректного ручного ввода или использования механизма копирования документов из прошлых периодов. Разберем шаги по поиску виновника:

  1. Проверка визуальным осмотром: откройте документ «Начисление зарплаты и взносов». Внимательно просмотрите вкладку «Начисления». Ищите строки, где колонка «Начисление» пуста. Иногда «битые» ссылки отображаются как <Объект не найден>.
  2. Использование консоли запросов: если сотрудников много, визуальный поиск неэффективен. Проанализируем таблицу начислений документа запросом. В запросе выберите таблицу Документ.НачислениеЗарплатыИВзносов.Начисления с фильтром по конкретной ссылке на ваш документ и условием Начисление = ЗНАЧЕНИЕ(ПланВидовРасчета.Начисления.ПустаяСсылка).
  3. Групповая обработка: воспользуйтесь стандартной обработкой «Групповое изменение реквизитов». Выберите тип объекта «Начисление зарплаты и взносов», в фильтре укажите ваш проблемный документ. Перейдите к просмотру табличных частей и проверьте заполнение колонки начисления.

Особенности отладки в фоновом режиме

Многие разработчики сталкиваются с тем, что точка останова в коде не срабатывает. Посмотрим на причину: современные версии 1С:ЗУП 3.1 выполняют расчет зарплаты в фоновом задании через механизм длительных операций. Отладчик основного сеанса не «видит» выполнение кода в фоне.

Рассмотрим два способа, как обойти это ограничение:

  1. Отключение фонового расчета: в некоторых релизах в настройках расчета зарплаты можно снять галочку «Выполнять расчет зарплаты в фоновом режиме». Это заставит систему считать данные прямо в текущем сеансе.
  2. Настройка автоматического подключения: в конфигураторе в меню «Отладка — Настройка предметов отладки» нажмите кнопку «Настройка». Убедитесь, что установлена галочка «Автоматическое подключение фоновых заданий».
  3. Отладка на одном сотруднике: попробуйте создать новый документ и подобрать туда только одного сотрудника. Если сотрудников мало, система часто выполняет расчет без ухода в фон, что позволит вам поймать ошибку точкой останова.

Разбор программного кода процедуры

Для более глубокого понимания ситуации проанализируем структуру процедуры СформироватьДвиженияНачислений, которую привел автор темы. Это поможет нам понять, какие именно данные подготавливает система перед падением.


// Фрагмент кода подготовки данных
МассивНачислений = Новый Массив;
Для Каждого Строка Из Начисления Цикл
    МассивНачислений.Добавить(Строка.Начисление);
КонецЦикла;

// Получаем реквизиты видов расчета одним махом для оптимизации
ИменаРеквизитов = "ИспользованиеПериода, |ПериодРасчетаБазовыхНачислений, |КоличествоМесяцевБазовогоПериода, |СдвигБазовогоПериода";
РеквизитыНачислений = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивНачислений, ИменаРеквизитов);

Функция ОбщегоНазначения.ЗначенияРеквизитовОбъектов возвращает Соответствие. Если в МассивНачислений попало пустое значение или ссылка на несуществующий объект, она просто не попадет в результат. Далее по коду идет основной цикл по таблице начислений:


Для Каждого Строка Из Начисления Цикл
    // ... заполнение свойств ...
    
    // Вот здесь происходит ошибка, если Строка.Начисление отсутствует в РеквизитыНачислений
    Если РеквизитыНачислений[Строка.Начисление].ИспользованиеПериода <> Перечисления.ВариантыИспользованияПериодаНачисления.ПериодДействия Тогда
        // ...
    КонецЕсли;
КонецЦикла;

Как предотвратить ошибку (совет программисту)

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

Рассмотрим пример безопасного обращения к реквизитам:


Для Каждого Строка Из Начисления Цикл
    
    // Получаем структуру реквизитов для текущей строки
    ТекущиеРеквизиты = Неопределено;
    РеквизитыНачислений.Свойство(Строка.Начисление, ТекущиеРеквизиты);
    
    Если ТекущиеРеквизиты = Неопределено Тогда
        // Если реквизиты не найдены, значит данные в строке некорректны.
        // Можно либо пропустить строку, либо выдать осмысленное сообщение.
        Продолжить; 
    КонецЕсли;

    Если ТекущиеРеквизиты.ИспользованиеПериода <> Перечисления.ВариантыИспользованияПериодаНачисления.ПериодДействия Тогда
        // Безопасное выполнение логики
    КонецЕсли;
    
КонецЦикла;

Подведение итогов

Выясним краткий алгоритм действий при возникновении данной ошибки:

  1. Проверьте данные: скорее всего, в документе за июнь появилась строка с пустым видом начисления. Удалите ее или заполните корректно.
  2. Тестирование и исправление: если визуально всё чисто, запустите «Тестирование и исправление» в конфигураторе с проверкой ссылочной целостности (это поможет выявить «битые» ссылки).
  3. Кэш: хотя в сообщениях форума чистка кэша не помогла, в некоторых случаях это может быть причиной некорректного отображения данных на клиенте.
  4. Файловый вариант: как заметил один из участников обсуждения, выгрузка базы в файловый вариант иногда упрощает отладку, так как снимает проблемы с распределением процессов на сервере 1С.

Используя комплексный подход — от анализа кода до проверки чистоты данных в табличных частях — вы сможете быстро локализовать и устранить ошибку Значение не является значением объектного типа (ИспользованиеПериода).

← На главную