Приветствую, Форумчане!
Самописная конфигурация, УФ

Имеется документ "Приходная накладная" с реквизитом "Номенклатура".

Требуется запретить ввод дублирующей номенклатуры с удалением этой дублирующей строки при вводе новой позиции в ТЧ документа.
Т.е. при нажатии кнопки "Добавить" или +. После выбора номенклатуры требуется проверить есть ли такая уже в списке и если есть, то удалить её. Проверка осуществляется как при добавлении строк в существующий (сохраненный) документ, так и в новый документ.

Перепробовал много способов с различными событиями, но как-то всё криво получается.
Подскажите как всё это правильно организовать?
---
Как-то так:
```1c
    &НаКлиенте
    Процедура ТоварыПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

    Если ОтменаРедактирования Тогда
    Возврат
    КонецЕсли;

    СтрокаТЧ = Элемент.ТекущиеДанные;

    Для Каждого Стр Из Объект.Товары Цикл

    Если Стр.НомерСтроки = СтрокаТЧ.НомерСтроки Тогда
    Продолжить;
    КонецЕсли;

    Если Стр.Номенклатура = СтрокаТЧ.Номенклатура Тогда
    Отказ = Истина;
    ПоказатьПредупреждение(, "Дублирование номенклатуры!");
    Возврат
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Подскажите как всё это правильно организовать? Может быть организовать фильтр при выборе номенклатуры? Т.е. та номенклатура которая уже есть в документе не была показана в формах выбора. Или объяснить что значит "все криво получается"?
---
так они ее руками начнут вбивать, без выбора или подбора

(1) может в событии ПередОкончаниемРедактирования выполнить проверку, что такая номенклатура уже есть и удалить строку по индексу, если есть и поругаться еще матом на пользователя

а лучше перед записью документа повесить процедуру проверки строк дублей - змакаешь записать, а она тебе - вот там и там строки дубли, удали или документ не запишу
и через неделю пользователи сами приучатся не дублировать номенклатуру в документах
---
Как-то так:
```1c
    &НаКлиенте
    Процедура ТоварыПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

    Если ОтменаРедактирования Тогда
    Возврат
    КонецЕсли;

    СтрокаТЧ = Элемент.ТекущиеДанные;

    Для Каждого Стр Из Объект.Товары Цикл

    Если Стр.НомерСтроки = СтрокаТЧ.НомерСтроки Тогда
    Продолжить;
    КонецЕсли;

    Если Стр.Номенклатура = СтрокаТЧ.Номенклатура Тогда
    Отказ = Истина;
    ПоказатьПредупреждение(, "Дублирование номенклатуры!");
    Возврат
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Лучше перед окончанием редактирования, а не перед записью. Пущай сразу видят свои ошибки.
Я пытался удалить строку, но были какие-то проблемы, связанные с новой строкой. Можно привести пример нормального кода удаления по индексу? //Я пытался через текущую строку. Никак не соображу: я ввожу новую строку и мне нужно получить её индекс....
---
Взял за основу. В итоге поставил код на при изменении номенклатуры

```1c
    &НаКлиенте
    Процедура ТоварыПриИзменении(Элемент)

    Отбор = Новый Структура();
    ТекСтрока = Элемент.ТекущиеДанные;
    Отбор.Вставить("Номенклатура", ТекСтрока.Номенклатура);
    СтрокиДублирования = Объект.Товары.НайтиСтроки(Отбор);
    ОтменаВводаСтроки = СтрокиДублирования.Количество() > 1;
    Если ОтменаВводаСтроки Тогда
    Сообщить("Дублирование номенклатур запрещено: " + ТекСтрока.Номенклатура);
    Объект.Товары.Удалить(ТекСтрока);
    Возврат;
    КонецЕсли;

    ОбработкаТабличныхЧастейКлиент.ОбработкаСтрокиТЧ(Элементы.Товары.ТекущиеДанные);

    КонецПроцедуры
```

Вроде сработало