Имя: Пароль:
1C
1С v8
Поиск в таблице значений
,
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) Кто нит знает?
Основная теорема систематики: Новые системы плодят новые проблемы.