Приветствую, Форумчане!
1с8.3.12, самопис, БСП, УФ

Имеется некий документ, где есть реквизит "Сотрудник" из справочника "Сотрудники"

Если элемент справочника поставлен на удаление, то при выборе такого сотрудника выходит системное сообщение типа "Элемент помечен на удаление: применить или отменить ввод..." Т.е. можно своевременно упредить ввод помеченного на удаление...

У справочника "Сотрудники" есть реквизит "Уволен" типа булево.

Как можно сделать так, чтобы проверялся ввод по строке по этому реквизиту с отменой ввода, если сотрудник уволен?

ПС: а нечто подобное можно сделать типа подписка на события для всех документов, где есть реквизит "Сотрудник"
---
а нечто подобное можно сделать типа подписка на события для всех документов, где есть реквизит "Сотрудник"
Да.
У справочника Сотрудники в модуле менеджера есть предопределенное событие ОбработкаПолученияДанныхВыбора()
Вот там можно переопределить поиск по подстроке, отфильтровать лишнее и т.п.
Т.е. можно самому построить запрос, который выдает список того, что находится по подстроке, убрав в запросе уволенных и прочее.
В портянке ниже - листинг этой процедуры из ЗУП 3.1. Чисто для понимания, что там происходит.

```1c
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт

    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = Новый СписокЗначений;

    СотрудникиФормы.УстановитьСтандартныеОтборыСотрудников(Параметры.Отбор);

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Если Параметры.Свойство("СтрокаПоиска") И Не ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
    СтрокаПоиска = Параметры.СтрокаПоиска;
    Иначе
    СтрокаПоиска = ";
    КонецЕсли;

    ДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска);

    ТекстыУсловий = Новый Массив;
    Если КадровыйУчетРасширенный.НастройкиКадровогоУчета().ВПоляхВводаСотрудниковУчитыватьИзмененияФамилии
    И Не ПустаяСтрока(СтрокаПоиска) Тогда

    УстановитьПривилегированныйРежим(Истина);
    ФизическиеЛицаЗарплатаКадры.СоздатьВТПрежниеФИО(Запрос.МенеджерВременныхТаблиц, Ложь, СтрокаПоиска);
    УстановитьПривилегированныйРежим(Ложь);

    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | ПрежниеФИО.ФИО КАК ФИО,
    | ПрежниеФИО.Фамилия КАК Фамилия,
    | ПрежниеФИО.Имя КАК Имя,
    | ПрежниеФИО.Отчество КАК Отчество,
    | Сотрудники.Сотрудник КАК Сотрудник,
    | МАКСИМУМ(ПрежниеФИО.Период) КАК Период,
    | Сотрудники.ПометкаУдаления КАК ПометкаУдаления,
    | Сотрудники.Код КАК Код,
    | Сотрудники.Наименование КАК Наименование
    |ИЗ
    | ВТПрежниеФИО КАК ПрежниеФИО
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    | ПО ПрежниеФИО.ФизическоеЛицо = Сотрудники.ФизическоеЛицо
    |ГДЕ
    | &УсловияБезСтрокиПоиска
    |
    |СГРУППИРОВАТЬ ПО
    | ПрежниеФИО.ФИО,
    | ПрежниеФИО.Фамилия,
    | ПрежниеФИО.Имя,
    | ПрежниеФИО.Отчество,
    | Сотрудники.Сотрудник,
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | "",
    | "",
    | "",
    | "",
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоНаименованию";

    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.Текст = Запрос.Текст + "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | "",
    | "",
    | "",
    | "",
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоКоду";

    КонецЕсли;

    Иначе

    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | Сотрудники.Наименование КАК Наименование,
    | Сотрудники.Сотрудник КАК Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1) КАК Период,
    | Сотрудники.Код КАК Код,
    | Сотрудники.ПометкаУдаления КАК ПометкаУдаления
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоНаименованию";

    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.Текст = Запрос.Текст + "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | Сотрудники.Наименование,
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.Код,
    | Сотрудники.ПометкаУдаления
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоКоду";

    КонецЕсли;

    КонецЕсли;

    // Отбор сотрудников "в архиве"
    Если Параметры.Отбор.Свойство("ВАрхиве") Тогда

    Если Параметры.Отбор.ВАрхиве = Истина Тогда
    ТекстыУсловий.Добавить("Сотрудники.ВАрхиве");
    Иначе
    ТекстыУсловий.Добавить("НЕ Сотрудники.ВАрхиве");
    КонецЕсли;

    КонецЕсли;

    // Отбор по головной организации.
    Если Параметры.Отбор.Свойство("ГоловнаяОрганизация")
    И ЗначениеЗаполнено(Параметры.Отбор.ГоловнаяОрганизация) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Организация = &ГоловнаяОрганизация");
    Запрос.УстановитьПараметр("ГоловнаяОрганизация", ЗарплатаКадры.ГоловнаяОрганизация(Параметры.Отбор.ГоловнаяОрганизация));

    КонецЕсли;

    // Удаление незаполненных значений отборов
    Если Параметры.Отбор.Свойство("ТекущаяОрганизация")
    И Не ЗначениеЗаполнено(Параметры.Отбор.ТекущаяОрганизация) Тогда

    Параметры.Отбор.Удалить("ТекущаяОрганизация");

    КонецЕсли;

    Если Параметры.Отбор.Свойство("ТекущееПодразделение") Тогда

    Если Параметры.Свойство("УчитыватьОтборПоПодразделению")
    И Параметры.УчитыватьОтборПоПодразделению
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение)
    И Не ПолучитьФункциональнуюОпцию("ВыполнятьРасчетЗарплатыПоПодразделениям") Тогда

    Параметры.Отбор.Удалить("ТекущееПодразделение");

    ИначеЕсли Не ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение) Тогда
    Параметры.Отбор.Удалить("ТекущееПодразделение");
    КонецЕсли;

    КонецЕсли;

    ПоказыватьПодработки = Неопределено;
    Параметры.Отбор.Свойство("ПоказыватьПодработки", ПоказыватьПодработки);

    // Отбор по головному сотруднику.
    Если ПоказыватьПодработки <> Истина И НЕ Параметры.Отбор.Свойство("ГоловнойСотрудник") Тогда
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Истина);
    ТекстыУсловий.Добавить("Сотрудники.ЭтоГоловнойСотрудник = ИСТИНА");
    ИначеЕсли Параметры.Отбор.Свойство("ПоказыватьТолькоПодработки") Тогда
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Истина);
    ТекстыУсловий.Добавить("Сотрудники.ЭтоГоловнойСотрудник = ЛОЖЬ");
    Иначе
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Ложь);
    КонецЕсли;

    Если Параметры.Свойство("ДоступныНеПринятые")
    И Параметры.ДоступныНеПринятые Тогда

    ТекстыУсловий.Добавить("Сотрудники.Начало = ДАТАВРЕМЯ(1, 1, 1)");
    ТекстыУсловий.Добавить("Сотрудники.Окончание = ДАТАВРЕМЯ(3999, 12, 31)");

    Если Параметры.Отбор.Свойство("ТекущаяОрганизация")
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущаяОрганизация) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Организация = &ГоловнаяОрганизация");
    Запрос.УстановитьПараметр("ГоловнаяОрганизация", ЗарплатаКадры.ГоловнаяОрганизация(Параметры.Отбор.ТекущаяОрганизация));

    КонецЕсли;

    Иначе

    Если Параметры.Отбор.Свойство("ТекущаяОрганизация") Тогда

    Запрос.УстановитьПараметр("Филиал", Параметры.Отбор.ТекущаяОрганизация);
    ТекстыУсловий.Добавить("Сотрудники.Филиал = &Филиал");

    КонецЕсли;

    КонецЕсли;

    // Отбор по текущему подразделению, если заполнено.
    Если Параметры.Отбор.Свойство("ТекущееПодразделение")
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Подразделение В ИЕРАРХИИ (&Подразделение)");
    Запрос.УстановитьПараметр("Подразделение", Параметры.Отбор.ТекущееПодразделение);

    КонецЕсли;

    ПараметрыОтбораПоПериоду = ПараметрыОтбораПоПериодуПараметровОткрытияФормыСписка(Параметры);
    Запрос.УстановитьПараметр("ДатаНачала", ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаНачала);
    Если ЗначениеЗаполнено(ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаОкончания) Тогда
    Запрос.УстановитьПараметр("ДатаОкончания", ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаОкончания);
    Иначе
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));
    КонецЕсли;
    ТекстыУсловий.Добавить("Сотрудники.Начало <= &ДатаОкончания");
    ТекстыУсловий.Добавить("Сотрудники.Окончание >= &ДатаНачала");
    ТекстыУсловий.Добавить("Сотрудники.ВидСобытия <> Значение(Перечисление.ВидыКадровыхСобытий.Увольнение)");

    // Отбор по виду занятости
    Если Параметры.Отбор.Свойство("ВидЗанятости")
    И ЗначениеЗаполнено(Параметры.Отбор.ВидЗанятости) Тогда

    ТекстыУсловий.Добавить("Сотрудники.ВидЗанятости В (&ВидЗанятости)");
    Запрос.УстановитьПараметр("ВидЗанятости", Параметры.Отбор.ВидЗанятости);

    КонецЕсли;

    // Отбор по виду договора
    Если Параметры.Отбор.Свойство("ВидДоговора")
    И ЗначениеЗаполнено(Параметры.Отбор.ВидДоговора)
    Или Параметры.Отбор.Свойство("НачислениеЗарплатыВоеннослужащим") Тогда

    ТекстыУсловий.Добавить("Сотрудники.ВидДоговора В (&ВидДоговора)");
    Если Параметры.Отбор.Свойство("НачислениеЗарплатыВоеннослужащим") Тогда

    Если Параметры.Отбор.НачислениеЗарплатыВоеннослужащим Тогда
    Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровССотрудниками.ВидыДоговоровВоеннойСлужбы());
    Иначе
    Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровССотрудниками.ВидыДоговоровКромеВоеннойСлужбы());
    КонецЕсли;

    Иначе
    Запрос.УстановитьПараметр("ВидДоговора", Параметры.Отбор.ВидДоговора);
    КонецЕсли;

    КонецЕсли;

    // Отбор по параметру РольСотрудника.
    Если Параметры.Отбор.Свойство("РольСотрудника")
    И ЗначениеЗаполнено(Параметры.Отбор.РольСотрудника) Тогда

    ТекстСоединения = "РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РолиСотрудников Как РолиСотрудников
    | По Сотрудники.Сотрудник = РолиСотрудников.Сотрудник";

    Запрос.Текст = СтрЗаменить(Запрос.Текст, "РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники", ТекстСоединения);

    Если Параметры.Отбор.РольСотрудника = Перечисления.РолиСотрудников.Договорник Тогда
    ТекстыУсловий.Добавить("РолиСотрудников.РольСотрудника = ЗНАЧЕНИЕ(Перечисление.РолиСотрудников.Договорник)");
    ИначеЕсли Параметры.Отбор.РольСотрудника = Перечисления.РолиСотрудников.Работник Тогда
    ТекстыУсловий.Добавить("РолиСотрудников.РольСотрудника = ЗНАЧЕНИЕ(Перечисление.РолиСотрудников.Работник)");
    КонецЕсли;

    КонецЕсли;

    ТекстыЗапроса = Новый Массив;
    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска + "%");
    Запрос.УстановитьПараметр("СтрокаПоискаПоКоду", "%" + СтрокаПоиска + "%");

    Если ТекстыУсловий.Количество() = 0 Тогда
    ТекстЗапроса = СтрЗаменить(Запрос.Текст, "&УсловияБезСтрокиПоиска", "(ИСТИНА)")
    Иначе
    ТекстЗапроса = СтрЗаменить(Запрос.Текст, "&УсловияБезСтрокиПоиска", СтрСоединить(ТекстыУсловий, Символы.ПС + "И "))
    КонецЕсли;

    ТекстыУсловийПоНаименованию = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ТекстыУсловий);
    ТекстыУсловийПоНаименованию.Добавить("(Сотрудники.Наименование ПОДОБНО &СтрокаПоиска)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбораПоНаименованию", СтрСоединить(ТекстыУсловийПоНаименованию, Символы.ПС + "И "));

    ТекстыУсловийПоКоду = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ТекстыУсловий);
    ТекстыУсловийПоКоду.Добавить("(Сотрудники.Код ПОДОБНО &СтрокаПоискаПоКоду)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбораПоКоду", СтрСоединить(ТекстыУсловийПоКоду, Символы.ПС + "И "));

    ТекстыЗапроса.Добавить(ТекстЗапроса);

    Иначе

    Если ТекстыУсловий.Количество() = 0 Тогда
    ТекстыЗапроса.Добавить(СтрЗаменить(Запрос.Текст, "&УсловияОтбораПоНаименованию", "(ИСТИНА)"));
    Иначе
    ТекстыЗапроса.Добавить(СтрЗаменить(Запрос.Текст, "&УсловияОтбораПоНаименованию", СтрСоединить(ТекстыУсловий, Символы.ПС + "И ")));
    КонецЕсли;

    КонецЕсли;

    ТекстыЗапроса.Добавить(
    "УПОРЯДОЧИТЬ ПО
    | Сотрудники.Наименование");

    Запрос.Текст = СтрСоединить(ТекстыЗапроса, Символы.ПС);
    ТаблицаСотрудников = Запрос.Выполнить().Выгрузить();

    ДополнительныеДанныеСотрудников = Новый Соответствие;
    ЗапросСвойств = Новый Запрос;
    ЗапросСвойств.УстановитьПараметр("СотрудникиДляДопДанных", ТаблицаСотрудников.ВыгрузитьКолонку("Сотрудник"));

    ЗапросСвойств.Текст =
    "ВЫБРАТЬ
    | Сотрудники.Ссылка КАК Сотрудник,
    | ПРЕДСТАВЛЕНИЕ(Сотрудники.Ссылка) КАК СотрудникПредставление,
    | Сотрудники.УточнениеНаименования КАК УточнениеНаименования,
    | Сотрудники.ФизическоеЛицо.УточнениеНаименования КАК УточнениеНаименованияФизическогоЛица
    |ИЗ
    | Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    | Сотрудники.Ссылка В(&СотрудникиДляДопДанных)";

    УстановитьПривилегированныйРежим(Истина);
    Выборка = ЗапросСвойств.Выполнить().Выбрать();
    УстановитьПривилегированныйРежим(Ложь);

    Пока Выборка.Следующий() Цикл

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

    КонецЦикла;

    Для Каждого СтрокаТаблицы Из ТаблицаСотрудников Цикл

    Если ЗначениеЗаполнено(СтрокаТаблицы.Период) Тогда

    ПравилоФормированияПредставления = ПараметрыСеанса.ПравилоФормированияПредставленияЭлементовСправочникаСотрудни­ки;

    ДанныеДляФормированияПредставления = Новый Структура;
    ДанныеДляФормированияПредставления.Вставить("ПравилоФормированияПредставления", ПравилоФормированияПредставления);

    ДанныеСотрудника = ДополнительныеДанныеСотрудников.Получить(СтрокаТаблицы.Сотрудник);
    ФИО = Новый Структура("Фамилия,Имя,Отчество");
    ЗаполнитьЗначенияСвойств(ФИО, СтрокаТаблицы);

    ДанныеДляФормированияПредставления.Вставить("ФИО", ФИО);
    ДанныеДляФормированияПредставления.Вставить("ФИОПолные", СтрокаТаблицы.ФИО);
    ДанныеДляФормированияПредставления.Вставить("УточнениеНаименованияФизическогоЛица", ДанныеСотрудника.УточнениеНаименованияФизическогоЛица);
    ДанныеДляФормированияПредставления.Вставить("УточнениеНаименованияСотрудника", ДанныеСотрудника.УточнениеНаименования);

    ПредставлениеПоПрежнимДанным = КадровыйУчетВнутреннийКлиентСервер.ПредставлениеЭлементаСправочникаСотрудники(
    ДанныеДляФормированияПредставления);

    Представление = Новый ФорматированнаяСтрока(
    Новый ФорматированнаяСтрока(
    Лев(ПредставлениеПоПрежнимДанным, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеПоПрежнимДанным, ДлинаСтрокиПоиска + 1));

    ПредставлениеСотрудника = ДанныеСотрудника.СотрудникПредставление;

    Представление = Новый ФорматированнаяСтрока(
    Представление,
    " (" + ПредставлениеСотрудника + " "
    + НСтр("ru='с'") + " " + Формат(СтрокаТаблицы.Период, "ДЛФ=D") + " (" + СтрокаТаблицы.Код + "))");

    Иначе

    ДанныеСотрудника = ДополнительныеДанныеСотрудников.Получить(СтрокаТаблицы.Сотрудник);
    Если Не ПустаяСтрока(СтрокаПоиска) И Не СтрНачинаетсяС(Врег(ДанныеСотрудника.СотрудникПредставление), Врег(СтрокаПоиска)) Тогда

    ПредставлениеСотрудника = "(" + СтрокаТаблицы.Код + ") " + ДанныеСотрудника.СотрудникПредставление;

    ПозицияСтрокиПоиска = СтрНайти(ВРег(ПредставлениеСотрудника), ВРег(СтрокаПоиска));
    Представление = Новый ФорматированнаяСтрока(
    Лев(ПредставлениеСотрудника, ПозицияСтрокиПоиска - 1),
    Новый ФорматированнаяСтрока(
    Сред(ПредставлениеСотрудника, ПозицияСтрокиПоиска, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеСотрудника, ПозицияСтрокиПоиска + ДлинаСтрокиПоиска));

    Иначе

    ПредставлениеСотрудника = ДанныеСотрудника.СотрудникПредставление + " (" + СтрокаТаблицы.Код + ")";

    Представление = Новый ФорматированнаяСтрока(
    Новый ФорматированнаяСтрока(
    Лев(ПредставлениеСотрудника, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеСотрудника, ДлинаСтрокиПоиска + 1));

    КонецЕсли;

    КонецЕсли;

    ДанныеВыбора.Добавить(СтрокаТаблицы.Сотрудник, Представление, СтрокаТаблицы.ПометкаУдаления);

    КонецЦикла;

    КонецПроцедуры
```
---
а нечто подобное можно сделать типа подписка на события для всех документов, где есть реквизит "Сотрудник"
Да.
У справочника Сотрудники в модуле менеджера есть предопределенное событие ОбработкаПолученияДанныхВыбора()
Вот там можно переопределить поиск по подстроке, отфильтровать лишнее и т.п.
Т.е. можно самому построить запрос, который выдает список того, что находится по подстроке, убрав в запросе уволенных и прочее.
В портянке ниже - листинг этой процедуры из ЗУП 3.1. Чисто для понимания, что там происходит.

```1c
    Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт

    СтандартнаяОбработка = Ложь;
    ДанныеВыбора = Новый СписокЗначений;

    СотрудникиФормы.УстановитьСтандартныеОтборыСотрудников(Параметры.Отбор);

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

    Если Параметры.Свойство("СтрокаПоиска") И Не ПустаяСтрока(Параметры.СтрокаПоиска) Тогда
    СтрокаПоиска = Параметры.СтрокаПоиска;
    Иначе
    СтрокаПоиска = ";
    КонецЕсли;

    ДлинаСтрокиПоиска = СтрДлина(СтрокаПоиска);

    ТекстыУсловий = Новый Массив;
    Если КадровыйУчетРасширенный.НастройкиКадровогоУчета().ВПоляхВводаСотрудниковУчитыватьИзмененияФамилии
    И Не ПустаяСтрока(СтрокаПоиска) Тогда

    УстановитьПривилегированныйРежим(Истина);
    ФизическиеЛицаЗарплатаКадры.СоздатьВТПрежниеФИО(Запрос.МенеджерВременныхТаблиц, Ложь, СтрокаПоиска);
    УстановитьПривилегированныйРежим(Ложь);

    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | ПрежниеФИО.ФИО КАК ФИО,
    | ПрежниеФИО.Фамилия КАК Фамилия,
    | ПрежниеФИО.Имя КАК Имя,
    | ПрежниеФИО.Отчество КАК Отчество,
    | Сотрудники.Сотрудник КАК Сотрудник,
    | МАКСИМУМ(ПрежниеФИО.Период) КАК Период,
    | Сотрудники.ПометкаУдаления КАК ПометкаУдаления,
    | Сотрудники.Код КАК Код,
    | Сотрудники.Наименование КАК Наименование
    |ИЗ
    | ВТПрежниеФИО КАК ПрежниеФИО
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    | ПО ПрежниеФИО.ФизическоеЛицо = Сотрудники.ФизическоеЛицо
    |ГДЕ
    | &УсловияБезСтрокиПоиска
    |
    |СГРУППИРОВАТЬ ПО
    | ПрежниеФИО.ФИО,
    | ПрежниеФИО.Фамилия,
    | ПрежниеФИО.Имя,
    | ПрежниеФИО.Отчество,
    | Сотрудники.Сотрудник,
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | "",
    | "",
    | "",
    | "",
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоНаименованию";

    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.Текст = Запрос.Текст + "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | "",
    | "",
    | "",
    | "",
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.ПометкаУдаления,
    | Сотрудники.Код,
    | Сотрудники.Наименование
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоКоду";

    КонецЕсли;

    Иначе

    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | Сотрудники.Наименование КАК Наименование,
    | Сотрудники.Сотрудник КАК Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1) КАК Период,
    | Сотрудники.Код КАК Код,
    | Сотрудники.ПометкаУдаления КАК ПометкаУдаления
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоНаименованию";

    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.Текст = Запрос.Текст + "
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 51
    | Сотрудники.Наименование,
    | Сотрудники.Сотрудник,
    | ДАТАВРЕМЯ(1, 1, 1),
    | Сотрудники.Код,
    | Сотрудники.ПометкаУдаления
    |ИЗ
    | РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    |ГДЕ
    | &УсловияОтбораПоКоду";

    КонецЕсли;

    КонецЕсли;

    // Отбор сотрудников "в архиве"
    Если Параметры.Отбор.Свойство("ВАрхиве") Тогда

    Если Параметры.Отбор.ВАрхиве = Истина Тогда
    ТекстыУсловий.Добавить("Сотрудники.ВАрхиве");
    Иначе
    ТекстыУсловий.Добавить("НЕ Сотрудники.ВАрхиве");
    КонецЕсли;

    КонецЕсли;

    // Отбор по головной организации.
    Если Параметры.Отбор.Свойство("ГоловнаяОрганизация")
    И ЗначениеЗаполнено(Параметры.Отбор.ГоловнаяОрганизация) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Организация = &ГоловнаяОрганизация");
    Запрос.УстановитьПараметр("ГоловнаяОрганизация", ЗарплатаКадры.ГоловнаяОрганизация(Параметры.Отбор.ГоловнаяОрганизация));

    КонецЕсли;

    // Удаление незаполненных значений отборов
    Если Параметры.Отбор.Свойство("ТекущаяОрганизация")
    И Не ЗначениеЗаполнено(Параметры.Отбор.ТекущаяОрганизация) Тогда

    Параметры.Отбор.Удалить("ТекущаяОрганизация");

    КонецЕсли;

    Если Параметры.Отбор.Свойство("ТекущееПодразделение") Тогда

    Если Параметры.Свойство("УчитыватьОтборПоПодразделению")
    И Параметры.УчитыватьОтборПоПодразделению
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение)
    И Не ПолучитьФункциональнуюОпцию("ВыполнятьРасчетЗарплатыПоПодразделениям") Тогда

    Параметры.Отбор.Удалить("ТекущееПодразделение");

    ИначеЕсли Не ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение) Тогда
    Параметры.Отбор.Удалить("ТекущееПодразделение");
    КонецЕсли;

    КонецЕсли;

    ПоказыватьПодработки = Неопределено;
    Параметры.Отбор.Свойство("ПоказыватьПодработки", ПоказыватьПодработки);

    // Отбор по головному сотруднику.
    Если ПоказыватьПодработки <> Истина И НЕ Параметры.Отбор.Свойство("ГоловнойСотрудник") Тогда
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Истина);
    ТекстыУсловий.Добавить("Сотрудники.ЭтоГоловнойСотрудник = ИСТИНА");
    ИначеЕсли Параметры.Отбор.Свойство("ПоказыватьТолькоПодработки") Тогда
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Истина);
    ТекстыУсловий.Добавить("Сотрудники.ЭтоГоловнойСотрудник = ЛОЖЬ");
    Иначе
    Запрос.УстановитьПараметр("ПоказыватьПодработки", Ложь);
    КонецЕсли;

    Если Параметры.Свойство("ДоступныНеПринятые")
    И Параметры.ДоступныНеПринятые Тогда

    ТекстыУсловий.Добавить("Сотрудники.Начало = ДАТАВРЕМЯ(1, 1, 1)");
    ТекстыУсловий.Добавить("Сотрудники.Окончание = ДАТАВРЕМЯ(3999, 12, 31)");

    Если Параметры.Отбор.Свойство("ТекущаяОрганизация")
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущаяОрганизация) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Организация = &ГоловнаяОрганизация");
    Запрос.УстановитьПараметр("ГоловнаяОрганизация", ЗарплатаКадры.ГоловнаяОрганизация(Параметры.Отбор.ТекущаяОрганизация));

    КонецЕсли;

    Иначе

    Если Параметры.Отбор.Свойство("ТекущаяОрганизация") Тогда

    Запрос.УстановитьПараметр("Филиал", Параметры.Отбор.ТекущаяОрганизация);
    ТекстыУсловий.Добавить("Сотрудники.Филиал = &Филиал");

    КонецЕсли;

    КонецЕсли;

    // Отбор по текущему подразделению, если заполнено.
    Если Параметры.Отбор.Свойство("ТекущееПодразделение")
    И ЗначениеЗаполнено(Параметры.Отбор.ТекущееПодразделение) Тогда

    ТекстыУсловий.Добавить("Сотрудники.Подразделение В ИЕРАРХИИ (&Подразделение)");
    Запрос.УстановитьПараметр("Подразделение", Параметры.Отбор.ТекущееПодразделение);

    КонецЕсли;

    ПараметрыОтбораПоПериоду = ПараметрыОтбораПоПериодуПараметровОткрытияФормыСписка(Параметры);
    Запрос.УстановитьПараметр("ДатаНачала", ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаНачала);
    Если ЗначениеЗаполнено(ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаОкончания) Тогда
    Запрос.УстановитьПараметр("ДатаОкончания", ПараметрыОтбораПоПериоду.ПериодРаботы.ДатаОкончания);
    Иначе
    Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДатаСеанса()));
    КонецЕсли;
    ТекстыУсловий.Добавить("Сотрудники.Начало <= &ДатаОкончания");
    ТекстыУсловий.Добавить("Сотрудники.Окончание >= &ДатаНачала");
    ТекстыУсловий.Добавить("Сотрудники.ВидСобытия <> Значение(Перечисление.ВидыКадровыхСобытий.Увольнение)");

    // Отбор по виду занятости
    Если Параметры.Отбор.Свойство("ВидЗанятости")
    И ЗначениеЗаполнено(Параметры.Отбор.ВидЗанятости) Тогда

    ТекстыУсловий.Добавить("Сотрудники.ВидЗанятости В (&ВидЗанятости)");
    Запрос.УстановитьПараметр("ВидЗанятости", Параметры.Отбор.ВидЗанятости);

    КонецЕсли;

    // Отбор по виду договора
    Если Параметры.Отбор.Свойство("ВидДоговора")
    И ЗначениеЗаполнено(Параметры.Отбор.ВидДоговора)
    Или Параметры.Отбор.Свойство("НачислениеЗарплатыВоеннослужащим") Тогда

    ТекстыУсловий.Добавить("Сотрудники.ВидДоговора В (&ВидДоговора)");
    Если Параметры.Отбор.Свойство("НачислениеЗарплатыВоеннослужащим") Тогда

    Если Параметры.Отбор.НачислениеЗарплатыВоеннослужащим Тогда
    Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровССотрудниками.ВидыДоговоровВоеннойСлужбы());
    Иначе
    Запрос.УстановитьПараметр("ВидДоговора", Перечисления.ВидыДоговоровССотрудниками.ВидыДоговоровКромеВоеннойСлужбы());
    КонецЕсли;

    Иначе
    Запрос.УстановитьПараметр("ВидДоговора", Параметры.Отбор.ВидДоговора);
    КонецЕсли;

    КонецЕсли;

    // Отбор по параметру РольСотрудника.
    Если Параметры.Отбор.Свойство("РольСотрудника")
    И ЗначениеЗаполнено(Параметры.Отбор.РольСотрудника) Тогда

    ТекстСоединения = "РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РолиСотрудников Как РолиСотрудников
    | По Сотрудники.Сотрудник = РолиСотрудников.Сотрудник";

    Запрос.Текст = СтрЗаменить(Запрос.Текст, "РегистрСведений.ДанныеДляПодбораСотрудников КАК Сотрудники", ТекстСоединения);

    Если Параметры.Отбор.РольСотрудника = Перечисления.РолиСотрудников.Договорник Тогда
    ТекстыУсловий.Добавить("РолиСотрудников.РольСотрудника = ЗНАЧЕНИЕ(Перечисление.РолиСотрудников.Договорник)");
    ИначеЕсли Параметры.Отбор.РольСотрудника = Перечисления.РолиСотрудников.Работник Тогда
    ТекстыУсловий.Добавить("РолиСотрудников.РольСотрудника = ЗНАЧЕНИЕ(Перечисление.РолиСотрудников.Работник)");
    КонецЕсли;

    КонецЕсли;

    ТекстыЗапроса = Новый Массив;
    Если Не ПустаяСтрока(СтрокаПоиска) Тогда

    Запрос.УстановитьПараметр("СтрокаПоиска", СтрокаПоиска + "%");
    Запрос.УстановитьПараметр("СтрокаПоискаПоКоду", "%" + СтрокаПоиска + "%");

    Если ТекстыУсловий.Количество() = 0 Тогда
    ТекстЗапроса = СтрЗаменить(Запрос.Текст, "&УсловияБезСтрокиПоиска", "(ИСТИНА)")
    Иначе
    ТекстЗапроса = СтрЗаменить(Запрос.Текст, "&УсловияБезСтрокиПоиска", СтрСоединить(ТекстыУсловий, Символы.ПС + "И "))
    КонецЕсли;

    ТекстыУсловийПоНаименованию = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ТекстыУсловий);
    ТекстыУсловийПоНаименованию.Добавить("(Сотрудники.Наименование ПОДОБНО &СтрокаПоиска)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбораПоНаименованию", СтрСоединить(ТекстыУсловийПоНаименованию, Символы.ПС + "И "));

    ТекстыУсловийПоКоду = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ТекстыУсловий);
    ТекстыУсловийПоКоду.Добавить("(Сотрудники.Код ПОДОБНО &СтрокаПоискаПоКоду)");
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбораПоКоду", СтрСоединить(ТекстыУсловийПоКоду, Символы.ПС + "И "));

    ТекстыЗапроса.Добавить(ТекстЗапроса);

    Иначе

    Если ТекстыУсловий.Количество() = 0 Тогда
    ТекстыЗапроса.Добавить(СтрЗаменить(Запрос.Текст, "&УсловияОтбораПоНаименованию", "(ИСТИНА)"));
    Иначе
    ТекстыЗапроса.Добавить(СтрЗаменить(Запрос.Текст, "&УсловияОтбораПоНаименованию", СтрСоединить(ТекстыУсловий, Символы.ПС + "И ")));
    КонецЕсли;

    КонецЕсли;

    ТекстыЗапроса.Добавить(
    "УПОРЯДОЧИТЬ ПО
    | Сотрудники.Наименование");

    Запрос.Текст = СтрСоединить(ТекстыЗапроса, Символы.ПС);
    ТаблицаСотрудников = Запрос.Выполнить().Выгрузить();

    ДополнительныеДанныеСотрудников = Новый Соответствие;
    ЗапросСвойств = Новый Запрос;
    ЗапросСвойств.УстановитьПараметр("СотрудникиДляДопДанных", ТаблицаСотрудников.ВыгрузитьКолонку("Сотрудник"));

    ЗапросСвойств.Текст =
    "ВЫБРАТЬ
    | Сотрудники.Ссылка КАК Сотрудник,
    | ПРЕДСТАВЛЕНИЕ(Сотрудники.Ссылка) КАК СотрудникПредставление,
    | Сотрудники.УточнениеНаименования КАК УточнениеНаименования,
    | Сотрудники.ФизическоеЛицо.УточнениеНаименования КАК УточнениеНаименованияФизическогоЛица
    |ИЗ
    | Справочник.Сотрудники КАК Сотрудники
    |ГДЕ
    | Сотрудники.Ссылка В(&СотрудникиДляДопДанных)";

    УстановитьПривилегированныйРежим(Истина);
    Выборка = ЗапросСвойств.Выполнить().Выбрать();
    УстановитьПривилегированныйРежим(Ложь);

    Пока Выборка.Следующий() Цикл

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

    КонецЦикла;

    Для Каждого СтрокаТаблицы Из ТаблицаСотрудников Цикл

    Если ЗначениеЗаполнено(СтрокаТаблицы.Период) Тогда

    ПравилоФормированияПредставления = ПараметрыСеанса.ПравилоФормированияПредставленияЭлементовСправочникаСотрудни­ки;

    ДанныеДляФормированияПредставления = Новый Структура;
    ДанныеДляФормированияПредставления.Вставить("ПравилоФормированияПредставления", ПравилоФормированияПредставления);

    ДанныеСотрудника = ДополнительныеДанныеСотрудников.Получить(СтрокаТаблицы.Сотрудник);
    ФИО = Новый Структура("Фамилия,Имя,Отчество");
    ЗаполнитьЗначенияСвойств(ФИО, СтрокаТаблицы);

    ДанныеДляФормированияПредставления.Вставить("ФИО", ФИО);
    ДанныеДляФормированияПредставления.Вставить("ФИОПолные", СтрокаТаблицы.ФИО);
    ДанныеДляФормированияПредставления.Вставить("УточнениеНаименованияФизическогоЛица", ДанныеСотрудника.УточнениеНаименованияФизическогоЛица);
    ДанныеДляФормированияПредставления.Вставить("УточнениеНаименованияСотрудника", ДанныеСотрудника.УточнениеНаименования);

    ПредставлениеПоПрежнимДанным = КадровыйУчетВнутреннийКлиентСервер.ПредставлениеЭлементаСправочникаСотрудники(
    ДанныеДляФормированияПредставления);

    Представление = Новый ФорматированнаяСтрока(
    Новый ФорматированнаяСтрока(
    Лев(ПредставлениеПоПрежнимДанным, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеПоПрежнимДанным, ДлинаСтрокиПоиска + 1));

    ПредставлениеСотрудника = ДанныеСотрудника.СотрудникПредставление;

    Представление = Новый ФорматированнаяСтрока(
    Представление,
    " (" + ПредставлениеСотрудника + " "
    + НСтр("ru='с'") + " " + Формат(СтрокаТаблицы.Период, "ДЛФ=D") + " (" + СтрокаТаблицы.Код + "))");

    Иначе

    ДанныеСотрудника = ДополнительныеДанныеСотрудников.Получить(СтрокаТаблицы.Сотрудник);
    Если Не ПустаяСтрока(СтрокаПоиска) И Не СтрНачинаетсяС(Врег(ДанныеСотрудника.СотрудникПредставление), Врег(СтрокаПоиска)) Тогда

    ПредставлениеСотрудника = "(" + СтрокаТаблицы.Код + ") " + ДанныеСотрудника.СотрудникПредставление;

    ПозицияСтрокиПоиска = СтрНайти(ВРег(ПредставлениеСотрудника), ВРег(СтрокаПоиска));
    Представление = Новый ФорматированнаяСтрока(
    Лев(ПредставлениеСотрудника, ПозицияСтрокиПоиска - 1),
    Новый ФорматированнаяСтрока(
    Сред(ПредставлениеСотрудника, ПозицияСтрокиПоиска, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеСотрудника, ПозицияСтрокиПоиска + ДлинаСтрокиПоиска));

    Иначе

    ПредставлениеСотрудника = ДанныеСотрудника.СотрудникПредставление + " (" + СтрокаТаблицы.Код + ")";

    Представление = Новый ФорматированнаяСтрока(
    Новый ФорматированнаяСтрока(
    Лев(ПредставлениеСотрудника, ДлинаСтрокиПоиска),
    Новый Шрифт( , , Истина),
    WebЦвета.Зеленый),
    Сред(ПредставлениеСотрудника, ДлинаСтрокиПоиска + 1));

    КонецЕсли;

    КонецЕсли;

    ДанныеВыбора.Добавить(СтрокаТаблицы.Сотрудник, Представление, СтрокаТаблицы.ПометкаУдаления);

    КонецЦикла;

    КонецПроцедуры
```
---
Спасибо. Вроде получилось.

Этот метод распространяется на все метаданные, где есть выбор из справочника.
А как правильно сделать это для отдельно взятого документа?

Никак не могу сообразить как применить события автоподбортекста, окончанияввода текста...
---
ну в документе нельзя, можно на форме документа ловить разные события у поля. ОкончаниеВводаТекста есть событие, примерно то же самое. Но это при непосредственно вводе текста в поле. Посмотрите так же событие НачалоВыбора() и Автоподбор() при разных вариантах редактирирование значений.