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