Имя: Пароль:
1C
1С v8
Проблема с нумерацией
,
0 an_str
 
17.07.13
10:39
Здравствуйте! может кто подскажет, возникла проблема...Имеем справочник, автонумерация и контроль уникальности включены. При создании элемента справочника тыкаемся в кнопку, на которую навешена следующая процедура:
&НаСервере
Процедура ПолучитьИнвентарныйНомерОборудования(Префикс)
   
       НОбъект=ДанныеФормыВЗначение(Объект,Тип("СправочникОбъект.КарточкаНоменклатуры"));
       Префикс1=СокрЛП(Префикс.Код)+"-";
       НОбъект.УстановитьНовыйКод(Префикс1);
       НОбъект.Записать();
       ЗначениеВДанныеФормы(НОбъект,Объект);
       
КонецПроцедуры

Таким образом формируются у нас элементы со след нумерацией:
2602-00001
2602-00002
2602-00003
2602-00004
2602-00005
Теперь задача...Пользователь может поменять код вручную, к примеру на 2602-6...следовательно след-1 код выдаст 2602-7, а нам надо дальше чтобы продолжало нормальную нумерацию т.е., чтобы след код был 2602-00006...Можно ли как-то отследить менялся ли код вручную? и возможно ли вообще реализовать эту задачу? буду благодарна за помощь...
1 Maxus43
 
17.07.13
10:41
>>и возможно ли вообще реализовать эту задачу?
запретить менять номера кривыми руками пользователей.
2 Академик_
Келдыш
 
17.07.13
10:41
Это почему пользователю вручную код менять нужно? хочет вручную- пусть сам дальше вручную и нумерует
3 Maxus43
 
17.07.13
10:42
Если свои специфические требования к номерам - заведи реквизит "НомерСвой" - пусть там меняют что хотят, а автонумерацию не трогают
4 an_str
 
17.07.13
10:44
(1)Ой, так вот именно..что все мои попытки что-то объяснить руководству бесполезны...Должен и все тут. редко, но должен...
5 Maxus43
 
17.07.13
10:45
(4) смотри (2). Или Или. Или ручная Или автомат
6 Maxus43
 
17.07.13
10:46
т.е. после ручного исправления надо руками и менять нумерацию на правильную
7 an_str
 
17.07.13
10:46
(3) суть с новым реквизитом все равно не меняется...Задача таково: чтобы была автонумерация, и иногда пользователь менял номер руками, при этом автонумерация потом продолжалась. Речи не идет о том, чтобы каждый раз вводить код вручную...Так понимаю в такой постановке - это не реализовать?
8 an_str
 
17.07.13
10:47
(6) ясно...спасибо
9 Академик_
Келдыш
 
17.07.13
11:00
(7) а если подумать? не вариант сделать доп реквизит который при записи нового будет автоматом как и код, но ручками чтоб менять можно было?
10 Академик_
Келдыш
 
17.07.13
11:02
а вообще зло это. машина не виновата что юзер когда-то что-то пропустил
11 an_str
 
17.07.13
11:10
(9) т.е. к примеру код=2602-00006 ДопРеквизит=2602-00006, меняем его ручками на 2602-6. При следующем создании будет элемент с код=2602-00007 и ДопРеквизит=2602-00007, т.е. номер  "2602-00006" уйдет в никуда...
12 Maxus43
 
17.07.13
11:11
(11) всё уже сказано, так работает автонумерация, и это нормально. Вмешиваясь в данный механизм - будь добр сам следить дальше
13 an_str
 
17.07.13
13:44
А если изобретать велосипед. И добавить реквизит "НомерИзмененВручную", в процедуре при изменении кода ставим его в истину. И по кнопке получить номер, если пропишем следующее:

&НаСервере
Процедура ПолучитьИнвентарныйНомерОборудования(Префикс)
   
   Запрос = Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ ПЕРВЫЕ 1
   |    МАКСИМУМ(КарточкаОборудования.Код) КАК Код
   |ИЗ
   |    Справочник.КарточкаОборудования КАК КарточкаОборудования
   |ГДЕ
   |    КарточкаОборудования.НомерИзменен = ЛОЖЬ
   |    И КарточкаОборудования.Код ПОДОБНО &СтрокаПоиска
   |
   |УПОРЯДОЧИТЬ ПО
   |    Код УБЫВ";
   Запрос.УстановитьПараметр("СтрокаПоиска", СокрЛП(Префикс.Код)+"-" + "%");
   Результат = Запрос.Выполнить().Выбрать();
   Пока Результат.Следующий() Цикл
       Код = Результат.Код;
   КонецЦикла;
   Рез=Найти(Код, "-");
   ДлинаКода=СтрДлина(Код);
   НОбъект=ДанныеФормыВЗначение(Объект,Тип("СправочникОбъект.КарточкаОборудования"));
   Префикс1=СокрЛП(Префикс.Код)+"-";
   НоваяДлина=СтрДлина(Префикс1)+СтрДлина(Строка(Число(Сред(Код,Рез+1))+1));
   КолНулей=ДлинаКода-НоваяДлина;
   стр="";
   Пока КолНулей<>0 цикл
       КолНулей=КолНулей-1;
       стр=стр+"0";
   КонецЦикла;
   
   НовКод= Строка(Префикс1+стр+(Число(Сред(Код,Рез+1))+1));
   ЭлементНайден=Истина;
   ЧислоКНомеру=1;
   Пока ЭлементНайден<>Ложь Цикл
       НовКод= Строка(Префикс1+стр+(Число(Сред(Код,Рез+1))+ЧислоКНомеру));
       ЭлементНайден = ЗначениеЗаполнено(Справочники.КарточкаОборудования.НайтиПоКоду(НовКод));
       ЧислоКНомеру=ЧислоКНомеру+1;
   КонецЦикла;
   НОбъект.Код = НовКод;
   НОбъект.Записать();
   ЗначениеВДанныеФормы(НОбъект,Объект);
   
КонецПроцедуры



На сколько это коряво? можно оптимизировать?