|
v7: ИзСтрокиСРазделителями | ☑ | ||
---|---|---|---|---|
0
HE1Cer
14.12.13
✎
18:10
|
Подскажите, можно ли как-то приспособить функцию ИзСтрокиСРазделителями к файлу с разделителями - точка с запятой.
Или может есть что-то аналогичное? |
|||
1
Злопчинский
14.12.13
✎
18:26
|
//********************************************************************************************************
// Функция глРазложитьИзСтроки(парамСтрока,СимволРазделитель="‡") Экспорт темпСтрока = СокрЛП(парамСтрока); // 450012‡900088 темпСтрока = СтрЗаменить(темпСтрока,"""",Симв(148)); // заменяем двойную кавычку на другую, похожую темпСтрока = """"+темпСтрока+""""; // "450012‡900088" темпСтрока = СтрЗаменить(темпСтрока,СимволРазделитель,""","""); // "450012","900088" темпСЗ = СоздатьОбъект("СписокЗначений"); // преобразуем строку темпСЗ.ИзСтрокиСРазделителями(темпСтрока); // в список значений темпСтрока = ""; // имеем перечень артикулов, лежащих в ячейке Возврат темпСЗ; КонецФункции //глРазложитьИзСтроки() |
|||
2
Злопчинский
14.12.13
✎
18:28
|
читай построчно,
используя указанную функцию из строки формируй СЗ из Сз извлекай нужные данные. . как вариант есть мнение что м.б. твой случай можно читать через установленные драйвера в системе..? . |
|||
3
Torquader
14.12.13
✎
18:36
|
Если файл специально "подготовить", то можно - только проще сразу читать.
Проблема 1С в том, что она не умеет искать в строке символ, начиная с какой-то фиксированной позиции (и восьмая версия тоже) и пока она это не умеет, называть 1С серьёзной системой для анализа содержимого файлов просто нельзя. VbScript вам в помощь и функцию InStr(Начало,Строка,ЧтоИщем,ТипСравнения) |
|||
4
Злопчинский
14.12.13
✎
18:40
|
(0) есть МОЯстрока = 23;47;58 98 45;60;20
СЗ = глРазложитьИзСтроки(мояСтрока,";"); получится список значений, состоящий из строк: 23 47 58 98 45 60 20 |
|||
5
HE1Cer
14.12.13
✎
18:46
|
Злопчинский, спасибо!
|
|||
6
Злопчинский
14.12.13
✎
19:27
|
(5) можно использовать типовую функцию глРазложить() - но она существенно тормознее - при больших обемах уже заметно немного.
|
|||
7
vcv
14.12.13
✎
19:37
|
(1) Интересны три вопроса
1. Почему нет "Перем темпСтрока;" 2. Зачем нужно "темпСтрока = "";" 3. Что будет, если в разбиваемой строке есть ковычки. (последний вопрос самый неинтересный, а на первые два хотелось бы услышать ответ) |
|||
8
Злопчинский
14.12.13
✎
19:57
|
(7)
1. наверное, надо? Почему? - явное определение переменной ускоряет выполнение кода? 2. шоб було. люблю занулять используемые переменные во избежание, возможно и не надо. 3. двойная кавычка заменяется на два апострафа |
|||
9
vcv
14.12.13
✎
20:46
|
(8) Точно уже не вспомню, но было "исследование" быстродействия переменных, определенных в функции/процедуре, переменных текущего модуля и глобальных переменных. Первые были быстрее.
А вот на счет разницы между явным и неявным определением переменной не знаю. Разве что есть вероятность наткнуться на одноименную глобальную переменную или одноименный реквизит... |
|||
10
Злопчинский
14.12.13
✎
21:18
|
(9) да, читал эту статью по быстродействию
|
|||
11
Torquader
15.12.13
✎
01:29
|
(9) Для 1С разницы в явном или неявном определении переменной нет, так как выделение памяти и ресурсов под переменную происходит в момент компиляции кода, а не в момент исполнения.
Глобальная переменная может быть немного "медленнее", так как живёт не в локальной памяти модуля, а требует обращения в блоку переменных модуля. Реквизит будет намного медленнее, чем любая переменная, так как требует выполнение преобразования типа. |
|||
12
mikecool
15.12.13
✎
01:33
|
(3) "называть 1С серьёзной системой для анализа содержимого файлов просто нельзя." - а с какого перепугу 1с это система анализа содержимого файлов???
|
|||
13
vcv
15.12.13
✎
15:51
|
(11) Мало того, что намного медленнее, еще и обращение к базе с большой вероятностью будет. Например, на форме есть реквизит "Фирма". Выполняю строчку "ТекФирма = Фирма" и получаю вызов хранимой процедуры (на SQL). Недавно смотрел на свою базу в штатный отчет в SQL2005. За пару часов работы хранимая процедура получения фирмы по ID вызвалась более пяти миллионов раз.
|
|||
14
Torquader
15.12.13
✎
21:02
|
(13) Это "хвалёный" механизм представлений, когда для каждого объекта система ещё и формирует представление - особенно, это касается реквизитов, когда в памяти хранится ID, а на экране отображается строка.
Потом, у 1С даже целый кеш под эти нужды создан. |
|||
15
vcv
15.12.13
✎
22:07
|
(14) Вот теперь в раздумьях. Можно ли как-то технично это изменить. Всё же за несколько часов дернуть хранимку пять миллионов раз, даже если всё берется из кеша, это лишнего грузит интерпретатор, оптимизатор и прочие механизмы SQL.
Предположительно такое количество обращений к справочнику фирм связано с тем, что очень много процедур в глобальнике обращается к "Конт.Фирма". Для сильно переписанной конфигурации можно завести глобальную переменную под это дело и заполнять её один раз перед проведением документа. Но это тупо и в лоб. Может есть лучшее решение. Завтра попробую разобраться, откуда обращений к хранимой процедуре справочника фирм в несколько раз больше, чем к любой другой хранимой. |
|||
16
Torquader
16.12.13
✎
01:24
|
(15) Везде, где используется фирма, будет вызываться хранимая процедура, так как ссылка на объект хранится вместе с представлением (для этого его придумали), а система всегда обновляет представление при выполнении каких-то операций.
Не знаю, можно ли отключить представление. Самое простое решение - использовать вместо ссылки сам ГУИД, как это обычно делается в Access-е, но это считается неправильным для 1С. |
|||
17
1s_ivan
16.12.13
✎
02:20
|
(3) господи вот проблема, ну на 1 функцию больше и что?
VB = InStr(Начало,Строка,ЧтоИщем,ТипСравнения) в 1с = Найти(сред(Строка,Начало),ЧтоИщем) |
|||
18
Torquader
16.12.13
✎
11:24
|
(17) А теперь скорость выполнения - во-втором случае, мы создаёт отдельную строку с началом на нужном символе. Если строка очень длинная, то скорости выполнения могут отличаться на несколько порядков.
|
|||
19
kupec
16.12.13
✎
16:44
|
Строчка=СтрЗаменить(СокрЛП(Текст.ПолучитьСтроку(Н)),";",Симв(34)+","+Симв(34));
Строчка=Симв(34)+Строчка+Симв(34); Спис.ИзСтрокиСРазделителями(Строчка); |
|||
20
kupec
16.12.13
✎
16:45
|
+(19) может уже было....
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |