Имя: Пароль:
1C
 
Метод: найти документ по номеру
0 Табуретка
 
18.11.06
10:19
Подскажите в чем ошибка... Перепробовал всяко, заездил уже все дебагером, перерыл кучу доков... код - проще некуда, но результата не дает!!! На форме два числовых поля НомерНач и НомерКон замысел преребрать доки по заданному диапазону номеров, в базе они есть но процедура их не находит :(

Процедура Сформировать()
Док=СоздатьОбъект("Документ.Реализация");
Док.ВыбратьДокументы();
Для Номер=НомерНач ПО НомерКон Цикл
   Если Док.НайтиПоНомеру(Строка(Номер))=1 Тогда //тут пробовал и просто Номер и СокрЛП(Номер) и Число(Номер) - никак :(
    Предупреждение("Найден: "+Док.ТекущийДокумент(),1);
   КонецЕсли;
КонецЦикла;
КонецПроцедуры
1 ТелепатБот
 
гуру
18.11.06
10:19
2 Табуретка
 
18.11.06
10:27
хехе, порылся в базе, нашел свойже код давнишний...

Док=СоздатьОбъект("Документ.ТС_Квитанция");
   Док.ВыбратьДокументы();
   ...            
Если Док.НайтиПоНомеру(Строки.ПолучитьЗначение(Н+1))=1 тогда
   ТЗ.Док = Док.ТекущийДокумент();
   ТЗ.Номер = Док.НомерДок;
КонецЕсли;

тут работает, а тут(0) - нет... в чём проблема, ума не приложу...
3 FreeFin
 
18.11.06
10:38
Код то рабочий, у меня находит.)

Номера доков не содержат префиксов и числовые?
НайтиПоНомеру = найти полное/точное соответствие, если номер типа РА-00001 то на 1 не откликнется.
4 Табуретка
 
18.11.06
10:41
нет, без всяких префиксов... обычный числовой номер...
5 Залетный
 
18.11.06
10:43
Длину номера полностью указываешь (с учетом нолей)?
6 Табуретка
 
18.11.06
10:45
так номерже не строковой а числовой... все ноли по левую сторону отпадают...
7 Smitt
 
18.11.06
10:45
Попробуй
Док.НайтиПоНомеру(Строка(Номер),ТекущаяДата());
А вообще, сделай следующее:
1) Посмотри в конфигураторе скажи нам тип номера, длину номера.
2) Покажи пример номера какого нить документа
8 Табуретка
 
18.11.06
10:48
(5)хотя и это уже тоже предвидел... забивал перед номером в строку нули до 6 знаков - результата 0
(7) пробовал и так Док.НайтиПоНомеру(Строка(Номер),Дата(0)); в ЖКК написано...
и ваш метод... результата 0
Тип - числовой
6 знаков
пример:  Реализация 2792 (03.10.06)
9 Табуретка
 
18.11.06
10:52
переписал всю обработку заново с нуля на три раза... (бывало, иногда, что код нехотел работать, может глюк, после того как создавал обработку заново и вбивал теже самые строки, все шло по маслу, но это в других обработках)
10 Smitt
 
18.11.06
10:56
На кой там "Док.ВыбратьДокументы();" ? Убирай...
И давай так попробуем:

Добавь на форму реквизит ВыбДок типа документ.реализация
дальше пишем:

Процедура Сформировать()
Док=СоздатьОбъект("Документ.Реализация");
Для Номер=НомерНач ПО НомерКон Цикл
  Если Номер = ВыбДок.НомерДок тогда
    Сообщить("Номер формируется правильно");
  КонецЕсли;
КонецЦикла;
КонецПроцедуры

Выбираем в реквизит "выбДок" самый первый по порядку документ, запускаем, смотрим, выполнилось ли условие. Если нет, тогда тормозим в отладчике и ищем, чем переменная "номер" отличается от "ВыбДок.НомерДок "
11 Табуретка
 
18.11.06
11:05
(10)ха!!! Есть контакт :)
дебагером вынул вот что:
ВыбДок.НомерДок = "  2792"
какогото демона он вместо нолей ставит пробелы...
12 Скользящий
 
18.11.06
11:06
СокрЛП()
13 Лошадка в пальто
 
18.11.06
11:07
СокрЛВП()
14 Скользящий
 
18.11.06
11:08
(13) Жжошь. А эта команда что обрезает? Старые баяны? :-)
15 Табуретка
 
18.11.06
11:10
не совсем понял, как мне к Док.НайтиПоНомеру прикрутить СокрЛП???
сам Номер у меня и так урезан до некуда...
16 Скользящий
 
18.11.06
11:14
Включи крышу.

Процедура Сформировать()
Док=СоздатьОбъект("Документ.Реализация");
Для Номер=НомерНач ПО НомерКон Цикл
  Если СокрЛП(Номер) = СокрЛП(ВыбДок.НомерДок) тогда
    Сообщить("Номер формируется правильно");
  КонецЕсли;
КонецЦикла;
КонецПроцедуры
17 Табуретка
 
18.11.06
11:17
(16)Это был тока пример для того чтобы выявить в чем причина не состыковки номеров... куда прикручивается СокрЛП в (0)?
Если Док.НайтиПоНомеру(Строка(Номер))=1 Тогда //тут пробовал и просто Номер и СокрЛП(Номер) и Число(Номер) - никак :(
18 Smitt
 
18.11.06
11:18
думается мне, что номер у тебя ниразу не числовой... ща я у себя проверю, а то прям сомнения берут...
19 Табуретка
 
18.11.06
11:19
либо загонять всю нумерацию доков в таблицу и перебирать там с обрезанием пробелов... либо одно из двух...
(18) да проверь...
20 Табуретка
 
18.11.06
11:20
при строковом номере - номер отображается(как и записывается) вот таким образом "002792"
числовой - "  2792"
21 Табуретка
 
18.11.06
11:29
(18)Ну так что там оказалось, числовой или строковой???
22 Smitt
 
18.11.06
11:32
Всё верно, при обращении к "НомерДок" возвращатся, действительно, строка.
Однако, по номеру обязан искать, именно по числовому значению
Попробуем написать "в трупую" :

Док=СоздатьОбъект("Документ.Реализация");
Сообщить(Док.НайтиПоНомеру(2792));
23 Smitt
 
18.11.06
11:33
И в твоём коде должно работать
Док.НайтиПоНомеру(Номер);
без вляких СокрЛВП() и т.п.
24 Табуретка
 
18.11.06
11:37
(22)непоможет... уже пробовал, результат 0
Выйдет тока вот так

Док.НайтиПоНомеру("  2792")
25 Smitt
 
18.11.06
11:40
Док.НайтиПоНомеру("  2792") - так находит?
26 Табуретка
 
18.11.06
11:41
У самого номера документа стоит два пробела перед числом,
сгенеренный же Номер получается без пробелов и соответственно не совпадает с номерами доков...

пример: Док.НайтиПоНомеру(Номер); не проходит...
работает вот так: Док.НайтиПоНомеру("  "+Номер);
но по ламерски ето както пробелы приплюсовывать... да и работать будет тока с четырехзначным номером... переводить нумерацию в строку уже поздно... до конца года ещё полтара месяца а жить и работать както надо... :)
27 Табуретка
 
18.11.06
11:42
(25) да находит...
28 Smitt
 
18.11.06
11:44
Странно, честно говоря. Специально попробовал на своей конфе, благополучно находит числовые номера по, собственно, числу...
Ну пиши тогда с пробелами:

НомерДляПоиска = Прав("     " + строка(Номер),6); //там 5 пробелов
Док.НайтиПоНомеру(НомерДляПоиска);
29 Smitt
 
18.11.06
11:46
+28 работать будет не только с четырехзначным номером, но с любым количеством знаков (в пределах длины номера, ес-сно :)))
30 Табуретка
 
18.11.06
11:47
(28) хехе, тоже вариант... :)
лана всем спасибо, главно хоть нашли в чем ошибка.
31 Smitt
 
18.11.06
11:49
(30) не-а, ошибку не нашли :) Нашли - как работает :)
32 Скользящий
 
18.11.06
11:51
(30) Тупой вариант. Самое оптимальное, алгоритм выстроить так, чтобы при сравнении с помощью СокрЛП отсекать пробелы не хрен, ИМХО.
33 Табуретка
 
18.11.06
11:53
(32)Кто запрещает выстроить такой алгоритм в моем примере?
Буду тока рад примеру!!!
34 Скользящий
 
18.11.06
11:54
(33) Тебе еще и пример подавай? :-)
35 Табуретка
 
18.11.06
11:56
(34)без обид, можеш даже не выставлять его на форум, чиста так для себя, напиши лучше...
36 Табуретка
 
18.11.06
11:57
Уверен на 90% что  без выгрузки всего списка доков в ТЗ или СЗ не обойдется...
37 Табуретка
 
18.11.06
11:58
опа, платформа скопытилась... :(
38 Smitt
 
18.11.06
12:05
(32) ты не фтеме :)
Автор не делает сравнение. Автор делает "найтиПоНомеру()"
А номер, который "найти" имеет ведущие пробелы.
Только вот откуда - не понятно. Перечитай посты с начала.
39 Хряк
 
18.11.06
12:05
Правильный ответ был в 7.
С тех пор так и не увидел Док.НайтиПоНомеру(НомерДок, ДатаДок);
Например из 8
Док.НайтиПоНомеру(2792, НачГода("03.10.06")); Если периодичность номера в конфигураторе год - дата любое число из етого года.
40 Smitt
 
18.11.06
12:05
(37) насмерть?
41 Smitt
 
18.11.06
12:08
(39) не, дата не при чем. Не понятно, почему ЧИСЛОВОЙ номер находится по строке:
Док.НайтиПоНомеру("  2792") = 1!
Что-то не так...
42 Скользящий
 
18.11.06
12:09
(38) Ну, тогда я бы просто перебором загнал бы все доки в ТЗ, и номер бы очистил от пробелов. Это все равно более изящное решение, чем добавлять 5 пробелов.
43 Табуретка
 
18.11.06
12:10
(40) почти, отладчик свернулся в процессе тока сидит и весит напроч...
(42) хехе см (19,36) %)))
44 Табуретка
 
18.11.06
12:12
(+43) это хорошо когда их загод не переваливает больше 3-5 тыс. а если за тотже год их будет скажем 999'999 Тогда как? тоже через ТЗ?
45 Smitt
 
18.11.06
12:26
(42) почему?
Дано:
Переменная "Номер", тип "Число"
Документы, с номерами вида "   " + Номер, общая длина номера - 6 символов.
Задача: найти документ
Моё решение:
Док.НайтиПоНомеру(Прав("     " + строка(Номер),6); );

Напиши элегантнее?
46 Табуретка
 
18.11.06
12:31
(45)Ээээ... хоть это уже и не поддается моей логике... но вариант
Док.НайтиПоНомеру(Прав("     " + строка(Номер),6)) тоже не проходит...
47 Табуретка
 
18.11.06
12:33
Я уже совсем ничего не понимаю... только что определили что в номере пробелы, подставили и результата 0!!! :( пойдука я спать...
48 Smitt
 
18.11.06
12:33
(47) Как? Тыж говорил, 25,28 работает?
49 Smitt
 
18.11.06
12:34
+48 хотя, по логике, если номер числовой, должно работать без пробелов, конечно
50 Скользящий
 
18.11.06
15:05
Надо бы сначала разобраться, почему
"Документы, с номерами вида "   " + Номер, общая длина номера - 6 символов. "

Не должно по идее такого быть вообще, чЁ то автор видно в ГлПрисвоитьНомер намудрил.
51 Табуретка
 
18.11.06
19:35
(50) Вот это для меня самого загадка - из-за чего номер документа принимает вид как пробелы с числом...
Конфигурация Бух.УСН ред1.3 (7.70.148)
Правленная мной неоднократно, ГлПрисвоитьНомер - ненайдена вообче...
Документ - Реализация, нумератор не назначен, периодичность в пределах года, автоматическая нумерация, тип числовой, длина 6 знаков, контроль уникальности...
да что я говорю... возьмите любой документ с такимиже параметрами номера и посмотрите повнимательней как он будет отображатся на самом деле...
52 Таня
 
18.11.06
19:43
праблему то решили нет?
53 Табуретка
 
18.11.06
19:51
нет... точнее да... точнее незнаю я...
вобчемто нашли изза чего непрокатывало то что было задумано:

Док.НайтиПоНомеру(Строка(Номер));

где Номер - число сгенеренное в цикле, а номер документа оказывается содержит пробелы перед числом, отсюда несостыковка искомова :(

вариант решения проблемы найден: загнать все номера документов в ТЗ либо в СЗ и перебирать их там СокрЛП(ТЗ.Ном), но както не нравится мне это... не по кулхацкерски чтоли... :)
54 Скользящий
 
18.11.06
19:55
(53) От решения требуется только чтобы оно работало. :-) Во-вторых, если сделать запрос по справочнику, а потом выгрузить в ТЗ, получится вполне даже шустро.
55 Табуретка
 
18.11.06
19:57
(54)По какому справочнику? у меня доки!
56 Таня
 
18.11.06
20:04
попробуй так:
   ИначеЕсли (ПустоеЗначение(Начало)=0) и (ПустоеЗначение(Конец)=0) Тогда
       Док.ВыбратьДокументы();
       Пока Док.ПолучитьДокумент()=1 Цикл
           Если (Число(Док.НомерДок)>=Число(Начало)) и (Число(Док.НомерДок)<=Число(Конец)) Тогда Действие(Док.ТекущийДокумент()); КонецЕсли;
       КонецЦикла;
   КонецЕсли;
57 Табуретка
 
18.11.06
20:10
(56) Опять все доки в цикле перелопачивать... :-/
Всем спасибо! Просьба сильно не заморачиваться, попытаюсь сделать сам...
58 Скользящий
 
18.11.06
21:21
(55) Бля, ну доки. Оговорился я. Проблема вселенского масштаба, млиню
59 Табуретка
 
18.11.06
22:36
(58) Это как закон подлости: сам запрос наваял за полчаса, все работает, все класс, а понадобилось ещё добавить выборку доков в диапазоне и млин вот такая жопа с номерами....
Закон Брукера: Даже маленькая практика стоит большой теории.