Имя: Пароль:
1C
1C 7.7
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