| 
    
        
     
     | 
    
  | 
Нумерация поля ввода на форме | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        amadeus2010    
     17.07.12 
            ✎
    14:18 
 | 
         
        Добрый день возвращаясь к своей вчерашней теме v8: Автонумерация элементов формы хотел бы спросить, возможно ли задать авто нумерацию элемента формы и если да то подбросьте пример пожалуйста     
         | 
|||
| 
    1
    
        aki_rezak    
     17.07.12 
            ✎
    14:20 
 | 
         
        сделай запрос к базе. Найди МАКСИМУМ,  а в новом объекте присвой значение Максимум()+1;     
         | 
|||
| 
    2
    
        aki_rezak    
     17.07.12 
            ✎
    14:23 
 | 
         
        Запрос = новый запрос;
  
        Запрос.текст = "ВЫБРАТЬ Максимум(ТвойРеквизит) КАК ТвойРеквыизит ИЗ ТвояТаблица"; Результ = Запрос.выполнить.выбрать(); ВотТвоеНовоеЗначение = Результат.ТвойРеквизи +1;  | 
|||
| 
    3
    
        amadeus2010    
     17.07.12 
            ✎
    14:27 
 | 
         
        я делал вот так 
  
        /////////////////////////////////////////////////// Если ПустаяСтрока(ЭлементыФормы.КодОракл) Тогда ЭлементыФормы.КодОракл=ЭлементыФормы.КодОракл+1; КонецЕсли; ///////////////////////////////////////////////////////// а когда я консоли запросов сделал подобие вашего запроса он выдал мне число 9999 вместо 108503 Свой код я записал в Процедуру Призаписи()  | 
|||
| 
    4
    
        aki_rezak    
     17.07.12 
            ✎
    14:29 
 | 
         
        (3) разрешаю пиши. Ответ в (1) (2) может и еще есть варианты     
         | 
|||
| 
    5
    
        Смешной 1С    
     17.07.12 
            ✎
    14:30 
 | 
         
        (3) А какой смыл от кода такого?
  
        Если пустое значение, ты к нему прибавляешь 1?  | 
|||
| 
    6
    
        amadeus2010    
     17.07.12 
            ✎
    14:32 
 | 
         
        (5) этот код все равно не работает, так что воспользуюсь кодом (1), у меня получается так
  
        //////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл ИЗ Справочник.Контрагенты КАК Контрагенты Результ = Запрос.выполнить.выбрать(); КодОракл = Результат.КодОракл +1;  | 
|||
| 
    7
    
        amadeus2010    
     17.07.12 
            ✎
    15:36 
 | 
         
        Сделал с подсказки запрос в Предприятии выдал ошибку 
  
        /////////////////////////////////////////////////// Запрос= Новый Запрос; Запрос.Текст= " Выбрать | МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл | ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выбрать(); КодОракл = Результат.КодОракл +1; /////////////////////////////////////////////////////////////////// {Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(885)}: Преобразование значения к типу Число не может быть выполнено КодОракл = Результат.КодОракл +1; Тип Реквизита КодОракл Строка, скорее всего из-за этого не может преобразовать значение в число  | 
|||
| 
    8
    
        aki_rezak    
     17.07.12 
            ✎
    15:51 
 | 
         
        (7)Если Строка, тогда разбирай строку (справа) ищи число до встречи первого символа. к ней прибавляй единицу. А потом обратно к строке.     
         | 
|||
| 
    9
    
        amadeus2010    
     17.07.12 
            ✎
    16:08 
 | 
         
        сделал так синтаксических ошибок нет
  
        КодОракл = Формат(Число(СокрЛП(Результат.КодОракл +1)),"ЧЦ=15");  | 
|||
| 
    10
    
        amadeus2010    
     17.07.12 
            ✎
    16:16 
 | 
         
        При проверке снова вышла ошибка преобразование строки к числу.
  
        (7)можете на примере показать разбор строки?  | 
|||
| 
    11
    
        palpetrovich    
     17.07.12 
            ✎
    16:45 
 | 
         
        (10) как-то так можно 
  
        КодОраклПрефикс = ""; ТекКодОракл = СокрЛП(КодОракл); Пока СтрДлина(ТекКодОракл)>0 Цикл Если (КодСимвола(ТекКодОракл)>49)и(КодСимвола(ТекКодОракл)<58) Тогда Прервать; КонецЕсли; КодОраклПрефикс = КодОраклПрефикс + Лев(ТекКодОракл, 1); ТекКодОракл = Сред(ТекКодОракл, 2); КонецЦикла; ТекКодОракл = ТекКодОракл + 1; КодОракл = КодОраклПрефикс + ТекКодОракл;  | 
|||
| 
    12
    
        palpetrovich    
     17.07.12 
            ✎
    16:46 
 | 
         
        * Если (КодСимвола(ТекКодОракл)>48)и(КодСимвола(ТекКодОракл)<58) Тогда     
         | 
|||
| 
    13
    
        Kreont    
     17.07.12 
            ✎
    16:47 
 | 
         
        КодОракл = Результат.КодОракл*1+1;     
         | 
|||
| 
    14
    
        amadeus2010    
     17.07.12 
            ✎
    16:48 
 | 
         
        Результат = Запрос.Выполнить().Выбрать();
  
        КодОракл = Формат(Число(СокрЛП(Результат.КодОракл)+1),"ЧГ=0"); В результате в КодОракл всегда =1  | 
|||
| 
    15
    
        palpetrovich    
     17.07.12 
            ✎
    16:48 
 | 
         
        (13) хм, а что это даст для. к примеру Результат.КодОракл = "К-00012"?     
         | 
|||
| 
    16
    
        Kreont    
     17.07.12 
            ✎
    16:49 
 | 
         
        Покажи так, что у тебя там:
  
        Сообщить(Результат.КодОракл);  | 
|||
| 
    17
    
        Kreont    
     17.07.12 
            ✎
    16:50 
 | 
         
        (15) для такого случая ничего, зато *1 быстро переводит число из текст поля в тип число     
         | 
|||
| 
    18
    
        palpetrovich    
     17.07.12 
            ✎
    16:54 
 | 
         
        кста, я в (11) слажал, надо ТекКодОракл = Число(ТекКодОракл) + 1;     
         | 
|||
| 
    19
    
        amadeus2010    
     17.07.12 
            ✎
    16:55 
 | 
         
        У нас КоДОракл всегда записан в виде числа напр 103502 и т.д,префиксы не используем, бывает что для филиалов головного контрагента пишем следующий код 108503_1.
  
        (13){Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(886)}: Преобразование значения к типу Число не может быть выполнено КодОракл = Результат.КодОракл*1+1; вышла такая ошибка  | 
|||
| 
    20
    
        palpetrovich    
     17.07.12 
            ✎
    16:56 
 | 
         
        (19) 108503_1 - это фигово :)     
         | 
|||
| 
    21
    
        amadeus2010    
     17.07.12 
            ✎
    16:57 
 | 
         
        ну вот такая у нас нумерация была     
         | 
|||
| 
    22
    
        palpetrovich    
     17.07.12 
            ✎
    17:00 
 | 
         
        (21) для филлиалов нужно свои префиксы делать, а не то что в (19) 
  
        как к такому единичку прилепить? разве что менять "_", на "РазделительДробнойЧасти" и тогда уже переводить в число ...но это все фигня  | 
|||
| 
    23
    
        amadeus2010    
     17.07.12 
            ✎
    17:01 
 | 
         
        с переходом на 8.2.14 хотим автоматизировать нумерацию КодОракл, поэтому нужно автонумерация этого поля
  
        Преобразование значения к типу Число не может быть выполнено ТекКодОракл = Число(ТекКодОракл) + 1;  | 
|||
| 
    24
    
        palpetrovich    
     17.07.12 
            ✎
    17:03 
 | 
         
        (23) создайте СправочникКодовОракл с автомумерацией  - и будет вам счастье :)     
         | 
|||
| 
    25
    
        palpetrovich    
     17.07.12 
            ✎
    17:05 
 | 
         
        выполни это, покажи что будет в Сообщить
  
        КодОраклПрефикс = ""; ТекКодОракл = СокрЛП(КодОракл); Пока СтрДлина(ТекКодОракл)>0 Цикл Если (КодСимвола(ТекКодОракл)>48)и(КодСимвола(ТекКодОракл)<58) Тогда Прервать; КонецЕсли; КодОраклПрефикс = КодОраклПрефикс + Лев(ТекКодОракл, 1); ТекКодОракл = Сред(ТекКодОракл, 2); КонецЦикла; Сообщить("ТекКодОракл = "+ТекКодОракл); ТекКодОракл = Число(ТекКодОракл) + 1; КодОракл = КодОраклПрефикс + ТекКодОракл;  | 
|||
| 
    26
    
        Kreont    
     17.07.12 
            ✎
    17:06 
 | 
         
        Выполни наконец то код, а то непонятно что не может преобразовать в число:
  
        Сообщить(Результат.КодОракл); Можно по разному обойти, если для филиалов: СтрЗаменить("108503_1","_",0)+100 Можно код филиала вообще в отдельный реквизит писать "КодФилиала" и т.д. и при выводе только склеивать  | 
|||
| 
    27
    
        palpetrovich    
     17.07.12 
            ✎
    17:10 
 | 
         
        хе, 7.7     Число("108503_1") - хавает на раз, а 8.2 - "Преобразование значения к типу Число не может быть выполнено"  ...все-таки клюшки рулЯт :)     
         | 
|||
| 
    28
    
        amadeus2010    
     17.07.12 
            ✎
    17:11 
 | 
         
        Выполнил код
  
        ////////////////////////////////////////////////// Результат = Запрос.Выполнить().Выбрать(); КодОраклПрефикс = ""; ТекКодОракл = СокрЛП(КодОракл); Пока СтрДлина(ТекКодОракл)>0 Цикл Если (КодСимвола(ТекКодОракл)>48)и(КодСимвола(ТекКодОракл)<58) Тогда Прервать; КонецЕсли; КодОраклПрефикс = КодОраклПрефикс + Лев(ТекКодОракл, 1); ТекКодОракл = Сред(ТекКодОракл, 2); КонецЦикла; Сообщить("ТекКодОракл = "+ТекКодОракл); ТекКодОракл = Число(ТекКодОракл) + 1; КодОракл = КодОраклПрефикс + ТекКодОракл; Сообщить(Результат.КодОракл); /////////////////////////////////////////////////////// но выходит ошибка Преобразование значения к типу Число не может быть выполнено ТекКодОракл = Число(ТекКодОракл) + 1;  | 
|||
| 
    29
    
        palpetrovich    
     17.07.12 
            ✎
    17:12 
 | 
         
        (28) а Сообщить("ТекКодОракл = "+ТекКодОракл); ГДЕ?     
         | 
|||
| 
    30
    
        palpetrovich    
     17.07.12 
            ✎
    17:15 
 | 
         
        надеюсь это не весь код? ...как-то все-же  так надо было: 
  
        ТекКодОракл = СокрЛП(Результат.КодОракл);  | 
|||
| 
    31
    
        amadeus2010    
     17.07.12 
            ✎
    17:18 
 | 
         
        я написал как вы посоветовали.Сообщить() и так было в строке кода зачем его еще раз писать в конце кода, а вот вместо ТекКодОракл = СокрЛП(Результат.КодОракл); был КодОракл     
         | 
|||
| 
    32
    
        amadeus2010    
     17.07.12 
            ✎
    17:18 
 | 
         
        сейчас попробую заново компилировать     
         | 
|||
| 
    33
    
        Kreont    
     17.07.12 
            ✎
    17:18 
 | 
         
        >>(Результат.КодОракл); был КодОракл
  
        не смешно :)  | 
|||
| 
    34
    
        palpetrovich    
     17.07.12 
            ✎
    17:20 
 | 
         
        (31) прикалываемся?  ...ох уже эти ораклисты, ну все у них само делается :))
  
        ...думать-же надо, я-ж твой код не вижу, я свои переменные рисую  | 
|||
| 
    35
    
        amadeus2010    
     17.07.12 
            ✎
    17:23 
 | 
         
        (34)я не прикалываюсь только 1С выдает ошибку
  
        Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(896)}: Преобразование значения к типу Число не может быть выполнено ТекКодОракл = Число(ТекКодОракл) + 1; ошибка в этой строке  | 
|||
| 
    36
    
        Kreont    
     17.07.12 
            ✎
    17:26 
 | 
         
        (35) Ну покажи что у тебя в "ТекКодОракл", сколь ж можно то (16)(26) :)     
         | 
|||
| 
    37
    
        palpetrovich    
     17.07.12 
            ✎
    17:28 
 | 
         
        (35) ошибка не здесь, ошибка как обычно :) ...неужели неясно, что кроме копи/пасте нужно еще и голову чуток включать ...свои входные данные подставлять надо 
  
        ...или вообще - бросай  | 
|||
| 
    38
    
        amadeus2010    
     17.07.12 
            ✎
    17:33 
 | 
         
        (36) в ТекКодОракл пишет Сообщить() обращение к процедуре как к функции. и КодОракл=Строка     
         | 
|||
| 
    39
    
        amadeus2010    
     17.07.12 
            ✎
    17:34 
 | 
         
        вот весь запрос как есть
  
        //////////////////////////////////////// Запрос= Новый Запрос; Запрос.Текст= " Выбрать | МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл | ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выбрать(); КодОраклПрефикс = ""; ТекКодОракл = СокрЛП(Результат.КодОракл); Пока СтрДлина(ТекКодОракл)>0 Цикл Если (КодСимвола(ТекКодОракл)>48)и(КодСимвола(ТекКодОракл)<58) Тогда Прервать; КонецЕсли; КодОраклПрефикс = КодОраклПрефикс + Лев(ТекКодОракл, 1); ТекКодОракл = Сред(ТекКодОракл, 2); КонецЦикла; Сообщить("ТекКодОракл = "+ТекКодОракл); ТекКодОракл = Число(ТекКодОракл) + 1; КодОракл = КодОраклПрефикс + ТекКодОракл; ////////////////////////////////////////////////////////////  | 
|||
| 
    40
    
        Kreont    
     17.07.12 
            ✎
    17:38 
 | 
         
        (38)?
  
        а теперь приведи для примера, какой код есть, и что ты хочешь получить, для примера: Есть сейчас код "АА01222-1", а надо увеличить на 1-цу чтобы стало так: "АА01223-1" :) И почему кстати код из 1С справочника не подходит как = КодОракл я так и не понял.  | 
|||
| 
    41
    
        palpetrovich    
     17.07.12 
            ✎
    17:47 
 | 
         
        (39) поменяй
  
        Результат = Запрос.Выполнить().Выбрать(); На Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда ТекКодОракл = СокрЛП(Выборка.КодОракл); Иначе сообщить("ФигВам"); возврат; КонецЕсли;  | 
|||
| 
    42
    
        palpetrovich    
     17.07.12 
            ✎
    17:52 
 | 
         
        хе, автор свалил по-ходу, ну что-ж, тогда что мы тут делаем) пора и нам ? :)     
         | 
|||
| 
    43
    
        amadeus2010    
     17.07.12 
            ✎
    23:51 
 | 
         
        Автор не свалил,у нас работе вырубили электричество,пришлось сделать ряд операций.Сейчас пишу из дома. (40) Сейчас у нас такой КодОракл 108503 надо чтобы при нажатии на кнопку Записать стало 108504,т.е каждый раз код в поле увеличивался на +1     
         | 
|||
| 
    44
    
        skiller3000    
     17.07.12 
            ✎
    23:58 
 | 
         
        типа этого
  
        [code] Функция ПолучитьКлючСвязи(ТекущийНомерСтроки = Неопределено) Экспорт Запрос = Новый Запрос; МВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = МВТ; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВЫРАЗИТЬ(ОписиДокументов.НомерСтроки КАК ЧИСЛО) КАК НомерСтроки, | ВЫРАЗИТЬ(ОписиДокументов.КлючСвязи КАК ЧИСЛО(10, 0)) КАК КлючСвязи |ПОМЕСТИТЬ ВТОписиДокументов |ИЗ | &ОписиДокументов КАК ОписиДокументов | |ИНДЕКСИРОВАТЬ ПО | КлючСвязи |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ОписиДокументов.КлючСвязи КАК КлючСвязи |ИЗ | ВТОписиДокументов КАК ОписиДокументов |ГДЕ | ОписиДокументов.НомерСтроки <> &НомерСтроки | |УПОРЯДОЧИТЬ ПО | КлючСвязи УБЫВ |АВТОУПОРЯДОЧИВАНИЕ |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ВТОписиДокументов"; Запрос.УстановитьПараметр("ОписиДокументов", ОписиДокументов); Запрос.УстановитьПараметр("НомерСтроки", ТекущийНомерСтроки); Результат = Запрос.Выполнить(); МВТ.Закрыть(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда КлючСвязи = Выборка.КлючСвязи; Иначе КлючСвязи = -1; КонецЕсли; Результат = КлючСвязи + 1; Если ОписиДокументов.Количество() > 1 Тогда СтруктураПоиска = Новый Структура("КлючСвязи", Результат); Пока ОписиДокументов.НайтиСтроки(СтруктураПоиска).Количество() > 0 Цикл Результат = Результат + 1; СтруктураПоиска.Вставить("КлючСвязи", Результат); КонецЦикла; КонецЕсли; Возврат Результат; КонецФункции [/code]  | 
|||
| 
    45
    
        hhhh    
     18.07.12 
            ✎
    00:01 
 | 
         
        какое бурное обсуждение. И только потому, что автор ни разу в жизни не слышал про Результат.Следующий()     
         | 
|||
| 
    46
    
        amadeus2010    
     18.07.12 
            ✎
    00:05 
 | 
         
        (45) насчет Результат.Следующий автор слышал,только не сталкивался с автонумерацией полей ввода.     
         | 
|||
| 
    47
    
        skiller3000    
     18.07.12 
            ✎
    00:06 
 | 
         
        (44) + ОписиДокументов - табличная часть, где КлючСтроки - поле для связки с другой табличной частью на форме.... но думаю можно доработать     
         | 
|||
| 
    48
    
        amadeus2010    
     18.07.12 
            ✎
    08:13 
 | 
         
        Всем доброго утра,продолжим обсуждение?     
         | 
|||
| 
    49
    
        hhhh    
     18.07.12 
            ✎
    08:22 
 | 
         
        (48) ну вот: во всех запросах, которыйе вы здесь привели поставьте после
  
        Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий();  | 
|||
| 
    50
    
        amadeus2010    
     18.07.12 
            ✎
    08:46 
 | 
         
        //////////////////////////////////////////////
  
        Запрос= Новый Запрос; Запрос.Текст= " Выбрать | МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл | ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); КодОраклПрефикс = ""; ТекКодОракл = СокрЛП(Результат.КодОракл); Пока СтрДлина(ТекКодОракл)>0 Цикл Если (КодСимвола(ТекКодОракл)>48)и(КодСимвола(ТекКодОракл)<58) Тогда Прервать; КонецЕсли; КодОраклПрефикс = КодОраклПрефикс + Лев(ТекКодОракл, 1); ТекКодОракл = Сред(ТекКодОракл, 2); КонецЦикла; Сообщить("ТекКодОракл = "+ТекКодОракл); ТекКодОракл = Число(ТекКодОракл) + 1; КодОракл = КодОраклПрефикс + ТекКодОракл; ////////////////////////////////////////////////////////// т.е предлагаете сделать вроде этого?  | 
|||
| 
    51
    
        amadeus2010    
     18.07.12 
            ✎
    08:59 
 | 
         
        (49) Этот код (50) срабатывает как-то странно. Он находит максимальный КодОракл из списка неправильно.Например у нас последний код в системе д.б 108504, он находит что последний якобы 9999 и создает контрагента с КоДОракл 10000, после все следующие контрагенты идут с номером 10000.     
         | 
|||
| 
    52
    
        hhhh    
     18.07.12 
            ✎
    09:22 
 | 
         
        (51) ну это элементарно проверяется отладчиком. Поставьте точку останова и пройдитесь пошагово. Да, согласен, этот код выглядит бредово, даже супербредово, поэтому наверно и срабатывает странно. Но это всё проверяется отладчиком.     
         | 
|||
| 
    53
    
        amadeus2010    
     18.07.12 
            ✎
    09:43 
 | 
         
        (51) я и проверил отладчиком, сперва он ищет максимальное число в КодОракл, в первый раз к найденному значению добавляет 1,а затем перестает увеличивать автоматически значение на 1, фактически цикл не срабатывает.     
         | 
|||
| 
    54
    
        hhhh    
     18.07.12 
            ✎
    09:48 
 | 
         
        (53) так вроде и нужно один раз прибавить единицу. Зачем ее несколько раз прибавлять?     
         | 
|||
| 
    55
    
        amadeus2010    
     18.07.12 
            ✎
    09:50 
 | 
         
        (52) есть ли функция увеличения значения строки на 1 при нажатии на кнопку и чтобы увеличение шло от последнего записанного значения в системе.К примеру
  
        есть значение 100.Следующему клиенту должен добавиться номер 101 и т.д. Что наподобие арифм. прогрессии  | 
|||
| 
    56
    
        amadeus2010    
     18.07.12 
            ✎
    09:56 
 | 
         
        (54) Одному и тому же клиенту не надо прибавлять кодоракл несколько раз.КодОракл должен увеличиваться на 1 при добавлении нового клиента в систему, т.е система при записи нашла последний записанный номер и добавила к нему 1 что и станет текущим КодОракл клиента. Операторы только должны нажать на кнопку Записать-Ок и система сама должна присвоить реквизиту КоДОракл  новый номер.
  
        А у меня получается что система всем клиентам подряд присваивает один и тот же номер что не логично  | 
|||
| 
    57
    
        hhhh    
     18.07.12 
            ✎
    10:03 
 | 
         
        а что там в поле ввода КодОракл в поле "Данные"?
  
        попробуйте ЭтотОбъект.КодОракл = КодОраклПрефикс + ТекКодОракл;  | 
|||
| 
    58
    
        amadeus2010    
     18.07.12 
            ✎
    10:30 
 | 
         
        (57) в поле ввода Кодоракл в поле Данные написана КодОракл     
         | 
|||
| 
    59
    
        Kreont    
     18.07.12 
            ✎
    10:39 
 | 
         
        Сделай Реквизит в контаргентах КодОракл типом число, а не строка     
         | 
|||
| 
    60
    
        Kreont    
     18.07.12 
            ✎
    10:41 
 | 
         
        А для строки сортировка по другому идет, и почему ставит 9999, проверь через консоль запросов какой последний:
  
        ВЫБРАТЬ Контрагенты.КодОракл КАК КодОракл ИЗ Справочник.Контрагенты КАК Контрагенты УПОРЯДОЧИТЬ ПО КодОракл и смотри что в низу самом, и как 1С сортирует строки...  | 
|||
| 
    61
    
        amadeus2010    
     18.07.12 
            ✎
    10:56 
 | 
         
        (59)реквизит можно сделать типом число, но при этом у нас сейчас кроме обычных номеров 101 идут также номера филиалов клиентов как 102_1. При типе число уже нельзя будет продолжить такую нумерацию и надо будет что-то придумать.
  
        (60)Проверил через консоль последняя цифра 9999, потом уже 10000, далее 100000-это наверно операторы завели новую серию номеров.Дело втом что до сих пор у нас используются 2 программы учета товаров 1С УПП и самописная Склад на Оракле.КодОракл задавался в складской программе автоматом и полученный результат вручную заносился в поле ввода КоДОракл. С отказом от складской программы возникла необходимость автонумерации КодОракл, вот поэтому и идет полемика о том как это лучше сделать  | 
|||
| 
    62
    
        amadeus2010    
     18.07.12 
            ✎
    11:14 
 | 
         
        т.е получается что в 1С фактически последний номер 108504, а результат запроса с максимум показывает что 9999     
         | 
|||
| 
    63
    
        Kreont    
     18.07.12 
            ✎
    11:43 
 | 
         
        Если среди кодов есть 102_1 и 108504 и 9999, тогда проще отвести для филиала например 2 последние цифры, что б струтура номера была: Порядковый код (9 знаков) + Код филиала (2 знака).
  
        Запросом через максимум выбирать макс.число и инкрементировать через: СледКод = (Цел(МаксКод/100) + 1)*100 + кодФилиала; И самое главное запретить изменять данный реквизит вручную.  | 
|||
| 
    64
    
        hhhh    
     18.07.12 
            ✎
    11:47 
 | 
         
        (62) девятка по-любому больше единицы, чего ты нам мозги паришь. И "9999" > "108504". Правильно программа тебе выдает.     
         | 
|||
| 
    65
    
        Kreont    
     18.07.12 
            ✎
    11:49 
 | 
         
        +(63) ну и реквизит сделать числовым     
         | 
|||
| 
    66
    
        amadeus2010    
     18.07.12 
            ✎
    12:07 
 | 
         
        (63) не совсем понял эту строку кода СледКод = (Цел(МаксКод/100) + 1)*100 + кодФилиала; Насколько я понял ее надо вставить в сам текст запроса или не так?     
         | 
|||
| 
    67
    
        Kreont    
     18.07.12 
            ✎
    12:10 
 | 
         
        (66) это строка будет работать при условии что поле числовое, и все предыдущие номера приведены в соотвествии структуры из(63).
  
        Пример: из 10201 - строка сделает 10300, а если для филиала 2, то сделает 10302 следующий номер сделает 10400 и т.д.  | 
|||
| 
    68
    
        amadeus2010    
     18.07.12 
            ✎
    13:04 
 | 
         
        Мне надо чтобы из 10201+1=10202 для нового клиента и т.д с приращением на +1. Насчет филиалов хорошая идея заменить штрих на целое число. А минутку понял вашу мысль головные клиенты 10300,10400 с умножением на 100     
         | 
|||
| 
    69
    
        amadeus2010    
     18.07.12 
            ✎
    13:14 
 | 
         
        а т.е как я понял результат прибавляет 100 к головному офису и если филиал то плюсует к числу еще 2 цифры,идея хорошая. пойду тестить и компилировать у себя в конфигурации     
         | 
|||
| 
    70
    
        Kreont    
     18.07.12 
            ✎
    14:25 
 | 
         
        (69) именно так, но если филиалов может быть больше 99, то лучше 3 цифры отвести :) и плюсовать 1000.     
         | 
|||
| 
    71
    
        amadeus2010    
     18.07.12 
            ✎
    14:34 
 | 
         
        простите за тормознутость но куда мне добавить в запросе СледКод = (Цел(МаксКод/100) + 1)*100 + кодФилиала;
  
        //////////////////////////////////////////////////////////// Запрос= Новый Запрос; Запрос.Текст= " Выбрать | МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл | ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); ТекКодОракл = СокрЛП(Результат.КодОракл); ТекКодоракл=(Цел(МаксКод/100) + 1)*100 + кодФилиала; КодОракл=ТекКодОракл; //////////////////////////////////////////////////////// я правильно понял вашу идею насчет инкремента,просто я не силен в программировании и могу что-то спутать  | 
|||
| 
    72
    
        Kreont    
     18.07.12 
            ✎
    14:37 
 | 
         
        Главное тип реквизита что б был числом, тогда условий и проверок сразу меньше надо делать :) Перед этим написать мини обработку и заменить все "_1" на 01 в конце.
  
        Запрос= Новый Запрос; Запрос.Текст= " Выбрать | МАКСИМУМ(Контрагенты.КодОракл) КАК КодОракл | ИЗ | Справочник.Контрагенты КАК Контрагенты"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); НовыйКодОракл=(Цел(Результат.КодОракл/100) + 1)*100 + кодФилиала;  | 
|||
| 
    73
    
        amadeus2010    
     18.07.12 
            ✎
    14:51 
 | 
         
        спасибо за совет     
         | 
|||
| 
    74
    
        amadeus2010    
     18.07.12 
            ✎
    15:25 
 | 
         
        (72)спасибо за помощь. Я сделал пока КодОракл тип число и приращение на единицу что дало мне прибавление от последнего КодОракл+1, например был последний номер клиента 108504,новому клиенту добавилось 108505. Код филиала насколько я понял это новый реквизит в справочнике контрагенты, тип число 2знака?     
         | 
|||
| 
    75
    
        amadeus2010    
     18.07.12 
            ✎
    15:46 
 | 
         
        можно также оставить старые коды как есть, а уже вновь создаваемым контрагентам присваивать Код согласно коду     
         | 
|||
| 
    76
    
        amadeus2010    
     19.07.12 
            ✎
    09:03 
 | 
         
        Доброго утра всем, сегодня проверял запись КодОракл для новых клиентов и обнаружил такую штуку что если 2 оператора вносят разных клиентов в базу и нажимают Записать-Ок то их клиентам присваиваться одинаковый код, например для клиента А и клиента В присвоился код 108509,хотя по логике д.б 108509 и 108510.
  
        НовыйКодОракл=(Цел(Результат.КодОракл/1) + 1)*1.  | 
|||
| 
    77
    
        amadeus2010    
     19.07.12 
            ✎
    09:23 
 | 
         
        Как я понял надо сделать перед НовыйКодОракл проверку уникальности для новых кодов,наподобие 
  
        Если НовыйКодОракл<>0 Тогда Если НовыйКодОракл.НайтиПоНомеру(НовыйКодОракл,)=1 Тогда Предупреждение("НовыйКодОракл с таким номером уже существует!"); СтатусВозврата(0); Возврат; КонецЕсли; НовыйКодОракл=(Цел(Результат.КодОракл/1) + 1)*1 КонецЕсли; КодОракл= НовыйКодОракл  | 
|||
| 
    78
    
        Kreont    
     19.07.12 
            ✎
    10:09 
 | 
         
        (77) Сделай инициализацию поля КодОракл только при записи справочника     
         | 
|||
| 
    79
    
        amadeus2010    
     19.07.12 
            ✎
    10:18 
 | 
         
        (77) не совсем понял     
         | 
|||
| 
    80
    
        amadeus2010    
     19.07.12 
            ✎
    10:21 
 | 
         
        у меня запрос с нумерацией Кодоракл находится в проуедуре призаписи()     
         | 
|||
| 
    81
    
        dsdred    
     19.07.12 
            ✎
    11:03 
 | 
         
        (80) При записи наверное не совсем нормально присваивать номер.
  
        Может в ОбработкаПроведения запихать? Хотя я еще только учусь... В регистр же поподают документы с номерами после проведения, из регистра запросом и забирать номер максимальный при ОбработкаПроведения  | 
|||
| 
    82
    
        rutony    
     19.07.12 
            ✎
    11:07 
 | 
         
        (81) Это справочник, его нельзя провести...     
         | 
|||
| 
    83
    
        amadeus2010    
     19.07.12 
            ✎
    11:13 
 | 
         
        (80)дело в том что у меня это справочник Контрагенты в котором есть поле КодОракл куда записываются номера новых клиентов, и в справочнике нет ОбработкаПроведения есть только ПриЗаписи() и ПослеЗаписи(), я поставил запрос в ПриЗаписи(). При нажатии на кнопку Записать присваивается номер клиента и если нажать еще Ок то номер увеличивается на 1,таким образом получается нумерация +2.     
         | 
|||
| 
    84
    
        amadeus2010    
     19.07.12 
            ✎
    11:26 
 | 
         
        (78) Обнаружил небольшой прикол с запросом и выдачей номера клиенту. Если нажать на кнопку Записать и Ок то результат получаем шаг +2 а не +1, например последний номер 108504,следующий д.б 108505, а получается 108506, пока не разобрался с этим, может надо запрос поставить в ПослеЗписи(),тем более там есть уже МеханизмНумерацииОбъектов.ОбновитьПодсказкуКодНомерОбъекта проверка номера справочника?     
         | 
|||
| 
    85
    
        amadeus2010    
     19.07.12 
            ✎
    11:32 
 | 
         
        Проверил трассировкой при выполнении запроса результат вычислений считается дважды,чем это можно объяснить?     
         | 
|||
| 
    86
    
        Kreont    
     19.07.12 
            ✎
    18:12 
 | 
         
        "Записать и Ок" равнозначно двум вызовам "ПриЗаписи"
  
        Сделай проверку на заполненость, перед установкой кодаОракл Если НЕ ЗначениеЗаполнено(КодОракл) Тогда //// Код установки кода оракл  | 
|||
| 
    87
    
        amadeus2010    
     20.07.12 
            ✎
    08:13 
 | 
         
        (86) доброе утро, спасибо за совет, сам в некоторых документах такую проверку ставил,а здесь как-то стормознул:). Не подскажите можно ли как-то сделать блокировку записи справочника,чтобы 2 оператора одновременно не могли записать справочник и у них не получилось так что 2 разным клиентам достался один КодОракл?     
         | 
|||
| 
    88
    
        amadeus2010    
     21.07.12 
            ✎
    08:35 
 | 
         
        Доброе утро немного изменил предыдущий код, создал регистр сведений в который записывается последнее значение КодОракл.Проблема в том что справочник создает новый код, но с одинаковыми номерами и в регистр сведений не записывается инфо о коде.Вот сам запрос помещенный в процедуру ПриЗаписи() справочника
  
        /////////////////////////////////////////////////////////////////// Запрос= Новый Запрос; Запрос.Текст= " ВЫБРАТЬ |ПоследнийКодОракл.КодОракл как КодОракл |ИЗ |РегистрСведений.ПоследнийКодОракл КАК ПоследнийКодОракл"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); НовыйКод =РегистрыСведений.ПоследнийКодОракл.СоздатьМенеджерЗаписи(); НовыйКод.Прочитать(); Если НЕ ЗначениеЗаполнено(КодОракл) Тогда НовыйКод.КодОракл=(Цел(Результат.КодОракл/1) + 1)*1; НовыйКод.Записать(); КодОракл=НовыйКод.КодОракл;  | 
|||
| 
    89
    
        Wobland    
     21.07.12 
            ✎
    08:38 
 | 
         
        > (Цел(Результат.КодОракл/1) + 1)*1;
  
        класс! весь протащился, спасибо  | 
|||
| 
    90
    
        Wobland    
     21.07.12 
            ✎
    08:39 
 | 
         
        ветку не читал, ткните , плз, в пост, который советовал автору такое     
         | 
|||
| 
    91
    
        amadeus2010    
     21.07.12 
            ✎
    08:41 
 | 
         
        можете посмотреть (72). Увеличение Кода на 1     
         | 
|||
| 
    92
    
        Wobland    
     21.07.12 
            ✎
    08:44 
 | 
         
        (91) вот там замена подчерка на ноль. а в (88) - совершенно необоснованное деление и умножение на единицу     
         | 
|||
| 
    93
    
        amadeus2010    
     21.07.12 
            ✎
    08:47 
 | 
         
        можно в принципе убрать Результат.КодОракл=просто КодОракл, но суть не в этом а в том что не происходит обновление регистра сведений и соответственно не может присвоиться новый код новому клиенту, т.е мысль такая что брать инфо о последнем коде из регистра сведений и добавлять к нему +1= новый код     
         | 
|||
| 
    94
    
        Wobland    
     21.07.12 
            ✎
    08:50 
 | 
         
        (93) не последний код брать, а максимальный. проблемы не вижу     
         | 
|||
| 
    95
    
        amadeus2010    
     21.07.12 
            ✎
    08:53 
 | 
         
        т.е в запросе написать 
  
        Максимум(ПоследнийКодОракл.КодОракл) как КодОракл и далее ////////////////////////////// ИЗ |РегистрСведений.ПоследнийКодОракл КАК ПоследнийКодОракл"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); НовыйКод =РегистрыСведений.ПоследнийКодОракл.СоздатьМенеджерЗаписи(); НовыйКод.Прочитать(); Если НЕ ЗначениеЗаполнено(КодОракл) Тогда НовыйКод.КодОракл=(Цел(Результат.КодОракл/1) + 1)*1; НовыйКод.Записать(); КодОракл=НовыйКод.КодОракл;  | 
|||
| 
    96
    
        Wobland    
     21.07.12 
            ✎
    08:57 
 | 
         
        (95) этот кусок кода, вырванный из контекста, мне не понятен. искать контекст лениво. подозреваю какую-то ересь ;)
  
        если в (72) убирали подчерки, значит, код строковый. какой МАКСИМУМ тогда может быть?  | 
|||
| 
    97
    
        amadeus2010    
     21.07.12 
            ✎
    09:00 
 | 
         
        у меня регистр сведений и реквизит КоДОракл справочника имеют тип число     
         | 
|||
| 
    98
    
        amadeus2010    
     21.07.12 
            ✎
    09:07 
 | 
         
        Кажется получилось то что сделать используя Максимум в запросе спасибо(94) за совет.Вот исправленный код
  
        /////////////////////////////////////////////////////////////// Запрос= Новый Запрос; Запрос.Текст= " ВЫБРАТЬ |МАКСИМУМ(ПоследнийКодОракл.КодОракл) как КодОракл |ИЗ |РегистрСведений.ПоследнийКодОракл КАК ПоследнийКодОракл"; Результат = Запрос.Выполнить().Выбрать(); Результат.Следующий(); НовыйКод =РегистрыСведений.ПоследнийКодОракл.СоздатьМенеджерЗаписи(); НовыйКод.Прочитать(); Если НЕ ЗначениеЗаполнено(КодОракл) Тогда НовыйКод.КодОракл=(Цел(Результат.КодОракл/1) + 1)*1; НовыйКод.Записать(); КодОракл=НовыйКод.КодОракл; КонецЕсли; /////////////////////////////////////////////////////////////// теперь осталось разобраться с филиалами клиентов  | 
|||
| 
    99
    
        Wobland    
     21.07.12 
            ✎
    09:12 
 | 
         
        (98) на здоровье. я понимаю, когда делится на единицу - этакое неявное преобразование в число. но ты ж говорил, что у тебя везде числа. на зачем /1 и *1??     
         | 
|||
| 
    100
    
        Wobland    
     21.07.12 
            ✎
    09:15 
 | 
         
        кстати, сто     
         | 
|||
| 
    101
    
        zak555    
     21.07.12 
            ✎
    09:16 
 | 
         
        (100) а чего не двести ?     
         | 
|||
| 
    102
    
        Wobland    
     21.07.12 
            ✎
    09:17 
 | 
         
        (101) что там двести, во мне уже поллитра ;)     
         | 
|||
| 
    103
    
        amadeus2010    
     21.07.12 
            ✎
    09:25 
 | 
         
        (101)везучие уже с утра по поллитра, а кому то на работе еще весь день сидеть:)
  
        (99)Это осталось от старого кода лень переделывать  | 
|||
| 
    104
    
        amadeus2010    
     21.07.12 
            ✎
    09:37 
 | 
         
        кстати хотел спросить а как можно сделать так чтобы в регистре сведений коды не плодились, а была всего одна запись которая просто меняется с изменением КодОракл
  
        например есть код в регистре 100, новый клиент получил код 101 и в регистре 100 заменилось на 101, а не так как у меня сейчас 100,101,102  | 
|||
| 
    105
    
        Wobland    
     21.07.12 
            ✎
    09:40 
 | 
         
        (104) сделай код измерением, без ресурсов. или даже константой     
         | 
|||
| 
    106
    
        Wobland    
     21.07.12 
            ✎
    09:41 
 | 
         
        (105) про измерение я что-то ляпнул невпопад, конечно     
         | 
|||
| 
    107
    
        zak555    
     21.07.12 
            ✎
    09:43 
 | 
         
        (102) я тебе на четверть обгоняю =)
  
        (103) пошли работу к чёрту и домой  | 
|||
| 
    108
    
        Wobland    
     21.07.12 
            ✎
    09:44 
 | 
         
        (107) неа, у меня уже литр подходит к концу ;)     
         | 
|||
| 
    109
    
        Wobland    
     21.07.12 
            ✎
    09:46 
 | 
         
        (104) чистая константа - последний код. надо бы ещё подумать, как будет вести себя база, если вдруг последний код не запишется, или будет ещё какой сбой... ну, мне отсюда всей картины не видно     
         | 
|||
| 
    110
    
        amadeus2010    
     21.07.12 
            ✎
    09:53 
 | 
         
        я так подумал что можно Кодоракл сделать константой и обновлять ее при каждом изменении КодОракл+1=новое значение константы
  
        (107) я бы с радостью но надо сидеть  | 
|||
| 
    111
    
        Wobland    
     21.07.12 
            ✎
    09:56 
 | 
         
        (110) улучи 10 минут, сгоняй за пивом и сиди себе дальше ;) чем ещё помочь?     
         | 
|||
| 
    112
    
        amadeus2010    
     21.07.12 
            ✎
    10:52 
 | 
         
        15 минут раздумий привели к этому коду с использованием констант
  
        /////////////////////////////////// Если НЕ ЗначениеЗаполнено(КодОракл) Тогда НовыйКод=Константы.НовыйКодОракл.Получить(); // НовыйКод=(Цел(Результат.КодОракл/1) + 1)*1; КодОракл=НовыйКод; Константы.НовыйКодОракл.Установить(НовыйКод+1); КонецЕсли; //////////////////////////////////////////////// а филиалы к полученному коду могут записать руками  | 
|||
| 
    113
    
        amadeus2010    
     21.07.12 
            ✎
    12:52 
 | 
         
        вот и наступил полдень кто-то уже загорает и отдыхает,а кому то еще работать и работать.Спасибо всем за помощь     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |