Как исправить ошибку «Значение поля "Физическое лицо" не может быть пустым» при настройке синхронизации ЗУП и БП

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

При настройке обмена данными между конфигурациями 1С:Зарплата и управление персоналом и 1С:Бухгалтерия предприятия (БП) технические специалисты часто сталкиваются с критической ошибкой на этапе завершения помощника создания синхронизации в базе БП. Проблема проявляется в виде аварийного завершения операции с сообщением о невозможности записи в регистр сведений ТекущиеКадровыеДанныеСотрудников из-за пустого значения поля Физическое лицо.

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

Анализ причины возникновения ошибки

Давайте проанализируем ситуацию. Ошибка возникает не в ЗУП, а именно в Бухгалтерии предприятия в тот момент, когда система пытается переключить режим ведения учета зарплаты. Когда мы завершаем настройку синхронизации, программа программно устанавливает константу УчетЗарплатыИКадровВоВнешнейПрограмме в значение Истина. Это действие влечет за собой каскадное обновление настроек, включая установку константы ИспользоватьКадровыйУчет в значение Ложь.

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

Почему в справочнике появляются «пустые» сотрудники? Чаще всего это результат некорректного переноса данных из версии 7.7 или 2.0, последствия работы сторонних обработок загрузки или результат неполного удаления объектов, когда ссылка на сотрудника осталась, а связанный объект физического лица был удален окончательно.

Способ 1: Идентификация проблемных записей через консоль запросов

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

Напишем и выполним простой запрос к справочнику Сотрудники:


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.Код КАК Код,
    Сотрудники.ПометкаУдаления КАК Удален
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    (Сотрудники.ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
        ИЛИ Сотрудники.ФизическоеЛицо ЕСТЬ NULL)

Проанализируем результат выполнения. Все найденные элементы справочника подлежат либо исправлению, либо окончательному удалению. Даже если сотрудник помечен на удаление, он все равно будет участвовать в процедуре обновления регистров при смене настроек учета, поэтому просто «скрыть» его не получится.

Способ 2: Использование группового изменения реквизитов

Если мы нашли записи, которые нам необходимы для истории учета, но в них отсутствует привязка к физическому лицу, мы можем воспользоваться стандартным инструментом «Групповое изменение реквизитов» (раздел Администрирование — Обслуживание — Корректировка данных).

Выполним следующие шаги:

  1. Выберем объект Справочник.Сотрудники.
  2. Добавим фильтр по полю ФизическоеЛицо, указав условие «Не заполнено».
  3. В колонке «Новое значение» для реквизита Физическое лицо выберем соответствующее лицо из справочника Физические лица (если оно существует) или создадим новое.
  4. Нажмем кнопку «Изменить реквизиты».

Этот метод является наиболее безопасным, так как он корректно вызывает все необходимые обработчики при записи объектов.

Способ 3: Использование универсального редактора реквизитов

В некоторых случаях стандартное групповое изменение может не сработать, если объект находится в «битом» состоянии. Тогда на помощь приходят специализированные инструменты, такие как Универсальный редактор реквизитов или обработки для восстановления битых ссылок. Рассмотрим этот вариант подробнее.

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

Способ 4: Окончательное удаление «фантомных» записей

Часто бывает так, что ошибка указывает на сотрудника, который уже много лет не работает и его данные не нужны в текущей базе. Выясним причину, почему обычное удаление не помогает. Как правило, пользователи просто ставят пометку на удаление, но объект остается в базе.

Разберем алгоритм полной очистки:

  1. Пометим на удаление всех сотрудников, выявленных запросом из Способа 1.
  2. Перейдем в раздел Администрирование — Обслуживание — Удаление помеченных объектов.
  3. Выберем режим «Выборочное удаление» и попробуем удалить этих сотрудников.
  4. Если система выдает ссылки на документы или другие регистры, нам придется либо очистить эти ссылки, либо заменить их на корректные.

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

Программное исправление (для разработчиков)

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Сотрудники.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    |	Сотрудники.ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ОбъектСотрудник = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
    // Здесь можно либо попытаться найти физлицо по ФИО
    // Либо назначить временное, чтобы пройти этап синхронизации
    ФизЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ОбъектСотрудник.Наименование);
    Если НЕ ФизЛицо.Пустая() Тогда
        ОбъектСотрудник.ФизическоеЛицо = ФизЛицо;
        ОбъектСотрудник.Записать();
        Сообщить("Исправлен сотрудник: " + ОбъектСотрудник.Наименование);
    Иначе
        Сообщить("Не удалось найти физлицо для: " + ОбъектСотрудник.Наименование, СтатусСообщения.Внимание);
    КонецЕсли;
КонецЦикла;

Заключение

Подведем итог. Ошибка при создании синхронизации ЗУП — БП с текстом Значение поля "Физическое лицо" не может быть пустым — это типичный симптом нарушения логической целостности данных в справочнике Сотрудники на стороне Бухгалтерии.

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

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

← На главную