|   |   | 
| 
 | Можно как-то ускорить создание простенькой ТЗ? | ☑ | ||
|---|---|---|---|---|
| 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 НЕ В (ВЫБРАТЬ * ИЗ Числа) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |