gifts2017

Проверка дублирования элементов справочников

Опубликовал Aleksandr Filonov (AleksSF) в раздел Программирование - Практика программирования

Программный код для проверки наличия дублирующегося элемента справочника до записи (8.2).
Для обычного и управляемого приложения.

При разработке своей конфигурации возникла проблема, когда пользователи от лени не просматривая справочники начинают дублировать записи. Чистить после них справочники достаточно запарно, на двойные элементы задействованы ссылки. Поэтому попробовал ограничить их при вводе новых элементов. Немного помучился с логикой, забыл двоичную арифметику. Вот что получилось. После окончательной проверки в своей конфе вставлю это и в стандартные (уже вставил). Может кому еще пригодится. Сразу оговорюсь критерий, что является дублем определен тот который подходит мне. Это пример и каждый волен доработать его по своему. Проверено на 8.2. Зараннее прошу прощения за оформление поста.

Итак для обычного приложения

В ОбщиеМодули помещаете СвойМодуль РаботаСоСправочниками и внем прописываете процедуру

// Проверяет существует элемент в справочнике или нет
// Вызывается перед записью элемента
//
// Элемент  - Объект Элемент
// Реквизит - Реквизит для поиска
// Отказ    - Отказ от записи элемента
//
Процедура ПроверитьЭлемент(Элемент, Реквизит, Отказ) Экспорт
      // Проверяем совпадение наименования
      Отбор = Реквизит;
      Найдено = Справочники[Элемент.Метаданные().Имя].НайтиПоНаименованию(Отбор, Истина);
      Если Найдено = Справочники[Элемент.Метаданные().Имя].ПустаяСсылка() Тогда
          // Такого элемента нет
          // Перезаписываем элемент справочника
          Отказ = Ложь;
      ИначеЕсли Найдено.Код = Элемент.Код Тогда
           // Это редактируемый элемент
           // Перезаписываем элемент справочника
           Отказ = Ложь;
      Иначе
           Предупреждение("Такой элемент есть в справочнике", 10);
           Отказ = Истина;
      КонецЕсли;
КонецПроцедуры

После этого во все формы Элементов справочников, которые необходимо контролировать, помещаем процедуру для события Формы

Процедура ПередЗаписью(Отказ)
     // Проверим существование элемента с таким Наименованием
     РаботаСоСправочниками.ПроверитьЭлемент(ЭтотОбъект, Наименование, Отказ);
КонецПроцедуры

 


А теперь для управляемого приложения

В нем почти все также, но немного другое обращение к форме.

В ОбщиеМодули помещаем СвойМодуль РаботаСоСправочниками и в нем прописываем процедуру

// Проверяет существует элемент в справочнике или нет
// Вызывается перед записью элемента
//
// Наимен   - Реквизит для поиска
// Элемент  - Объект Элемент
// Отказ    - Отказ от записи элемента
//
Процедура ПроверитьЭлемент(Наимен, Элемент, Отказ) Экспорт
   
// Проверяем совпадение наименования
   
Отбор = Наимен;
   
Найдено = Справочники[Элемент.Метаданные().Имя].НайтиПоНаименованию(Отбор, Истина);
    Если
Найдено = Справочники[Элемент.Метаданные().Имя].ПустаяСсылка() Тогда
       
// Сообщить("1-Такого элемента нет");
        // Перезаписываем элемент справочника
       
Отказ = Ложь;
    ИначеЕсли
Найдено.Код = Элемент.Код Тогда
       
// Сообщить("2-Это редактируемый элемент");
        // Перезаписываем элемент справочника
       
Отказ = Ложь;
    Иначе
       
// Сообщить("3-Такой элемент уже есть в справочнике");
        // Запрещаем запись этого элемента
       
Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

После этого в формы Элементов справочников, которые необходимо контролировать, помещаем процедуру для события Формы

 &НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
   
РаботаСоСправочниками.ПроверитьЭлемент(ЭтаФорма.Объект.Наименование, ЭтаФорма.Объект.Ссылка, Отказ);
    Если
Отказ Тогда
       
Предупреждение("Такой элемент есть в справочнике", 10);
    КонецЕсли;
КонецПроцедуры

Вот и все. Переделывайте и используйте на свое усмотрение. Удачи.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Serg Kondrasgov (SergDi) 17.02.12 11:49
2. Павел (orsh) 17.02.12 13:24
Опечатка?
помещаем роцедуру для события
3. Aleksandr Filonov (AleksSF) 17.02.12 13:57
(2) orsh,
Естессено, я думаю на понимание сути это не сказывается
4. Павел (orsh) 20.02.12 08:04
Да только данную проверку дописывать и дописывать.

Например: надо делать проверку по 2 реквизитам
Справочник номенклатура : наименование и единица измерения.

Да и по отдельным группам надо делать проверку.
5. Aleksandr Filonov (AleksSF) 20.02.12 09:09
(4) orsh, Я привел только пример кода, и я делал для своей конфы. А дальше используйте по своему усмотрению.
6. Ivan Migov (navi) 23.02.12 18:42
Дублирование по наименованию или файловая ошибка в таблице?
7. Aleksandr Filonov (AleksSF) 24.02.12 09:33
8. Aleksandr Filonov (AleksSF) 24.02.12 19:58
(4) orsh, Извиняюсь, но это ответ не только Вам, а всем читающим. Я привел пример логики для проверки записывать элемент или нет в зависимости от того, что это новый элемент или редвактируемый. А проверка факта дублирования здесь приведена та что устаивает меня и она далеко не универсальна. Поэтому саму проверку каждый должен описать сам в зависимости что считается дублированием, а ее результат можно обработать моим кодом.
9. Денис Стюров (pitbul) 09.07.12 20:37
а вот если в наименовании товара между словами добавить лишний пробел то эта проверка получаеться не кчему
10. Aleksandr Filonov (AleksSF) 09.01.13 09:11
(9) pitbul,
Уже написано, что алгоритм проверки - является элемент дублем или нет, каждый определяет сам. Кому-то может и нужно, чтобы наименование с пробелом было новым элементом.
11. Станислав Политикин (Escimo) 21.06.15 18:30
Доброго времени суток. А не подскажите, как сделать проверку дублей при загрузке справочников из внешней обработки? Буду весьма признателен
12. Aleksandr Filonov (AleksSF) 22.06.15 09:07
(11) Escimo,
Не понял вопроса. Вы сами пишете обработку ?. Тогда перед записью элемента справочника вставляете проверку. Если используете готовую обработку, тогда к автору.
13. Глеб Зломанов (Glebis) 07.10.15 09:13
Недостатки:
1) Объектная, а не запросная модель реализации.
2) Не возможности поиска дубликата по родителю и/или владельцу.
3)
Справочники[Элемент.Метаданные().Имя]
нужно сохранять в переменную, чтоб 2 раза не спрашивать один и тот же набор метаданных.
4)
Отбор = Реквизит
- бессмысленный код, т.к. достаточно Реквизит взять по значению.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа