При переносе данных или первичной настройке современных конфигураций на платформе 1С:Предприятие 8.3 (таких как 1С:ERP Управление предприятием 2, 1С:Комплексная автоматизация 2 или 1С:Зарплата и управление персоналом 3) технические специалисты часто сталкиваются со странным поведением системы. Физические лица успешно загружаются, элементы справочника Сотрудники создаются, обработка рапортует об успешном завершении операции, но сам справочник в пользовательском интерфейсе остается абсолютно пустым.
В этой статье мы подробно разберем, почему так происходит, исследуем внутреннюю архитектуру кадрового учета в 1С и рассмотрим три практических способа решения этой проблемы, включая варианты без создания официальных документов приема на работу. Ознакомиться с различными сценариями перехода и составом передаваемой информации предлагаем в специальном раздел с готовыми переносами данных в 1С:ЗУП.
Разберем по шагам, как устроено отображение сотрудников в современных конфигурациях. В старых версиях (например, в УПП 1.3 или ЗУП 2.5) справочник Сотрудники отображался напрямую из своей таблицы БД. В современных решениях архитектура значительно усложнилась ради повышения производительности при расчете зарплаты и подборе людей в документы.
Форма списка справочника Сотрудники использует сложный динамический список. Если мы проанализируем его SQL-запрос через конфигуратор, то увидим, что выборка строится не просто по таблице справочника, а через внутреннее соединение (INNER JOIN) со служебными регистрами сведений. Если в этих регистрах отсутствуют записи по конкретному сотруднику, система считает его виртуальным (например, недооформленным или скрытой подработкой) и просто отфильтровывает из интерфейса.
Проанализируем ключевые элементы, влияющие на видимость сотрудника в списке:
Сотрудники есть реквизит ГоловнойСотрудник. Он обязательно должен ссылаться на этот же элемент (самоссылка). При стандартном импорте через универсальные обработки этот реквизит часто остается незаполненным.Сотрудник связано с физлицом и организацией, а флаг ЭтоОсновнойСотрудник установлен в значение Истина.Работник или Договорник).Обычная загрузка данных из табличного документа выполняет простую запись ссылок в таблицу справочника, но не инициирует движения по этим регистрам, так как в типовой логике эти движения создаются при проведении документа Прием на работу.
Прежде чем приступать к исправлению, давайте убедимся, что наши сотрудники действительно записались в базу данных, а не пропали из-за системной ошибки. Для этого воспользуемся консолью запросов и выполним простейший запрос:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.Код КАК Код,
Сотрудники.Наименование КАК ФИО,
Сотрудники.ФизическоеЛицо КАК ФизическоеЛицо,
Сотрудники.ГоловнойСотрудник КАК ГоловнойСотрудник
ИЗ
Справочник.Сотрудники КАК Сотрудники
Если этот запрос возвращает созданные вами строки, значит, физически элементы существуют. Проблема кроется исключительно в механизме их вывода на форму. Переходим к вариантам решения.
Если вы уже загрузили справочник и вам нужно быстро вернуть сотрудников в видимое поле, можно попробовать воспользоваться встроенным механизмом восстановления индексов подбора. Рассмотрим, как это сделать:
e1cib/list/РегистрСведений.ДанныеДляПодбораСотрудников и нажмите «Перейти».Система запустит фоновое задание, которое попытается проанализировать справочник сотрудников и восстановить по ним кадровые связи. Если реквизит ГоловнойСотрудник у элементов был заполнен корректно, этот метод сразу вернет их в список.
Если заказчик категорически отказывается создавать документы приема на работу (например, база используется только для управленческих целей или загружается архив за прошлые периоды), нам придется программно имитировать кадровые связи.
Рассмотрим пример кода внешней обработки, который необходимо запустить после загрузки элементов в справочник. Этот алгоритм устанавливает самоссылку в реквизите ГоловнойСотрудник и создает минимально необходимые записи в служебных регистрах:
Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() Цикл
// 1. Исправляем реквизит самоссылки головного сотрудника
Если Выборка.ГоловнойСотрудник <> Выборка.Ссылка Тогда
ОбъектСотрудник = Выборка.ПолучитьОбъект();
ОбъектСотрудник.ГоловнойСотрудник = Выборка.Ссылка;
ОбъектСотрудник.Записать();
КонецЕсли;
СотрудникСсылка = Выборка.Ссылка;
ФизЛицоСсылка = Выборка.ФизическоеЛицо;
ОрганизацияСсылка = Выборка.ГоловнаяОрганизация;
// 2. Запись в регистр "Данные для подбора сотрудников"
НаборПодбор = РегистрыСведений.ДанныеДляПодбораСотрудников.СоздатьНаборЗаписей();
НаборПодбор.Отбор.Сотрудник.Установить(СотрудникСсылка);
НоваяЗапись = НаборПодбор.Добавить();
НоваяЗапись.Сотрудник = СотрудникСсылка;
НоваяЗапись.ФизическоеЛицо = ФизЛицоСсылка;
НоваяЗапись.Организация = ОрганизацияСсылка;
НоваяЗапись.ЭтоГоловнойСотрудник = Истина;
НоваяЗапись.ВШтате = Истина;
НаборПодбор.Записать();
// 3. Запись в регистр "Роли сотрудников"
НаборРоли = РегистрыСведений.РолиСотрудников.СоздатьНаборЗаписей();
НаборРоли.Отбор.Сотрудник.Установить(СотрудникСсылка);
НоваяРоль = НаборРоли.Добавить();
НоваяРоль.Сотрудник = СотрудникСсылка;
НоваяРоль.Роль = Перечисления.РолиСотрудников.Работник;
НаборРоли.Записать();
// 4. Запись в регистр "Основные сотрудники физических лиц"
НаборОсновные = РегистрыСведений.ОсновныеСотрудникиФизическихЛиц.СоздатьНаборЗаписей();
НаборОсновные.Отбор.ФизическоеЛицо.Установить(ФизЛицоСсылка);
НаборОсновные.Отбор.Работает.Установить(Истина);
НоваяЗаписьОсн = НаборОсновные.Добавить();
НоваяЗаписьОсн.ФизическоеЛицо = ФизЛицоСсылка;
НоваяЗаписьОсн.Организация = ОрганизацияСсылка;
НоваяЗаписьОсн.Сотрудник = СотрудникСсылка;
НоваяЗаписьОсн.Работает = Истина;
НаборОсновные.Записать();
КонецЦикла;
Важное предупреждение: Использование этого метода решает проблему отображения сотрудников в списках и полях выбора, однако вы должны предупредить заказчика о возможных последствиях. Без реальных документов приема на работу (или кадровых переводов) в системе не будут автоматически рассчитываться остатки отпусков, стажи, а также не сформируется регламентированная отчетность по кадрам (например, ЕФС-1).
Чтобы система работала корректно, а у бухгалтеров и кадровиков не возникало проблем с начислением зарплаты, лучшим выходом будет автоматическое создание документов приема на работу по упрощенной схеме. При переезде из устаревших систем эту задачу выполняет автоматизированный перенос данных из УПП 1.3 в ЗУП 3, который сразу создает все нужные кадровые документы.
Выясним, как автоматизировать этот процесс. Можно использовать обработку, которая создает один общий групповой документ Прием на работу списком для всех загруженных сотрудников. Посмотрим на пример кода создания упрощенного документа:
ДокПрием = Документы.ПриемНаРаботуСписком.СоздатьДокумент();
ДокПрием.Дата = ТекущаяДата();
ДокПрием.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
ДокПрием.Ответственный = ПараметрыСеанса.ТекущийПользователь;
Для Каждого СтрокаТаблицы Из ТаблицаЗагруженныхСотрудников Цикл
НоваяСтрока = ДокПрием.Сотрудники.Добавить();
НоваяСтрока.Сотрудник = СтрокаТаблицы.СотрудникСсылка;
НоваяСтрока.ФизическоеЛицо = СтрокаТаблицы.ФизЛицоСсылка;
НоваяСтрока.ДатаПриема = СтрокаТаблицы.ДатаПриема;
НоваяСтрока.Подразделение = СтрокаТаблицы.ПодразделениеСсылка;
НоваяСтрока.Должность = СтрокаТаблицы.ДолжностьСсылка;
НоваяСтрока.Оклад = СтрокаТаблицы.Оклад;
// Заполняем остальные обязательные кадровые реквизиты
КонецЦикла;
Попытка
ДокПрием.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Сотрудники успешно приняты на работу, кадровые регистры заполнены!");
Исключение
ДокПрием.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Не удалось провести документ приема: " + ОписаниеОшибки() + ". Документ сохранен как черновик.");
КонецПопытки;
Данный подход является наиболее надежным и гарантирует, что все механизмы платформы 1С:ERP и ЗУП будут работать штатно. Проведение документа автоматически сформирует записи во всех пяти необходимых регистрах сведений, и сотрудники мгновенно станут видны в справочнике без написания сложных костылей. В случаях, когда требуется выделить зарплатный контур из комплексной системы, применяется перенос кадровых данных из 1С:ERP 2 в ЗУП 3 с сохранением всей истории учета.