Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Некорректное преобразование строки в число при импорте их Excel (http://forums.kuban.ru/f1040/nekorrektnoe_preobrazovanie_stroki_v_chislo_pri_importe_ih_excel-8066692.html)

Skeave 08.11.2016 13:47

Некорректное преобразование строки в число при импорте их Excel
 
Некорректное преобразование строки в число при импорте из Excel

Ячейка = ВходExcel.Cells(НомерСтр, 5);
ЗначЯч= "" + СокрЛП(Ячейка.Text);//длина
Длина=Число(ЗначЯч);
Сообщить("Длина: "+ ЗначЯч + "/" + Длина);

ЗначЯч - число в текстовом формате, в 1С передается
Длина - переменная, в которую передается преобразованное явным образом из текстового формата число, иногда оказывается равным 0

(Иногда - то есть обычно все работает корректно. Но иногда - описываемый случай. Не понятно)

user1C 08.11.2016 14:04

пример Сообщить("Длина: "+ ЗначЯч + "/" + Длина) когда Длина = 0 в студию...

Skeave 08.11.2016 14:05

[url]http://my-files.ru/fsxerw[/url] xls-файл с описанной ошибкой. Колонка Длина

Skeave 08.11.2016 14:06

[quote=user1C;43196596] пример Сообщить("Длина: "+ ЗначЯч + "/" + Длина) когда Длина = 0 в студию... [/quote]

Я отправил файл с описанной ошибкой. [url]http://my-files.ru/fsxerw[/url]

Skeave 08.11.2016 14:07

[quote=Skeave;43196614] [url]http://my-files.ru/fsxerw[/url] xls-файл с описанной ошибкой. Колонка Длина [/quote]

Если колонку длина заполнить вручную или скопировав значения из колонки Ширина, ошибка пропадает.

Разве не чудеса?

GariPortman 08.11.2016 14:09

В числе есть символ(160)?

GariPortman 08.11.2016 14:11

поставь точку останова в Длина=Число(ЗначЯч); и внимательно посмотри на ЗначЯч. м.б. оно выглядит как "1 200"

user1C 08.11.2016 14:15

(2,3)
копипаст из окна сообщений сюда...

Skeave 08.11.2016 14:18

[quote=user1C;43196700] (2,3) копипаст из окна сообщений сюда... [/quote]

Длина: 25/25
Длина: 608 /608
Длина:  540/0
Длина:  960/0

Первые две строчки - это я вписал значения вручную. Они, как я и рассказывал сразу, преобразуются корректно

GariPortman 08.11.2016 14:24

Длина: 960/0 - между ":" и "960" - Два пробела

Skeave 08.11.2016 14:28

[quote=user1C;43196700] (2,3) копипаст из окна сообщений сюда... [/quote]

Вот, что я сделал. Обработка с текстом и результатом, в котором хотелось бы разобраться. Откройте в обработке xls файл, ссылку на котрый я дал выше, и убедитесь в справедливости того, про что я рассказал

[url]http://my-files.ru/7iq8la[/url]

Skeave 08.11.2016 14:31

[quote=Begemot;43196777] Длина: 960/0 - между ":" и "960" - Два пробела [/quote]

Откуда там могут взяться пробелы, когда используется СокрЛП?
Один пробел. Потому что - Сообщить("Длина: "+ ЗначЯч + "/" + Длина);

GariPortman 08.11.2016 14:39

СокрЛП(Ячейка.Text) = " 719"
Число(СтрЗаменить(ЗначЯч,Симв(160),"")) = 719

ЗначЯч = " 719"

GariPortman 08.11.2016 14:40

[quote=Skeave;43196826]Откуда там могут взяться пробелы, когда используется СокрЛП[/quote]
СокрЛП(Ячейка.Text) = " 719"
Что видно между первой скобкой и цифрой 7????
Пробелы бывают разные. Делай как в 12.

VZ 08.11.2016 14:43

(0) Открой для себя [b].value[/b]

user1C 08.11.2016 14:44

(11)
оттуда... формируйте xls прально и все будет корректно
там в xls везде идет неразрывный пробел перед числами (код 160)

Skeave 08.11.2016 14:46

[quote=VZ;43196897] (0) Открой для себя .value [/quote]

Value первоначально и было. Посоветовали попробовать Text. С Value та же ошибка

Skeave 08.11.2016 14:48

[quote=user1C;43196903] (11) оттуда... формируйте xls прально и все будет корректно там в xls везде идет неразрывный пробел перед числами (код 160) [/quote]


Что значит формируйте ПРАВИЛЬНО? И что за "неразрывный пробел"? Разве СокрЛП() не должен убирать всякого рода пробелы?

GariPortman 08.11.2016 14:51

[quote=Skeave;43196934]И что за "неразрывный пробел"? [/quote]
[url]https://yandex.ru/yandsearch?&clid=2186623&text=%22%D0%BD%D0%B5%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%BD%D1%8B%D0%B9%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%22&lr=39[/url]

[quote=Skeave;43196934] Разве СокрЛП() не должен убирать всякого рода пробелы? [/quote]
Уже ж на пальцах показали.

user1C 08.11.2016 14:53

(17)
"[em]Разве СокрЛП() не должен убирать всякого рода пробелы?[/em]"
Нет
для затравочки:
...
стр = "_";
Для к=1 По СтрДлина(ЗначЯч) Цикл
стр = стр + КодСимв(Сред(ЗначЯч,к,1)) + "_";
КонецЦикла;
Сообщить("Длина: "+ ЗначЯч + "/" + Длина+" коды "+стр);
дальше в жкк и гугель...

Skeave 08.11.2016 15:02

[quote=user1C;43196968] (17) "Разве СокрЛП() не должен убирать всякого рода пробелы?" Нет для затравочки: ... стр = "_"; Для к=1 По СтрДлина(ЗначЯч) Цикл стр = стр + КодСимв(Сред(ЗначЯч,к,1)) + "_"; КонецЦикла; Сообщить("Длина: "+ ЗначЯч + "/" + Длина+" коды "+стр); дальше в жкк и гугель... [/quote]


Воспользовался советом Число(СтрЗаменить(ЗначЯч,Симв(160),""))

А почему и при использовании в Excel формата ячеек Числовой, то же этот самый "неразрывный пробел" себя проявлял? Пробел - это разве не аттрибут тектсового представления?

Чучундер 08.11.2016 15:03

Сокрлп например прекрасно убирает разделитель строк по концам строки

Helen1986 08.11.2016 15:11

господя... желтая страна этих самых
валюе + локализация + разделитель тысяч + точность на экране...

Skeave 08.11.2016 15:12

[quote=Helen1986;43197072] господя... желтая страна этих самых валюе + локализация + разделитель тысяч + точность на экране... [/quote]

не ругайтесь, пишите понятно. value - приводило к той же самой ошибке, что и text

Skeave 08.11.2016 15:14

[quote=Чучундер;43197021] Сокрлп например прекрасно убирает разделитель строк по концам строки [/quote]

О чем вы? СокрЛП я использовал и этого оказывалось недостаточно

VZ 08.11.2016 15:21

22-Helen1986 > Разделитель триад, прошу прощение за занудство ;)
А про "локализацию" -вовремя.

Тут (сабж) в чем непонимание: в механизме обмена через СОМ-соединение. И в том, что это соединение вовсе не обязано знать о тонкостях внутренних форматов разных утилит.
И о цвете страны тоже ;)

Helen1986 08.11.2016 15:23

(25) совершенно верно, разделитель не тысяч, а триад

VZ 08.11.2016 15:27

23-Skeave > Если какой-то болван загнал в ячейку заместо числа текст, визуально не отличимый от [em]отображения[/em] числа, то при чем здесь "1С"? Та же самая беда приключится, если будешь читать не 1С, а, к примеру, WSH.

user1C 08.11.2016 15:31

(20)
формат ячеек эхеля это аля функция формат() одноэса - представление значения... если образно)

Skeave 08.11.2016 15:32

[quote=VZ;43197167] 23-Skeave > Если какой-то болван загнал в ячейку заместо числа текст, визуально не отличимый от отображения числа, то при чем здесь "1С"? Та же самая беда приключится, если будешь читать не 1С, а, к примеру, WSH. [/quote]

СокрЛП() - убирает пробелы спереди и сзади значения. Согласно документации 1С. Для того эта функция и предназначена. Чтоб использовать ее в случаях "визуально не отличимых..". То, что она убирает не все пробелы, а только их часть - конечно, это ошибка 1С.

VZ 08.11.2016 15:38

29-Skeave > Во-первых, СокрЛП убирает только первые и оконечные пробелы.
Во-вторых, не трогает пробелы внутри текста.
И наконец, разделитель триад - [b]не[/b] пробел.

Skeave 08.11.2016 15:40

[quote=VZ;43197219]СокрЛП убирает только первые и оконечные пробел[/quote]

Так ведь речь и идет именно о первых и последних пробелах.
Разделитель триад - т.н. "неразрывный пробел" - это все-таки пробел, как следует из его названия. И здесь - никаких триад никто не делил.

Skeave 08.11.2016 15:42

Кстати. Как думаете, как пользователи вообще умудрились использовать эти самые "неразрывные.."? "Shift+пробел" нужно специально нажать, чтоб получилась эта фигня. Вряд ли в обсуждаемом случае можно вести речь о сознательной злонамеренности. Непонятно. Как эти пробелы могли получиться "случайно"?

user1C 08.11.2016 15:45

(32)
например, копипастом с сайта... там этисамые &nbsp часто обитают))

VZ 08.11.2016 16:05

32-Skeave > Нет, не специально:в Excel отображение настраивается. По дефолту - как в установках Windows (потому и не рекомендуется винигред из по разному локализованных ПО).
И потому Excel не рекомендован для обмена. Нигде в типовых решениях он не используется.
Но разрешен для особо упёртых: легче дать, чем отговорить.
P.S. "пробел" и "неразрывный пробел" - это [b]разные[/b] символы. Так же "молоко" от коровы, и "молоко" от негашеной извести, хоть и выглядит одинаково, все-таки отличаются по вкусу. Предлагаю поверить не проверяя.

Skeave 08.11.2016 16:23

[quote=VZ;43197374] 32-Skeave > Нет, не специально:в Excel отображение настраивается. По дефолту - как в установках Windows (потому и не рекомендуется винигред из по разному локализованных ПО). И потому Excel не рекомендован для обмена. Нигде в типовых решениях он не используется. Но разрешен для особо упёртых: легче дать, чем отговорить. P.S. "пробел" и "неразрывный пробел" - это разные символы. Так же "молоко" от коровы, и "молоко" от негашеной извести, хоть и выглядит одинаково, все-таки отличаются по вкусу. Предлагаю поверить не проверяя. [/quote]

А кто говорит, что это одинаковые символы? Вы продолжаете спорить сам с собой. Конечно, разные. Но и то и другое - пробелы. Которые, согласно документации, должны удалятся функцией СокрЛП(). Поскольку конкретизации "такие то пробелы удаляются, а такие то нет" в этой самой документации нет. Почитайте сами. Ctrl+F1. Либо в более полной, чем хелп программы, документации. Нигде не сказано, что есть разновидность пробелов, которые не удаляются.

Skeave 08.11.2016 16:25

[quote=VZ;43197374] 32-Skeave > Нет, не специально:в Excel отображение настраивается. По дефолту - как в установках Windows (потому и не рекомендуется винигред из по разному локализованных ПО). И потому Excel не рекомендован для обмена. Нигде в типовых решениях он не используется. Но разрешен для особо упёртых: легче дать, чем отговорить. P.S. "пробел" и "неразрывный пробел" - это разные символы. Так же "молоко" от коровы, и "молоко" от негашеной извести, хоть и выглядит одинаково, все-таки отличаются по вкусу. Предлагаю поверить не проверяя. [/quote]

Это бланк загрузки в документ Реализация заказываемых товаров и их размеров. Заполняемый менеджерами компании покупателя. Вряд ли "с сайта"

USSR 08.11.2016 16:34

называйте не пробелом, а просто невидимым символом ) что тут спорить, такие символы встречаются и надо просто это принять как снег, дождь, солнце

MagAN 08.11.2016 17:06

[quote=Skeave;43197492] Это бланк загрузки в документ Реализация заказываемых товаров и их размеров. Заполняемый менеджерами компании покупателя. [/quote]

1С 7.7 "не понимает" некоторые дурацкие символы. Например, пресловутый "длинный дефис", который так нужен был банкам в извещении о взносе наличных.
И этот твой дурацкий неразрывный пробел тоже.
Можно "очищать" текст поиском первого символа-цифры,
Пока СтрДлина(ЗначЯч)>0 Цикл
Если Найти(Лев(ЗначЯч,1),"0123456789")=0 Тогда
ЗначЯч=Сред(ЗначЯч,2);
Иначе
Длина=0+ЗначЯч;
Прервать;
КонецЕсли;
КонецЦикла;
или удалением конкретного символа
ЗначЯч=СтрЗаменить(ЗначЯч,Симв(160),"");
, но лучше - найти паразита, который в настройках Excel установил этот символ в качестве разделителя триад и прибить ...

VZ 08.11.2016 17:27

Да о чем разговор... Аффтар еще с датами не сталкивался ;)
Все, кто связывался с "обменом 1С с Excel-ем" отлично знают о ненадежности этой связки. Усугубленной тем, что ввод в Excel осуществляется ручками. Без каких-либо формальных соглашений. Где вместо нулевого значения вполне можно словить знак <-> ("прочерк" по мнению барышни).
Короче говоря, "обмен 1С с Excel" неизбежно обрастает кучей вспомогательных функций типа [em]ОпределитьТипЗначения(выражение)[/em], [em]ПривестиИзПредставленияКНормальномуВиду()[/em] и т.п.


Текущее время: 23:14. Часовой пояс GMT +3.