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