Как программно очистить должность и подразделение у сотрудника в 1С:ЗУП 2.5

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

В практике работы с конфигурацией «Зарплата и Управление Персоналом 2.5» (ЗУП 2.5) нередко возникают ситуации, когда данные о сотруднике были введены ошибочно. Типичный пример: человека оформили по трудовому договору, указав ему должность и подразделение, но позже выяснилось, что он должен работать по договору гражданско-правового характера (ГПХ). В этом случае поля «Текущая должность» и «Текущее подразделение» в карточке сотрудника становятся неактуальными, и их необходимо очистить.

В этой статье мы подробно разберем, как решить эту задачу программно, проанализируем структуру данных ЗУП 2.5 и рассмотрим правильные методы работы с объектами справочников.

Постановка задачи и анализ структуры данных

Прежде чем приступать к написанию кода, проанализируем ситуацию. В ЗУП 2.5 справочник СотрудникиОрганизаций имеет реквизиты ТекущаяДолжностьОрганизации и ТекущееПодразделениеОрганизации. Эти поля отображают актуальное состояние сотрудника на текущий момент. Однако важно помнить, что архитектура ЗУП построена на регистрах сведений. Основные данные о кадровых перемещениях хранятся в регистре РаботникиОрганизаций.

Если мы просто очистим реквизиты в справочнике, но оставим проведенным документ «Прием на работу в организацию», программа может вести себя некорректно или восстановить данные при пересчете. Поэтому программная очистка — это лишь часть решения. Тем не менее, рассмотрим, как выполнить её правильно с точки зрения программирования на платформе 1С.

Шаг 1: Формирование запроса для поиска сотрудников

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    СотрудникиОрганизаций.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
    |ГДЕ
    |    СотрудникиОрганизаций.ЭтоГруппа = ЛОЖЬ
    |    И СотрудникиОрганизаций.ВидДоговора = &ВидДоговора
    |    И СотрудникиОрганизаций.ТекущаяДолжностьОрганизации <> ЗНАЧЕНИЕ(Справочник.ДолжностиОрганизаций.ПустаяСсылка)";

Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровСФизЛицами.Подряда);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

В данном запросе мы используем обращение к перечислению ВидыДоговоровСФизЛицами.Подряда и проверяем, что должность не является пустой ссылкой. Это позволяет нам получить только те объекты, которые действительно нуждаются в корректировке.

Шаг 2: Программное изменение и очистка реквизитов

После того как мы получили список сотрудников через Выборка, нам нужно изменить их данные. Здесь важно не совершить распространенную ошибку начинающих программистов — попытку поиска по наименованию. Поскольку у нас уже есть Ссылка в результате запроса, мы должны использовать метод ПолучитьОбъект().

Разберем процесс изменения по шагам:

  1. Получаем объект справочника из ссылки.
  2. Присваиваем реквизитам значение пустой ссылки соответствующего типа.
  3. Записываем объект, используя обработку исключений.

Посмотрим на пример реализации цикла обработки:


Пока Выборка.Следующий() Цикл
    
    // Получаем объект для редактирования
    СотрудникОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    // Очищаем должность и подразделение
    СотрудникОбъект.ТекущаяДолжностьОрганизации = Справочники.ДолжностиОрганизаций.ПустаяСсылка();
    СотрудникОбъект.ТекущееПодразделениеОрганизации = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
    
    // Используем попытку для записи, чтобы избежать прерывания обработки при ошибках
    Попытка
        СотрудникОбъект.Записать();
        Сообщить("Данные сотрудника " + СотрудникОбъект.Наименование + " успешно очищены.");
    Исключение
        Сообщить("Не удалось записать объект: " + СотрудникОбъект.Наименование + ". Ошибка: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецЦикла;

Важные технические нюансы

1. Использование ПустойСсылки вместо создания нового объекта. В коде автора темы прозвучала идея использовать конструктор Новый(Тип("СправочникОбъект...")). Это в корне неверно для очистки поля. Для очистки реквизита типа «Ссылка» в 1С всегда следует использовать метод ПустаяСсылка() соответствующего справочника. Это гарантирует правильное сравнение данных и отсутствие «битых» ссылок в базе.

2. Свойство ОбменДанными.Загрузка. Если в вашей конфигурации ЗУП 2.5 внедрены сложные проверки при записи (например, проверка на уникальность табельного номера или обязательное заполнение подразделения), обычный метод Записать() может выдать ошибку. Чтобы обойти проверки, которые мешают очистке данных в исключительных случаях, можно использовать следующий прием:

СотрудникОбъект.ОбменДанными.Загрузка = Истина;

Установка этого свойства перед вызовом Записать() отключает выполнение обработчиков событий ПередЗаписью и ПриЗаписи в модуле объекта и подписки на события.

Комплексный подход к исправлению ошибки

Как мы выяснили в начале, просто очистить поля в справочнике СотрудникиОрганизаций может быть недостаточно, так как кадровый учет в ЗУП 2.5 ведется «по документам». Проанализируем правильную последовательность действий, если сотрудник был принят ошибочно:

  1. Отмена проведения документа «Прием на работу»: Если по сотруднику был создан документ приема, его необходимо найти и отменить его проведение. Программно это делается так: ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);.
  2. Проверка регистров: После отмены документа записи в регистре РаботникиОрганизаций удалятся автоматически.
  3. Очистка справочника: Теперь можно применить код, приведенный выше, чтобы привести карточку сотрудника в соответствие с его новым статусом договорника (ГПХ).

Совет: Перед выполнением любых групповых обработок данных программным способом обязательно делайте резервную копию базы данных. В ЗУП 2.5 связи между объектами очень тесные, и некорректное изменение одного реквизита может отразиться на расчете зарплаты и формировании отчетности по НДФЛ.

Таким образом, мы разобрали, как эффективно и безопасно очистить должность у сотрудника, используя объектную модель 1С. Помните о разнице между ссылкой и объектом, используйте пустые ссылки для обнуления полей и всегда учитывайте регистрационную модель хранения данных в зарплатных решениях.

← На главную