При интеграции внешних систем или программном создании документов в конфигурации «1С:Зарплата и Управление Персоналом» (редакция 3.1) разработчики часто сталкиваются со следующей проблемой: документ РазовоеНачисление создается и заполняется программно, однако при попытке его проведения вылетает ошибка вида: «Запись не верна! Значение поля "Сотрудник" не может быть пустым (Регистры накопления: Взаиморасчеты с сотрудниками; номер строки 1)».
При этом в табличной части документа реквизит Сотрудник внешне заполнен корректно, а при ручном создании аналогичного документа ошибка не возникает. Рассмотрим подробнее причины этой проблемы и разберем способы ее диагностики и исправления.
Проанализируем архитектуру конфигурации 1С:ЗУП 3.1. Ошибка формируется на этапе записи движений в регистр накопления ВзаиморасчетыССотрудниками. В этот момент алгоритм проведения пытается извлечь данные о сотруднике и его кадровой истории, но получает пустую ссылку. Это происходит по следующим основным причинам:
ФизическиеЛица, отсутствием кадровой истории на дату документа (например, после переноса данных из 1С:ЗУП 2.5) или передачей ссылки на физическое лицо вместо объекта справочника Сотрудники.Разовое начисление строки табличных частей Начисления, ФизическиеЛица и Показатели увязаны между собой через служебный реквизит ИдентификаторСтроки. Если при программном формировании заполняется только ТЧ Начисления без генерации этих ключей, служебный механизм проведения не может сопоставить начисление с физическим лицом.Разберем по шагам действия, которые необходимо выполнить для устранения неисправности.
Поиск проблемного сотрудника.
Если в выгрузке участвует массив сотрудников, необходимо выяснить, по всем ли физлицам возникает ошибка или дело в конкретном человеке. Проведите тестовую загрузку документов по отдельности на каждого сотрудника. Если ошибка воспроизводится только по одному из них, проблема кроется в его кадровых данных.
Проверка и восстановление кадровой истории.
Для сотрудника, вызывает ошибку, необходимо проверить наличие активных кадровых сведений на дату проводимого разового начисления. Откройте документы Прием на работу или Кадровый перевод по данному сотруднику и перепроведите их. Это обновит срез последних в кадровых регистрах сведений (например, КадроваяИсторияСотрудников).
Отладка в момент возникновения ошибки.
Запустите конфигуратор, включите режим остановки по ошибке (меню Отладка — Остановка по ошибке) и выполните программное проведение документа. Посмотрите значение переменной, передаваемой в процедуру формирования движений регистра ВзаиморасчетыССотрудниками. Вы сразу увидите, на какой строке реквизит Сотрудник принимает значение ЗначениеНеЗаполнено().
Корректное программное заполнение всех обязательных ТЧ.
Проанализируем пример правильного программного формирования документа РазовоеНачисление с заполнением связи табличных частей через ИдентификаторСтроки:
// Создаем новый документ
ДокОбъект = Документы.РазовоеНачисление.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Организация = СсылкаОрганизация;
ДокОбъект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
ДокОбъект.Начисление = СсылкаНачисление;
// Заполняем табличную часть "Начисления"
СтрНачисление = ДокОбъект.Начисления.Добавить();
СтрНачисление.Сотрудник = СсылкаСотрудник;
СтрНачисление.Результат = 5000;
СтрНачисление.ДатаНачала = НачалоМесяца(ТекущаяДата());
СтрНачисление.ДатаОкончания = КонецМесяца(ТекущаяДата());
СтрНачисление.ИдентификаторСтроки = 1; // Указываем уникальный числовой ключ
// Заполняем табличную часть "ФизическиеЛица"
СтрФизЛицо = ДокОбъект.ФизическиеЛица.Добавить();
СтрФизЛицо.ФизическоеЛицо = СсылкаСотрудник.ФизическоеЛицо;
СтрФизЛицо.ИдентификаторСтроки = 1; // Указываем тот же ключ связи
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Заполнение служебных ключей связи ИдентификаторСтроки гарантирует корректную работу типовых механизмов расчета и гарантирует, что движенческие модули проведения верно определят физическое лицо и соответствующего ему сотрудника.