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

14.12.12

Разработка - Универсальные функции

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

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

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

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

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

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

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

 


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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    5484    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    10118    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    61425    dimanich70    86    

176

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8426    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    77206    atdonya    31    

74

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10653    ke.92@mail.ru    18    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SergDi 17.02.12 11:49 Сейчас в теме
2. orsh 25 17.02.12 13:24 Сейчас в теме
Опечатка?
помещаем роцедуру для события
3. AleksSF 231 17.02.12 13:57 Сейчас в теме
(2) orsh,
Естессено, я думаю на понимание сути это не сказывается
4. orsh 25 20.02.12 08:04 Сейчас в теме
Да только данную проверку дописывать и дописывать.

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

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

Не работает ваше описание. Сами то пробовали воспроизвести ? или из интернета просто скопировали ?

Приведите код в рабочий вид и разместите здесь во вложении пример базы данных на крайней версии платформы 8.3. Вот это будет помощь людям. А в вашем случае халтура.
16. azsw 14 08.03.22 11:26 Сейчас в теме
Одновременно могут пользователи добавлять . Как по проще сделать в этом случае ?
17. G_110097639092072316942 27.12.24 19:47 Сейчас в теме
{ОбщийМодуль.ПроверкаДублирования.Модуль(14,3)}: Процедура или функция с указанным именем не определена (Предупреждение)
<<?>>Предупреждение("Такой элемент уже есть в справочнике"); (Проверка: Сервер)
18. ketr 153 26.05.26 20:06 Сейчас в теме
Мой вариант для УФ (реквизит можете указать свой свой)

&НаСервере
Процедура ВСПередЗаписьюНаСервереПеред(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	Если НЕ НомерИГКУникален() Тогда
		ОписаниеОшибки = НСтр("ru = 'С таким Идентификатором элемент есть в справочнике.';
								|en = 'State defense order number is not unique.'");
		ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки, , , "Объект.НомерИГК");
		Отказ = Истина;
	КонецЕсли;
	
	
КонецПроцедуры 

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