Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 04:06

Коды номенклатупы, нетривиальная ситуация

Автор evgen.olegovih, 31 дек 2017, 20:26

0 Пользователей и 1 гость просматривают эту тему.

evgen.olegovih

Цитата: AIFrame от 02 янв 2018, 20:48
Цитата: evgen.olegovih от 02 янв 2018, 15:23Если мы в подписку ПриУстановкеНовогоКода в модуле ОбщегоЗначения вставим

В модуле МеханизмаНумерацииОбъектов есть логика небольшая. Префикс организации ставится если у Объекта метаданных есть реквизит "Организация". Тащемта, расширить там эту логику по аналогии до ваших хотелок не проблема. Увидите, короче.

Если нужно применять вашу логику на конкретные справочник\документ, то лучше воспользоваться ПриУстановкеНовогоКода в модуле каждого нужного объекта. Тем более, что в этой процедуре ничто не мешает вызвать свою процедуру из своего общего модуля (ну чтобы не писать одно и то же по сто раз).
Т.е. тупо
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
    ИмяОбъекта = ЭтотОбъект.Метаданные().Имя;
    СтандартнаяОбработка = НашМеханизмНумерации.ПрименятьСтандартнуюОбработку(ИмяОбъекта);
    Если НЕ СтандартнаяОбработка Тогда
        НашМеханизмНумерации.УстановитьКодПринудительно(ЭтотОбъект, ИмяОбъекта);
    Иначе
        Префикс = НашМеханизмНумерации.УстановитьТолькоПрефикс(ЭтотОбъект, ИмяОбъекта);
    КонецЕсли;   
КонецПроцедуры


Добавлено: 02 янв 2018, 20:51


Цитата: evgen.olegovih от 02 янв 2018, 15:23Нумератор видит каталоги как элементы значит?
Каталоги в любом иерархическом справочнике - суть те же элементы, только у них есть признак ЭтоГруппа = Истина.
По этому признаку к каталогам применяются или не применяются реквизиты. Т.е. Артикул для групп не применяется, но можно поставить для реквизита Артикул применение ДляГруппИЭлементов, и у каталогов тоже появится реквизит Артикул. Можно поставить ДляГрупп, и реквизит будет только у каталогов.
Так что нумератору при штатной работе пофигу, группа это или нет. Код, как и Наименование и другие "стандартные реквизиты" применяются ко всем объектам справочника. Поэтому нумератор одинаково присваивает коды и тем, и другим.

Спасибо Вам!
Проблему решил следующим образом:
Написал обработку, которая перебирает всю номенклатуру (обходя группы)и устанавливает префикс (под нашу логику) с помощью
ТекОбъект.УстановитьНовыйКод("Префикс");

Механизм нумератора не трогал, он как-то спокойно подхватил последний элемент с Префиксом и начал продолжать нумерацию после того, как я справочник обработкой обработал.

То есть если я Код вручную вставляю, то он все равно следующий элемент создаст подхватывая именно последний элемент (максимальный) с префиксом.

AIFrame

Цитата: evgen.olegovih от 05 фев 2018, 09:31именно последний элемент (максимальный) с префиксом
Ну да. У элемента справочника нет признака момента времени его создания или присваивания нового кода. Поэтому дефолтный нумератор берет весь справочник, делает запрос МАКСИМУМ(Ссылка.Код), прибавляет 1 и так оно и получается.
Т.е., если ты ставишь код ВАР0000054, и есть элемент с кодом ЩБР0000099, то при следующем присвоении кода автоматически будет код ЩБР0000100, а не ВАР0000055.
Естественно, все это при условии, что нет реквизита "Организация", для которого есть свой префикс.

З.Ы. В нумерации еще вроде как кэширование участвует или индексирование. Поэтому иногда даже возникают ситуации, когда по индексу у тебя новый код должен быть 003, а по факту все уже занято до 057 и платформа на записи начинает ошибку выдавать. Т.е. платформа не опрашивает справочник, а берет последний присвоенный код из индекса\кэша и к нему прибавляет. Лечится перезапуском службы 1С или переиндексацией базы.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск