Проверять название на дублирование в справочнике
По теме из базы знаний
- Удаление дубликатов из справочников в 1С8
- Эффективная работа со справочником контрагентов
- Загрузка данных из табличного документа в справочники, документы, планы видов характеристик, планы видов расчетов, планы счетов, бизнес-процессы, задачи, в движения документов, поточная загрузка документов (EXCEL, управляемые формы, универсальная)
- Перенос данных и обмен из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки
- Пример переноса справочников, документов и движений через Эксель и "Конвертацию данных 2" из оптовой учетной системы 1С 7.7 Комплексной 4.2 и розничной учетной системы Рарус Торговый комплекс -> в 1С 8.3 ЕРП 2.4 (расширение и дополнительные реквизиты)
Найденные решения
В модуле объекта справочника, в процедуре "ПередЗаписью()" наговнокодить:
Запрос = Новый Запрос("ВЫБРАТЬ С.Ссылка ИЗ Справочник.КонтактныеЛица КАК С ГДЕ С.Наименование = &Наименование И С.Ссылка <> &Ссылка";
Запрос.УстановитьПараметр();
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой Тогда
Отказ = Истина;
// Ругаемся
КонецЕсли;
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В модуле объекта справочника, в процедуре "ПередЗаписью()" наговнокодить:
Запрос = Новый Запрос("ВЫБРАТЬ С.Ссылка ИЗ Справочник.КонтактныеЛица КАК С ГДЕ С.Наименование = &Наименование И С.Ссылка <> &Ссылка";
Запрос.УстановитьПараметр();
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой Тогда
Отказ = Истина;
// Ругаемся
КонецЕсли;
(2) Спасибо! Только
что-то не отрабатывал. Сделал вот так:
Отказ = Истина;
что-то не отрабатывал. Сделал вот так:
&НаСервере
Функция ПроверитьУникальностьПоНаименованию()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактныеЛицаПартнеров.Ссылка КАК Ссылка
|ИЗ
| Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
|ГДЕ
| КонтактныеЛицаПартнеров.Ссылка <> &Ссылка
| И КонтактныеЛицаПартнеров.Наименование = &Наименование";
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
Запрос.УстановитьПараметр("Наименование", Объект.Наименование);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Возврат 1;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ЗначениеЗаполнено(Объект.Наименование) Тогда
Если ПроверитьУникальностьПоНаименованию() = 1 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Контактное лицо не будет создано, так как уже есть похожая запись!";
Сообщение.Поле = "Объект.Наименование";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
Кусок ОбработкаПроверкиЗаполнения
моя проверка (без отказа) наименования справочника Контрагенты
"Плюсы" данного метода:
- нечёткое сравнение
- только 1С
"Минусы":
- ещё нужно дописать обновление индексов полнотекстового поиска после записи нового элемента... т.к. его обновление идёт фоновым по расписанию и можно попасть когда записали новый и делаете его копию - если индекс не обновлен - не будет ругаться на только что записанный
Перед вызовом проверка "Если ЭтоНовый() Тогда"
моя проверка (без отказа) наименования справочника Контрагенты
"Плюсы" данного метода:
- нечёткое сравнение
- только 1С
"Минусы":
- ещё нужно дописать обновление индексов полнотекстового поиска после записи нового элемента... т.к. его обновление идёт фоновым по расписанию и можно попасть когда записали новый и делаете его копию - если индекс не обновлен - не будет ругаться на только что записанный
Перед вызовом проверка "Если ЭтоНовый() Тогда"
//Ищем по наименованию
Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() <> РежимПолнотекстовогоПоиска.Разрешить Тогда
//Отказ = Истина;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Использование полнотекстового поиска не разрешено. Вы можете включить его в диалоге ""Управление полнотекстовым поиском""'
Сообщение.Сообщить();
Иначе
Стр = СокрЛП(НаименованиеПолное);
//ДлинаСтрокиПоиска = СтрДлина(Стр);
СписокПоиска = ПолнотекстовыйПоиск.СоздатьСписок(Стр, 50);
СписокПоиска.ПолучатьОписание = Истина;
СписокПоиска.ИспользованиеМетаданных = ИспользованиеМетаданныхПолнотекстовогоПоиска.НеИспользовать;
//Если ДлинаСтрокиПоиска < 5 Тогда
ПорогНечеткости = 35;
//Иначе
СписокПоиска.ПорогНечеткости = ПорогНечеткости;
МассивОтбор = Новый Массив();
МассивОтбор.Добавить(Метаданные.Справочники.Контрагенты);
СписокПоиска.ОбластьПоиска = МассивОтбор;
СписокПоиска.ПерваяЧасть();
Для каждого текРезультат Из СписокПоиска Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "ВНИМАНИЕ!!!
|Есть похожие наименования"+СокрЛП(текРезультат.Значение);
Сообщение.Поле = "Наименование";
Сообщение.КлючДанных=текРезультат.Значение;
Сообщение.Сообщить();
КонецЦикла;
Показать
(6)
Т.к. ПорогНечеткости - процент "несовпадений" и если длина строки 5 и ПорогНечеткости = 50, то попадут с несовпадениями до 3 знаков...
А если длина 100 - то несовпадение 50 знаков - очень много вариантов с "мусором",
т.е. при увеличении длины нужно уменьшать ПорогНечеткости... чтобы получить меньше вариантов...
//Если ДлинаСтрокиПоиска < 5 Тогда
ПорогНечеткости = 35;
//Иначе
ПорогНечеткости = 35;
//Иначе
Т.к. ПорогНечеткости - процент "несовпадений" и если длина строки 5 и ПорогНечеткости = 50, то попадут с несовпадениями до 3 знаков...
А если длина 100 - то несовпадение 50 знаков - очень много вариантов с "мусором",
т.е. при увеличении длины нужно уменьшать ПорогНечеткости... чтобы получить меньше вариантов...
(8)
Если ссылка заполнена ("перезапись") - отбор всех из базы кроме неё с одинаковым наименованием
Если ссылка не заполнена ("запись нового") - отбор всех из базы с одинаковым наименованием
Нужный функционал работает...
А делать 2 запроса, или модифицировать по условию существующий... Зачем?
З.Ы. Хотя и выгладит "неправильно"
Если ссылка заполнена ("перезапись") - отбор всех из базы кроме неё с одинаковым наименованием
Если ссылка не заполнена ("запись нового") - отбор всех из базы с одинаковым наименованием
Нужный функционал работает...
А делать 2 запроса, или модифицировать по условию существующий... Зачем?
З.Ы. Хотя и выгладит "неправильно"
(9)Условия ТС звучат так:
"необходимо сделать проверку чтобы не заводились дубли контактных лиц".
Проверять дубли при обновлении существующих - чревато.
Обычно запрет на дубли включают когда уже вычистили от дублей и не хотят чистить от дублей еще раз.
"необходимо сделать проверку чтобы не заводились дубли контактных лиц".
Проверять дубли при обновлении существующих - чревато.
Обычно запрет на дубли включают когда уже вычистили от дублей и не хотят чистить от дублей еще раз.
(8) хм, смыла нет - а результат есть!
ну ладно, вот вам подсказка,
зачастую потом, приходится редактировать элементы справочников, что-то кроме Наименования, телефоны, ИНН, дату рождения и др.
вот в этом случае без проверки по Ссылке, вы не запишите измененный элемент!!!
и получите сообщение что Наименование не уникально
а с такой проверкой получится сохранить измененных элемент
для самого себя
или для нового
ну ладно, вот вам подсказка,
зачастую потом, приходится редактировать элементы справочников, что-то кроме Наименования, телефоны, ИНН, дату рождения и др.
вот в этом случае без проверки по Ссылке, вы не запишите измененный элемент!!!
и получите сообщение что Наименование не уникально
а с такой проверкой получится сохранить измененных элемент
для самого себя
или для нового
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот