Подбор свободного кода справочника "Номенклатура" #713527


#0 by Shade84
Как можно осуществить подбор свободного кода справочника "Номенклатура" без захвата одного и того же кода несколькими операторами, подскажите, пожалуйста? Код для 7.7 есть, может кто адаптировать поможет? Процедура ВводНового(ПризнКопирования)             Процедура ПриЗаписи  и Процедура ПриЗакрытии или
#1 by Shade84
для 8.0 УТ 10.3
#2 by Shade84
это нужно, для того, чтобы занять ранее удаленные кода, а нам еще и для того, чтобы занять 10000 штук пропущенных ранее элементов
#3 by Shade84
Или такое не возможно?
#4 by Крошка Ру
Создать регистр,где хранить данные о используемых номерах и по нему проверять
#5 by Крошка Ру
Можно конечно и по справочнику, но по регистру - быстрее
#6 by Shade84
А как проверять по регистру? и главное как новому элементу присвоить старое значение?
#7 by Shade84
Записать получить объект и затем изменить код?
#8 by Крошка Ру
Вопрос: а зачем тебе использовать пропущенные номера?
#9 by Shade84
5 + регистр сведений нужен? А заполнять его вручную?
#10 by Shade84
чтобы занять 10000 штук пропущенных ранее элементов Пропустили случайно при объединении двух баз
#11 by Крошка Ру
да погоди ты. Про регистр - это я так, шучу.
#12 by Крошка Ру
Может перенумеровать их просто?
#13 by Крошка Ру
+ Это если не считать, что пропустили - ну хрен с ними))
#14 by Shade84
нельзя перенумеровать :-) кода на товаре висят по ним его пробивают
#15 by ksupalo
Мы делали такое со счетами-фактурами, чтобы нумерация была корректной. Маска была ГГГГММДДХХХ, т.е. в один день можно было выписать 10 тыс. счетов фактур и номер был уникальный. Выполняется поиск номера по коду только в том случае, если номер не уникальный. Если пока собирались проводить, номер кто-то занял, процедура повторялась. Проблем не было.
#16 by floody
зачем вам эти 10000 пропущенных кодов?
#17 by Shade84
Тут наоборот нужно сначала искать меньшие от максимального кода. а если нет то присваивать следующий
#18 by PRO100 NigGaZ
Выбрать все коды запросом, удаляем префиксы, преобразуем в число, сортируем по возрастанию, запускаем цикл от 1 по ТЗ.Количество, в цикле если не а = ТЗ.НомерСтроки Тогда это и есть пропущенный номер, может так...
#19 by Shade84
уже 58000 использовали :( не хотелось бы менять разрядность
#20 by Крошка Ру
У вас разрядность номера - 5 цифр?
#21 by Shade84
Да, вариант хороший. Только не знаю: 1.) как это сделать? 2.) как потом получить код, который он хочет присвоить 3.) как указать старый код элементу номенклатуры
#22 by Shade84
да
#23 by Крошка Ру
Выбрать ВСЕ коды, а потом их перебирать, вдруг попадется неиспользуемый? Это сильно. Да и выбирать-то придется каждый раз, когда нужно новый присвоить.
#24 by Shade84
Может и правда регистр? сделать обход заполнить а потом из него брать?
#25 by Крошка Ру
Раз уж пошла такая пьянка, может действительно завести регистр (на время, пока все пропущенные номера не заполнятся). Туда один раз выбрать все пропущенные номера, а потом при создании нового справочника искать номер сначала там, а уж если там нет, то добавлять новый.
#26 by PRO100 NigGaZ
#27 by Shade84
Да :) 1.) как это сделать? 2.) как потом получить код, который он хочет присвоить 3.) как указать старый код элементу номенклатуры
#28 by Shade84
О! Дельно. Спасибо большое а как указать старый код элементу номенклатуры?
#29 by Shade84
и как получить код, который 1С хочет присвоить элементу?
#30 by Shade84
в этот код можно использовать для заполнение временного регистра :)
#31 by Крошка Ру
метод объекта УстановитьНовыйКод
#32 by Shade84
спасибо :) А старый просто перезаписываем?
#33 by PRO100 NigGaZ
а в объекте элемента в этой процедуре наверное Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) КонецПроцедуры это при создании нового, по поводу производительности должен за 0,2 сек выполнить
#34 by Shade84
Большое спасибо :-) сейчас все опробую!!!!!
#35 by PRO100 NigGaZ
КонецПроцедуры может даже лучше так
#36 by Shade84
Да, так лучше!!! :)
#37 by Крошка Ру
Смотри, по порядку: 1) Создаешь РС 2) Заполняешь его неиспользуемыми кодами в промежутке (от 00000 до максимального используемого значения для данного справочника) 3) При создании нового элемента берешь минимальный код из РС и присваиваешь его записываемому элементу. (можно руками: Элемент.Код = НашКодИзРегистра) 4) Если элемент успешно записан, удаляешь из РС использованный номер(чтоб второй раз потом его не использовать) 5) Если РС - пустой(т.е все пробелы в нумерации закончились), то новый код устанавливаешь методом УстановитьНовыйКод
#38 by Крошка Ру
Вот этого, если честно, не понял: Если а <> ТЗ.НомерСтроки Тогда
#39 by Крошка Ру
+ Даже, вернее, вот этого: Для а = 1 По ТЗ.Количество Цикл
#40 by Shade84
Ага, понял. Щас посмотрю сколько по продолжительности код    PRO100 NigGaZ работает
#41 by Shade84
Если код не равен отличается от числа строки то это то что нам нужно в идеале они все по порядку идут и равны
#42 by PRO100 NigGaZ
косяк Если а <> ТЗ[Формат(а-1, "ЧН=; ЧГ=0")].Код Тогда мы же сравниваем с кодом )))
#43 by Shade84
ага. а то говорит что поле НомерСтроки не обнаружено :)
#44 by Shade84
{Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(2982)}: Поле объекта не обнаружено Если а <> ТЗ[Формат(а-1, "ЧН=; ЧГ=0")].Код Тогда
#45 by PRO100 NigGaZ
Для каждого СтрокаТЗ ИЗ ТЗ Цикл а может так )))
#46 by Shade84
неее, возвращает "1" при условии что 00001 есть
#47 by Shade84
А значение СтрокаТЗ.Код    "1    "    Строка тип
#48 by PRO100 NigGaZ
даже после преобразования в число?
#49 by Shade84
С форматами нужно, видимо
#50 by Shade84
да
#51 by hhhh
может просто у тех номенклатур, которые после вбили поменять префикс. Тогда само будет браться из пропущенного диапазона..
#52 by Крошка Ру
#53 by Shade84
С префиксом нельзя, их 30000 и они рабочие(ну некоторые из них)
#54 by Крошка Ру
+ Это если префиксов у кодов нет
#55 by Shade84
префиксов нет
#56 by hhhh
если рабочие, то сам бог велел префикс вставить.
#57 by Крошка Ру
Вру, есть ошибка
#58 by Крошка Ру
#59 by Shade84
Пробую :-)
#60 by Крошка Ру
Что-то глючит при отправке
#61 by Shade84
Проверяю.... Пожалуйста подождите... :-)
#62 by Крошка Ру
Ах, черт, и здесь ошибка)) В условии цикла ТекНомер надо не с количеством элементов выборки, а с максимальным кодом из выборки сравнивать
#63 by Shade84
:) А еще +1 не надо прибавлять вроде
#64 by Крошка Ру
Где? во внутреннем цикле или внешнем?
#65 by Shade84
то есть как будет правильно? :)
#66 by Shade84
Во внутреннем
#67 by Shade84
это как мне кажется :)
#68 by Крошка Ру
Нет, все нормально: ТекНомер изначально меньше Выборка.Код(или равен, но тогда сразу переходим к след коду из выборки). Поэтому, пока не сравняем ТекНомер с очередным кодом из выборки , во внутреннем цикле увеличиваем ТекНомер(и сохраняем его в регистре, т.к. в Выборке его нет). Как только сравнялся, "перескакиваем" на следующий код из Выборки и т.д., пока Выборка не закончится
#69 by Shade84
не получается список нужных кодов попадают ненужные 00001 00005 00006 00085 00089 где 1 это существующая папка 5 - элемент, а вот 4 нету 6 папка, 84 нету 88 нету
#70 by Крошка Ру
Первые десять кодов из справочнника покажи
#71 by Крошка Ру
+ Я надеюсь там префиксов нет?
#72 by Масянька
Код для 7.7:
#73 by Крошка Ру
Один в один, только я почему-то коды как строки стал сравнивать, а не как числа))
#74 by Shade84
А как чтобы на 8 работало? :)
#75 by Shade84
я все таки его поменял чуть чуть щас покажу как, тогда список правильно формирует
#76 by Shade84
#77 by Shade84
Вот Промежут дает нужные значения :-)
#78 by Крошка Ру
Ну все правильно)) Ты код посмотри. Сначала заносится в регистр СтрНомер, ПОТОМ он увеличивается на один. В этот момент ты говоришь : Ага! А СтрНомер-1  -  это то, что нужно. Т.е. СтрНомер+1-1 - это то что нужно)) Поставь "Сообщить(СтрНомер)" перед "ТекНомер=ТекНомер+1" и увидишь чудо))
#79 by Salimbek
Вместо:
#80 by Крошка Ру
Ага))
#81 by Shade84
:-) Промежут пошел в массы :)
#82 by Salimbek
И вообще, я бы в ТЗ загнал все номера, потом укладываешь эту ТЗ во временную таблицу, а потом: Выбрать Первые свНомер из ВсяТЗ Левое соединение Справочник.Номенклатура как Номенклатура ПО ВсяТЗ.Код=Номенклатура.Код Где Номенклатура.Код ЕСТЬ NULL Упорядочить ПО свНомер И все это еще бы один раз на сервер загнать, чтобы для каждого таблички не перекладывать.
#83 by Salimbek
...Первые 1... конечно же
#84 by Salimbek
и вместо свНомер -> ВсяТЗ.Код
#85 by Shade84
О чудо!
#86 by Shade84
Клево :))))))))
#87 by Shade84
То есть каждый раз просматривать? Без регистра?
#88 by Крошка Ру
Так проще, да, но больно уж большую ТЗ загружать-соединять, это уж проще тогда просто перебором в цикле отсеивать ненужные номера, как в самом начале предлагалось
#89 by Shade84
У меня файловая 10.3 и все на клиенте делает
#90 by Shade84
Спасибо :-)
#91 by Shade84
всем спасибо :)
#92 by Shade84
А вы в сложных запросах разбираетесь?
#93 by Shade84
напишите, что нибудь на shade84 собака bk точка ru, пожалуйста, есть предложение
#94 by Salimbek
Да не вопрос, создаем служебный Регистр сведений "Нумерация" с одним лишь полем "Код", которое заполняем всеми нужными числами. Потом останется только вызвать запрос: Выбрать Первые 1 Нумерация.Код из РегистрСведений.Нумерация КАК Нумерация Левое соединение Справочник.Номенклатура как Номенклатура ПО Нумерация.Код=Номенклатура.Код Где Номенклатура.Код ЕСТЬ NULL Упорядочить ПО Нумерация.Код
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С