|
Нумерация поля ввода на форме | ☑ | ||
---|---|---|---|---|
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
|
вот и наступил полдень кто-то уже загорает и отдыхает,а кому то еще работать и работать.Спасибо всем за помощь
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |