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

5. Самоделкин 2 08.11.14 20:17 Сейчас в теме
Не совсем по теме, но есть вопрос по поиску контрагентов.

Подскажите как найти контрагента по двум первым буквам? Есть ИП и ООО - вот мне и надо определить какой контрагент выбран.

Например:
Справочник = СоздатьОбъект ("Справочник.Контрагенты"); 
Если Справочник.Выбрать ("Выбирите контрогента","") > 0 Тогда


а вот что дальше не могу додумать.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. Cooler 22 08.11.14 20:55 Сейчас в теме
(5)
Есть ИП и ООО - вот мне и надо определить какой контрагент выбран.
А что, вы не видите, что сами выбрали? И при чем тут "две первые буквы", ведь выбирается одна запись справочника?

Если же вам нужно программно определить тип контрагента, то для этого надо знать конфигурацию, в которой вы "творите". Например, в Бухгалтерии у контрагентов есть специальный реквизит, который заполняется при создании элемента справочника.

Еще можно попытаться определить по длине ИНН (если он есть в вашей конфигурации): у ИП он имеет длину 12 символов.

P.S. И, ради бога, подучите русский язык: "Выберите контрагента", а не "Выбирите контрогента", смотреть противно.
7. Самоделкин 2 08.11.14 21:07 Сейчас в теме
(6) Cooler, с русским языком у меня все в порядке, а если противно - не смотри, а смотришь - читай правильно, грамотей.
8. vcv 89 08.11.14 22:10 Сейчас в теме
(7) Самоделкин, Поддержу Cooler. Совершенно непонятно, чего же вы хотите.
9. Самоделкин 2 08.11.14 22:31 Сейчас в теме
(8) vcv, я, конечно, вижу какого контрагента выбрал; мне нужно программно определить какой контрагент выбран.
Как-нибудь так:

Если ВыбранныйКонтрагент = ?ИП? Тогда
...
Иначе
...

А вот что написать вместо ?ИП? не знаю, уже мыслей никаких нет.
10. MaxDavid 127 08.11.14 23:18 Сейчас в теме
(9) Самоделкин, по двум первым буквам???

Если Найти(СокрЛП(Справочник.Наименование), "ИП") = 1 Тогда
//Это ИП
ИначеЕсли Найти(СокрЛП(Справочник.Наименование), "ООО") = 1 Тогда
//Это ООО
Иначе
//Это не ИП и не ООО, или ИП и ООО, но не в первых буквах...
КонецЕсли;
Не то?
12. Самоделкин 2 09.11.14 09:23 Сейчас в теме
(10) MaxDavid, нет, это не то - контрагент уже найден.

(11) vcv, Вы как всегда на высоте, С П А С И Б О.
11. vcv 89 09.11.14 08:22 Сейчас в теме
(9) Самоделкин, 100% надёжного способа определить организационно-правовую форму контрагента, по моему, на практике не существует.
1. физ.лицо от юр.лица отличается ИНН. Но ИНН может быть не указан.
2. В ТиС есть вид контрагента (юр.лицо/физ.лицо/собственное юр.лицо). Но на практике его мало кто правильно выбирает.
3. Можно искать в наименовании. Но тоже надёжность не велика с учетом ошибок пользователей.
Лучше всего использовать всё. Если стоит задача только отличить физ.лица от юр.лиц, то можно сделать где-то так:
Функция ЕстьВхождениеСлова(Строка,Образец)
  Возврат ?(Найти(" "+ВРег(Строка)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
Функция ЭтоИП(Контрагент)
  Если СтрДлина(СокрЛП(Контрагент.ИНН)) = 12 Тогда
    Возврат 1;
  КонецЕсли;
  ЮрФизЛицо = Контрагент.ЮрФизЛицо;
  Если ПустоеЗначение(ЮрФизЛицо) = 0 Тогда
    Если ЮрФизЛицо.Вид() = "ФизЛица" Тогда
      Возврат 1;
    КонецЕсли;
  КонецЕсли;
  Если ЕстьВхождениеСлова(Контрагент.Наименование,"ИП") = 1 Тогда
    Возврат 1;
  КонецЕсли;
  Если ЕстьВхождениеСлова(Контрагент.Наименование,"Индивидуальный предприниматель") = 1 Тогда
    Возврат 1;
  КонецЕсли;
  Если ЕстьВхождениеСлова(Контрагент.Наименование,"ЧП") = 1 Тогда
    Возврат 1;
  КонецЕсли;
  Если ЕстьВхождениеСлова(Контрагент.Наименование,"Частный предприниматель") = 1 Тогда
    Возврат 1;
  КонецЕсли;
  Возврат 0;
КонецФункции
Показать
Самоделкин; ECartman; +2 Ответить
13. Cooler 22 09.11.14 10:36 Сейчас в теме
(11)
Если ЕстьВхождениеСлова(Контрагент.Наименование,"ИП") = 1 Тогда
    Возврат 1;
  КонецЕсли;


Вот тут возможны веселые варианты, если в контрагенты затешется кто-то типа ООО «ВСК-ИПОТЕКА» (ИНН 7731404259).

Но для автора, у которого одна ошибка на каждое самостоятельно написанное слово - это нормально, конечно же сойдёт!
14. Самоделкин 2 09.11.14 11:14 Сейчас в теме
(13) Cooler, я не программист и не вношу глобальных изменений в 1С.

Мне нужно было определить наименование контрагента программно и все, а какой у него ИНН и т.п. - не важно, это не какой-то бухгалтерский супер отчет.

На любом форуме есть учитель Русского языка, который вместо помощи в вопросе, выискивает грамматические ошибки, не влияющие на выполнение программы, но если покопаться в его ответах, то можно найти и у него ошибки и грамматические, и орфографические.
15. Cooler 22 09.11.14 11:40 Сейчас в теме
(14)
а какой у него ИНН и т.п. - не важно, это не какой-то бухгалтерский супер отчет.
Угу, я именно это и имел в виду: тяп-ляп, как-нибудь, сойдет! А потом "что-то пошло не так", но мы же не виноваты, верно?

На любом форуме есть учитель Русского языка, который вместо помощи в вопросе, выискивает грамматические ошибки, не влияющие на выполнение программы
Я вам и тут подскажу, просвещайтесь: подобных мне называют "граммар-наци", но я, боюсь, пока еще не дотягиваю.

Насчет помощи: профи тем и отличаются от дилетантов, что привыкли понимать то, что делают. А вас сходу понять, кроме меня, не смогли еще двое участников этой ветки: vcv честно в этом признался, а MaxDavid попытался угадать, что вам нужно. Не получилось. Но виноват в этом, разумеется, один только Cooler.

если покопаться в его ответах, то можно найти и у него ошибки и грамматические, и орфографические.
Очень даже может быть. Но вам до этого уровня - как до Парижа раком.
22. Самоделкин 2 11.11.14 10:51 Сейчас в теме
(15) Cooler,
тяп-ляп, как-нибудь, сойдет
если будет какой-то косяк, то его увижу только я, никто кроме меня это не увидит.

как до Парижа раком.

Не стоит этим кичиться (уровень Вашей грамотности виден в этой ветке хорошо.
Выражения "до Парижа раком" в природе не существует, есть "как фанера над Парижем" и "как до Китая раком".

Но вам до этого уровня

Здесь Вы подразумеваете весь форум или только меня, тогда слово "Вы" пишется с большой буквы; Word, конечно, распознает и грамматические, и синтаксические ошибки, но не считает такое ошибкой.

профи тем и отличаются от дилетантов, что привыкли понимать то, что делают

Ответы типа:
Экстрасенсов тут нет.
. Как раз в духе профессионала.
23. Cooler 22 11.11.14 11:41 Сейчас в теме
(22)
Выражения "до Парижа раком" в природе не существует
Разумеется, не существует: язык - часть культуры, а не природы.

и "как до Китая раком".
Китай был заменен намеренно: а вдруг вы из Владивостока? А Париж - это с гарантией то, что нужно! :-)

Все остальные плевки ядом оставляю без комментариев.
24. Самоделкин 2 11.11.14 13:18 Сейчас в теме
(23) Дорогой, Cooler!
плевки ядом
, в Русском языке, называется это
И, ради бога, подучите русский язык: "Выберите контрагента", а не "Выбирите контрогента", смотреть противно.
, или это
Но для автора, у которого одна ошибка на каждое самостоятельно написанное слово - это нормально, конечно же сойдёт!
, или здесь
Cooler был прав в отношении к самоделкиным.
.
А то, что Вы отказались комментировать, просто дружеское указание на ошибки, как Вы себя называете, "граммар-наци" и больше ничего.

Надеюсь, на этом наши разногласия решены.
16. vcv 89 09.11.14 12:16 Сейчас в теме
(13) Cooler,
Вот тут возможны веселые варианты, если в контрагенты затешется кто-то типа ООО «ВСК-ИПОТЕКА» (ИНН 7731404259).

Вы имеете в виду, что в слово "ИПОТЕКА" входят буквы "ИП" ? Тогда вы невнимательно почитали мой код.
17. Cooler 22 09.11.14 12:53 Сейчас в теме
(16) Да, признаю, был неправ.
18. ECartman 2 09.11.14 22:38 Сейчас в теме
19. Cooler 22 09.11.14 22:52 Сейчас в теме
(18)
Cooler прав.
Cooler был прав в отношении к самоделкиным. И в (17), когда признал, что неправ в отношении vcv. :-)

Теперь вы смотрите внимательно:
Возврат ?(Найти(" "+ВРег(Строка)+" "," "+ВРег(Образец)+" ")>0,1,0);

Все дело в "обрамлении" пробелами И образца для поиска, И строки, в которой ищем.

Таким образом, на примере предложенных вами строк будет искаться " ИП " в следующих строках:

" ИП ВАСИЛИЙ ПУПКИН "
" ВАСИЛИЙ ПУПКИН, ИП "

Результат проверьте сами.
ECartman; +1 Ответить
20. ECartman 2 09.11.14 22:53 Сейчас в теме
(19) Cooler, Да, действительно невнимателен)))) Признаю, извиняюсь)
21. vcv 89 10.11.14 05:34 Сейчас в теме
(20) ECartman, На самом деле "обмануть" код из 11 довольно просто. Достаточно написать в наименовании контрагента что-то типа Иванов Иван Иванович,ИП или ИП"Иванов Иван Иванович".
Для улучшения хорошо бы проверять не только Наименование, но и ПолнНаименование контрагента, и, перед поиском образца " ИП ", делать в обыскиваемой строке замену символов-разделителей на пробел.
Но это всё перегружало код, который и так был размером на полэкрана. Поэтому я посчитал, что безграмотные варианты, вроде предложенных выше, окажутся редки. Запятые, и прочие знаки пунктуации, редкий товар в 21 веке. Не на всех хватает :)
25. Frogger1971 12.11.14 12:41 Сейчас в теме
(21) vcv, не думаю, что можно обмануть, если предварительно знаки препинания и кавычки поубирать + проверять на написание БОЛЬШИМИ буквами, если организационная структура написана типа: "ооо Рога и кАпыта", то это проблемы написавшего и такие случаи одиночны
26. Самоделкин 2 13.11.14 18:31 Сейчас в теме
(25) Frogger1971, спасибо за подсказку, доработаю.
27. Jill 17 13.11.14 19:28 Сейчас в теме
(26) Самоделкин, ну, об этом еще в (21) говорилось... Да и дорабатывать там особо нечего (правда смысла в проверке написания исключительно большими буквами я не уловил):
Функция ЕстьВхождениеСлова(Стр,Образец) 
	Перем ПроверСтр;  
	
	ПроверСтр=Стр;
	Для К=33 По 47 Цикл
		ПроверСтр=СтрЗаменить(ПроверСтр,Симв(К)," ");
	КонецЦикла;
	
  Возврат ?(Найти(" "+ВРег(ПроверСтр)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
Показать


Только с диапазонами символов следует поиграть и избрать подходящий.
29. Самоделкин 2 14.11.14 13:20 Сейчас в теме
(27) Jill,
Да и дорабатывать там особо нечего
, как всегда выразился неправильно.

В принципе, поскольку ИП и ООО мои, то и завожу их я, это так на всякий случай, как говорит одна знакомая: "Всяк бават".

Хотел Вам и vcv за помощь перевезти немного $m, но почему-то временно запрещено, как только разрешат, переведу, хоть как-то, кроме СПАСИБО, отблагодарить.
30. Гость 14.11.14 15:56
(29) ПеревеЗти - это от "перевозить", а от слова перевод - "перевеСти"
28. Jill 17 13.11.14 19:49 Сейчас в теме
(26) Самоделкин, а можно и вовсе:
Процедура ДобавитьДиапазон(СписДиапазона, ДиапНач, ДиапКон)  
	Если ТипЗначенияСтр(СписДиапазона)<>"СписокЗначений" Тогда
		СписДиапазона=СоздатьОбъект("СписокЗначений");
	КонецЕсли;
	СписДиапазона.ДобавитьЗначение(ДиапНач+ДиапКон/1000);
КонецПроцедуры    

Процедура ПолучитьДиапазон(ЗначенДиап, ДиапНач, ДиапКон)
	ДиапНач=Цел(ЗначенДиап);
	ДиапКон=(ЗначенДиап-ДиапНач)*1000;
КонецПроцедуры

Функция ЕстьВхождениеСлова(Стр,Образец) 
	Перем ПроверСтр, СписДиапазона, ДНач, ДКон;
	
	ПроверСтр=Стр;
	
	//Добавляем диапазоны
	//******************************
	ДобавитьДиапазон(СписДиапазона, 33, 47);
	//******************************
	
	Для i=1 По СписДиапазона.РазмерСписка() Цикл
		ПолучитьДиапазон(СписДиапазона.ПолучитьЗначение(i),ДНач, ДКон);
		Для j=ДНач По ДКон Цикл
			ПроверСтр=СтрЗаменить(ПроверСтр,Симв(j)," ");
		КонецЦикла;	
	КонецЦикла;
	
  Возврат ?(Найти(" "+ВРег(ПроверСтр)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
Показать


Но это уже, скорее, перебор... )))
31. Оберон 17 19.11.14 14:31 Сейчас в теме
32. Sanario 27 20.11.14 09:26 Сейчас в теме
Да надо было просто объявить вознаграждение за топик и все
33. nick_krsk 18 10.06.08 08:38 Сейчас в теме
Задача такая: нужно найти дубли (элементы с одинаковыми наименованиями) справояника. Как организовать перебор с наибольшим быстродействием? Делаю так:
1) Спр.ВыбратьЭлементы()
2) Пока ПолучитьЭлемент() = 1 Цикл
Наименование = Спр.ТекущийЭлемент().Наименование();
Внутри цикла запрос: "
|ТекЭл= Справочник.Контрагенты.ТекущийЭлемент;
|Группировка ТекЭл;
|Условие(ПотенциальныеКлиенты.Наименование =Наименование);
|Условие(ТекЭл<> Спр.ТекущийЭлемент());

Так вот, время выполнения запроса 3,5 сек. Как можно оптимизировать?
34. ssp_ 155 10.06.08 08:59 Сейчас в теме
1. перебором
Код
ПрошлоеНаименование=0;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
    Если ПрошлоеНаименование<>Спр.Наименование Тогда
        ПрошлоеНаименование=Спр.Наименование;
        Продолжить;
    КонецЕсли;
    Сообщить("Дубль: "+Спр.Код+" "+Спр.Наименование);
КонецЦикла;
Показать полностью


2. запросом
Код
ТекстЗапроса="
|Спр=Справочник.Контрагенты.ТекущийЭлемент;
|Наименование=Справочник.Контрагенты.Наименование;
|Группировка Наименование;
|Группировка Спр;
|";
Показать полностью

35. nick_krsk 18 10.06.08 09:30 Сейчас в теме
36. ssp_ 155 10.06.08 12:56 Сейчас в теме
Уточнение:
В способе 1 надо добавить
Код
Спр.ПорядокНаименований();
Показать полностью

И еще
Код
Спр.ВыбратьЭлементы(0);
Показать полностью
если мы хотим видеть элементы с одним наименованием в разных группах.
MaxDavid; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот