|
Самый красивый код для задачи - распознать ГТД и страну из строки | ☑ | ||
---|---|---|---|---|
0
Maniac
10.11.18
✎
22:42
|
Имеем типичную накладную из 1С - печатная форма стандартная которая лепит в наименование ГТД и страну в конец наименования.
Задача - из этих самых наименований а) убрать нафиг эти ГТД и страны оставив чистым наименование б) Распознать ГТД в) Распознать страну. Три не сложных алгоритма. Я у себя решил, но чота не нравится.. Чую как то можно красивее!! Так чтобы глаз радовался коду. Вот такие наименования в накладной Корпус системного блока ПК ZALMAN Z1 NEO Mid Tower, ATX, USB3.0 (10702070/130618/0078002/1, КИТАЙ) Корпус системного блока ПК ZALMAN Z3 PLUS Black Mid Tower, ATX, USB3.0, 120mm Fan x4, fan controller, видео карты до 360мм, SSD support, Arcilic side panel, black color (10702070/160418/0046291/1, КИТАЙ) |
|||
1
Maniac
10.11.18
✎
22:42
|
Еще также могут быть наименования, в которых несколько раз встречаются скобки
Активная акустическая система MICROLAB М-109 черные (10W RMS) (10702070/010618/0072070/7, КИТАЙ) |
|||
2
Maniac
10.11.18
✎
22:44
|
Сейчас в меня
а) 4 строки кода б) 11 строк кода в) 9 строк кода. |
|||
3
Полбатона
10.11.18
✎
23:27
|
Напиши на ИС, там 100% помогут.
|
|||
4
Maniac
10.11.18
✎
23:29
|
Тут лучше форум чем ИС. Это раз.
|
|||
5
МихаилМ
10.11.18
✎
23:57
|
мыслите множествами - нужно обработать множество строк , а не одну. и алгоритмы будут другими.
|
|||
6
Maniac
11.11.18
✎
00:05
|
Все я нашел лучший варианты!!!...
а) 4 строки б) 4 строки в) 3 строки!!! |
|||
7
Maniac
11.11.18
✎
00:09
|
В общем я решил задачу два раза по три алгоритма.
В последнем варианте получились самые короткие и наверное более универсальные чем в первом. Решайте теперь вы. Я свои варианты предоставлю (они уже опубликованы) |
|||
8
МихаилМ
11.11.18
✎
00:11
|
стиль шизойда фиксина - давать загадки без решения - дурной.
|
|||
9
Maniac
11.11.18
✎
00:13
|
А смысл тогда темы было заводить если бы были решения.
Должна сработать соображаловка. Кому не лень тот учавствует в конкурсе. Кому лень - ну так проходите мимо или зайдете когда тут люди напишут. |
|||
10
Maniac
11.11.18
✎
00:14
|
Я когда писал тему у меня были варианты которые мне не нравились. Писать их - это значило бы начатьб обсуждать их.
А наоборот хочу увидеть варианты решений которые кому прийдут в голову. Но потом я сам посидел и нашел скорее всего лучший варианты. Но я потом все напишу. |
|||
11
zak555
11.11.18
✎
00:26
|
Давно в наименования гтд лепятся?
И я не помню, чтобы гтд было в торг |
|||
12
Aleksey
11.11.18
✎
00:28
|
(11) Да уже много лет ут так делает
|
|||
13
Maniac
11.11.18
✎
00:28
|
Практически во всех старых конфигурациях
|
|||
14
Asmody
11.11.18
✎
00:29
|
(0) Если оно всегда в последних скобках и разделено запятой,то решается одной регуляркой https://regex101.com/r/w8GzJY/2
|
|||
15
zak555
11.11.18
✎
00:32
|
(12) ааа
Это наверное серия? |
|||
16
Aleksey
11.11.18
✎
00:32
|
(7) А судьи кто? Кто сказал что твой алгоритм рабочий универсальный?
(9) А что объявлен конкурс? Конкурс это когда есть экспертное жюри или голосование. А это тянет максимум на соревнование |
|||
17
Maniac
11.11.18
✎
00:33
|
Ладно короче чтобы уже флуд закончился начну с первой задачи
ЗАДАЧА 1 - получить чистое наименование. ВАРИАНТ 1 НайтиСкобку = СтрНайти(Значение, "(",НаправлениеПоиска.СКонца); Если НайтиСкобку > 0 Тогда Значение = Лев(Значение,НайтиСкобку-1); КонецЕсли; ВАРИАНТ 2 МассивВсехСлов = СтрРазделить(Колонка3," "); МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1); МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1); Значение = СтрСоединить(МассивВсехСлов," "); |
|||
18
Maniac
11.11.18
✎
00:34
|
ЗАДАЧА 2 - получить ГТД
ВАРИАНТ 1 НайтиСкобку = СтрНайти(Значение, "(",НаправлениеПоиска.СКонца); Если НайтиСкобку > 0 Тогда Значение = Прав(Значение,СтрДлина(Значение)-НайтиСкобку); Значение = СтрЗаменить(Значение,"(",""); Значение = СтрЗаменить(Значение,")",""); НайтиЗапятую = СтрНайти(Значение, ","); Если НайтиЗапятую > 0 Тогда Значение = Лев(Значение,НайтиЗапятую-1); КонецЕсли; КонецЕсли; ВАРИАНТ 2 МассивВсехСлов = СтрРазделить(Колонка3," "); ПредпоследнееСлово = МассивВсехСлов.Получить(МассивВсехСлов.Количество()-2); Значение = СтрЗаменить(ПредпоследнееСлово,"(",""); Значение = СтрЗаменить(Значение,",",""); Ну а третью задачу про страну не вижу смысла писать. Практически тоже самое. |
|||
19
Aleksey
11.11.18
✎
00:34
|
(14) код не рабочий
|
|||
20
Aleksey
11.11.18
✎
00:36
|
(18) Аналогично, не универсальный
|
|||
21
Asmody
11.11.18
✎
00:38
|
(19) Ты гонишь, у меня всё работает.
|
|||
22
Maniac
11.11.18
✎
00:39
|
(20) через массивы и методом стрразделить - все универсально проходит. И с очень коротким кодом.
|
|||
23
Aleksey
11.11.18
✎
00:39
|
(21) В номере ГТД, внезапно, могут быть символы, а твой код этого не допускает.
Плюс длина номера не фиксированная |
|||
24
Aleksey
11.11.18
✎
00:40
|
(22) Внезапно, некоторые страны могут содержать скобки в имени, хочешь сказать твой код корректно их обработает?
|
|||
25
Asmody
11.11.18
✎
00:40
|
(23) Все представленные (0) тесты регулярка прошла.
|
|||
26
Maniac
11.11.18
✎
00:40
|
(14) а что это за сайт такой?
Это как то можно в 1С использовать без кода 1С? И без обращения к каким то сайтам. |
|||
27
Aleksey
11.11.18
✎
00:41
|
(25) Я же говорю правила какие. Мы ищем универсальный механизм? Или конкретно работает с 2-мя тестовыми примерами?
|
|||
28
Maniac
11.11.18
✎
00:44
|
(27) он все правильно описал. Всегда в конце, скобки и запятая.
|
|||
29
Aleksey
11.11.18
✎
00:46
|
(28) У меня по скобкам нет вопроса к его коду, у меня вопрос по символам. Т.е. если в номере ГТД будут символы, его код этот номер пропустит, так как он будет в неформате.
|
|||
30
Asmody
11.11.18
✎
00:51
|
(27) Кто сказал, что задачу надо решать на 1С? Хотя, можно и в 1С регулярки пускать. Я знаю три, нет, четыре способа для этого. Или даже пять, если с извращениями.
|
|||
31
Cthulhu
11.11.18
✎
00:52
|
Корпус системного блока ПК ZALMAN Z3 PLUS Black Mid Tower, ATX, USB3.0, 120mm Fan x4, fan controller, видео карты до 360мм, SSD support, Arcilic side panel, black color (10702070/160418/0046291/1(2), КИТАЙ)
|
|||
32
Asmody
11.11.18
✎
00:52
|
(30) в (26)
|
|||
33
Maniac
11.11.18
✎
00:52
|
Вы скажите теперь как в 1С можно использовать регулярные выражения на иных языках, но чтобы без обращения к интернету и без всяких КОМ- объектов.
И чтобы работало быстро если например 100 000 строк обрабатывается. |
|||
34
Maniac
11.11.18
✎
00:54
|
И так чтобы работало на серверной 1С даже если сервак на линуксе.
|
|||
35
Asmody
11.11.18
✎
00:54
|
(27) мы ищем способ решить задачу в (0). В ней даны конкретные тест-кейсы. Про формат ГТД в ней ничего нет. Про формат названий страны тоже.
|
|||
36
Aleksey
11.11.18
✎
00:55
|
(31) А в жизни такой номер ГТД бывает?
- "1(2)" - это номер позиции в декларации. Т.е. у тебя один и тот же товар (Корпус системного блока ПК...) в таможенной декларации отражен двумя строками? |
|||
37
Asmody
11.11.18
✎
00:56
|
(33) это разовая задача или постоянная?
|
|||
38
Maniac
11.11.18
✎
00:56
|
Асмоди решил задачу в ноль!
Все остальное фигня. Нет в том файле другого. Было бы я бы сразу описал. Если будут - то это уже другой вопрос. Настраивается конкретный файл. Если будут другие - у них свои будут алгоритмы. Тут главное принцип. Принцип ясен. |
|||
39
Aleksey
11.11.18
✎
00:57
|
(35) Ну я думаю у автора все таки вопрос стоит несколько шире, а то можно докатиться до того что
если найти ("КИТАЙ") тогда - и такой код тоже формально будет решать тестовый пример |
|||
40
Maniac
11.11.18
✎
00:58
|
(37) с регулярками? вообще постоянно!
С чем попало. То то то се. Пишу все на 1С. Все получается. Но добавить еще регулярные на других языках - тоже было бы круто!!! Не все владеют 1С. |
|||
41
Asmody
11.11.18
✎
00:58
|
Для разовой я бы выгрузил в текст и прошелся бы скриптом на питоне.
Для постоянной поднял бы сервис и дергал бы при необходимости. |
|||
42
Aleksey
11.11.18
✎
00:59
|
(38) Ну ок, я тебя предупредил что его код не универсальный, что в жизни всё гораздо сложнее. Но если тебя устроит решение конкретно твоего тестового примера, то кто я такой, чтобы тут указывать тебе?
|
|||
43
Maniac
11.11.18
✎
00:59
|
Вот например я еще задачу решал час назад....
Добрый день. У поставщика наименование имеет вид Холодильник {много текста} Индезит Какой алгоритм, чтобы было Холодильник Индезит {много текста} Поставить последнее слово после первого МассивВсехСлов = СтрРазделить(Значение," "); ПоследнееСлово = МассивВсехСлов.Получить(МассивВсехСлов.Количество()-1); МассивВсехСлов.Удалить(МассивВсехСлов.Количество()-1); МассивВсехСлов.Вставить(1,ПоследнееСлово); Значение = СтрСоединить(МассивВсехСлов," "); |
|||
44
Cthulhu
11.11.18
✎
00:59
|
(36): а в номере гтд и стране происхождения - не может быть скобок (даже проще - открывающей скобки)? только в этом случае алгоритм, построенный на поиске "открывающей скобки" с конца (в качестве начала постфикса с номером гтд и страной)работоспособен...
|
|||
45
zak555
11.11.18
✎
01:00
|
а вот перешли бы на упд или xml и проблем не было
|
|||
46
Aleksey
11.11.18
✎
01:01
|
(44) В номере нет, а в стране да. Открой классификатор стран мира
|
|||
49
Maniac
11.11.18
✎
01:07
|
(42) пилять) вы мне скажите как к 1С прикрутить эти регулярки на других языках, чтобы работало во всех режимах.
Компонента может какая или что... И насколько быстрее это может работать чем код 1С (например тот что я привел) |
|||
51
Asmody
11.11.18
✎
01:15
|
У Орефкова была ВК, которая цепляла библиотеку из состава 8ки
https://snegopat.ru/scripts/doc/trunk/rex/readme.markdown . |
|||
52
Aleksey
11.11.18
✎
01:17
|
По коду Asmody
Там всего лишь нужно добавить 2 символа Пп и тогда в первом приближение вопросов нет. |
|||
53
Maniac
11.11.18
✎
01:18
|
Понятно что ничего не понятно. Завтра своему корешу дам задание изучить вопрос (он питонщик) и если нужно сделать нативную компоненту для восьмерки, работающую везде.
Главное понять, насколько это будет быстро и функционально по сравнению с 1С. Я так понимаю это будет проще тем кто на 1С не совсем кодит или не нравится кодить. |
|||
54
Garykom
гуру
11.11.18
✎
01:35
|
Маня и тебя стукнула задачка над которой я страдал еще в 2014?
Алгоритм нахождения подстрок в строке |
|||
55
Garykom
гуру
11.11.18
✎
01:36
|
Для выделения ГТД можно использовать их формат http://www.tehreg.ru/vopr_gtd.htm
Для выделения страны можно использовать справочник стран, логично? |
|||
56
Maniac
11.11.18
✎
01:45
|
Что значит стукнула. я 19 лет в 1С кодю и справляюсь с ее языком. эта вся дребень у меня началась с 2008 года
|
|||
57
Maniac
11.11.18
✎
01:47
|
(55) это уже все после строковых разложений
|
|||
58
Maniac
11.11.18
✎
01:50
|
в тех проблемах что обычно в1С практически всегда не бывает ничего просто. регулярные выражения на питоне скорее всего лишь малая часть. кодом 1С можно закрыть практически все что связано со строами...
как минимум инструментарий в платформе есть и становится шире. |
|||
59
Garykom
гуру
11.11.18
✎
01:51
|
(57) Зачем после "строковых разложений", когда можно сразу и вместо?
Пойми что чуть поменялся формат и решение через поиск ГТД и страны в тексте будет работать даже если скобок нет или местами переставят ГТД и страну. А твое решение нифига не универсальное и для другого поставщика/прайса тупо не заработает. |
|||
60
Maniac
11.11.18
✎
01:52
|
меня просто смущает то что массивы надо шлепать. поэтому я и привел примеры.
где в одних тупо через символы пасковыриваю. в другом через массивы и разложения. ...хотя.... этож накладные а в накладных не бывает тысяч строк... любой код этот в затратах секунды работать будет. как новорится не нужно усложнять там где оно нафиг не нада. |
|||
61
Maniac
11.11.18
✎
01:53
|
(59) будет другой будет пища. вот тогда нужно будет или улучшать и упиверсализировать. либо тупо другому подправить и все.
|
|||
62
Garykom
гуру
11.11.18
✎
01:54
|
(61) Задолбаешься подправлять (лично я так сразу) когда форматов наименований разных штук под 40 и все новые появляются с новыми поставщиками а старые уходят.
|
|||
63
Maniac
11.11.18
✎
01:55
|
у меня один фиг это все справочник. из которого под конкретный прайс выбираются наборы выражений.
жто не является соновным кодом обработки. |
|||
64
Garykom
гуру
11.11.18
✎
01:56
|
(62)+ Я у себя сделал обучение обработки юзером, он тупо выделяет новые (не распознаваемые еще) примеры подстрок и говорит к какому классу они относятся.
И далее оно само распознается - пример машинного обучения )) |
|||
65
Maniac
11.11.18
✎
01:57
|
(62) пофиг. я каждому составляю то что ему нужно. в рамках поддержки. еще и немного платят. все универсализировать невозможно. говорю это как тот кто все схавал уже за 10 лет.
работы всегда будет во всем. справочник и все. |
|||
66
Garykom
гуру
11.11.18
✎
02:04
|
Хочешь сказать тебя не попросили выделять/разделять
"Корпус системного блока ПК" и "Активная акустическая система" с сопоставлением со своими названиями групп/разделов? |
|||
67
Garykom
гуру
11.11.18
✎
02:16
|
"10702070/130618/0078002/1" - это шаблон поиска с "Ч" (число) и ключевыми символами "/"
"ЧЧЧЧЧЧЧЧ/ЧЧЧЧЧЧ/ЧЧЧЧЧЧЧ/Ч" или "ЧЧЧЧЧЧЧЧ/ЧЧЧЧЧЧ/ЧЧЧЧЧЧЧ/ЧЧ" |
|||
68
Aleksey
11.11.18
✎
03:09
|
(67)
Первые 8 Ч необязательно, бывает и не форматы (когда растоможкой занимаются страны ТС) бывают и наши ставят меньше 8. Короче там может быть от 3 до 8 Ч Вторые Ч в идеале желательно проверять на корректность, чтобы отсекать совсем левые ГТД (например будущей датой или некорректные цифры при распознавании) У третей группы Ч допускается первый символ П, так называемая предварительная декларация. Зачастую её меняют на окончательную, но иногда (если ошибок в предварительной нет) выпускают и по предварительной, с буквой П вначале (возможно сейчас еще какие то буквы, но по крайне мере лет 5 назад было такое) Четвертая палка не обязательный реквизит, т.е. его может и не быть, но чисто теоретически в рамках одной декларации может быть до 100 товаров включительно. (1 товар на первом листе, остальные на добавочном. При этом на добавочном до 3-х товара и количество добавочных листов ограничено 33. Итого 33*3+1 = 100 товара). Больше только в разных декларациях. Короче возможен вариант и ЧЧЧ - конечно такой вариант крайне мал, но раз в год и палка стреляет |
|||
69
Aleksey
11.11.18
✎
03:18
|
О даже в декабре прошлого года были изменения (Решение Коллегии Евразийской экономической комиссии от 13.12.2017 N 171) и теперь в 3 группе возможно 9 символов.
элемент 3 - порядковый номер заявления, присваиваемый по журналу регистрации заявлений таможенным органом, зарегистрировавшим заявление, начинающийся с буквенных символов «ЗВ» (нумерация начинается каждый календарный год с 1). Т.е. в 3 группе возможны варианты "ЗВЧЧЧЧЧЧЧ" или "ПЧЧЧЧЧЧЧ" или "ЧЧЧЧЧЧЧ" |
|||
70
Garykom
гуру
11.11.18
✎
19:57
|
(69) Угу просто несколько шаблонов слегка отличающихся, добавить новый при новых данных не проблема и код переписывать не надо.
|
|||
71
Лефмихалыч
11.11.18
✎
21:02
|
ГТД - это последовательность XXX/YYY/ZZZ, у которой
XXX - это один из вот этих кодов http://www.tamognia.ru/qualifiers/qualifier_22.php YYY - это дата в формате ДДММГГ ZZZ - длинное целое страна - закрытый классификатор ОКСМ по этим признакам находим сначала ГТД, потом все, что после прогоняем через ОКСМ. Потом вырезаем это все к херам из наименования, потом удаляем скобки, внутри которых ничего, кроме пробелов и знаков препинания. Оставшееся - сокрэлпим. Это - если строго. Если по-сельскохозяйственному, то тупо регуляркой ищем "(ГТД что_угодно)", ломаем по месту пробела и слева - ГТД, справа - страна. |
|||
72
Лефмихалыч
11.11.18
✎
21:05
|
но в любом случае понадобится руками контролировать. Потому, что страну могут написать, как попало, скобку могут не открыть или не закрыть и т.д.
|
|||
73
Aleksey
11.11.18
✎
21:21
|
(72) Эта шаблон.
Т.е. 1С-ка в поле наименовании товара пихает наименование + (Номер ГТД, Страна) Т.е. никто руками эту строку не пишет, это 1С-ка так выпендрилась (видать кто то на упрощенки попросил, так как фактуры нет, и поэтому нет ГТД и страны) |
|||
74
Лефмихалыч
11.11.18
✎
21:30
|
(73) тогда сельскохозяйственный метод - самое оно
|
|||
75
Мимохожий Однако
11.11.18
✎
22:06
|
(0)ОФФ:Запахло Гением 1С.
|
|||
76
Maniac
12.11.18
✎
09:07
|
(75) я в том числе и гений в 1С
|
|||
77
FIXXXL
12.11.18
✎
09:21
|
Маня открыл для себя СтрРазделить :)
|
|||
78
tgu82
12.11.18
✎
09:21
|
(0) Ну это то же самое как в наименовании кабельного товара есть ПУГНП/ПУГВП/ПУГСП/ВВГпг 2*4 провод и надо убрать в ценнике эти ПУГНП/ПУГВП/ПУГСП. Как-то давно сделал убирается даже если скобки есть
|
|||
79
Maniac
12.11.18
✎
09:22
|
Кстати распознать формат типа XXX/YYY/ZZZ в 1С тоже достаточно легко языком написать
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |