Как запретить ввод повторяющихся товаров в табличную часть документа 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача контроля уникальности записей в табличной части документа. Рассмотрим, как программно реализовать запрет на добавление уже существующего товара в список.

Вариант 1: Использование запроса (рекомендуемый для больших таблиц)

Одним из самых надежных способов проверки является использование Запрос. Этот метод позволяет эффективно сгруппировать данные и выявить дубли, даже если таблица содержит большое количество строк. Рассмотрим, как реализовать эту логику в процедуре ПередЗаписью.

Для начала создадим запрос, который сгруппирует номенклатуру и посчитает количество вхождений каждого товара:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Товары.Номенклатура КАК Номенклатура,
    |	1 КАК КоличествоВТаблице
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |	&Товары КАК Товары
    |;
    |ВЫБРАТЬ
    |	ВТ.Номенклатура КАК Номенклатура,
    |	СУММА(ВТ.КоличествоВТаблице) КАК КоличествоВТаблице
    |ИЗ
    |	ВТ КАК ВТ
    |СГРУППИРОВАТЬ ПО
    |	ВТ.Номенклатура";

Запрос.УстановитьПараметр("Товары", ЭтотОбъект.Товары);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Если ВыборкаДетальныеЗаписи.КоличествоВТаблице > 1 Тогда
        Сообщить("Внимание! Позиция " + ВыборкаДетальныеЗаписи.Номенклатура + " повторяется.");
        Отказ = Истина;
    КонецЕсли;
КонецЦикла;

Вариант 2: Использование метода поиска строк

Если табличная часть документа небольшая, можно воспользоваться более простым методом НайтиСтроки. Этот подход позволяет избежать написания тяжелых запросов. Рассмотрим алгоритм действий:

  1. Перебираем все строки табличной части в цикле.
  2. Для каждой строки формируем Структура с параметрами поиска.
  3. Используем метод НайтиСтроки для получения массива найденных элементов.
  4. Если количество найденных элементов больше единицы — фиксируем ошибку.

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

Где разместить код проверки?

Важно понимать различие между модулем формы и модулем объекта:

Мы рекомендуем использовать комбинацию методов: интерактивную проверку для удобства пользователя в модуле формы и строгий контроль в модуле объекта для гарантии целостности данных базы данных.

Дополнительные рекомендации по UX

Помимо простого отказа в записи, вы можете значительно улучшить опыт пользователя:

Теперь вы обладаете достаточными знаниями, чтобы внедрить контроль уникальности номенклатуры в любой документ вашей конфигурации 1С!

← На главную