|
Поиск в таблице значений | ☑ | ||
---|---|---|---|---|
0
Abduvali
21.12.22
✎
09:43
|
Уважаемые форумчане, здравствуйте.
У меня головная боль с такой задачей: Есть некая переменная типа Строка, я ищу значение этой строки в таблице значений. Функция Найти() его не находить, пишу вместо переменного само значение в лоб, он его находит. Вообщем я замудохался с этим... скрин прилагаеться: https://ibb.co/qsWVZVd |
|||
1
Abduvali
21.12.22
✎
09:46
|
Использую версию платформы 8.3.10.2505 (0)
|
|||
2
Fish
21.12.22
✎
09:47
|
Код в студию. Скрин не всем виден.
|
|||
3
Abduvali
21.12.22
✎
09:49
|
(2)
Зпрос= Новый Запрос( "ВЫБРАТЬ | "" "" КАК НомерЭСФ, | СчетФактураВесоваяНовая.Ссылка КАК Ссылка, | СчетФактураВесоваяНовая.Номер КАК Номер, | СчетФактураВесоваяНовая.Дата КАК Дата, | СчетФактураВесоваяНовая.Количество КАК Количество, | СчетФактураВесоваяНовая.Всего КАК Сумма |ИЗ | Документ.СчетФактураВесоваяНовая КАК СчетФактураВесоваяНовая |ГДЕ | СчетФактураВесоваяНовая.Дата МЕЖДУ &НачПериода И &КонПериода | |УПОРЯДОЧИТЬ ПО | Номер"); Зпрос.УстановитьПараметр("НачПериода", НачалоДня(НачПериода)); Зпрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода)); ЭСФы=Зпрос.Выполнить().Выгрузить(); Для Каждого ТекСтр из ЭСФы Цикл ТекСтр.НомерЭСФ= ПолучитьНомерНаПечать(ТекСтр.Ссылка); КонецЦикла; Состояние("Начато обработка таблицы....."); Для ТекСтрокаExl=4 По 20000 Цикл НомерНаСайте= СокрЛП( Страница.Cells(ТекСтрокаExl,8).Text); Если ПустаяСтрока( НомерНаСайте) Тогда Прервать; КонецЕсли; СФактура= ЭСФы.Найти( НомерНаСайте, "НомерЭСФ"); Если СФактура<> Неопределено Тогда Знач1= СокрЛП( Страница.Cells( ТекСтрокаExl, 12).Text); Если Число( Знач1)= ЭСФы[СФактура].Сумма Тогда Страница.Cells( ТекСтрокаExl, 16).Value= "НА САЙТЕ!"; Иначе Страница.Cells( ТекСтрокаExl, 16).Value= "- не найден"; КонецЕсли; Иначе Страница.Cells( ТекСтрокаExl, 16).Value= "вне диапазона"; КонецЕсли; |
|||
4
Fish
21.12.22
✎
09:53
|
(3) Все верно. Так у тебя никогда не найдёт. Потому что: "" "" КАК НомерЭСФ.
|
|||
5
Abduvali
21.12.22
✎
09:55
|
(4) я пишу в коде:
Для Каждого ТекСтр из ЭСФы Цикл ТекСтр.НомерЭСФ= ПолучитьНомерНаПечать(ТекСтр.Ссылка); КонецЦикла; |
|||
6
Abduvali
21.12.22
✎
09:56
|
Я проверил данные заполнены все данные правильно.
|
|||
7
Kassern
21.12.22
✎
09:57
|
(6) Поставьте точку останова на ЭСФы.Найти( НомерНаСайте, "НомерЭСФ"); И посмотрите, что вы передаете в НомерНаСайте. Может там число, а у вас строка, может у вас там неразравный пробел между числами стоит, который срезать надо и т.д. Чудес не бывает.
|
|||
8
Ногаминебить
21.12.22
✎
09:58
|
Под отладчиком уже смотрел? Я в код особо не вчитывался, но там похоже ексель.А где ексель - там добавления пробелов при чтении того, что он считает числом.
|
|||
9
Fish
21.12.22
✎
09:58
|
(5) Да, не заметил. Ну значит, у тебя ПолучитьНомерНаПечать(ТекСтр.Ссылка) возвращает значение, отличное от СокрЛП( Страница.Cells(ТекСтрокаExl,8).Text). Посмотри в отладчике, нет ли там лишних пробелов и прочего из (7).
|
|||
10
Abduvali
21.12.22
✎
09:59
|
(7) (8) В скрине ясно, что я сделал отладочку именно там. Как мне скрин показать вам всем.
|
|||
11
Kassern
21.12.22
✎
10:01
|
(10) Увидел скрин, вообще забавно) Попробуйте через запрос это все дело реализовать
|
|||
12
Abduvali
21.12.22
✎
10:03
|
(11) Через запрос? Как? Может подскажите!
|
|||
13
Abduvali
21.12.22
✎
10:04
|
(11) Наверно, из эгзеля прочитать столбец в массив и отправит его в запрос как параметр?
|
|||
14
Kassern
21.12.22
✎
10:06
|
(12) У вас какая таблица больше, в экселе, или в ЭСФы?
|
|||
15
Fish
21.12.22
✎
10:06
|
(11) Да, какая-то мистика.
|
|||
16
Kassern
21.12.22
✎
10:08
|
Если у вас ЭСФы меньше чем эксель, только оптимальнее обходить в цикле строки ТЗ, а в экселе уже искать нужную ячейку.
|
|||
17
НЕА123
21.12.22
✎
10:08
|
в отладчике посмотреть
НомерЭСФ = "34060" ? |
|||
18
Мультук
гуру
21.12.22
✎
10:09
|
(10)
СтрДлина(НомерНаСайте) равна 5 ? |
|||
19
Fish
21.12.22
✎
10:09
|
+(15) Попробуй ещё такое посмотреть в отладчике ЭСФы.Найти("34060", "НомерЭСФ").НомерЭСФ = НомерНаСайте
|
|||
20
ass1c
21.12.22
✎
10:09
|
Тут конечно много чего не оптимально. Но попробуй самое простое для этого кода:
Зпрос= Новый Запрос( "ВЫБРАТЬ //| "" "" КАК НомерЭСФ, закоменть ЭСФы=Зпрос.Выполнить().Выгрузить(); ЭСФы.Колонки.Добавить("НомерЭСФ",Новый ОписаниеТипов("Строка")); //+ добавить колонку программно Для Каждого ТекСтр из ЭСФы Цикл ТекСтр.НомерЭСФ= ПолучитьНомерНаПечать(ТекСтр.Ссылка); КонецЦикла; |
|||
21
НафНаф
21.12.22
✎
10:10
|
НомерЭСФ точно набран в нужной кодировке весь?
|
|||
22
Abduvali
21.12.22
✎
10:12
|
(20) уже пробовал добавить программно, но безуспешно.
|
|||
23
Fish
21.12.22
✎
10:13
|
(22) На (19) ответь.
|
|||
24
Abduvali
21.12.22
✎
10:13
|
(21) там только циферки.
а как посмотреть кодировку. |
|||
25
Abduvali
21.12.22
✎
10:15
|
(19) так этот Найти() возвращает Неопределено, ведь.
|
|||
26
Abduvali
21.12.22
✎
10:16
|
(19) на скрине виден ответ
|
|||
27
Галахад
гуру
21.12.22
✎
10:18
|
(26) Бывают невидимые символы.
|
|||
28
Fish
21.12.22
✎
10:18
|
(26) На скрине у тебя как раз ЭСФы.Найти("34060", "НомерЭСФ") возвращает строку.
Вот и сравни колону найденной строки с твоим НомерНаСайте |
|||
29
Abduvali
21.12.22
✎
10:19
|
(19) удивительно, он возвращает ЛОЖЬ!
|
|||
30
Fish
21.12.22
✎
10:20
|
(29) Вот и ответ, почему не находит. То ли кодировка, то ли невидимые символы.
|
|||
31
НЕА123
21.12.22
✎
10:20
|
(29)
делай (18) |
|||
32
Kassern
21.12.22
✎
10:21
|
(24) Попробуйте вместо | "" "" КАК НомерЭСФ, написать | 0 КАК НомерЭСФ,
А тут ТекСтр.НомерЭСФ= Число(ПолучитьНомерНаПечать(ТекСтр.Ссылка)); Тут: НомерНаСайте= СокрЛП( Страница.Cells(ТекСтрокаExl,8).Text); Попытка НомерНаСайте= Число(НомерНаСайте); Исключение НомерНаСайте=0; КонецПопытки |
|||
33
Abduvali
21.12.22
✎
10:23
|
(30) решение не приходит в голову. А переменну НомерНаСайте не переобразовывает к числу, ошибка выходить.
|
|||
34
Kassern
21.12.22
✎
10:24
|
(33) "НомерНаСайте не переобразовывает к числу" - это еще почему? А если написать Страница.Cells(ТекСтрокаExl,8).Value?
|
|||
35
Abduvali
21.12.22
✎
10:25
|
Щась попробую через .Value вместо .Text видимо не видимые символ ....
|
|||
36
Fish
21.12.22
✎
10:26
|
(33) "А переменну НомерНаСайте не переобразовывает к числу, ошибка выходить" - Похоже, там есть невидимые символы.
Посмотри СтрДлина( ЭСФы.Найти("34060", "НомерЭСФ").НомерЭСФ) и СтрДлина(НомерНаСайте ) |
|||
37
Галахад
гуру
21.12.22
✎
10:28
|
Для Сч = 1 по СтрДлина(НомерНаСайте) Цикл
Код = КодСимвола(Сред(НомерНаСайте, Сч, 1); Сообщить(Код); КонецЦикла; |
|||
38
Kassern
21.12.22
✎
10:30
|
(35) Еще раз подтверждается факт, что магии не существует)
|
|||
39
Abduvali
21.12.22
✎
10:32
|
(37) Точно! Надо проверить.
|
|||
40
Abduvali
21.12.22
✎
10:39
|
(37) Этот грёбанный Эгзел возвращает невидимый символ в конце с кодом 8203 и его не показывает 1С,
Большое человеческое СПАСИБО ВСЕМ кто помог! |
|||
41
Kassern
21.12.22
✎
10:42
|
(40) Видишь пробел нулевой ширины? - Нет. Вот и я не вижу. А он есть)
|
|||
42
НафНаф
21.12.22
✎
10:46
|
(24) я про имя колонки
|
|||
43
НафНаф
21.12.22
✎
10:47
|
(40) это говорит, что СокрЛП работает криво
|
|||
44
Abduvali
21.12.22
✎
11:22
|
(43) он сбрасывает лишь пробелы и табуляции, возможно еще ВК и ПС.
|
|||
45
Kassern
21.12.22
✎
11:23
|
(43) Все правильно работает:
Отсекает незначащие символы, стоящие слева от первого значащего символа в строке, и пробелы, стоящие справа от последнего значащего символа в строке. Слева никаких незначащих символов не было, а справа был не простой пробел, а нулевой ширины. |
|||
46
Kassern
21.12.22
✎
11:25
|
Можно попробовать СокрП() использовать, там по описанию : Отсекает незначащие символы, стоящие справа от последнего значащего символа в строке.
|
|||
47
Kassern
21.12.22
✎
11:25
|
Хотя тоже вряд ли поможет, так как для 1с незначащие символы это - «Пробел», «Неразрывный пробел», «Табуляция», «Возврат коретки», «Перевод коретки», «Перевод строки», «Перевод формы».
|
|||
48
Fish
21.12.22
✎
11:26
|
(45) Модно попробовать тогда после СокрЛП ещё СокрП.
|
|||
49
Fish
21.12.22
✎
11:26
|
(48) *можно
|
|||
50
Kassern
21.12.22
✎
11:27
|
(48) походу пробел с нулевой шириной не попадает в незначащие символы
|
|||
51
НафНаф
21.12.22
✎
11:28
|
(50) это плохо
|
|||
52
Fish
21.12.22
✎
11:28
|
(50) Судя по описанию да, но попробовать можно.
|
|||
53
Fish
21.12.22
✎
11:31
|
+(52) А можно использовать Лев() с нужным количеством символов, если длина номера известна и не меняется. Но это не спасёт от невидимых символов слева.
|
|||
54
Ногаминебить
21.12.22
✎
11:35
|
Я через стрзаменить такую фигню решаю. Коряво, но действенно.
|
|||
55
Abduvali
21.12.22
✎
11:37
|
оффтоп
А как егзел показать на переднем плане на весь экран, Excel.OnTop=Истина не работает. |
|||
56
Kassern
21.12.22
✎
11:39
|
(55) оффтоп
Уходите уже из этого экселя. Сделайте табличку у себя в 1с. Там и контролируйте статусы заказов и т.д. Тогда всей этой мороки с чтение и прочей лабудой с выводом и записью файла не будет. |
|||
57
Fish
21.12.22
✎
11:42
|
(56) Да можно и не уходить, а использовать ТабДок.Прочитать(). Тогда и проблем с символами не будет.
|
|||
58
Kassern
21.12.22
✎
11:45
|
(57) так ему потом нужно напротив этой ячейки в экселе статус проставить и файлик перезаписать. Далее уже юзверы с этим файликом работают. Вот я и спрашиваю, к чему это все, когда это дело можно в 1с реализовать и не мучить файловую систему с приложением эксель (а там еще свои косяки могут быть с блокировками, зависшими приложениями и т.д.).
|
|||
59
Fish
21.12.22
✎
11:49
|
(58) ТабДок.Записать() и пусть возятся со своим экселем, если так нравится :)))
|
|||
60
Abduvali
21.12.22
✎
11:49
|
(57) Спасибо за подсказку!
|
|||
61
Fish
21.12.22
✎
11:50
|
+(59) Да, и даже установленный эксель тут не понадобится.
|
|||
62
Fish
21.12.22
✎
11:51
|
+(61) Но, если честно, то подобная работа с экселем - те ещё костыли.
|
|||
63
Abduvali
21.12.22
✎
11:52
|
(55) Кто нит знает?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |