Как работает код проверки уникальности товара при записи в 1С?

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

Часто в процессе разработки конфигураций на платформе 1С возникает задача предотвратить создание дублей в справочниках. Рассмотрим стандартный механизм проверки, реализованный через событие ПередЗаписью, и разберем, как именно происходит взаимодействие с базой данных.

Разбор работы алгоритма проверки уникальности

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

  1. Проверка на создание нового элемента: С помощью метода ЭтоНовый() мы определяем, является ли объект новым или мы редактируем уже существующий. Логика проверки уникальности в данном коде актуальна только для новых записей, чтобы не блокировать сохранение при редактировании карточки.
  2. Формирование запроса: Мы создаем объект Запрос и задаем ему текст выборки. В тексте запроса мы обращаемся к таблице справочника Справочник.Товары и ищем строки, где Наименование совпадает с параметром &Наименование.
  3. Передача параметров: Метод УстановитьПараметр("Наименование", Наименование) передает текущее значение поля Наименование, которое ввел пользователь, внутрь запроса. Именно здесь происходит сопоставление данных.
  4. Выполнение и анализ результата: После выполнения запроса методом Выполнить() мы получаем РезультатЗапроса. Если в выборке есть хотя бы одна запись, значит товар с таким именем уже существует. В этот момент срабатывает цикл Пока, выводится сообщение пользователю, и запись прерывается через установку флага Отказ = Истина.

Важно понимать, что этот код — это классический пример «решения в лоб». Он наглядно демонстрирует взаимодействие с СУБД, но имеет ряд ограничений, о которых мы должны знать.


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

Альтернативные способы проверки

Помимо использования объекта Запрос, платформа 1С предоставляет встроенные методы для поиска объектов. Рассмотрим метод НайтиПоНаименованию(). Это более компактный способ реализации той же логики:

Метод НайтиПоНаименованию:


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

Подводные камни и рекомендации по доработке

Работая с данными, мы должны учитывать возможные сложности, с которыми столкнется пользователь:

Таким образом, разобрав работу предложенного алгоритма, мы видим, что он выполняет задачу поиска совпадений по строковому полю. Однако, для профессиональной разработки стоит стремиться к использованию стандартных инструментов контроля уникальности платформы и нормализации входных данных, чтобы обеспечить высокую чистоту справочников в системе.

← На главную