![]() |
![]() |
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/*" вместо * номер основания (вводятся несколько отгрузок по счету) |