К списку форумов К списку вопросов
Последний номер
Serdg
06.07.2004 - 10:09
Каким оператором можно получить номер последнего документа (реализации)? И как проверить этот номер на наличие в нем буквы? Ситуация такая: реализация разбивается на 2 типа – обычная и услуги, услуги надо отделить (номер начинается на «А» - а212). Есть документ «Выписка накладных по услугам», который формирует на основании внесенных данных документы «Реализация», услуги разбиты на 2 части (те которые входят в книгу продаж, и те которые не входят). Чтобы отделить реализацию продукции и услуг использовали букву «а». Теперь вся загвоздка в том, чтобы Выписка искала последний номер, добавляла в начало «а» и всё. Помогите с оператором
Diter
1 - 06.07.2004 - 10:16
А не получится ли применить УстановитьНовыйНомер(Префикс). Проверяй некое условие. Если выполняется - префикс=а, нет - префикс="".
holod
2 - 06.07.2004 - 10:19
Док=СоздатьОбъект("Документ.Реалищация");
Док.ОбратныйПорядок(1);
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент()=1 Цикл
  Если Лев(Док.НомерДок,1)="а" Тогда
    Сообщить("Я нашел его!!! "+Док.НомерДок);
    Прервать;
  КонецЕсли;
КонецЦикла;
yeti
3 - 06.07.2004 - 10:20
Док.ОбратныйПорядок(1)
Serdg
4 - 06.07.2004 - 10:21
(1,2,3) спасибо, попробую
VovaZ
5 - 06.07.2004 - 10:29
хм... а в выборке обратный порядок по номерам устанавливается?
Diter
6 - 06.07.2004 - 10:36
(5) прав. Обратный порядок устанавливается по позиции документа, которая определяется временем его создания. Номера здесь нипричём. Если уж использовать ВыбратьДокументы() то мне кажется нужно делать так :
Док.ВыбратьДокументы();
НайденыйНомер="";
Пока Док.ПолучитьДокумент()<>0 Цикл
НомерДок=Док.НомерДок;
Если НомерДок>НайденыйНомер Тогда
НайденыйНомер=НомерДок;
КонецЦикла
Сообщить("Последний номер "+НайденыйНомер);
VovaZ
7 - 06.07.2004 - 10:38
(6) в (1) было проще :)
Господин Забалуев
8 - 06.07.2004 - 10:39
по аналогии сделай...
//==============================================================================
Процедура ПриВводеРНН(Об,Зн) Экспорт
  //проверка РНН на "числовость"
  НеЧисловоеРНН=0;
  СтрЧисл="1234567890";
  РНН=СокрЛП(Строка(Зн));
  ДлРНН=СтрДлина(РНН);
  Для К=1 По ДлРНН Цикл
    ОдинСимв=Сред(РНН,К,1);
    Если Найти(СтрЧисл,ОдинСимв)=0 Тогда
      НеЧисловоеРНН=1;
      Прервать;
    КонецЕсли;
  КонецЦикла;
  Если НеЧисловоеРНН=1 Тогда
    Сообщить("Неверный РНН - "+ВРЕГ(РНН)+" для "+ВРЕГ(СокрЛП(Строка(Об)))+". РНН должен быть числовым !");
  КонецЕсли;
КонецПроцедуры
//==============================================================================
holod
9 - 06.07.2004 - 10:42
В (0) написано: "получить номер последнего документа", а не последний номер документа
Diter
10 - 06.07.2004 - 10:42
(7) Конечно проще, но вдруг человек хочет именно перебором решить проблему.
(8) Интерсено, а если номер "Д-ааббее8ррпп" то он тоже числовой?
Serdg
11 - 06.07.2004 - 10:43
Номер документа не уникальный. Я изменил (2) сообщить("Я нашел его!!!... на НомерДокум=НомерДок+1;
...
...
...
Док.НомерДок="а"+НомерДокум;
Что не так?
Diter
12 - 06.07.2004 - 10:45
(9) А в чём логика? На кой ляд нужен номер последнего документа, если он может не совпадать с последним номером документов? Для информации типа "последний по дате документ был введён под номером ...". И что дальше. Для чего? Для сведения?
holod
13 - 06.07.2004 - 10:45
НомерДок - это текстовый реквизит. К тексту нельзя прибавлять число
VovaZ
14 - 06.07.2004 - 10:46
(9) "Теперь вся загвоздка в том, чтобы Выписка искала последний номер,"
Diter
15 - 06.07.2004 - 10:47
(11) Да в том и логика, что в (2) ты перебираешь документы и находишь последний документ по дате, а не последний документ по номеру. Ты мог ввести документ с новым номером задним чтслом и ты его по (2) не найдёшь никогда в жизни. Просто задвоишь номера и 1С ругнётся.
holod
16 - 06.07.2004 - 10:47
(12) Как человек задал вопрос, такой он и получил ответ
VovaZ
17 - 06.07.2004 - 10:48
(13) ещё одно откровение :) с каких это пор к тексту число прибавлять нельзя? :)
Serdg
18 - 06.07.2004 - 10:50
а каким макаром тогда прилепить "а" в начало номера?
Diter
19 - 06.07.2004 - 10:51
(16) В том то и дело что он задал как написано в (0) и (14).
Ещё раз цитата из (0)
"Каким оператором можно получить номер последнего документа (реализации)?"
VovaZ
20 - 06.07.2004 - 10:51
(16) мне кажется, что и прочитан вопрос был так же как "задан".
holod
21 - 06.07.2004 - 10:52
(17) А с подскажи, как это сделать?
VovaZ
22 - 06.07.2004 - 10:55
(21) прежде чем спорить попробуй команду выполнить
Сообщить("а"+123);
Diter
23 - 06.07.2004 - 10:57
(19) RTFM
В (1) всё написано.
(21)
Ну во-первых прибавлять число к строке можно двумя способами :
1. переводить строку в число и прибавлять. Затем обратное преобразование
2. Перевести число в строку и прибавить его к строке
Во-вторых - УстановитьНовыйНомер() автоматически формирует номер неважно какой он по формату - числовой или строковый (сожержащий и буквы и цифры).
holod
24 - 06.07.2004 - 10:58
(22) В твоем примере число 123 преобразовывается в строку "123" и производится операция конкатенации т.е. сложения двух строк, но никак не сложения строки с чилом
NL
25 - 06.07.2004 - 10:58
Я делал через список значений, сортивал его и потом вытаскивал последний номер как СЗ.РазмерСписка() Потом очищал от букв (у меня было в конце буква а, если это счет-фактура на аванс, превращал в число, прибавлял единицу, переводил в текст, добавлял несущие нули и букву а. И вся недолга.
VovaZ
26 - 06.07.2004 - 11:01
но к (0) тоже можно вопрос задать.
у обычной реализации и реализации услуг номерация сквозная, но в услугах в начале "а", либо у услуг и остальных номерация отдельная у услуг с "а", у остальных без "а"?
VovaZ
27 - 06.07.2004 - 11:04
(24) если ты заметил, то в (11) тоже конкатенация, если уж переходить на умные термины, и именно она там и нужна, скажи тогда к чему было (13)?
ABZ
28 - 06.07.2004 - 11:09
  Запрос = СоздатьОбъект("Запрос");
  ТекстЗапроса =
  "//{{ЗАПРОС(Сформировать)
  |Период с ВыбНачПериода по ВыбКонПериода;
  |Обрабатывать НеПомеченныеНаУдаление;
  |НомерДок = Документ.Реализация.НомерДок;
  |Условие(ЛеВ(НомерДок)="а");
  |Группировка НомерДок;
  |"//}}ЗАПРОС
  ;
  // Если ошибка в запросе, то выход из процедуры
  Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
  КонецЕсли;
  ТабНомеров=СоздатьОбъект("таблицаЗначений");
  Запрос.Выгрузить(ТабНомеров);
  ТабНомеров.Сортировать("НомерДок-");
  ТабНомеров.ПолучитьСтрокуПоНомеру(1);
  ПоследнийНомер=ТабНомеров.НомерДок;
holod
29 - 06.07.2004 - 11:09
(27) Корректная конкатенация у него в строке Док.НомерДок="а"+НомерДокум;
а 1С ругалась у него на строку:
НомерДокум=НомерДок+1; где:
НомерДок="а00001" (к примеру) т.е. строка
1 - число
Что не понятно?
VovaZ
30 - 06.07.2004 - 11:10
+27
Ном = 123;
Рез = "а"+Ном;
Сообщить(Рез);
думаю результат тот же будет.
holod
31 - 06.07.2004 - 11:12
PS к (27)
Док.НомерДок="а"+НомерДокум; тоже некорректно с точки зрения выдаваемого результата (но корректно с точки зрения выполнения этой операции)
ABZ
32 - 06.07.2004 - 11:13
Блин блокировали на 67 секунд...
Условие(ЛеВ(НомерДок,1)="а");
VovaZ
33 - 06.07.2004 - 11:14
(29) он ругался на неуникальный номер.
больше претензий не имею. но у него нигде не было видно что НомерДокум это строка. поэтому предполагать можно что угодно.
For1C
34 - 06.07.2004 - 11:16
Я не совсем понимаю о чем вы так усердно спорите.
Получите работающий код, принимаются к оплате пиво и сок :-)
Процедура МаксНом(Стр);
  Если Основание = 1 Тогда
    Если Стр = 1 Тогда
      Если Лев(Строка(НомерДок), 1) <> "Н" Тогда
        НомерДок = "Н" + НомерДок;
      КонецЕсли;
    Иначе
      Если Лев(Строка(НомерДок), 1) = "Н" Тогда
        НомерДок = Прав(НомерДок, СтрДлина(НомерДок)-1);
      КонецЕсли;
    КонецЕсли;
  Иначе
    Накл = СоздатьОбъект("Документ.РасходнаяНакладная");
    
    Накл.ВыбратьДокументы(НачГода(ДатаДок),КонГода(ДатаДок));
    МаксНомер = 0;
    Пока Накл.ПолучитьДокумент() = 1 Цикл
      Если (Стр = 1) Тогда
        Если Лев(Накл.НомерДок, 1) = "Н" Тогда
          Ном = Прав(Накл.НомерДок, СтрДлина(Накл.НомерДок)-1);
          Если Найти(Ном, "/") <> 0 Тогда
            Ном = Лев(Ном, Найти(Ном, "/")-1);
          КонецЕсли;
          Если Число(Ном) > МаксНомер Тогда
            МаксНомер = Число(Ном);
          КонецЕсли;
        КонецЕсли;
      Иначе
        Если Лев(Накл.НомерДок, 1) <> "Н" Тогда
          Ном = Накл.НомерДок;
          Если Найти(Ном, "/") <> 0 Тогда
            Ном = Лев(Ном, Найти(Ном, "/")-1);
          КонецЕсли;
          Если Число(Ном) > МаксНомер Тогда
            МаксНомер = Число(Ном);
          КонецЕсли;
        КонецЕсли;
      КонецЕсли;
    КонецЦикла;
    НомерДок = Строка(МаксНомер+1);
    Если Стр = 1 Тогда
      НомерДок = "Н" + НомерДок;
    КонецЕсли;
  КонецЕсли;
КонецПроцедуры
VovaZ
35 - 06.07.2004 - 11:19
(34) видимо быстро будет находится новый номер в декабре, при обороте документов так хотябы 300 в день :)
For1C
36 - 06.07.2004 - 11:19
(34) Да забыл добавить, на форме есть 2 кнопки и процедуры в зависимости от нажатия кнопки выдается номер вида "Н 1234" или "1231" если вводится на основании "123/*" вместо * номер основания (вводятся несколько отгрузок по счету)

К списку вопросов на форуме 1C

>>