Как исправить ошибку «Значение поля "Сотрудник" не может быть пустым» при проведении документа «Разовое начисление» в 1С:ЗУП 3.1?

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

При интеграции внешних систем или программном создании документов в конфигурации «1С:Зарплата и Управление Персоналом» (редакция 3.1) разработчики часто сталкиваются со следующей проблемой: документ РазовоеНачисление создается и заполняется программно, однако при попытке его проведения вылетает ошибка вида: «Запись не верна! Значение поля "Сотрудник" не может быть пустым (Регистры накопления: Взаиморасчеты с сотрудниками; номер строки 1)».

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

Причины возникновения ошибки

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

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

Диагностика и пошаговое решение

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

  1. Поиск проблемного сотрудника.

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

  2. Проверка и восстановление кадровой истории.

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

  3. Отладка в момент возникновения ошибки.

    Запустите конфигуратор, включите режим остановки по ошибке (меню Отладка — Остановка по ошибке) и выполните программное проведение документа. Посмотрите значение переменной, передаваемой в процедуру формирования движений регистра ВзаиморасчетыССотрудниками. Вы сразу увидите, на какой строке реквизит Сотрудник принимает значение ЗначениеНеЗаполнено().

  4. Корректное программное заполнение всех обязательных ТЧ.

    Проанализируем пример правильного программного формирования документа РазовоеНачисление с заполнением связи табличных частей через ИдентификаторСтроки:

    
    // Создаем новый документ
    ДокОбъект = Документы.РазовоеНачисление.СоздатьДокумент();
    ДокОбъект.Дата = ТекущаяДата();
    ДокОбъект.Организация = СсылкаОрганизация;
    ДокОбъект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
    ДокОбъект.Начисление = СсылкаНачисление;
    
    // Заполняем табличную часть "Начисления"
    СтрНачисление = ДокОбъект.Начисления.Добавить();
    СтрНачисление.Сотрудник = СсылкаСотрудник;
    СтрНачисление.Результат = 5000;
    СтрНачисление.ДатаНачала = НачалоМесяца(ТекущаяДата());
    СтрНачисление.ДатаОкончания = КонецМесяца(ТекущаяДата());
    СтрНачисление.ИдентификаторСтроки = 1; // Указываем уникальный числовой ключ
    
    // Заполняем табличную часть "ФизическиеЛица"
    СтрФизЛицо = ДокОбъект.ФизическиеЛица.Добавить();
    СтрФизЛицо.ФизическоеЛицо = СсылкаСотрудник.ФизическоеЛицо;
    СтрФизЛицо.ИдентификаторСтроки = 1; // Указываем тот же ключ связи
    
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
    

Заполнение служебных ключей связи ИдентификаторСтроки гарантирует корректную работу типовых механизмов расчета и гарантирует, что движенческие модули проведения верно определят физическое лицо и соответствующего ему сотрудника.

← На главную