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

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

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

Причина возникновения проблемы

Основная причина заключается в отсутствии проверки существования уже созданного объекта в базе данных перед выполнением метода Записать(). Когда мы просто создаем документ методом СоздатьДокумент() и сразу же вызываем Записать(), система не знает, что такой документ уже был создан ранее на основе текущих данных. Кроме того, логика перебора данных в цикле должна быть жестко связана с проверкой уже существующих записей.

Способ №1: Использование метода НайтиПоРеквизиту

Если вы присваиваете создаваемому документу уникальный номер или специальный реквизит, ссылающийся на родительский документ, вы можете перед созданием нового объекта попробовать найти уже существующий. Давайте рассмотрим, как это реализовать корректно.

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


// Сначала ищем документ по реквизиту-связке
НайденныйДокумент = Документы.узт_ПутевойЛист.НайтиПоРеквизиту("НомерОтЖурналаПутевыхЛистов", СтрГлТЗ.Номер);

Если НайденныйДокумент.Пустая() Тогда
    // Если документ не найден, создаем новый
    Док = Документы.узт_ПутевойЛист.СоздатьДокумент();
    Док.НомерОтЖурналаПутевыхЛистов = СтрГлТЗ.Номер;
    // Заполняем остальные реквизиты...
    Док.Записать();
Иначе
    // Если документ найден, ничего не делаем или обновляем существующий
    Сообщить("Документ для номера " + СтрГлТЗ.Номер + " уже существует!");
КонецЕсли;

Обратите внимание: Метод НайтиПоРеквизиту требует, чтобы поле, по которому ведется поиск, было проиндексировано в конфигураторе, иначе при большом объеме данных обработка будет работать крайне медленно.

Способ №2: Проверка через Запрос (рекомендуемый подход)

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

Разберем, как сделать это правильно:

  1. Создайте запрос, который выбирает все существующие документы узт_ПутевойЛист за нужный период.
  2. Сопоставьте результаты вашего исходного запроса с данными уже созданных документов (можно использовать левое соединение).
  3. В выборке оставьте только те записи, для которых не нашлось пары в целевом документе (где поле Ссылка из целевого документа равно NULL).

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

Ключевые рекомендации по исправлению кода

Проанализировав ваш код, выделим несколько критических моментов, которые помогут вам писать чистый и рабочий код:

Помните, что лучший способ избежать проблем с дублями — это хранение Ссылка на родительский документ в дочернем. Это позволит системе однозначно понимать, какой именно документ был создан на основе какого, и при следующем запуске обработки вы сможете моментально проверить наличие связи по уникальному идентификатору (GUID), который является наиболее надежным ключом в 1С.

← На главную