Подскажите алгоритм перебора элементов справочника
Не совсем по теме, но есть вопрос по поиску контрагентов.
Подскажите как найти контрагента по двум первым буквам? Есть ИП и ООО - вот мне и надо определить какой контрагент выбран.
Например:
а вот что дальше не могу додумать.
Подскажите как найти контрагента по двум первым буквам? Есть ИП и ООО - вот мне и надо определить какой контрагент выбран.
Например:
Справочник = СоздатьОбъект ("Справочник.Контрагенты");
Если Справочник.Выбрать ("Выбирите контрогента","") > 0 Тогда
а вот что дальше не могу додумать.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5)
Если же вам нужно программно определить тип контрагента, то для этого надо знать конфигурацию, в которой вы "творите". Например, в Бухгалтерии у контрагентов есть специальный реквизит, который заполняется при создании элемента справочника.
Еще можно попытаться определить по длине ИНН (если он есть в вашей конфигурации): у ИП он имеет длину 12 символов.
P.S. И, ради бога, подучите русский язык: "Выберите контрагента", а не "Выбирите контрогента", смотреть противно.
Есть ИП и ООО - вот мне и надо определить какой контрагент выбран.
А что, вы не видите, что сами выбрали? И при чем тут "две первые буквы", ведь выбирается одна запись справочника?
Если же вам нужно программно определить тип контрагента, то для этого надо знать конфигурацию, в которой вы "творите". Например, в Бухгалтерии у контрагентов есть специальный реквизит, который заполняется при создании элемента справочника.
Еще можно попытаться определить по длине ИНН (если он есть в вашей конфигурации): у ИП он имеет длину 12 символов.
P.S. И, ради бога, подучите русский язык: "Выберите контрагента", а не "Выбирите контрогента", смотреть противно.
(9) Самоделкин, по двум первым буквам???
Не то?
Если Найти(СокрЛП(Справочник.Наименование), "ИП") = 1 Тогда
//Это ИП
ИначеЕсли Найти(СокрЛП(Справочник.Наименование), "ООО") = 1 Тогда
//Это ООО
Иначе
//Это не ИП и не ООО, или ИП и ООО, но не в первых буквах...
КонецЕсли;
(9) Самоделкин, 100% надёжного способа определить организационно-правовую форму контрагента, по моему, на практике не существует.
1. физ.лицо от юр.лица отличается ИНН. Но ИНН может быть не указан.
2. В ТиС есть вид контрагента (юр.лицо/физ.лицо/собственное юр.лицо). Но на практике его мало кто правильно выбирает.
3. Можно искать в наименовании. Но тоже надёжность не велика с учетом ошибок пользователей.
Лучше всего использовать всё. Если стоит задача только отличить физ.лица от юр.лиц, то можно сделать где-то так:
1. физ.лицо от юр.лица отличается ИНН. Но ИНН может быть не указан.
2. В ТиС есть вид контрагента (юр.лицо/физ.лицо/собственное юр.лицо). Но на практике его мало кто правильно выбирает.
3. Можно искать в наименовании. Но тоже надёжность не велика с учетом ошибок пользователей.
Лучше всего использовать всё. Если стоит задача только отличить физ.лица от юр.лиц, то можно сделать где-то так:
Функция ЕстьВхождениеСлова(Строка,Образец)
Возврат ?(Найти(" "+ВРег(Строка)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
Функция ЭтоИП(Контрагент)
Если СтрДлина(СокрЛП(Контрагент.ИНН)) = 12 Тогда
Возврат 1;
КонецЕсли;
ЮрФизЛицо = Контрагент.ЮрФизЛицо;
Если ПустоеЗначение(ЮрФизЛицо) = 0 Тогда
Если ЮрФизЛицо.Вид() = "ФизЛица" Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Если ЕстьВхождениеСлова(Контрагент.Наименование,"ИП") = 1 Тогда
Возврат 1;
КонецЕсли;
Если ЕстьВхождениеСлова(Контрагент.Наименование,"Индивидуальный предприниматель") = 1 Тогда
Возврат 1;
КонецЕсли;
Если ЕстьВхождениеСлова(Контрагент.Наименование,"ЧП") = 1 Тогда
Возврат 1;
КонецЕсли;
Если ЕстьВхождениеСлова(Контрагент.Наименование,"Частный предприниматель") = 1 Тогда
Возврат 1;
КонецЕсли;
Возврат 0;
КонецФункции
Показать
(11)
Вот тут возможны веселые варианты, если в контрагенты затешется кто-то типа ООО «ВСК-ИПОТЕКА» (ИНН 7731404259).
Но для автора, у которого одна ошибка на каждое самостоятельно написанное слово - это нормально, конечно же сойдёт!
Если ЕстьВхождениеСлова(Контрагент.Наименование,"ИП") = 1 Тогда
Возврат 1;
КонецЕсли;
Вот тут возможны веселые варианты, если в контрагенты затешется кто-то типа ООО «ВСК-ИПОТЕКА» (ИНН 7731404259).
Но для автора, у которого одна ошибка на каждое самостоятельно написанное слово - это нормально, конечно же сойдёт!
(13) Cooler, я не программист и не вношу глобальных изменений в 1С.
Мне нужно было определить наименование контрагента программно и все, а какой у него ИНН и т.п. - не важно, это не какой-то бухгалтерский супер отчет.
На любом форуме есть учитель Русского языка, который вместо помощи в вопросе, выискивает грамматические ошибки, не влияющие на выполнение программы, но если покопаться в его ответах, то можно найти и у него ошибки и грамматические, и орфографические.
Мне нужно было определить наименование контрагента программно и все, а какой у него ИНН и т.п. - не важно, это не какой-то бухгалтерский супер отчет.
На любом форуме есть учитель Русского языка, который вместо помощи в вопросе, выискивает грамматические ошибки, не влияющие на выполнение программы, но если покопаться в его ответах, то можно найти и у него ошибки и грамматические, и орфографические.
(14)
Насчет помощи: профи тем и отличаются от дилетантов, что привыкли понимать то, что делают. А вас сходу понять, кроме меня, не смогли еще двое участников этой ветки: vcv честно в этом признался, а MaxDavid попытался угадать, что вам нужно. Не получилось. Но виноват в этом, разумеется, один только Cooler.
а какой у него ИНН и т.п. - не важно, это не какой-то бухгалтерский супер отчет.
Угу, я именно это и имел в виду: тяп-ляп, как-нибудь, сойдет! А потом "что-то пошло не так", но мы же не виноваты, верно?
На любом форуме есть учитель Русского языка, который вместо помощи в вопросе, выискивает грамматические ошибки, не влияющие на выполнение программы
Я вам и тут подскажу, просвещайтесь: подобных мне называют "граммар-наци", но я, боюсь, пока еще не дотягиваю.
Насчет помощи: профи тем и отличаются от дилетантов, что привыкли понимать то, что делают. А вас сходу понять, кроме меня, не смогли еще двое участников этой ветки: vcv честно в этом признался, а MaxDavid попытался угадать, что вам нужно. Не получилось. Но виноват в этом, разумеется, один только Cooler.
если покопаться в его ответах, то можно найти и у него ошибки и грамматические, и орфографические.
Очень даже может быть. Но вам до этого уровня - как до Парижа раком.
(15) Cooler,
Не стоит этим кичиться (уровень Вашей грамотности виден в этой ветке хорошо.
Выражения "до Парижа раком" в природе не существует, есть "как фанера над Парижем" и "как до Китая раком".
Здесь Вы подразумеваете весь форум или только меня, тогда слово "Вы" пишется с большой буквы; Word, конечно, распознает и грамматические, и синтаксические ошибки, но не считает такое ошибкой.
Ответы типа:
тяп-ляп, как-нибудь, сойдет
если будет какой-то косяк, то его увижу только я, никто кроме меня это не увидит.
как до Парижа раком.
Не стоит этим кичиться (уровень Вашей грамотности виден в этой ветке хорошо.
Выражения "до Парижа раком" в природе не существует, есть "как фанера над Парижем" и "как до Китая раком".
Но вам до этого уровня
Здесь Вы подразумеваете весь форум или только меня, тогда слово "Вы" пишется с большой буквы; Word, конечно, распознает и грамматические, и синтаксические ошибки, но не считает такое ошибкой.
профи тем и отличаются от дилетантов, что привыкли понимать то, что делают
Ответы типа:
Экстрасенсов тут нет.
. Как раз в духе профессионала.
(22)
Все остальные плевки ядом оставляю без комментариев.
Выражения "до Парижа раком" в природе не существует
Разумеется, не существует: язык - часть культуры, а не природы.
и "как до Китая раком".
Китай был заменен намеренно: а вдруг вы из Владивостока? А Париж - это с гарантией то, что нужно! :-)
Все остальные плевки ядом оставляю без комментариев.
(23) Дорогой, Cooler!
А то, что Вы отказались комментировать, просто дружеское указание на ошибки, как Вы себя называете, "граммар-наци" и больше ничего.
Надеюсь, на этом наши разногласия решены.
плевки ядом
, в Русском языке, называется это И, ради бога, подучите русский язык: "Выберите контрагента", а не "Выбирите контрогента", смотреть противно.
, или это Но для автора, у которого одна ошибка на каждое самостоятельно написанное слово - это нормально, конечно же сойдёт!
, или здесьCooler был прав в отношении к самоделкиным.
.
А то, что Вы отказались комментировать, просто дружеское указание на ошибки, как Вы себя называете, "граммар-наци" и больше ничего.
Надеюсь, на этом наши разногласия решены.
(18)
Теперь вы смотрите внимательно:
Все дело в "обрамлении" пробелами И образца для поиска, И строки, в которой ищем.
Таким образом, на примере предложенных вами строк будет искаться " ИП " в следующих строках:
" ИП ВАСИЛИЙ ПУПКИН "
" ВАСИЛИЙ ПУПКИН, ИП "
Результат проверьте сами.
Cooler прав.
Cooler был прав в отношении к самоделкиным. И в (17), когда признал, что неправ в отношении vcv. :-)
Теперь вы смотрите внимательно:
Возврат ?(Найти(" "+ВРег(Строка)+" "," "+ВРег(Образец)+" ")>0,1,0);
Все дело в "обрамлении" пробелами И образца для поиска, И строки, в которой ищем.
Таким образом, на примере предложенных вами строк будет искаться " ИП " в следующих строках:
" ИП ВАСИЛИЙ ПУПКИН "
" ВАСИЛИЙ ПУПКИН, ИП "
Результат проверьте сами.
(20) ECartman, На самом деле "обмануть" код из 11 довольно просто. Достаточно написать в наименовании контрагента что-то типа Иванов Иван Иванович,ИП или ИП"Иванов Иван Иванович".
Для улучшения хорошо бы проверять не только Наименование, но и ПолнНаименование контрагента, и, перед поиском образца " ИП ", делать в обыскиваемой строке замену символов-разделителей на пробел.
Но это всё перегружало код, который и так был размером на полэкрана. Поэтому я посчитал, что безграмотные варианты, вроде предложенных выше, окажутся редки. Запятые, и прочие знаки пунктуации, редкий товар в 21 веке. Не на всех хватает :)
Для улучшения хорошо бы проверять не только Наименование, но и ПолнНаименование контрагента, и, перед поиском образца " ИП ", делать в обыскиваемой строке замену символов-разделителей на пробел.
Но это всё перегружало код, который и так был размером на полэкрана. Поэтому я посчитал, что безграмотные варианты, вроде предложенных выше, окажутся редки. Запятые, и прочие знаки пунктуации, редкий товар в 21 веке. Не на всех хватает :)
(26) Самоделкин, ну, об этом еще в (21) говорилось... Да и дорабатывать там особо нечего (правда смысла в проверке написания исключительно большими буквами я не уловил):
Только с диапазонами символов следует поиграть и избрать подходящий.
Функция ЕстьВхождениеСлова(Стр,Образец)
Перем ПроверСтр;
ПроверСтр=Стр;
Для К=33 По 47 Цикл
ПроверСтр=СтрЗаменить(ПроверСтр,Симв(К)," ");
КонецЦикла;
Возврат ?(Найти(" "+ВРег(ПроверСтр)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
ПоказатьТолько с диапазонами символов следует поиграть и избрать подходящий.
(27) Jill,
В принципе, поскольку ИП и ООО мои, то и завожу их я, это так на всякий случай, как говорит одна знакомая: "Всяк бават".
Хотел Вам и vcv за помощь перевезти немного $m, но почему-то временно запрещено, как только разрешат, переведу, хоть как-то, кроме СПАСИБО, отблагодарить.
Да и дорабатывать там особо нечего
, как всегда выразился неправильно.
В принципе, поскольку ИП и ООО мои, то и завожу их я, это так на всякий случай, как говорит одна знакомая: "Всяк бават".
Хотел Вам и vcv за помощь перевезти немного $m, но почему-то временно запрещено, как только разрешат, переведу, хоть как-то, кроме СПАСИБО, отблагодарить.
(26) Самоделкин, а можно и вовсе:
Но это уже, скорее, перебор... )))
Процедура ДобавитьДиапазон(СписДиапазона, ДиапНач, ДиапКон)
Если ТипЗначенияСтр(СписДиапазона)<>"СписокЗначений" Тогда
СписДиапазона=СоздатьОбъект("СписокЗначений");
КонецЕсли;
СписДиапазона.ДобавитьЗначение(ДиапНач+ДиапКон/1000);
КонецПроцедуры
Процедура ПолучитьДиапазон(ЗначенДиап, ДиапНач, ДиапКон)
ДиапНач=Цел(ЗначенДиап);
ДиапКон=(ЗначенДиап-ДиапНач)*1000;
КонецПроцедуры
Функция ЕстьВхождениеСлова(Стр,Образец)
Перем ПроверСтр, СписДиапазона, ДНач, ДКон;
ПроверСтр=Стр;
//Добавляем диапазоны
//******************************
ДобавитьДиапазон(СписДиапазона, 33, 47);
//******************************
Для i=1 По СписДиапазона.РазмерСписка() Цикл
ПолучитьДиапазон(СписДиапазона.ПолучитьЗначение(i),ДНач, ДКон);
Для j=ДНач По ДКон Цикл
ПроверСтр=СтрЗаменить(ПроверСтр,Симв(j)," ");
КонецЦикла;
КонецЦикла;
Возврат ?(Найти(" "+ВРег(ПроверСтр)+" "," "+ВРег(Образец)+" ")>0,1,0);
КонецФункции
ПоказатьНо это уже, скорее, перебор... )))
Задача такая: нужно найти дубли (элементы с одинаковыми наименованиями) справояника. Как организовать перебор с наибольшим быстродействием? Делаю так:
1) Спр.ВыбратьЭлементы()
2) Пока ПолучитьЭлемент() = 1 Цикл
Наименование = Спр.ТекущийЭлемент().Наименование();
Внутри цикла запрос: "
|ТекЭл= Справочник.Контрагенты.ТекущийЭлемент;
|Группировка ТекЭл;
|Условие(ПотенциальныеКлиенты.Наименование =Наименование);
|Условие(ТекЭл<> Спр.ТекущийЭлемент());
Так вот, время выполнения запроса 3,5 сек. Как можно оптимизировать?
1) Спр.ВыбратьЭлементы()
2) Пока ПолучитьЭлемент() = 1 Цикл
Наименование = Спр.ТекущийЭлемент().Наименование();
Внутри цикла запрос: "
|ТекЭл= Справочник.Контрагенты.ТекущийЭлемент;
|Группировка ТекЭл;
|Условие(ПотенциальныеКлиенты.Наименование =Наименование);
|Условие(ТекЭл<> Спр.ТекущийЭлемент());
Так вот, время выполнения запроса 3,5 сек. Как можно оптимизировать?
1. перебором
2. запросом
Код |
---|
ПрошлоеНаименование=0;
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если ПрошлоеНаименование<>Спр.Наименование Тогда
ПрошлоеНаименование=Спр.Наименование;
Продолжить;
КонецЕсли;
Сообщить("Дубль: "+Спр.Код+" "+Спр.Наименование);
КонецЦикла;
Показать полностью |
2. запросом
Код |
---|
ТекстЗапроса="
|Спр=Справочник.Контрагенты.ТекущийЭлемент;
|Наименование=Справочник.Контрагенты.Наименование;
|Группировка Наименование;
|Группировка Спр;
|";
Показать полностью |
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот