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