Имя: Пароль:
1C
1С v8
Нумерация поля ввода на форме
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
вот и наступил полдень кто-то уже загорает и отдыхает,а кому то еще работать и работать.Спасибо всем за помощь