Имя: Пароль:
1C
1C 7.7
v7: поиск по номеру
0 vsy
 
03.11.11
14:36
Люди, подскажите почему то не ищется документ по номеру. Номер правда с префиксом.
док = СоздатьОбъект("Документ."+доквид);
   док.ВыбратьДокументы(ДатаНачала, ДатаКонца);
       если док.НайтиПоНомеру(номер)=1 Тогда
           ОткрытьФорму(док.ТекущийДокумент());
       Иначе
           Сообщить("Документ "+доквид+" с № "+номер+" не найден!");
       КонецЕсли;
причем когда не находится в сообщении выводит тот номер , который у дока.
1 ДенисЧ
 
03.11.11
14:37
нумерация документов периодическая?
2 Ёпрст
 
гуру
03.11.11
14:37
(0) Заданы не все параметры метода НайтиПоНомеру

ЗЫ:ВыбратьДокументы - это вообще убери к едрени фени
3 vsy
 
03.11.11
14:39
Нумерация не переодическа.
все и не нужно, а выбрать, задаю диапазон в котором искать, а то умрет ( у меня в штрих коде указан год вот в нем и ищу)
4 vsy
 
03.11.11
14:44
попробовал поставить нумерацию переодической (в пределах года) все равно не ищет
5 victuan1
 
03.11.11
14:46
(3) Наивный, так не задают период поиска.
(4) Переменную номер добивал пробелами до длины номера?
6 vsy
 
03.11.11
14:49
просвети,
у меня сканер возвращает столько символов сколько нужно, иногда приходится наоборот обрезать лишнее.
7 victuan1
 
03.11.11
14:56
А причем здесь сканер? В сабже про него ни слова.
8 vsy
 
03.11.11
14:58
это предисловие откуда я получаю номер дока
9 Ёпрст
 
гуру
03.11.11
15:10
>>>все и не нужно, а выбрать, задаю диапазон в котором искать

Где ты его задаешь ?!
10 echo77
 
03.11.11
15:34
Вообще, если верить синтаксис-помощнику, то документ по номеру ищут так:
Документ.НайтиПоНомеру(Номер, ДатаЛежащаяВДиапазонеПоиска)
11 vsy
 
03.11.11
15:44
дату дока указывать не обязательно
12 Ёпрст
 
гуру
03.11.11
15:50
(11) только если нумерация "по всем данного вида"
13 vsy
 
03.11.11
15:53
спасибо учту
14 Ёпрст
 
гуру
03.11.11
15:54
(13) указывай дату и добей номер до длины, указанной в метаданных - будет искать
15 vsy
 
03.11.11
15:56
да я дату в шк не загонял, видимо придеться
16 Ёпрст
 
гуру
03.11.11
15:58
(15) там подойдёт любая дата из периодичности номера - если периодичность нумера год, воткни ТекущаяДата() и привет (или РабочаяДата())
17 vsy
 
03.11.11
16:02
попробовал все пошло, большое спасибо.
18 FN
 
03.11.11
16:14
(17) а если номер поменяют? или дату документа?

Загоняй в штрихкод ID


например так:

Функция СформироватьШтрихКодДокумента(Док) Экспорт
   спУникАйДи=СоздатьОбъект("СписокЗначений");
   ЗначениеДока=Док;
   Попытка
       ЗначениеДока=Док.ТекущийДокумент();
   Исключение
   КонецПопытки;
   спУникАйДи.ИзСтрокиСРазделителями(СтрЗаменить(ЗначениеВСтрокуВнутр(ЗначениеДока),"""",""));
   УникАйди=(СокрЛП(спУникАйДи.ПолучитьЗначение(7)));
   Возврат "22"+Прав("0000000000"+УникАйди,10);
КонецФункции

Функция ПолучитьДокументИзШтрихКода(ШтрихКод) Экспорт
   СтрШК=Прав(Лев(СокрЛП(ШтрихКод),12),10);
   Пока Лев(СтрШК,1)="0" Цикл
       СтрШК=Прав(СтрШК,СтрДлина(СтрШК)-1);
   КонецЦикла;
   УникАйди=(_IdToStr(СтрШК));
   RS = СоздатьОбъект("ODBCRecordset");
   ТекстЗапроса = "
   |SELECT
   |  Жур.IDDoc as [Док $Документ],
   |  Жур.IDDocDef as Док_вид
   |FROM
   |  _1SJourn Жур (nolock)
   |WHERE
   |  Жур.IDDoc='"+УникАйди+"'
   |";

   
   ТзДоков = RS.ВыполнитьИнструкцию(ТекстЗапроса);
   Если ТзДоков.КоличествоСтрок()=1 Тогда
       ТзДоков.ПолучитьСтрокуПоНомеру(1);
       Возврат ТзДоков.Док;
   Иначе
       Возврат ПолучитьПустоеЗначение("Документ");
   КонецЕсли;
КонецФункции
19 Ёпрст
 
гуру
03.11.11
16:20
(18) эх,деревня!

Ежели и используешь 1cpp, то и ЗначениеВСтрокуВнутр нафик не нужно, пользуйся методами класса метадатаворк - ПолучитьИд, ЗначениеВСтроку, ЗначениеВСамуюДлинуюСтроку  и т.д..
Это всё быстрее и красившее, чем пихать что-то в список с разделителями и объект в строку сворачивать
20 FN
 
03.11.11
16:23
(19) эта функция у меня осталась с времен, когда я еще не очень активно использовал 1С++, а как говорится: работает - нетрожь!
:)