Консультация № 126990
12.03.2008, 17:30
0.00 руб.
0 3 3
Господа професионалы! Помогите, плз!!
Проблема: есть справочник Контрагенты, идентификатор Наименование - Полное название контрагента, ид. кодЭДРПОУ - код плательщика налогов, КонтОС - контактное лицо от заказчика (контрагента)... Так вот, при записи нового элемента справочника нужно сделать перебор всех его элементов на проверку не существует ли он уже... Соответственно перебор нужно делать по Наименованию и вышеупомянутым реквизитам...

Помогите, плз!!!

Обсуждение

Неизвестный
12.03.2008, 18:19
общий
это ответ
Здравствуйте, Троцюк Олександр Володимирович!

в модуль формы элемента справочника (а если редактирование разрешено в диалоге, то и в модуль формы списка справочника) добавляем или модифицируем процедуру приЗаписи

Процедура ПриЗаписи()
//......
Если Выбран()=0 Тогда //проверку делаем только для нового элемента
спрК=СоздатьОбъект("Справочник.Контрагенты");
спрК.ВыбратьЭлементы(0); //перебираем все элементы
Пока спрК.ПолучитьЭлемент()=1 Цикл
Если спрК.ЭтоГруппа()=1 Тогда //группы не рассматриваем
Продолжить;
КонецЕсли;
НашлиДубликат=0;

//берем ВРЕГ(СокрЛП(х)) чтобы исключить пробелы справа слева и считать что "ИВанов" = "Иванов"

Если (ВРЕГ(СокрЛП(спрК.Наименование))= ВРЕГ(СокрЛП(Наименование)))
или (ВРЕГ(СокрЛП(спрК.кодЭДРПОУ)) = ВРЕГ(СокрЛП(кодЭДРПОУ)))
или (ВРЕГ(СокрЛП(спрК.КонтОС)) = ВРЕГ(СокрЛП(КонтОС)))
//остальные критерии "совпадаемости"
//...
//...
Тогда
НашлиДубликат=1; //нашли полностью совпадающий элемент
Прервать; //вышли из цикла (или, например, увеличили счетчик совпадений)
Тогда
КонецЕсли;
КонецЦикла;

Если НашлиДубликат=1 Тогда
Предупреждение("Найден полностью совпадающий элемент",10); //поругались с пользователем
СтатусВозврата(0); //сказали, БУ! Не буду сохранять
Возврат; //вышли из ПриЗаписи и замерли в тревожном ожидании
КонецЕсли;
КонецЕсли;
//....
КонецПроцедуры // ПриЗаписи

//возможно логичнее было бы искать не полное совпадение а совпадение по одному из критериев
//или более сложные условия накладывать вроде:
//1. код ЭДРПОУ - должен быть уникален
//2. сочетание (наименование и контактное лицо) должно быть уникальным
//и т.п.

удачи!

Max//
Неизвестный
12.03.2008, 19:23
общий
это ответ
Здравствуйте, Троцюк Олександр Володимирович!
Все указанные реквизиты нужно проиндексировать (поставить в диалоге создания реквизита галочку "Сортировка")
Соответсвенно при записи (Процедура "ПриЗаписи" в модуле формы диалога и в табличном представлении , если нужно) нужно искать реквизит с помощью процедуры "НайтиПоРеквизиту", наименование - искать с помощью функции "НайтиПоНаименованию". Хотя я бы ориентироваться на Наименование и контактное лицо не стал бы, они могут повторяться - но это Ваше дело.Поверять или не проверять.
Неизвестный
13.03.2008, 09:31
общий
это ответ
Здравствуйте, Троцюк Олександр Володимирович!
В дополнение ответа Maximush, возможен вариант с отбором по реквизиту, если Вы уверены в стандартном написании реквизитов (для этого возможно использование шаблонов в поле ввода), особенно для кодов. Естесственно для проверяемых реквизитов признак "сортировка" должен быть установлен.
Я тоже считаю, что проверять можно только "кодЭДРПОУ".
В варианте Maximush по моему при перезаписи будет выдаваться предупреждение, т.к процедура будет находить свой же элемент.
Успехов Вам в работе.

Приложение:
КА = СоздатьОбъект("Справочник.Контрагенты"); //Проверка наименования КА.ВыбратьЭлементыПоРеквизиту("Наименование",Наименование, 0, 0); Пока КА.ПолучитьЭлемент() = 1 Цикл Если КА.ТекущийЭлемент() = ТекущийЭлемент() Тогда Продолжить; КонецЕсли; Предупреждение("Наименование не уникально! Элемент не записан."); СтатусВозврата(0); Возврат; КонецЦикла; //Проверка кодЭДРПОУ КА.ВыбратьЭлементыПоРеквизиту("кодЭДРПОУ",кодЭДРПОУ, 0, 0); Пока КА.ПолучитьЭлемент() = 1 Цикл Если КА.ТекущийЭлемент() = ТекущийЭлемент() Тогда Продолжить; КонецЕсли; Предупреждение("Код плательщика налогов не уникален! Элемент не записан."); СтатусВозврата(0); Возврат; КонецЦикла; //Проверка КонтОС КА.ВыбратьЭлементыПоРеквизиту("КонтОС",КонтОС, 0, 0); Пока КА.ПолучитьЭлемент() = 1 Цикл Если КА.ТекущийЭлемент() = ТекущийЭлемент() Тогда Продолжить; КонецЕсли; Предупреждение("Контактное лицо не уникально! Элемент не записан."); СтатусВозврата(0); Возврат; КонецЦикла; // Можно добавить аналогичные проверки для других реквизитов // но все реквизиты должны быть с установленным признаком "сортировка"
Форма ответа