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

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

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

Метод 1: Проверка через запрос при записи документа

Самым прямым способом является использование события ПередЗаписью модуля объекта. В этом случае, перед тем как система окончательно сохранит документ в базу данных, мы инициируем запрос, проверяющий наличие аналогичных данных.

Рассмотрим алгоритм действий по шагам:

  1. Создаем функцию, которая выполняет поиск уже существующих записей в базе данных с таким же значением реквизита.
  2. Вызываем эту функцию внутри обработчика события ПередЗаписью.
  3. Если функция возвращает Истина, устанавливаем параметр Отказ = Истина, что прерывает процесс записи.

Пример программной реализации такой проверки:


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

Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    // Допустим, мы проверяем значение в текущей строке или анализируем всю ТЧ
    Если ПроверитьСуществующееЗначение(ЭтотОбъект.ВашРеквизит) Тогда
        Отказ = Истина;
        Сообщить("Документ с таким значением реквизита уже существует!");
    КонецЕсли;
КонецПроцедуры

Метод 2: Использование регистра сведений для контроля уникальности

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

Почему это удобно:

Метод 3: Проверка при редактировании строки (на стороне клиента)

Для повышения удобства пользователей можно реализовать проверку непосредственно в момент заполнения табличной части, не дожидаясь нажатия кнопки «Записать». Для этого используйте обработчик события ПриОкончанииРедактирования или ПриИзменении колонки табличной части.

Рекомендуемый алгоритм:

  1. При изменении значения в строке выполните обход коллекции ЭтотОбъект.ИмяТабличнойЧасти.
  2. Используйте цикл Для Каждого, чтобы сравнить введенное значение с другими строками коллекции.
  3. Если найдено совпадение, выведите Предупреждение и очистите ошибочное значение.

Также эффективным способом для локальной проверки (внутри документа) является выгрузка табличной части в ТаблицаЗначений и использование метода Свернуть(). Если количество строк после сворачивания уменьшилось — значит, внутри вашей табличной части присутствуют дубли.

Важные рекомендации

Помните об отказах записи: Установка Отказ = Истина в ПередЗаписью надежно защищает базу данных, но может вызвать проблемы при обмене данными. Всегда предусматривайте логику обхода проверки, если документ загружается автоматически или программно, а не создается пользователем вручную.

Производительность: Запросы к базе данных в ПередЗаписью при больших объемах данных могут замедлять работу. Старайтесь оптимизировать текст запроса, используя индексируемые поля и конструкцию ПЕРВЫЕ 1, чтобы база данных прекращала поиск сразу после нахождения первого дубля.

Анализируя задачу, выбирайте метод в зависимости от того, где именно должна соблюдаться уникальность: строго внутри одного документа (метод с ТаблицаЗначений) или по всей базе данных (метод с РегистрСведений).

← На главную