Имя: Пароль:
1C
 
Коды товаров. определить максимальное
,
0 lamme
 
06.09.18
14:33
Есть справочник номенклатуры.
Код = строка.
Какое-то время код товара делался вручную как и кто хотел.
были  и есть товары с цифробуквенными кодами.
Потом от этого отказались - но переделать карточки товара - нельзя. На код товара много чего где завязано.
Те сейчас есть старые товары  - цифробуквенные и новые - только цифры. в поле код. типа строка.

Как определить максимальное значение поля код - только по полям, где есть только цифровые значения.
?
1 Пуля
 
06.09.18
14:37
Отсортируй справочник по коду и смотри
2 Пуля
 
06.09.18
14:37
+ в режиме предпиятия
3 lamme
 
06.09.18
14:39
Программно надо .. программно
4 Базис
 
naïve
06.09.18
14:41
Программист вам нужен, боюсь.
5 Пуля
 
06.09.18
14:43
Макс = -1;
1. Если код преобразуется в число, и Код > макс Тогда Макс= КОд
6 lamme
 
06.09.18
14:46
(5)
перебирать все карточки товара для этого ?
7 Пуля
 
06.09.18
14:47
Да
8 lamme
 
06.09.18
14:49
издеваешься ?
это же сколько будет открываться/записываться новая карточка товара ?
9 Пуля
 
06.09.18
14:50
(8) Ну так оптимизируй, наложи фильтры какие-нить, запоминай максимум
10 Базис
 
naïve
06.09.18
14:58
Один раз перенумеруй. Такое ощущение, что ты издеваешься. Запрос за тебя писать?

Выбрать
   Первые 1
   Спр.Ссылка,
   Спр.Код
Из
   ЯНеВижуЧтоЗаОбъект
Где
   (Тут фильтр на отбор некрасивых кодов)
11 lamme
 
06.09.18
15:14
(10) из (0)
но переделать карточки товара - нельзя. На код товара много чего где завязано.

(Тут фильтр на отбор некрасивых кодов) - ну вот придумай как в запросе отловить коды - где есть буква
12 Вафель
 
06.09.18
15:17
в подобно можно юзать псевдо регэкспы
13 Пуля
 
06.09.18
15:19
-Ты какойто странный, Билли!
- Походу у меня скитлстрянка
- а она заразная?
- Не, не думаю!
14 Смотрящий
 
06.09.18
15:20
(11) Префикс "0" используй, при назначении кода товара
15 Вафель
 
06.09.18
15:20
типа
код подобно [0-9][0-9][0-9][0-9]
или код подобно [0-9][0-9][0-9]
...
16 Пуля
 
06.09.18
15:22
Что на выходе то получить надо? Один раз ищешь максимум, дальше "плюсуешь" коды от него
17 lamme
 
06.09.18
15:29
(16)
на выходе это и надо получить - последний код товара + 1
чтобы новому товару назначить следующий свободный
18 lamme
 
06.09.18
15:30
(15)
а можно подробно ...
это как?
19 Пуля
 
06.09.18
15:36
Запиши текущий максимум куда-нить, и обновляй его каждый раз при добавлении нового элемента
20 lamme
 
06.09.18
15:37
(19)
логично
работало так года 3
потом начало вот такое выдавать

https://e.mail.ru/attachment/15337149230000000893/0;1
21 lamme
 
06.09.18
15:37
Значение поля код не уникально
22 lamme
 
06.09.18
15:38
Хранилось в константе - куда писалось текущее последнее
и при создании новой картчоки товара - бралось из нее и на +1

работало работало ..
что то поменялось - что не говорят
и на тебе - приплыли.
23 Пуля
 
06.09.18
15:39
Ты не химик, ты психолог (с) "Охота на пиранью". так вот ты не программист ты фотограф....
24 Пуля
 
06.09.18
15:41
Ты загони в константу число чуть больше текущего, и с высокой вероятностью у тебя все опять заработает
25 lamme
 
06.09.18
15:42
короче вот
http://1c-bezproblem.ru/zametki-programmista/1s-stroku-v-chislo-v-zaprose-chislo-v-stroku-v-zaprose

и работает нормально все
26 lamme
 
06.09.18
15:42
Функция ТекстЗапросаИзСтрокиВЧисло(пИмяПоля, пДлинаСтроки, пСимволРазделителя=".")
    лТекст="ВЫБОР ";
    Для лДлинаЦелойЧасти=0 По пДлинаСтроки Цикл
        Если лДлинаЦелойЧасти=пДлинаСтроки Тогда
            лТекст=лТекст+"ИНАЧЕ"+Символы.ПС;
        Иначе
            лТекст=лТекст+"КОГДА ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""+пСимволРазделителя+""" ИЛИ ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""" ТОГДА "+Символы.ПС;
        КонецЕсли;
        Если лДлинаЦелойЧасти=0 Тогда лТекст=лТекст+"    0"+Символы.ПС; КонецЕсли;
        Для лИнд=1 По лДлинаЦелойЧасти Цикл
            лТекст=лТекст+"    ВЫБОР "+Символы.ПС;
            Для лЦифра=0 По 9 Цикл
                лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
            КонецЦикла;
            лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "*"+Формат(Pow(10, лДлинаЦелойЧасти-лИнд), "ЧРД=.; ЧГ=0")+"+")+Символы.ПС;
        КонецЦикла;
        Для лИнд=лДлинаЦелойЧасти+2 По пДлинаСтроки Цикл
            лТекст=лТекст+"+ ВЫБОР";
            Для лЦифра=0 По 9 Цикл
                лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
            КонецЦикла;
            лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "/"+Формат(Pow(10, лИнд-лДлинаЦелойЧасти-1), "ЧРД=.; ЧГ=0"))+Символы.ПС;
        КонецЦикла;
    КонецЦикла;
    лТекст=лТекст+"КОНЕЦ";
    Возврат лТекст;
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    МАКСИМУМ("+ТекстЗапросаИзСтрокиВЧисло("Номенклатура.Код", 6)+") КАК Код
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.ЭтоГруппа = ЛОЖЬ";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        сообщить (ВыборкаДетальныеЗаписи.код+1);
    КонецЦикла;
    
КонецПроцедуры
27 lamme
 
06.09.18
15:46
(24)
нет.
не работало.
константу увеличивали принудительно с шагом в +10000
те что то изменилось в работе
например - стали трое одновремнно создавать карточки товара

и для троих определился код = (например) = 6532145
а записать успел тот - кто первый записывает
28 ptiz
 
06.09.18
15:48
(8) Тебе это регулярно надо? Сделай новый реквизит "КодЧислом" и заполняй при записи.
29 lamme
 
06.09.18
15:49
(28)
да - так тоже делал .. пока не наткнулся на статью из (25)
30 МихаилМ
 
06.09.18
20:29
(25)
это фулскан. его нужно избегать в продакшене.

более корректно создать поле с пизнаком нового порядка формирования кода. по полю + код создать индекс
и отбирать максимальное значение по индексу. будет на порядки быстрее.