Имя: Пароль:
1C
1С v8
работа с ПОДСТРОКОЙ
,
0 1Слайт
 
11.03.20
10:35
Ребят, нужна помощь!
Есть докумет АрхивныйДокумент, его номер может быть: Ф-000000005Т, Ф-000000005ТТ, Инв.-000000005Т, Инв.-000000005ТТ и т.д.
Задача: подсчитать количество документов в разрезе Индексов, т.е. в итоге нужна такая таблица

        Т     ТТ

Ф      5      10
Инв.   3      22
Итого  8      32

Помогите определить Индекс в номере документа. Понимаю, что поможет ПОДСТРОКА, но не совсем доходит как определить количество знаков Индекса(он может быть как просто Ф - 1, так и Инв. - 4)

ВЫБРАТЬ
    АрхивныйДокумент.РегНомер КАК РегНомер,
    АрхивныйДокумент.оргРазр КАК оргРазр,
    АрхивныйДокумент.КолвоПодл КАК КолвоПодл,
    АрхивныйДокумент.КолвоКопий КАК КолвоКопий
ИЗ
    Документ.АрхивныйДокумент КАК АрхивныйДокумент
1 dka80
 
11.03.20
10:41
Перебор в цикле
2 dka80
 
11.03.20
10:42
или, если максимальное количество знаков индекса известно, то
Подобно "[A-Z]-%"
или Подобно "[A-Z][A-Z]-%"
или Подобно "[A-Z][A-Z][A-Z]-%"
и т.д.
3 Timon1405
 
11.03.20
10:44
примерно так
выбор когда Подстрока(Номер,1,1) = "Ф" Тогда
выбор когда Подстрока(Номер,10,2) ="ТТ" Тогда
1
иначе 0
Конец
Иначе 0
Конец как Каунт_Ф_ТТ
4 Redkiy
 
11.03.20
10:45
если в запросе, то

ВЫБОР
КОГДА ПОДСТРОКА(АрхивныйДокумент.Номер,2,1) = "-" ТОГДА ПОДСТРОКА(АрхивныйДокумент.Номер,3,8)
КОГДА ПОДСТРОКА(АрхивныйДокумент.Номер,3,1) = "-" ТОГДА ПОДСТРОКА(АрхивныйДокумент.Номер,4,8)
...
КОНЕЦ КАК Номер

заполнение поля индекс аналогично
5 1Слайт
 
11.03.20
10:49
(4) спасибо! пробую
6 unbred
 
11.03.20
13:40
Функция НайтиЧислаВСтроке(Ящик,массивЧисел)
    
    
    СтрокаЧисел = "";
    
    Для Индекс = 1 По СтрДлина(Ящик) Цикл
        
        Символ = Сред(Ящик, Индекс, 1); // Перебираем все сиволы из нашей строки
        
        Если КодСимвола(Символ) >= 48 И КодСимвола(Символ) <= 57 Тогда // Код нуля - 48, код 9-ки - 57
            СтрокаЧисел = СтрокаЧисел + Символ;
        ИначеЕсли СтрДлина(СтрокаЧисел) > 0 Тогда
            Если  МассивЧисел.Количество()< 3 тогда //только первые 3 цифры нужны
                
                МассивЧисел.Добавить(Число(СтрокаЧисел));
                СтрокаЧисел = "";
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    Если СтрДлина(СтрокаЧисел)>0 Тогда
        Если  МассивЧисел.Количество()< 3 тогда   //только первые 3 цифры нужны
            
            МассивЧисел.Добавить(Число(СтрокаЧисел));
        КонецЕсли;
    КонецЕсли;
    
    Возврат МассивЧисел
    
КонецФункции
7 1Слайт
 
11.03.20
15:19
(3) спасибо огромное за подсказку, таблица у меня с огромным количеством значений, поэтому брошу кусочек кода, на самом деле он примитивный, но чаще всего на таких мелочах могу тормознуться...)
ВЫБОР
    КОГДА ПОДСТРОКА(АрхивныйДокумент.РегНомер, 1, 1) = "Ф"
        И ПОДСТРОКА(АрхивныйДокумент.РегНомер, 12, 1) = "Т"
        И НЕ ПОДСТРОКА(АрхивныйДокумент.РегНомер, 13, 1) = "Т"
    ТОГДА АрхивныйДокумент.КолвоКопий
    КОНЕЦ КАК КолвоКопийФТ,
    ВЫБОР
    КОГДА ПОДСТРОКА(АрхивныйДокумент.РегНомер, 1, 1) = "Ф"
        И ПОДСТРОКА(АрхивныйДокумент.РегНомер, 12, 1) = "Т"
        И ПОДСТРОКА(АрхивныйДокумент.РегНомер, 13, 1) = "Т"
        ТОГДА АрхивныйДокумент.КолвоКопий
    КОНЕЦ КАК КолвоКопийФТТ,
8 Garykom
 
гуру
11.03.20
15:42
http://programmist1s.ru/ispolzovanie-operatora-podobno-v-zaprosah-1s/
https://helpf.pro/faq/view/852.html

АрхивныйДокумент.РегНомер ПОДОБНО "Ф-__________Т"
9 1Слайт
 
11.03.20
16:33
(8) да, спасибо, мне уже писали об этом варианте, возможно еще им воспользуюсь, т.к. есть еще куча параметров для создания отчета
10 Garykom
 
гуру
11.03.20
16:47
(9) Этот вариант изящней в реализации и теоретически должен работать шустрее ибо поддержка like почти во всех sql движках есть
11 Garykom
 
гуру
11.03.20
16:49
(10)+ И да можно автоматически найти все шаблоны, путем замены цифр на "_" оставляя символы.
Вот если еще префиксы есть тут сложней но можно задать шаблоны префиксов и один фиг шаблоны автоматом.
12 palsergeich
 
11.03.20
16:50
Это тестовое задание или боевое?
Если боевое - то не надо этой херотой заниматься, при записи пиши куда угодно ключ ссылка - префикс.
13 1Слайт
 
11.03.20
16:57
(10) согласна, часть переделала, из плюсов еще и код короче)) потому как условий и правда много
14 1Слайт
 
11.03.20
17:02
(12) задание тестово-боевое)
Префикс номера ты имешь ввиду?
если да, то не подходит, изначально с ним и работала, но Префикс может быть разным и нумерация вразрезе него идет, а мне нужна нумерация независимая... то есть Ф-001Т, П-002ТТ, М-003Т, Ф-004ТТ.....
15 palsergeich
 
11.03.20
17:12
(14) нет не префикс, а твои уникальные вот эти комбинации при записи документа куда нить сохранять
16 palsergeich
 
11.03.20
17:14
Ибо то что ты делаешь в учебном плане штука неплохая, но в боевом требуется более производительные решения
17 1Слайт
 
11.03.20
17:16
(16) давай по буквам)
что подразумевается под словом сохранить? у меня номер этот и так формируется в отдельное поле...
18 1Слайт
 
11.03.20
17:19
(15) или имеешь ввиду регистры, справочники...
?
19 palsergeich
 
11.03.20
17:19
Смотри тебе надо сделать отчет - часть номера - количество ссылок.
Ну сделай регистр сведений Измерение ссылка,ресурс - часть номера.
М подписку при записи, где будешь алгоритмически эту часть доставать и сохранять в регистр.
Тогда сам отчет будет тривиален
20 palsergeich
 
11.03.20
17:21
Ибо сегодня ты опишешь всеситуации, а завтра что то поменяется, ИМХО проще код написать чем многоэтажные конструкции в запросе
21 Garykom
 
гуру
11.03.20
17:28
Ну я бы задачу решал по тупому совершенно, через заполнение ТЗ, с заменой "ненужных" цифр на один символ и Свернуть()

Если надо для каждого префикса (Ф, Инв) получить количество по постфиксам (Т, ТТ) то после свертки еще раз обрабатывам по тому же алгоритму записывая 1 в нужную колонку (Т, ТТ и т.д.) а затем снова Свернуть()
22 Garykom
 
гуру
11.03.20
17:29
(19) Еще можно хеш-функцию наваять или MapReduce заюзать да.
Только кто потом это допиливать/поддерживать будет и нахрена для разовой задачи базу загромождать?
23 Garykom
 
гуру
11.03.20
17:32
(21)+ В результате имеем короткий и понятный код, который если что легко допилить.
Префиксы и постфиксы оно само определит при (точнее после) замене последовательности цифр на один символ.

Было
Ф-001Т, П-002ТТ, М-003Т, Ф-004ТТ

Стало
Ф-Т, П-ТТ, М-Т, Ф-ТТ

И дальше банально уже
24 1Слайт
 
12.03.20
08:52
(20) это главный вопрос,я тоже думала о том, что завтра может поменяться, хотя отдел заверяет меня, что это система у них уже годами работает)
25 1Слайт
 
12.03.20
08:53
Спасибо всем огромное за помощь!
Вариантов как оказалось много, нужно выбрать удобный)