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