Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 апр 2025, 11:55

Поиск дубликатов при вводе

Автор graffserg, Вчера в 12:20

graffserg и 1 гость просматривают эту тему.

graffserg

Всем привет!
Помогите разобраться что я делаю не так.
Создал справочник "Лица" с реквизитами - фамилия, собственное имя, отчество, дата рождения.
Далее создал ФормаЭлемента (форма элемента справочника, тип формы - обычная). В модуль вставил код
Процедура ПриЗаписи(Отказ, РежимЗаписи)
Если Ссылка.Пустая() = Ложь Тогда // Уже сохраненный элемент — не проверяем
Возврат;
КонецЕсли;

Фам = НРег(СтрЗаменить(Фамилия, " ", ""));
Имя = НРег(СтрЗаменить(СобственноеИмя, " ", ""));
Отч = НРег(СтрЗаменить(Отчество, " ", ""));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Ссылка
ИЗ
Справочник.Лица
ГДЕ
НРег(СтрЗаменить(Фамилия, "" "", "")) = &Фам
И НРег(СтрЗаменить(СобственноеИмя, "" "", "")) = &Имя
И НРег(СтрЗаменить(Отчество, "" "", "")) = &Отч
И ДатаРождения = &Дата";

Запрос.УстановитьПараметр("Фам", Фам);
Запрос.УстановитьПараметр("Имя", Имя);
Запрос.УстановитьПараметр("Отч", Отч);
Запрос.УстановитьПараметр("Дата", ДатаРождения);

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

Задумка такова - если в справочнике имеется запись об Иванове Иване Ивановиче 01.01.1980 г.р. и при вводе новой записи с такими же данными (по сути это одно и то же лицо) должен быть отказ на ввод одинаковой записи.

Но, при вводе одинаковой записи выдается ошибка:
{Справочник.Лица.Форма.ФормаЭлемента.Форма(58,9)}: Пропущен символ '"' (двойная кавычка)
"ВЫБРАТЬ<<?>>
{Справочник.Лица.Форма.ФормаЭлемента.Форма(58,9)}: Ожидается символ ';'
"ВЫБРАТЬ<<?>>
{Справочник.Лица.Форма.ФормаЭлемента.Форма(60,1)}: Неопознанный оператор
<<?>>ИЗ

Не могу понять, что я делаю не так.
Спасибо

antoneus

Внутри строки вместо одной кавычки надо писать две, для пустой строки тоже.

ГДЕ
    НРег(СтрЗаменить(Фамилия, "" "", """")) = &Фам

graffserg

antoneus, Спасибо.
Пересобрал код
Процедура ПриЗаписи(Отказ, РежимЗаписи)

// Не проверяем уже записанный элемент
Если НЕ Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;

// Убираем пробелы и приводим к нижнему регистру
НормФамилия  = НРег(СтрЗаменить(Фамилия, " ", ""));
НормИмя      = НРег(СтрЗаменить(СобственноеИмя, " ", ""));
НормОтчество = НРег(СтрЗаменить(Отчество, " ", ""));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ " +
"Ссылка " +
"ИЗ Справочник.Лица " +
"ГДЕ " +
"НРег(СтрЗаменить(Фамилия, "" "", """")) = &Фам " +
"И НРег(СтрЗаменить(СобственноеИмя, "" "", """")) = &Имя " +
"И НРег(СтрЗаменить(Отчество, "" "", """")) = &Отч " +
"И ДатаРождения = &Дата";

Запрос.УстановитьПараметр("Фам", НормФамилия);
Запрос.УстановитьПараметр("Имя", НормИмя);
Запрос.УстановитьПараметр("Отч", НормОтчество);
Запрос.УстановитьПараметр("Дата", ДатаРождения);

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
Если Результат.Ссылка <> Ссылка Тогда
Ответ = Вопрос("Лицо с такими данными уже существует. Открыть?", 4);
Если Ответ = КодВозвратаДиалога.Да Тогда
ОткрытьФорму("Справочник.Лица.ФормаЭлемента", Результат.Ссылка);
КонецЕсли;
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;

Наименование = СокрЛП(Фамилия) + " " + СокрЛП(СобственноеИмя) + " " + СокрЛП(Отчество);

КонецПроцедуры
Все ошибки изчезли - код срабатывает, но вот проблема с дубликатами осталась. Для примера ввел две совершенно одинаковые записи и ничего не произошло. Теперь в справочнике спокойно находится два дубликата.

Подскажите в чем может быть причина?
Спасибо

antoneus

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

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск