Имя: Пароль:
1C
1C 7.7
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) может уже было....