Имя: Пароль:
1C
1С v8
Поиск свободного номера документа
0 Falex
 
07.11.13
15:10
Здравствуйте. Подскажите как имея начальный номер, например 11, найти
первый свободный номер больше, чем 11 (с учетом и без префикса)?

Спасибо.
1 RomaH
 
naïve
07.11.13
15:12
Запрос.Текст =
    "ВЫБРАТЬ
    |    ВременныйНомерПациентаДляПрофосмотра.НомерПациента КАК НомерПациента
    |ИЗ
    |    РегистрСведений.ВременныйНомерПациентаДляПрофосмотра КАК ВременныйНомерПациентаДляПрофосмотра
    |ГДЕ
    |    ВременныйНомерПациентаДляПрофосмотра.НаправлениеНаПрофосмотр.Дата > &ВремяЖизни
    |
    |ДЛЯ ИЗМЕНЕНИЯ
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерПациента";
    
    ВыборкаНомеров = Запрос.Выполнить().Выбрать();
    
    ВременныйНомер = 1;
    
    Пока ВыборкаНомеров.Следующий() Цикл
        
        Если ВыборкаНомеров.НомерПациента > ВременныйНомер Тогда
            //Если ВременныйНомер = 13
            //    ИЛИ ВременныйНомер = 666 Тогда
            //Иначе
                Прервать;    
            //КонецЕсли;
        КонецЕсли;
        
        ВременныйНомер = ВременныйНомер + 1;
            
    КонецЦикла;
2 KARSH
 
07.11.13
15:13
через счетчик и запрос с конструкцией ПОДОБНО
3 dk
 
07.11.13
15:15
Дата > &ВремяЖизни
суров )
4 Falex
 
07.11.13
15:17
"через счетчик и запрос с конструкцией ПОДОБНО"

пример есть?
5 Холодильник
 
07.11.13
15:19
жесть.. не проще использовать УстановитьНовыйНомер() ?
Создаешь новый док, устанавливаешь ему нов номер и запоминаешь этот номер
6 mikecool
 
07.11.13
15:19
(5) а если есть 11, 15, то новый будет 16
но можно использовать 12,13,14
7 Холодильник
 
07.11.13
15:20
(6) ерунда получится, если 11 и 15 будет за октябрь, а 12 - за  ноябрь
8 KARSH
 
07.11.13
15:23
(4) что то типа вот такого (не проверял в рабочей, так что может надо допилить)
    НомерНачальный = 11;
    
    Для а = НомерНачальный По 9999999999 Цикл
        
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |    РеализацияТоваровУслуг.Ссылка
                       |ИЗ
                       |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                       |ГДЕ
                       |    РеализацияТоваровУслуг.Номер ПОДОБНО &Номер";
                      
        Запрос.УстановитьПараметр("Номер", Префикс + "%" + а);                       
        
        Результат = Запрос.Выполнить().Выбрать();
        
        Если НЕ Результат.Следующий() Цикл
            
            Сообщить("Пустой номер " + а);
            
            Прервать;
            
        КонецЦикла;
        
    КонецЦикла;
9 KARSH
 
07.11.13
15:24
(8) жестковато для производительности, но как вариант
10 Falex
 
07.11.13
15:51
Спасибо. Сработало. А далее при установке номера через УстановитьНовыйНомер будет устанавливаться номера с учетом "дырок" в номерах документа за период?
11 WildSery
 
07.11.13
15:53
выбрать 0 н
поместить вт_цифры
объединить все выбрать 1 объединить все выбрать 2 объединить все выбрать 3 объединить все выбрать 4 объединить все выбрать 5
объединить все выбрать 6 объединить все выбрать 7 объединить все выбрать 8 объединить все выбрать 9;

выбрать цифра1.н + цифра2.н*10 + цифра3.н*100 ч
поместить вт_числовой_ряд
из вт_цифры как цифра1
    внутреннее соединение вт_цифры как цифра2 по истина
    внутреннее соединение вт_цифры как цифра3 по истина;

выбрать    min(вт_числовой_ряд.ч) как НомерПациента
из вт_числовой_ряд
    левое соединение РегистрСведений.Больные
    по Больные.НомерПациента = вт_числовой_ряд.ч
где Больные.НомерПациента is null
12 KARSH
 
07.11.13
16:02
(10) в типовых конфигурациях в настройках конфигурации "Режим автонумирации" стоит в не освобождать автоматически, поэтому автоматически пробелы заполняться не будут, если перевести в режим "Освобождать автоматически", то будет, но в этому случае и (5) вариант будет нормально работать и быстрее моей :)