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