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