Имя: Пароль:
1C
1С v8
Можно как-то ускорить создание простенькой ТЗ?
,
0 palpetrovich
 
29.11.15
14:32
вот это ну не очень быстро работает:

    Для Инд = 1000 По 99999 Цикл
        НоваяСтр = ТЗ.Добавить();
        НоваяСтр.Артикул = Формат(Инд,"ЧГ=0");
    КонецЦикла;

зы: клиент хочет автоматом для новых элеменов получать уникальный артикул
ззы: можно конечно создавать ТЗ приНачалеРаботыСистемы...
1 ДенисЧ
 
29.11.15
14:33
Запросом из базы сразу бери
2 palpetrovich
 
29.11.15
14:33
+(0) далее получаю первый незанятый - это быстро

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ТЗ.Артикул
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    &ТЗ КАК ТЗ
    |;
    |ВЫБРАТЬ
    |    ВТ.Артикул,
    |    СпрНоменклатура.Ссылка КАК Номенклатура
    |ПОМЕСТИТЬ ВТ1
    |ИЗ
    |    ВТ КАК ВТ
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |        ПО ВТ.Артикул = СпрНоменклатура.Артикул
    |;
    |ВЫБРАТЬ первые 1
    |    ВТ1.Артикул
    |ИЗ
    |    ВТ1 КАК ВТ1
    |ГДЕ ЕСТЬNULL(ВТ1.Номенклатура, 0)=0
    |";
3 palpetrovich
 
29.11.15
14:35
(1) нет их в базе, откуда им там взяться :)
это строки типа "1234", "1235", "99999"
4 Nuobu
 
29.11.15
14:38
(3) Сортировать по максимуму пробовал?
5 Записьдампа
 
29.11.15
14:47
(0) У тебе всегда одновременно только один клиент в базе с этим функционалом работать будет?
6 palpetrovich
 
29.11.15
14:59
(4) часть номенклатуры занесена с арьикулами из другой базы, причем не "по порядку"
(5) пока да
7 Скай
 
29.11.15
14:59
А тут не "Формат" большую часть времени отжирает? Он вроде не образец скорости работы
8 Записьдампа
 
29.11.15
15:10
(6) Уточняю. Один пользователь может начать два сеанса? Например на RDP.
9 palpetrovich
 
29.11.15
15:33
(7) мржет, но мне на выходе строку без "пробелов" надо
(8) нет
10 Записьдампа
 
29.11.15
15:53
(9) Гм.. а как ты такого эффекта добился? Запретил пользователю несколько раз щелкать по ярлыку?

Самый тупой вариант ускорить твою хотелку, не меняя архитектуры - заменить в цикле Формат на СтрЗаменить с символом неразрывного пробела. Это даст процентов 10% выигрыша.

Если тебе действительно надо быстро, то переосмысливай архитектуру. Надо хранить числа, оперировать числами, а "пробелы" убирать только в том месте, где данные показывается пользователю.

И про "второго пользователя" я тебя не просто так спрашиваю. Сейчас окажется, что у тебя обмен данными еще есть.
11 Лефмихалыч
 
29.11.15
16:01
(0) откуда потребность постоянно и ежедневно создавать новые номенклатурные позиции? Это нонсенс само по себе
12 Лефмихалыч
 
29.11.15
16:03
И это - в поле Код уникальный артикул уже и так автоматом появляется. На кой кол там второй?

Я подозреваю клюшки какие-то вонючие, которые хотят в v8 перетащить 1в1, не приходя в сознание
13 palpetrovich
 
29.11.15
16:05
(10) показывать ничего не нужно, используется здесь:
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура
    |        ПО ВТ.Артикул = СпрНоменклатура.Артикул
(12) Код != артикул
14 Записьдампа
 
29.11.15
16:08
(13) И зачем тебе артикул хранить строкой, если ты даже в (0) генерируешь его как число?
15 palpetrovich
 
29.11.15
16:20
(14) в конфигурации он строка, клиент использует как число
16 palpetrovich
 
29.11.15
16:24
короче, вижу 2 пути:
1 глобальная экспортная ТЗ
2 доп. справочник или РС
17 itlikbez
 
29.11.15
16:26
(0) Получай таблицу номеров в запросе
выбрать 0
объединить
выбрать 1
объединить
выбрать 2 и т.д.
18 palpetrovich
 
29.11.15
16:32
(17) Для Инд = 1000 По 99999 Цикл ...не жестоко-ли ?  ?)
19 Записьдампа
 
29.11.15
16:36
(15)(16) Забудь про скорость. У тебя две проблемы - во-первых ты оперируешь несогласованными типами данных, и во-вторых не понимаешь что одна база обслуживает несколько сеансов. Следующая тема будет "как избавится от коллизий?" =)

Похоже (12) был прав.
20 itlikbez
 
29.11.15
16:37
(18) Нет.
10*10*10*10*10=100000
Соедини 5 раз таблицу с номерами от 0 до 9 с самой собой, и получишь 100000 записей.
21 Записьдампа
 
29.11.15
16:42
(20) А можно я за ТС спрошу? =)
Как привести в запросе число к строке, причём без пробелов?
22 palpetrovich
 
29.11.15
16:44
(19) я-хе  сказал, один чел будет этим заниматься
(20) поздно, я уже повесил одинэсину :)
23 itlikbez
 
29.11.15
16:47
(21) Зачем приводить к строке? Пусть число использует.
24 Записьдампа
 
29.11.15
16:50
(23) - (14)+(15) =)
25 PR третий
 
29.11.15
16:52
(0) Задача бредовая. Не стоит так делать.
26 palpetrovich
 
29.11.15
16:55
(25)откуда такие глубокие выводы? - раз
мне пофик, платит - далаю! два :)
27 PR третий
 
29.11.15
16:57
(26) Колбасить базу с целью найти пропущенные номера — бред. Раз.
Делай. Два.
28 palpetrovich
 
29.11.15
17:05
(27) где Колбасить-то? основное время теряется на подготовку "заготовки" :) код в (2) отрабатывает достаточно шустро, хоть и наверняка неоптимаоен
зы а тебя не напрягает проверка на уникальность реквихитов типа  ИНН?
29 Бертыш
 
29.11.15
17:05
Самое быстрое в интерпретаторе 1С это когда вместо кода написанного на 1С и соответственно интерпретируемого интерпретатором ты используешь двоичный код по максимуму, то есть вместо написания функционала на языке 1С ты используешь функционал встроенный в платформу.
В твоём случае это связка поля артикул справочника номенклатуре с неким справочником артикулов в котором и будет по потребности заводится новый элемент с новым кодом артикула и по ссылке на который будет заполнятся текстовое поле. Уникальность кодов будет гарантировать платформа. Заведение новых кодов будет производится самой платформой.
30 palpetrovich
 
29.11.15
17:11
(29) Тема конечно, я в (16) уже думал об этом! надо подумать...
31 H A D G E H O G s
 
29.11.15
17:30
(30) Сохрани ТЗ во ХранилищеСистемныхНастроек
32 HeKrendel
 
29.11.15
18:14
я конечно не программист, но нахрена перебирать все значения, если проще завести тот же регистр сведений и с него получать последний артикул и к нему добавлять единицу?
33 Garykom
 
гуру
29.11.15
18:20
(0) ТС самый правильный ответ (1), причем сразу дали его

Заводишь табличку со своими желаемыми артикулами, затем запрос между этой табличкой и "использованными артикулами" в номенклатуре

Полученный список "свободных артикулов" как хочешь используй, но советую сразу после использования проверять на дубли...
34 Garykom
 
гуру
29.11.15
19:37
(33)+ для тех кто не понял, в базе табличку в виде справочника или регистра
справочника лучше с числовым кодом
и 1 раз ее заполняешь
35 Ildarovich
 
30.11.15
12:42
Интересная задача. Я понял ее так, что дан массив "занятых" строковых артикулов, состоящих из 6-ти цифр. Требуется определить первый неиспользуемый (пропущенный) артикул.
Поскольку артикулы берутся из ИБ таблицу значений использовать нецелесообразно: на ее ввод в запрос потребуется много времени. Даже если ее где-то хранить. Можно было бы формировать эту таблицу в запросе, но без этого тоже можно обойтись.
Достаточно преобразовать артикулы в числа, объединить эту таблицу с той же таблицей кандидатов, где числа увеличены на 1 и посчитать количество одних и тех же чисел в этой таблице. Там, где число встречается один раз и взято из таблицы кандидатов, и будет свободный артикул.
Далее числовое значение артикула можно преобразовать в строку как в статье http://catalog.mista.ru/public/331805/ . Если в выборке артикулов написать "ДЛЯ ИЗМЕНЕНИЯ", можно ожидать, что таблица артикулов будет заблокирована для записи нового элемента.
Вот получившийся запрос. Он кажется громоздким, но все операции там простые и он должен работать быстро. В принципе, его можно записать и покомпактнее на идеях из http://catalog.mista.ru/public/170336/ . Но там быстродействие будет ниже.
Запрос:

ВЫБРАТЬ
    "000001" КАК Артикул
ПОМЕСТИТЬ Дано

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "000002"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "000004"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВЫБОР ПОДСТРОКА(Дано.Артикул, 6, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ + ВЫБОР ПОДСТРОКА(Дано.Артикул, 5, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ * 10 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 4, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ * 100 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 3, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ * 1000 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 2, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ * 10000 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 1, 1)
        КОГДА "1"
            ТОГДА 1
        КОГДА "2"
            ТОГДА 2
        КОГДА "3"
            ТОГДА 3
        КОГДА "4"
            ТОГДА 4
        КОГДА "5"
            ТОГДА 5
        КОГДА "6"
            ТОГДА 6
        КОГДА "7"
            ТОГДА 7
        КОГДА "8"
            ТОГДА 8
        КОГДА "9"
            ТОГДА 9
        ИНАЧЕ 0
    КОНЕЦ * 100000 КАК Х
ПОМЕСТИТЬ Числа
ИЗ
    Дано КАК Дано

ДЛЯ ИЗМЕНЕНИЯ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Числа.Х,
    ЛОЖЬ КАК Свободен
ПОМЕСТИТЬ ЧислаПлюс
ИЗ
    Числа КАК Числа

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Числа.Х + 1,
    ИСТИНА
ИЗ
    Числа КАК Числа
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПОДСТРОКА(ВЗ.Ц, ВЗ.Х / 100000 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.0006)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.006)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.06)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.6)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 6)) / 6 + 1, 1) КАК НовыйАртикул
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 1
        ЧислаПлюс.Х КАК Х,
        "0123456789" КАК Ц,
        ДАТАВРЕМЯ(1, 1, 1) КАК О
    ИЗ
        ЧислаПлюс КАК ЧислаПлюс
    
    СГРУППИРОВАТЬ ПО
        ЧислаПлюс.Х
    
    ИМЕЮЩИЕ
        КОЛИЧЕСТВО(*) = 1 И
        МАКСИМУМ(ЧислаПлюс.Свободен) = ИСТИНА) КАК ВЗ
36 Ildarovich
 
30.11.15
12:50
+(35) Запрос можно еще отрефакторить. И условие в "имеющие" упростить. Или записать вообще без группировки через
Число + 1 НЕ В(ВЫБРАТЬ * ИЗ Числа)
Но группировка надежнее, хотя и длиннее, так как нет риска попасть на сканирование таблицы "Числа".
37 RomanYS
 
30.11.15
12:53
Создать регистр сведений "Свободные артикулы"
38 H A D G E H O G s
 
30.11.15
13:01
(35) Я бы постарался с человеком - написавшим такой код - не работать. Мог бы уволить - уволил бы.
39 Ildarovich
 
30.11.15
13:01
(37) В этом нет смысла: свободные артикулы ДОСТАТОЧНО БЫСТРО получаются запросом.

+(35) Сравнивая два подхода: с генерацией таблицы всех артикулов и получением следующего свободного артикула для занятых можно заметить, что если свободных артикулов немного, то победит первый подход, а если много (больше половины(?) возможных), то второй. На практике миллион занятых артикулов - маловероятная ситуация, поэтому запрос из (35) в большинстве случаев будет быстрее.
40 palpetrovich
 
30.11.15
14:36
(35) спасибо за внимание, но ей-бо не стоило :)
Порешал новым справочником + ПодпискойНаСобытие с кодом

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

(38) извини, с ХранилищемСистемныхНастроек  заморачиваться не стал, поленился :)
41 katc
 
30.11.15
14:51
(40) - звание г**нокодера уже тебе присвоили?
добавить целый справочник , только что бы не думать.
42 Timon1405
 
30.11.15
14:58
(41) >>добавить целый справочник , только что бы не думать.
а что в этом такого? не "не думать", а решить поставленную задачу, методом, который будет читабелен, прост и достаточно быстр, легко поддерживаемый как автором так и потомками.
назовите плюсы отказаться от этого решения в угоду т.н. "негвнокодерству"?
43 asady
 
30.11.15
15:04
(42) самый главный аргумент - "это не айс"
44 viraboy
 
30.11.15
15:25
Храните в регистре последний присвоенный артикул, ну или в константе.
45 Garykom
 
гуру
30.11.15
15:25
(43) если бы был простой способ запросом найти "пустые промежутки" в артикулах это был бы "айс"?
46 palpetrovich
 
30.11.15
15:35
(41) скорее уж г.конструктора, кодерство тут как-би и ни при чем
(45) мона я отвечу?  был-бы "айс"!  есть решение?

зы кста, такой "вспомогательный" справочник вполне может быть использован для решение и других задач
47 Garykom
 
гуру
30.11.15
15:36
48 EugeniaK
 
30.11.15
15:42
(40) Проще уже было добавить числовое поле АртикулЧислом и заполнять при записи как число от артикула. Потом тупо простым соединением артикул с артикул+1 получать минимальный незанятый артикул.
49 palpetrovich
 
30.11.15
16:03
(47) вот не поленился, почитал... поцитирую:

"Прочитал про «пул телефонных номеров» ещё раз, надо было просто создать все записи для номеров и колонку assigned(типа кому назначено, а там уже foreign key или что там нужно), если она NULL — номер пустой и выбирается тогда всё одним простым запросом."

"Есть ещё один метод, который Вы не упомянули: держать отдельную таблицу с «пропущеными» номерами. Тогда INSERT будет предельно краток — берем минимальный номер из нашей таблицы, а если она пустая — то создаем новый номер. На большом кол-ве INSERT-ов это выльется в ощутимую экономию ресурсов. Обновлять таблицу тоже можно в удобное время когда есть запас по ресурсу."

"Вообще, мне кажется, что держать пул всех номеров — это правильно в вашем случае.
А, как уже ранее было сказано, иметь одно поле, типа client_id: либо пустое, либо с айдишником клиента. В таком случае ваша проблема не появляется."

скромно так резюмирую: ничего нового я не изобрел :)

(48) читать надо все-таки всю ветку :)
50 Ildarovich
 
30.11.15
16:19
(46) Теперь мне непонятно: чем плохо решение из (45). Оно ПРОСТОЕ и быстрое! Не требует дополнительных структур данных. Вся "многобуквенность" решения из-за преобразования строки в число и числа в строку, которая записано громоздким для глаз, но не трудным для вычислений выражением. Его нужно воспринимать как единое целое. По сути там все так как в ссылке из (47). Получается, что нужно было всего лишь постараться записать решение понятнее. Видимо, проблема в этом.
51 Записьдампа
 
30.11.15
16:45
(50) Проблема в том, что это сферический конь в вакууме. Вместо простого решения конкретной задачи, решается непонятно что.

Представьте себе что, например, в компьютерных игрушках, для отображения огня начнут считать дифуры по сеткам и гордится этим. Вот у вас тоже самое.
52 palpetrovich
 
30.11.15
16:49
(50) я может, ошибаюсь, но код в (35) ищет пропущенные в ряде, формируемом в:

ВЫБРАТЬ
    "000001" КАК Артикул
ПОМЕСТИТЬ Дано
ОБЪЕДИНИТЬ
ВЫБРАТЬ
    "000002"
ОБЪЕДИНИТЬ
+ Code
ВЫБРАТЬ
    "000004"  

...это мне что, 99999 раз ОБЪЕДИНИТЬ надо предварительно?
53 ejikbeznojek
 
30.11.15
16:58
А чё, раз уж БыдлоКодить, создай запись в каком-нибудь мусорном регистре сведений или константу строковую,
И вбей туда обработкой 1 раз все пропущенные артикула.
Получится строка "000001000005000007....0011223" и отщипывай от неё по 6 символов каждый раз как надо))
54 Garykom
 
гуру
30.11.15
16:58
Самый быстрый способ найти первое пустое, это запросом получить отсортированный список артикулов и далее в коде цикл по нему пока предыдущий артикул + 1 = текущий артикул

Все остальные методы намного медленне
55 palpetrovich
 
30.11.15
17:06
(54) было-бы неплохо, однако есть одно но: Артикул - строка и владелец руками вполне может ввести нечто типа "МойСамыйЛюбимыйАрт" ...если длины строки хватит конечно :)
56 Garykom
 
гуру
30.11.15
17:08
(55) ыыы, тогда точно (54) потому что это действительно самый быстрый способ проконтролировать ввод "МойСамыйЛюбимыйАрт"
они в конце будут да и в середине на ять отлавливаются
57 Garykom
 
гуру
30.11.15
17:09
(56)+ запросом быстрее когда список артикулов свободных нужен, причем полный
58 Бубка Гоп
 
30.11.15
17:11
(0) я за РС. Зачем изобретать велосипед?
59 palpetrovich
 
30.11.15
17:17
(57) не, вообще мысль в 54 здравая, но есть еще одно но, сортировка строк в 1с прикольная :)
100
1000
101
102

(58) сделал справочник без наименования и реквизитов
60 Записьдампа
 
30.11.15
17:19
(54) Блд.
Самый быстрый способ найти первое пустое, это хранить в номенклатуре два значения артикула - текущий актуальный и заранее рассчитанный "следующий". И написать запрос попадающий в индексы.

Скажите уже наконец, как называется ваш продукт, я уже не хочу им пользоваться =)
61 palpetrovich
 
30.11.15
17:23
(60) "хранить в номенклатуре два значения артикула - текущий актуальный и заранее рассчитанный "следующий""  

Блд. я уже не хочу вам его продавать :)
62 Garykom
 
гуру
30.11.15
17:27
(59) в данном случае совершенно правильная сортировка строк
если работаем с символьными строками а не числами то просто функция итерации строк своя и все
AAA -> AAB -> AAC
63 Garykom
 
гуру
30.11.15
17:28
(62)+ а если у нас числа записанные как строки то предварительно привести к одному виду с нужным числом "0" впереди
64 Ildarovich
 
30.11.15
18:08
(52) Начало запроса для проверки его работы в консоли. Так все делают. Вам это не нужно. Вам нужно сразу со второго запроса пакета начинать. Где артикулы из базы читаются.
65 Ildarovich
 
30.11.15
18:11
(54) Какие все остальные? В (35) ГОТОВЫЙ ЗАПРОС. Скопируйте его в консоль и проверьте. Он работает. Работает быстро. Трудозатраты пропорциональны числу занятых артикулов.
66 Ildarovich
 
30.11.15
18:12
+(64) Вместо таблицы Дано свою таблицу подставьте.
67 Записьдампа
 
30.11.15
18:19
(61) Так те, кто такое пишет еще и самостоятельно это продают? =)
68 palpetrovich
 
30.11.15
18:36
(66) стоп, я наверное что-то не так понял, таблица "Дано" для кода в (35) это что уже заполненные артикулы?
69 palpetrovich
 
30.11.15
18:49
(68) проверил, для существующих Артикулов
1001, 1002, 1003, 1008....  12345
запрос из (35) возвращает 100401

а код из (40) вполне ожидаемо возвращает 1004

вот спрашивается, нафига козе баян :)
70 Ildarovich
 
30.11.15
20:12
(69) Да, я проявил невнимательность. Код, приведенный в (35) рассчитан на определение пропусков у артикулов "000000", "000001", "000002", "000003", "000004", ..., "100000", "100001" и так далее. То есть длина строки полагалась равной 6. Как у кодов справочника длиной 6.
С точки зрения приведения к длине 6 в ряду 1001, 1002, 1003, 1008....  12345 свободным считается 100101.
Нет проблем сделать длину равной 5, как у Вас, но вот сделать ее переменной? - Чтобы они шли как числа - без ведущих нулей? - Тут запрос придется переделать. Обязательно сделаю это. Чуть позже.
71 Drac0
 
30.11.15
20:22
(40) А что там будет если два человека одновременно запишут новые элементы?
72 Записьдампа
 
30.11.15
22:29
(71) Не мешай дядькам расставлять восемь сферических ферзей на трёхсторонней шахматной доске!
73 Ildarovich
 
01.12.15
10:29
(69)
+(70)
Преобразование в число чуть усложнится, если допустить разную длину артикулов на входе (от 1 до 5).
С другой стороны запрос из (35) можно упростить. За счет того, что пропущенный артикул достаточно вернуть из запроса и в виде числа. Громоздкое преобразование из числа в строку в запросе делать вообще не нужно!
Также можно пожертвовать усложнениями, необходимыми для стабильности скорости выполнения в файловом режиме и в разных СУБД, отказавшись от приема с группировкой. Тогда запрос станет совсем понятным:

ВЫБРАТЬ "1001" КАК Артикул
ПОМЕСТИТЬ Строки
ОБЪЕДИНИТЬ ВЫБРАТЬ "1002"
ОБЪЕДИНИТЬ ВЫБРАТЬ "1003"
ОБЪЕДИНИТЬ ВЫБРАТЬ "12345"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
(    ВЫБОР ПОДСТРОКА(Артикул, 5, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ
+    ВЫБОР ПОДСТРОКА(Артикул, 4, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10
+    ВЫБОР ПОДСТРОКА(Артикул, 3, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 100
+    ВЫБОР ПОДСТРОКА(Артикул, 2, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 1000
+    ВЫБОР ПОДСТРОКА(Артикул, 1, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10000
)
/    ВЫБОР ПОДСТРОКА(Артикул, 5, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ
/    ВЫБОР ПОДСТРОКА(Артикул, 4, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ
/    ВЫБОР ПОДСТРОКА(Артикул, 3, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ
/    ВЫБОР ПОДСТРОКА(Артикул, 2, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ
    КАК Артикул    
ПОМЕСТИТЬ Числа
ИЗ Строки
ДЛЯ ИЗМЕНЕНИЯ
;
/////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    Артикул + 1 КАК НовыйАртикул
ИЗ
    Числа
ГДЕ
    Артикул + 1 НЕ В (ВЫБРАТЬ * ИЗ Числа)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший