|
v7: Одинаковые ИНН | ☑ | ||
---|---|---|---|---|
0
rinaty17
29.10.12
✎
10:31
|
Добрый день уважаемые форумчане.
Я в семерке плохо шарю, но некоторые моменты знаю. к вам такая просьба. мне нужно сделать отчет который выводит список контрагентов у которых одинаковый ИНН или не заполненный ИНН. Вот мои наброски //_____________________________________________________________________________ Функция ПоискКонтрагента(пПоиск) спрФиз = СоздатьОбъект("Справочник.ФизЛица"); спрЮр = СоздатьОбъект("Справочник.ЮрЛица"); спрСвои = СоздатьОбъект("Справочник.СвоиЮрЛица"); Если спрФиз.НайтиПоНаименованию(пПоиск,0,1)=1 Тогда СпрЛица = спрФиз.ИНН; Возврат СпрЛица; ИначеЕсли спрЮр.НайтиПоНаименованию(пПоиск,0,1)=1 Тогда СпрЛица = спрЮр.ИНН; Возврат СпрЛица; ИначеЕсли спрСвои.НайтиПоНаименованию(пПоиск,0,1)=1 Тогда СпрЛица = спрСвои.ИНН; Возврат СпрЛица; Иначе Возврат 0; КонецЕсли; КонецФункции // //******************************************* Процедура Сформировать() Таб=СоздатьОбъект("Таблица"); Таб.ВывестиСекцию("Шапка"); Таб.ТолькоПросмотр(1); Спр1 = СоздатьОбъект("Справочник.Контрагенты"); Спр1.ВыбратьЭлементы(); Пока Спр1.ПолучитьЭлемент() = 1 Цикл Если (Спр1.ЭтоГруппа() = 0) и (Спр1.ПометкаУдаления() = 0) Тогда Спр2 = СоздатьОбъект("Справочник.Контрагенты"); Спр2.ВыбратьЭлементы(); СпрЛица1 = ПоискКонтрагента(Спр1.ЮрФизЛицо); Если СпрЛица1 = "" Тогда Таб.ВывестиСекцию("Строка"); Иначе Пока Спр2.ПолучитьЭлемент() = 1 Цикл Если (Спр2.ЭтоГруппа() = 0) и (Спр2.ПометкаУдаления() = 0) Тогда СпрЛица2 = ПоискКонтрагента(Спр2.ЮрФизЛицо); Если СпрЛица1=СпрЛица2 Тогда Таб.ВывестиСекцию("Строка"); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; Таб.Показать(); КонецПроцедуры как можно упрастить данный модуль? может как нибудь через запрос можно сделать? в 8ке я бы без проблем решил бы эту задачу... |
|||
1
Mikeware
29.10.12
✎
10:33
|
"сами мы восьмерочники, СП украли, ЖКК сгорели - помогите кодом кто каким может..."©
|
|||
2
ДенисЧ
29.10.12
✎
10:33
|
инн = Справочник.Контрагенты.ИНН;
контра - Справочник.Контрагенты.ТекущийЭлемент; Группировка ИНН; Группировка Контра; ЗАпрос = СоздатьОбъект("Запрос"); запрос.Выполнить(стрЗАпрос); Пока запрос.Группировка(1) = 1 ЦИкл сообщить("ИНН = " + запрос.ИНН); Пока запрос.Группировка(2) = 1 Цикл сообщить("" + запрос.контра); КонецЦикла; КонецЦикла; где-то так. |
|||
3
Ёпрст
29.10.12
✎
10:34
|
(0) можно смело отправить его в топку.
|
|||
4
Ёпрст
29.10.12
✎
10:34
|
(2) и твой тоже, у клиентосов нет ИНН, они есть у ЮрФизЛицо в типовом ТиСе..
|
|||
5
ДенисЧ
29.10.12
✎
10:35
|
(4) ну или так :-)
Я эти типовые не помню уже давно |
|||
6
cw014
29.10.12
✎
10:35
|
(4) А где ты видишь, что это типовой ТиС?
|
|||
7
rinaty17
29.10.12
✎
10:37
|
(2)
такой не катит |
|||
8
Ёпрст
29.10.12
✎
10:39
|
(6) только в типовом ТиС/Комплексная есть справочники
ФизЛица,ЮрЛица,СвоиЮрЛица |
|||
9
Ёпрст
29.10.12
✎
10:40
|
(7) см (3,4)
|
|||
10
rinaty17
29.10.12
✎
10:41
|
это типовая Комплексная
|
|||
11
Ёпрст
29.10.12
✎
10:44
|
(10)
ну, самое тупое - перебор справочника клиентосы + складывание в ТЗ + свертка этой ТЗ по ИНН. Более быстрое решение - прямой запрос. |
|||
12
Надсмотрщик
29.10.12
✎
10:46
|
(0) Пригласи СПЕЦИАЛИСТА СЕМЕРОЧНИКА!!!
|
|||
13
rinaty17
29.10.12
✎
10:53
|
(11) понятно что более быстрое решение это прямой запрос, но как его сформировать, вообще не пойму, вот интересно если ИННы одиноковые следует ли из этого что и ЮрФизЛицо одинаковые? вот это интересно, если так то модуль упрощается
|
|||
14
rinaty17
29.10.12
✎
10:53
|
(12) их просто у нас нету)
|
|||
15
Ёпрст
29.10.12
✎
10:54
|
(13) вовсе нет.
Если что, ИНН может быть одинаковым, а КПП разным |
|||
16
Ёпрст
29.10.12
✎
10:55
|
и в типовых запросто наплодить клиентосов с одинаковым ИНН\КПП и с разными ЮрЛицами..
|
|||
17
Ёпрст
29.10.12
✎
10:56
|
собственно, это постоянно делают, если ИНН одинаковый, КПП разный, или ИНН/Кпп одинаковый, а адреса клиентосов разные..
|
|||
18
Преднаименование
29.10.12
✎
10:59
|
Примерно так
//******************************************* Процедура Сформировать() Контр=СоздатьОбъект("Справочник.Контрагенты"); Сп1=СоздатьОбъект("СписокЗначений"); Сп2=СоздатьОбъект("СписокЗначений"); Контр.ВыбратьЭлементы(); Пока Контр.ПолучитьЭлемент()=1 Цикл Если (Сп1.НайтиЗначение(Контр.ИНН)=0) и (Контр.ИНН<>"") Тогда Сп1.ДобавитьЗначение(Контр.ИНН,); ИНаче Сп2.ДобавитьЗначение(Контр.ИНН,); КонецЕсли; КонецЦикла; Контр.ВыбратьЭлементы(); Пока Контр.ПолучитьЭлемент()=1 Цикл Если (Сп2.НайтиЗначение(Контр.ИНН)=0)Тогда Сообщить(Контр); КонецЦИкла; КонецПроцедуры |
|||
19
Преднаименование
29.10.12
✎
11:01
|
Вернее так
//******************************************* Процедура Сформировать() Контр=СоздатьОбъект("Справочник.Контрагенты"); Сп1=СоздатьОбъект("СписокЗначений"); Сп2=СоздатьОбъект("СписокЗначений"); Контр.ВыбратьЭлементы(); Пока Контр.ПолучитьЭлемент()=1 Цикл Если (Сп1.НайтиЗначение(Контр.ИНН)=0) и (Контр.ИНН<>"") Тогда Сп1.ДобавитьЗначение(Контр.ИНН,); ИНаче Сп2.ДобавитьЗначение(Контр.ИНН,); КонецЕсли; КонецЦикла; Контр.ВыбратьЭлементы(); Пока Контр.ПолучитьЭлемент()=1 Цикл Если (Сп2.НайтиЗначение(Контр.ИНН)<>0) или (Контр.ИНН="") Тогда Сообщить(Контр); КонецЕсли; КонецЦИкла; КонецПроцедуры |
|||
20
rinaty17
29.10.12
✎
11:02
|
(19) нельзя обратиться на прямую к инн через справочник контрагенты
|
|||
21
monsterZE
29.10.12
✎
11:05
|
ИНН у тебя реквизит чего? =)
|
|||
22
monsterZE
29.10.12
✎
11:08
|
вариант уже предложили - загнать всех контров в таблицу, создать доп. поле с 1, заполнить его, свернуть и отсортировать
--- или можно выбирать по реквизиту, и, если в выборке больше одной строки или у онтра не заполнено инн - сувать в таблицу =) |
|||
23
rinaty17
29.10.12
✎
11:08
|
(21)ИНН реквизит справочников "Справочник.ФизЛица"; "Справочник.ЮрЛица"; "Справочник.СвоиЮрЛица";
когда заполняем реквизит ЮрФизЛицо на форму автоматический притягивается инн "ЮрФизЛицо". ИНН это не реквизит справочника контрагентый |
|||
24
Преднаименование
29.10.12
✎
11:10
|
(20) Ну обратись через юр лиц, какая разница.
Суть в том чтобы получить двойников используя два списка. Если (Сп1.НайтиЗначение(Контр.ИНН)=0) Тогда Сп1.ДобавитьЗначение(Контр.ИНН,); ИНаче Сп2.ДобавитьЗначение(Контр.ИНН,); КонецЕсли; |
|||
25
aka AMIGO
29.10.12
✎
11:11
|
Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(СпрК) |Клиент = Справочник.Клиенты.ТекущийЭлемент; |Наименование = Справочник.Клиенты.Наименование; |ИНН = Справочник.Клиенты.ИНН; |Телефон = Справочник.Клиенты.Телефон; |Рук = Справочник.Клиенты.Рук; |Группировка Клиент; |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Таб.ВывестиСекцию("Заг"); Таб.Опции(0,0,Таб.ВысотаТаблицы()); ТЗК = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗК,1,0); ТЗК.НоваяКолонка("Колво","Число"); ТЗК.Заполнить(1,,,"Колво"); ТЗК.Сортировать("Наименование"); //------------------------------------- Если поИНН=1 Тогда ТЗК.Сортировать("ИНН"); ТЗВ = СоздатьОбъект("ТаблицаЗначений"); ТЗК.Выгрузить(ТЗВ); ТЗВ.Свернуть("ИНН","Колво"); Шап = "Дубли по ИНН"; Таб.ВывестиСекцию("Шап"); ТЗВ.ВыбратьСтроки(); Пока ТЗВ.ПолучитьСтроку() = 1 Цикл Если ПустоеЗначение(ТЗВ.ИНН)=1 Тогда Продолжить; КонецЕсли; Если Найти(ТЗВ.ИНН,"*")>0 Тогда Продолжить; КонецЕсли; Если Найти(ТЗВ.ИНН,"-")>0 Тогда Продолжить; КонецЕсли; Если Найти(ТЗВ.ИНН,"_")>0 Тогда Продолжить; КонецЕсли; Если ТЗВ.Колво>1 Тогда Рекв = ТЗВ.ИНН; Колво = ТЗВ.Колво; Таб.ВывестиСекцию("Рекв"); Стр =0; Если ТЗК.НайтиЗначение(Рекв, Стр, "ИНН")>0 Тогда Для х=Стр По ТЗК.КоличествоСтрок() Цикл ТЗК.ПолучитьСтрокуПоНомеру(х); Если ТЗК.ИНН <> Рекв Тогда Прервать; КонецЕсли; Наименование = ТЗК.Наименование; ИНН = ТЗк.ИНН; Телефон = ТЗК.Телефон; Рук = ТЗК.Рук; Таб.ВывестиСекцию("Дубль"); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; //------------------------ Таб.ТолькоПросмотр(1); Таб.Показать("Дубли Клиентов"); КонецПроцедуры Процедура ОбработкаЯчейкиТаблицы(Значение,ФСо,Табл,Адрес) //(Док, СтандартнаяОбработка, Таблица,Адрес) ФСо=1; Если Значение.Вид() = "Клиенты" Тогда ФСо=0; Стр=0; СЗ = СоздатьОбъект("СписокЗначений"); СЗ.ДобавитьЗначение(Значение, Значение); ТЗ = СоздатьОбъект("ТаблицаЗначений"); НайтиСсылки(СЗ, ТЗ); Табл = СоздатьОбъект("Таблица"); Табл.ИсходнаяТаблица("Ссылки"); Табл.ВывестиСекцию("Заг"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Табл.ВывестиСекцию("ТЗ"); КонецЦикла; Табл.ТолькоПросмотр(1); Табл.Показать("КП по клиенту"); КонецЕсли; КонецПроцедуры поНаименованию=1; поТелефону=1; поИНН=1; |
|||
26
Ёпрст
29.10.12
✎
11:12
|
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент()=1 Цикл Если (Спр.ПометкаУдаления()=1) Или (Спр.ЭтоГруппа()=1) Тогда Продолжить; КонецЕсли; Если ПустоеЗначение(Спр.ЮрФизЛицо)=1 Тогда Сообщить("Клиентос "+Спр+" отсутствует ЮрФизЛицо"); Продолжить; КонецЕсли; Если ПустоеЗначение(Спр.ЮрФизЛицо.ИНН)=1 Тогда Сообщить("Клиентос "+Спр+" отсутствует ИНН"); Продолжить; КонецЕсли; ТЗ.НоваяСтрока(); ТЗ.Клиентос = Спр.ТекущийЭлемент(); ТЗ.ИНН = Спр.ЮрФизЛицо.ИНН; ТЗ.Служ = 1; КонецЦикла; ТЗ.Выгрузить(врТЗ); врТЗ.Свернуть("ИНН","Служ"); врТЗ.Сортировать("-Служ"); дальше сам разберешься ? там где Служ>=2 - дубли ИНН.. обходишь ТЗ и выгребаешь только тек, где в врТЗ.Служ> -имеешь самих клиентосов. |
|||
27
Ёпрст
29.10.12
✎
11:13
|
+
ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Клиентос") ТЗ.НоваяКолонка("ИНН") ТЗ.НоваяКолонка("Служ","Число") |
|||
28
dk
29.10.12
✎
11:18
|
если операция одноразовая, то regprint + Excel тебе в помощь
|
|||
29
Ёпрст
29.10.12
✎
11:19
|
(28) регпринт ?!
:))) |
|||
30
Андрей_Андреич
naïve
29.10.12
✎
11:20
|
(28) RefPrint
|
|||
31
rinaty17
29.10.12
✎
11:21
|
(26), (27) Спасибо, постараюсь это проделать
|
|||
32
rinaty17
29.10.12
✎
11:22
|
(28),(30) че за операция?
|
|||
33
1Сергей
29.10.12
✎
11:23
|
(32) Ы!
|
|||
34
Ёпрст
29.10.12
✎
11:23
|
(30) не поможет - она не выводит реквизиты с ЮрФизЛицо
|
|||
35
PuhUfa
29.10.12
✎
11:26
|
//*******************************************
// Процедура генерации запроса Сформировать. // Процедура Сформировать() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |ИНН = Справочник.ФизЛица.ИНН, Справочник.ЮрЛица.ИНН; |ТекущийЭлемент = Справочник.ЮрЛица.ТекущийЭлемент, Справочник.ФизЛица.ТекущийЭлемент; |Функция Сч = Счётчик(); |Группировка ИНН; |Группировка ТекущийЭлемент; |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Сформировать"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл Если (Запрос.Сч = 1) И (ПустоеЗначение(Запрос.ИНН)=0) тогда //в группе 1 запись с таким инн и инн не пустое Продолжить; КонецЕсли; // Заполнение полей ИНН Таб.ВывестиСекцию("ИНН"); Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей ТекущийЭлемент Таб.ВывестиСекцию("ТекущийЭлемент"); КонецЦикла; КонецЦикла; // Заполнение полей "Итого" Таб.ВывестиСекцию("Итого"); // Вывод заполненной формы Таб.ТолькоПросмотр(1); Таб.Показать("Сформировать", ""); КонецПроцедуры |
|||
36
dk
29.10.12
✎
11:29
|
(34) а что мешает запустить refprint по спр ЮрФизЛица?
|
|||
37
Ёпрст
29.10.12
✎
11:31
|
(36)
1. Там 2 справочника - ЮрЛица и ФизЛица 2. что это даст, когда нужны сами клиентосы ? |
|||
38
rinaty17
29.10.12
✎
11:43
|
врТЗ.ВыбратьСтроки();
Ном = 0; ИНН1=""; Пока врТЗ.ПолучитьСтроку() = 1 Цикл Ном = Ном+1; (37) к твоему коду добавил вот этот кусочек: Если врТЗ.Служ>=2 Тогда ПЕчНом = Ном; ПечКон = врТЗ.Клиентос; ПечИнн = врТЗ.ИНН; Таб.ВывестиСекцию("Строка"); Если ИНН1 <>врТЗ.ИНН Тогда Таб.ВывестиСекцию("СтрокаР"); КонецЕсли; КонецЕсли; ИНН1 = врТЗ.ИНН; КонецЦикла; Но прога ругается и пишет Поле агрегатного объекта не обнаружено (Клиентос) я может не то вывожу? |
|||
39
rinaty17
29.10.12
✎
11:43
|
упс
(37) к твоему коду добавил вот этот кусочек: врТЗ.ВыбратьСтроки(); Ном = 0; ИНН1=""; Пока врТЗ.ПолучитьСтроку() = 1 Цикл Ном = Ном+1; Если врТЗ.Служ>=2 Тогда ПЕчНом = Ном; ПечКон = врТЗ.Клиентос; ПечИнн = врТЗ.ИНН; Таб.ВывестиСекцию("Строка"); Если ИНН1 <>врТЗ.ИНН Тогда Таб.ВывестиСекцию("СтрокаР"); КонецЕсли; КонецЕсли; ИНН1 = врТЗ.ИНН; КонецЦикла; Но прога ругается и пишет Поле агрегатного объекта не обнаружено (Клиентос) я может не то вывожу? |
|||
40
Ёпрст
29.10.12
✎
11:45
|
(39) не то.
нужно бегать по ТЗ и искать по ИНН в врТЗ, во врТЗ только ИНН и их количество после свертки. |
|||
41
rinaty17
29.10.12
✎
11:48
|
(40) я не могу понять что выдает колонка служ в врТЗ, это число повторов ИНН?
|
|||
42
Ёпрст
29.10.12
✎
11:49
|
(41) какой догадливый.
|
|||
43
rinaty17
29.10.12
✎
11:58
|
(41) Спасибо большое!) все заработало!)
Оказывается клиентов с одинаковыми ИНН очень много, в большинстве случаев это филиалы |
|||
44
rinaty17
29.10.12
✎
11:59
|
вот итоговый код
//******************************************* Процедура Сформировать() Таб=СоздатьОбъект("Таблица"); Таб.ВывестиСекцию("Шапка"); Таб.ТолькоПросмотр(1); ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Клиентос"); ТЗ.НоваяКолонка("ИНН"); ТЗ.НоваяКолонка("Служ","Число"); врТЗ = СоздатьОбъект("ТаблицаЗначений"); врТЗ.НоваяКолонка("Клиентос"); врТЗ.НоваяКолонка("ИНН"); врТЗ.НоваяКолонка("Служ","Число"); Спр = СоздатьОбъект("Справочник.Контрагенты"); Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент()=1 Цикл Если (Спр.ПометкаУдаления()=1) Или (Спр.ЭтоГруппа()=1) Тогда Продолжить; КонецЕсли; Если ПустоеЗначение(Спр.ЮрФизЛицо)=1 Тогда Сообщить("Клиентос "+Спр+" отсутствует ЮрФизЛицо"); Продолжить; КонецЕсли; Если ПустоеЗначение(Спр.ЮрФизЛицо.ИНН)=1 Тогда Сообщить("Клиентос "+Спр+" отсутствует ИНН"); Продолжить; КонецЕсли; ТЗ.НоваяСтрока(); ТЗ.Клиентос = Спр.ТекущийЭлемент(); ТЗ.ИНН = Спр.ЮрФизЛицо.ИНН; ТЗ.Служ = 1; КонецЦикла; ТЗ.Выгрузить(врТЗ); врТЗ.Свернуть("ИНН","Служ"); врТЗ.Сортировать("-Служ"); врТЗ.ВыбратьСтроки(); Ном = 0; ИНН1=""; Пока врТЗ.ПолучитьСтроку() = 1 Цикл Если врТЗ.Служ>=2 Тогда ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Если врТЗ.ИНН = ТЗ.ИНН Тогда Ном = Ном+1; ПЕчНом = Ном; ПечКон = ТЗ.Клиентос; ПечИнн = ТЗ.ИНН; Таб.ВывестиСекцию("Строка"); КонецЕсли; КонецЦикла; Если ИНН1 <>врТЗ.ИНН Тогда Таб.ВывестиСекцию("СтрокаР"); КонецЕсли; КонецЕсли; ИНН1 = врТЗ.ИНН; КонецЦикла; Таб.Показать(); КонецПроцедуры |
|||
45
Преднаименование
29.10.12
✎
12:01
|
(44) Цикл в цикле? Оригинально.
|
|||
46
Ёпрст
29.10.12
✎
12:01
|
ТЗ тоже бы нужно отсортировать по ИНН
|
|||
47
Ёпрст
29.10.12
✎
12:02
|
и .. лучше бегать по ТЗ и делать НайтиЗначение в врТЗ.
|
|||
48
PuhUfa
29.10.12
✎
12:03
|
(45) они не ищут легких путей
|
|||
49
PuhUfa
29.10.12
✎
12:03
|
(47) а чем вам запросом то не нравится?
|
|||
50
Ёпрст
29.10.12
✎
12:05
|
(49) прямым - нравится, черным - не получится
|
|||
51
Ёпрст
29.10.12
✎
12:06
|
точнее рполучится, но долго
|
|||
52
PuhUfa
29.10.12
✎
12:07
|
(50) да ладно. мой код в 35 работает. по крайней мере на тестовой базе все правильно сформировал
|
|||
53
Ёпрст
29.10.12
✎
12:08
|
(52) :) И где там в коде клиентосы ?
Автору клиентосов нужно получить, а не ЮрЛица/ФизЛица. |
|||
54
rinaty17
29.10.12
✎
12:08
|
(49) прямым не получается никак, он же у тебя в итоге никак не связан со спр контрагенты
|
|||
55
rinaty17
29.10.12
✎
12:09
|
(47) попробую так сделать после обеда
|
|||
56
Ёпрст
29.10.12
✎
12:11
|
Могу написать, в одном черном запросе, вот только скорость запроса не гарантирую..
|
|||
57
Злопчинский
29.10.12
✎
16:05
|
Задача быстродействия не стояла - поэтому молотит неспешно..
. //******************************************* Процедура Сформировать() ОчиститьОкноСообщений(); Спр = СоздатьОбъект("Справочник.Контрагенты"); Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ЭтоГруппа()=1 Тогда Продолжить; КонецЕсли; ИсключаемыйКонтрагент = Спр.ЮрФизЛицо; Результат = 2; Результат = Результат - глКонтрольУникальностиИНН(ИсключаемыйКонтрагент, СтрЗаменить(ИсключаемыйКонтрагент.ИНН,Симв(160),""), "ФизЛица")- глКонтрольУникальностиИНН(ИсключаемыйКонтрагент, СтрЗаменить(ИсключаемыйКонтрагент.ИНН,Симв(160),""), "ЮрЛица"); Если Результат <> 0 Тогда СООБЩИТЬ("********************* ПРОБЛЕМА: "+ИсключаемыйКонтрагент.ИНН+" "+ИсключаемыйКонтрагент); //ОткрытьФорму(Спр.ТекущийЭлемент()); КонецЕсли; КонецЦикла; КонецПроцедуры . //****************************************************************************** // возврат: // 1 - успешно, нет дублей ИНН // 0 - ошибка, есть дубли ИНН // Функция глКонтрольУникальностиИНН(ВыбКонтрагент, ИННКПП, ВидСправочника) Экспорт Если ПустоеЗначение(ИННКПП) = 1 Тогда //допустимо неуказание ИНН, //ответственность за дубли клиентов - на пользователе Возврат 1; КонецЕсли; Результат = глКонтрольУникальностиИННSQLite(ВыбКонтрагент, ИННКПП, ВидСправочника); Если Результат <> -1 Тогда //поиск прошел успешно Возврат Результат; КонецЕсли; тИНН = глПолучитьИНН(ИННКПП); тКПП = глПолучитьКПП(ИННКПП); Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса =" |Без Итогов; |Элемент = Справочник.*.ТекущийЭлемент; |ИНН = Справочник.*.ИНН; |Условие(Найти(ИНН,ИННКПП)>0); |Группировка Элемент Без Упорядочивания Без Групп; |"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"*",ВидСправочника); Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат 0; КонецЕсли; ТЗ = СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ,0,0); Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда //удалим из результатов поиска текущий элемент, который записываем поз = 0; Если ТЗ.НайтиЗначение(ВыбКонтрагент,поз,"Элемент") > 0 Тогда ТЗ.УдалитьСтроку(поз); КонецЕсли; КонецЕсли; Если ТЗ.КоличествоСтрок()>0 Тогда //обнаружены клиенты с дублирующимися ИНН Сообщить("Внимание: обнаружено дублирование ИНН..?!","!"); Сообщить(СимволТабуляции+"|_ по справочнику: "+Метаданные.Справочник(ВидСправочника).Синоним); Сообщить(СимволТабуляции+"|_ текущий ИНН\КПП для записи: "+ИННКПП); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Сообщить(СимволТабуляции+"|_ дубль: "+СокрЛП(ТЗ.Элемент.Код)+" "+СокрЛП(ТЗ.Элемент)+", "+ТЗ.Элемент.ИНН); КонецЦикла; Возврат 0; КонецЕсли; //если попали сюда - нет дублей клиентов с заданными ИНН\КПП Если Найти("\/",Прав(СокрЛП(ИННКПП),1)) =0 Тогда Возврат 1; КонецЕсли; //но! //проверим на дубли только ИНН, без учета КПП //т.к. возможны случаи когда сравниваются ИНН вида "1234567890" и "1234567890\" //тогда предыдущий запрос это не отловит ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"ИННКПП","тИНН"); Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат 0; КонецЕсли; Запрос.Выгрузить(ТЗ,0,0); Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда //удалим из результатов поиска текущий элемент, который записываем поз = 0; Если ТЗ.НайтиЗначение(ВыбКонтрагент,поз,"Элемент") > 0 Тогда ТЗ.УдалитьСтроку(поз); КонецЕсли; КонецЕсли; Если ТЗ.КоличествоСтрок()>0 Тогда //обнаружены клиенты с дублирующимися ИНН Сообщить("Внимание: обнаружено дублирование ИНН..?!","!"); Сообщить(СимволТабуляции+"|_ по справочнику: "+Метаданные.Справочник(ВидСправочника).Синоним); Сообщить(СимволТабуляции+"|_ текущий ИНН\КПП для записи: "+ИННКПП); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Сообщить(СимволТабуляции+"|_ дубль: "+СокрЛП(ТЗ.Элемент.Код)+" "+СокрЛП(ТЗ.Элемент)+", "+ТЗ.Элемент.ИНН); КонецЦикла; Возврат 0; КонецЕсли; //если попали сюда - нет дублей клиентов не только с заданными ИНН\КПП //но и с ИНН без указания КПП Возврат 1; КонецФункции // глКонтрольУникальностиИНН() . Внимание: обнаружено дублирование ИНН..?! |_ по справочнику: Сторонние юридические лица |_ текущий ИНН\КПП для записи: 7721232508\772101001 |_ дубль: 00001293 ООО "САМОХВАЛ", 7721232508\772101001 |_ дубль: 00001333 ООО "Самохвал", 7721232508\772101001 ********************* ПРОБЛЕМА: 7721232508\772101001 САМОХВАЛ ООО |
|||
58
Ёпрст
29.10.12
✎
16:06
|
err проца глКонтрольУникальностиИННSQLite не обнаружена..
в топку! |
|||
59
Злопчинский
30.10.12
✎
01:08
|
(58) Кочегар, блин... ;-)
|
|||
60
Злопчинский
30.10.12
✎
01:09
|
(38) у меня там загушка стоит, которая неуспех возвращает... ;-) не осилил...
|
|||
61
Касандер72
30.10.12
✎
09:29
|
Имхо, для поиска одиноковых так красивее:
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Обрабатывать Все; |Клиент = Справочник.ЮрЛица.ТекущийЭлемент, Справочник.ФизЛица.ТекущийЭлемент; |ИНН = Справочник.ЮрЛица.ИНН, Справочник.ФизЛица.ИНН; |Группировка Клиент без групп;"; ОчиститьОкноСообщений(); СписокИНН = СоздатьОбъект("СписокЗначений"); КлиентДанные = ""; Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда Пока Запрос.Группировка(1) = 1 Цикл Позиция = СписокИНН.НайтиЗначение(Запрос.ИНН); Если Позиция = 0 Тогда СписокИНН.ДобавитьЗначение(Запрос.ИНН, СокрЛП(Запрос.Клиент.Наименование) + "; " + СокрЛП(Запрос.Клиент.ЮрАдрес)); Иначе ТекКлиент = СоздатьОбъект("Справочник.Контрагенты"); СписокИНН.ПолучитьЗначение(Позиция,КлиентДанные); Сообщить("ИНН = " + СокрЛП(Запрос.ИНН)+ " = " + КлиентДанные + " = " + СокрЛП(Запрос.Клиент.Наименование) + "; " + СокрЛП(Запрос.Клиент.ЮрАдрес)); КонецЕсли; КонецЦикла; КонецЕсли; Предупреждение("ОБРАБОТКА СПРАВОЧНИКОВ КЛИЕНТОВ ЗАВЕРШЕНА !" |
|||
62
Касандер72
30.10.12
✎
09:32
|
+(61) для поиска "пустышек" соответственно:
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = " |Обрабатывать Все; |Клиент = Справочник.ЮрЛица.ТекущийЭлемент, Справочник.ФизЛица.ТекущийЭлемент; |ИНН = Справочник.ЮрЛица.ИНН, Справочник.ФизЛица.ИНН; |Условие(ПустоеЗначение(ИНН)=1); |Группировка Клиент без групп;"; ОчиститьОкноСообщений(); Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда Пока Запрос.Группировка(1) = 1 Цикл Сообщить(СокрЛП(Запрос.Клиент.Наименование) + "; " + СокрЛП(Запрос.Клиент.ЮрАдрес) + " - НЕ УКАЗАН ИНН !!!"); КонецЕсли; КонецЦикла; КонецЕсли; Предупреждение("ОБРАБОТКА СПРАВОЧНИКОВ КЛИЕНТОВ ЗАВЕРШЕНА !"); |
|||
63
Злопчинский
30.10.12
✎
21:54
|
(61) не словит
1234567890\123456789 1234567890/123456789 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |