Как вывести ИНН сотрудника в печатной форме 1С и исправить ошибку «Поле объекта не обнаружено»?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

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

Выясняем причину ошибки: Сотрудники vs Физические лица

Проанализируем архитектуру типовых конфигураций 1С (таких как ЗУП 3.1 или БП 3.0). Основная причина ошибки заключается в том, что ИНН является реквизитом справочника ФизическиеЛица, а не справочника Сотрудники. Справочник Сотрудники служит для хранения данных о трудовых отношениях (табельный номер, подразделение, должность), в то время как персональные данные (паспорт, ИНН, СНИЛС) хранятся в карточке физического лица.

Рассмотрим ситуацию: если в коде вы обращаетесь к объекту типа СправочникСсылка.Сотрудники и пытаетесь написать Выборка.ИНН, система выдаст ошибку, так как у сотрудника просто нет такого поля. Поле ИНН «спрятано» внутри реквизита ФизическоеЛицо.

Решение 1. Использование запроса с соединением таблиц

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

Предположим, у нас есть ссылка на сотрудника. Нам нужно получить его ИНН. Посмотрим на пример правильного запроса:


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

Важный нюанс: обратите внимание на именование реквизитов. В старых версиях конфигураций (например, ЗУП 2.5) реквизит мог называться ФизЛицо, однако в современных конфигурациях на платформе 8.3 (ЗУП 3.1, БП 3.0) он называется ФизическоеЛицо. Если вы ошибетесь в одну букву, то снова получите ошибку «Поле объекта не обнаружено».

Решение 2. Программное получение через точку (безопасный метод)

Если вам нужно получить значение ИНН в коде модуля обработки без использования сложного запроса, можно обратиться к реквизиту через точку. Однако здесь кроется ловушка: если ссылка на сотрудника или физическое лицо окажется пустой (Неопределено), программа аварийно завершит работу.

Проанализируем безопасный способ обращения через стандартные функции 1С:


// Получаем ссылку на физическое лицо из сотрудника
ФизЛицо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаСотрудника, "ФизическоеЛицо");

// Получаем ИНН напрямую из физического лица
ИНН_Сотрудника = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизЛицо, "ИНН");

Использование метода ОбщегоНазначения.ЗначениеРеквизитаОбъекта позволяет избежать ошибки «Поле объекта не обнаружено», даже если в базе данных есть битые ссылки или незаполненные поля, так как эта функция корректно обрабатывает пустые значения.

Решение 3. Использование специализированного API (для ЗУП 3.1)

В конфигурации «Зарплата и управление персоналом 3.1» разработчики фирмы 1С предусмотрели специальные механизмы для получения персональных данных. Рассмотрим работу с программным интерфейсом КадровыйУчет. Это наиболее современный и надежный способ для работы в этой конфигурации.

Для получения данных выполним следующий алгоритм:

  1. Создадим массив, содержащий ссылку на физическое лицо.
  2. Определим список необходимых полей (в нашем случае только ИНН).
  3. Вызовем функцию получения данных.

МассивФизЛиц = Новый Массив;
МассивФизЛиц.Добавить(СсылкаНаФизЛицо);

СписокПолей = "ИНН";
ТаблицаДанных = КадровыйУчет.ДанныеФизическихЛиц(МассивФизЛиц, СписокПолей, ТекущаяДата());

Если ТаблицаДанных.Количество() > 0 Тогда
    ИНН_ДляВывода = ТаблицаДанных[0].ИНН;
КонецЕсли;

Этот метод хорош тем, что он учитывает изменения данных во времени (если это периодические реквизиты) и автоматически проверяет права доступа текущего пользователя к персональным данным.

Типичные ошибки при заполнении макета

Даже если запрос написан верно, данные могут не появиться в печатной форме. Разберем основные моменты, которые стоит проверить:

Подведем итог: для успешного вывода ИНН всегда четко разделяйте объекты Сотрудник и ФизическоеЛицо, проверяйте точное имя реквизита в вашей конфигурации и используйте типовые функции общего назначения для безопасного доступа к данным.

← На главную