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