Получение максимального кода справочника при конвертации данных



При конвертации данных из разных БД в одну(слияние), возникает необходимость собственной нумерации кодов справочников,
например справочника "Контрагенты". Данный алгоритм позволяет назначать собственную нумерацию, независимо от данных которые уже хранятся в БД приемнике.

При слиянии нескольких БД в одну, имеется ситуация когда некоторым справочникам желательно присваивать код по собственному алгоритму, так как автоматическая нумерация не подходит, нам неизвестно какие коды и с какими префиксами уже существуют в БД.

Принцип следующий: дополняем строку кода с изъятым префиксом до двойной длины, что бы исключить «пропавшие» нули(для них то и используется неудобная функция вычисления длины конкретного кода), выравнивая до длины кода, что то типа функции Прав(«0*(ДлинаКода+ДлинаПрефикса)»+Сред(Код,ДлинаПрефикса),ДлинаКода) можно использовать любой символ вместо «0», но так проще потом собирать код, в  этом случае сортировка по убыванию поднимет максимальное значение кода в первую позицию.

Вот функция которую можно применять независимо:

// Возвращает максимальный код справочника с заданным префиксом или без него,

// использовать для справочников с типом кода «строка» 

// Параметры 

//                   ВидСправочника — имя справочника как оно задано в конфигурации

//                   Префикс — префикс, который вы хотите использовать(например префикс организации), «0» — без префикса

Функция МаксимальныйКод(ВидСправочника,Префикс = «0»)

Мета = Метаданные.Справочники.Найти(ВидСправочника);

ДлинаКода = Мета.ДлинаКода;
ДлинаПрефикса = СтрДлина(Префикс);

// можно использовать функцию одДополнитьСтроку в обработке КонвертацияОбъектовИнформационныхБаз
Дополнение = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(«0»ДлинаПрефикса + ДлинаКода — 1,«0»);

Запрос = Новый Запрос;

Запрос.УстановитьПараметр(«ДлинаКода»,ДлинаКода);
Запрос.УстановитьПараметр(«Дополнение»,Дополнение);
Запрос.УстановитьПараметр(«Префикс»,Префикс);
Запрос.УстановитьПараметр(«ДлинаПрефикса»,ДлинаПрефикса);

Запрос.Текст = «

|ВЫБРАТЬ ПЕРВЫЕ 1
|        ПОДСТРОКА(&Дополнение + ПОДСТРОКА(Контрагенты.Код,&ДлинаПрефикса+1,&ДлинаКода), ВЫБОР«;

// определение длины строки кода, ВЫБОР начался чуть раньше перед циклом, КОНЕЦ будет чуть позже после цикла
Для Инд = 1 По ДлинаКода Цикл

Запрос.Текст = Запрос.Текст + «
|        КОГДА Контрагенты.Код = ПОДСТРОКА(Контрагенты.Код, 1,» + Инд + «)
|        ТОГДА » + Инд;

КонецЦикла;


Запрос.Текст = Запрос.Текст + «

|          КОНЕЦ, &ДлинаКода) КАК Код
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|   ПОДСТРОКА(Контрагенты.Код, 1, &ДлинаПрефикса) = &Префикс
|
|УПОРЯДОЧИТЬ ПО
|   Код УБЫВ«;


Запрос.Текст = СтрЗаменить(Запрос.Текст,«Контрагенты»,ВидСправочника);

Результат = Запрос.Выполнить();
Если Результат = Неопределено Тогда
     Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(«1», ДлинаКода,«0»);
Иначе
     Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Число(Результат.Выгрузить()[0].Код) + 1, ДлинаКода,«0»);
КонецЕсли;

Результат = Префикс + Сред(Результат,ДлинаПрефикса 1);

Возврат Результат;

КонецФункции // МаксимальныйКод()

Конечно не очень красивая функция определения длины строки в запросе, но наворачивать для этого СКД (там есть такая функция) не вижу смысла, длины кодов в конфигурациях не очень велики.

Приведена функция, чтоб ее можно было использовать в любом месте

Например:

Процедура СформироватьКод()


// Для другого справочника поменять ВидСправочника на имя вашего справочника, как оно задано в конфигураторе
ВидСправочника = «Контрагенты»;
Префикс = Организация.Префикс;
Код = МаксимальныйКод(ВидСправочника,Префикс);


КонецПроцедуры

Однако для конвертации, требуется следующее:

Просто в требуемом месте (ОбъектыУчета/Справочники/Контрагенты) вставить код программы тела функции без оператора «Возврат» и явно задав значения ВидСправочника и Префикс и дополнить строкой — Объект.Код = Результат; , в закладке событий — после загрузки 

или же, если функция используется в разных местах выполнить:

  1. Открыть, конвертацию (Бухгалтерский учет для Украины(293) -> Бухгалтерия для Украины 1.8.1)
  2. Перейти к правилам конвертации
  3. Открыть закладку Алгоритмы/Запросы
  4. Создать новый алгоритм
  5. Назвать его «МаксимальныйКод»
  6. Установить параметры — ВидСправочника,Префикс = «0»
  7. В окно алгоритма вставить код функции без строк Функция.. и КонецФункции
  8. В требуемом месте (ОбъектыУчета/Справочники/Контрагенты) вызывать эту функцию в закладке событий — после загрузки (Объект.Код = МаксимальныйКод(«Контрагенты»))

В скобках указаны примеры, некоторые этапы показаны на скриншотах.

В моем случае данный алгоритм понадобился при слиянии нескольких БД Бухгалтерия 7.7 в одну БД Бухгалтерия 8.2, при работе с одинаковыми товарами но разными контрагентами и складами, общие контрагенты и склады обрабатывались по другим правилам.



 

1 Comment

  1. kudim

    В результат выводит число с учетом Рег. установок системы…

    Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Число(Результат.Выгрузить().Код) + 1, ДлинаКода,»0″);

    Такой вариант будет правильнее:

    Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Формат(Число(Результат.Выгрузить()[0].Код) + 1,»ЧГ=0″), ДлинаКода,»0″);

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *