При настройке обмена данными между конфигурациями 1С:Зарплата и управление персоналом и 1С:Бухгалтерия предприятия (БП) технические специалисты часто сталкиваются с критической ошибкой на этапе завершения помощника создания синхронизации в базе БП. Проблема проявляется в виде аварийного завершения операции с сообщением о невозможности записи в регистр сведений ТекущиеКадровыеДанныеСотрудников из-за пустого значения поля Физическое лицо.
В данной статье мы подробно разберем, почему возникает эта ситуация, проанализируем механизм работы платформы в этот момент и рассмотрим несколько способов эффективного решения проблемы, от использования стандартных инструментов до программных методов коррекции данных.
Давайте проанализируем ситуацию. Ошибка возникает не в ЗУП, а именно в Бухгалтерии предприятия в тот момент, когда система пытается переключить режим ведения учета зарплаты. Когда мы завершаем настройку синхронизации, программа программно устанавливает константу УчетЗарплатыИКадровВоВнешнейПрограмме в значение Истина. Это действие влечет за собой каскадное обновление настроек, включая установку константы ИспользоватьКадровыйУчет в значение Ложь.
В этот момент срабатывают обработчики событий в общих модулях, таких как РасчетЗарплатыДляНебольшихОрганизацийСобытия и УчетЗарплаты. Программа инициирует обновление регистра сведений ТекущиеКадровыеДанныеСотрудников. Если в справочнике Сотрудники базы БП присутствуют записи, у которых не заполнено поле ФизическоеЛицо, система пытается записать их в регистр. Поскольку в структуре регистра данное поле является обязательным для заполнения и не может быть пустым, платформа генерирует исключение, и процесс настройки синхронизации прерывается.
Почему в справочнике появляются «пустые» сотрудники? Чаще всего это результат некорректного переноса данных из версии 7.7 или 2.0, последствия работы сторонних обработок загрузки или результат неполного удаления объектов, когда ссылка на сотрудника осталась, а связанный объект физического лица был удален окончательно.
Прежде чем что-то исправлять, нам необходимо найти всех «виновников» ошибки. Если штат организации велик, ручной перебор справочника неэффективен. Рассмотрим, как быстро выявить проблемные записи с помощью консоли запросов.
Напишем и выполним простой запрос к справочнику Сотрудники:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Код КАК Код,
Сотрудники.ПометкаУдаления КАК Удален
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
(Сотрудники.ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
ИЛИ Сотрудники.ФизическоеЛицо ЕСТЬ NULL)
Проанализируем результат выполнения. Все найденные элементы справочника подлежат либо исправлению, либо окончательному удалению. Даже если сотрудник помечен на удаление, он все равно будет участвовать в процедуре обновления регистров при смене настроек учета, поэтому просто «скрыть» его не получится.
Если мы нашли записи, которые нам необходимы для истории учета, но в них отсутствует привязка к физическому лицу, мы можем воспользоваться стандартным инструментом «Групповое изменение реквизитов» (раздел Администрирование — Обслуживание — Корректировка данных).
Выполним следующие шаги:
Справочник.Сотрудники.ФизическоеЛицо, указав условие «Не заполнено».Физическое лицо выберем соответствующее лицо из справочника Физические лица (если оно существует) или создадим новое.Этот метод является наиболее безопасным, так как он корректно вызывает все необходимые обработчики при записи объектов.
В некоторых случаях стандартное групповое изменение может не сработать, если объект находится в «битом» состоянии. Тогда на помощь приходят специализированные инструменты, такие как Универсальный редактор реквизитов или обработки для восстановления битых ссылок. Рассмотрим этот вариант подробнее.
Проанализируем ситуацию из сообщения автора темы: у сотрудника Н********* Юрий Евгеньевич поле Физ. лицо было визуально пустым, хотя элемент справочника существовал. Используя редактор реквизитов, мы принудительно устанавливаем правильную ссылку на объект Справочник.ФизическиеЛица. После того как во всех записях справочника Сотрудники будет заполнено поле ФизическоеЛицо, регистр ТекущиеКадровыеДанныеСотрудников сможет успешно обновиться, и ошибка при создании синхронизации исчезнет.
Часто бывает так, что ошибка указывает на сотрудника, который уже много лет не работает и его данные не нужны в текущей базе. Выясним причину, почему обычное удаление не помогает. Как правило, пользователи просто ставят пометку на удаление, но объект остается в базе.
Разберем алгоритм полной очистки:
Важный нюанс: пока запись о сотруднике физически существует в таблице справочника, механизм пересчета ТекущиеКадровыеДанныеСотрудников будет пытаться ее обработать. Только полное удаление записи (для чего можно использовать инструменты универсальной очистки базы) или заполнение обязательного реквизита решит проблему.
Если записей много и они явно некорректны, мы можем воспользоваться небольшой внешней обработкой, чтобы программно заполнить пустые реквизиты или очистить мусор. Посмотрим на пример кода, который поможет исправить ситуацию:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.ФизическоеЛицо = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбъектСотрудник = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
// Здесь можно либо попытаться найти физлицо по ФИО
// Либо назначить временное, чтобы пройти этап синхронизации
ФизЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ОбъектСотрудник.Наименование);
Если НЕ ФизЛицо.Пустая() Тогда
ОбъектСотрудник.ФизическоеЛицо = ФизЛицо;
ОбъектСотрудник.Записать();
Сообщить("Исправлен сотрудник: " + ОбъектСотрудник.Наименование);
Иначе
Сообщить("Не удалось найти физлицо для: " + ОбъектСотрудник.Наименование, СтатусСообщения.Внимание);
КонецЕсли;
КонецЦикла;
Подведем итог. Ошибка при создании синхронизации ЗУП — БП с текстом Значение поля "Физическое лицо" не может быть пустым — это типичный симптом нарушения логической целостности данных в справочнике Сотрудники на стороне Бухгалтерии.
Для успешного завершения настройки нам необходимо обеспечить выполнение правила: каждый элемент справочника «Сотрудники» обязан ссылаться на существующий элемент справочника «Физические лица». Как только мы устраним пустые ссылки (через групповое изменение, редактор реквизитов или полное удаление), внутренние алгоритмы 1С смогут корректно обновить кадровые регистры, и синхронизация будет успешно создана.
Перед выполнением любых манипуляций с данными, особенно с использованием сторонних обработок или группового изменения, всегда делайте резервную копию информационной базы!