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