gifts2017

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

Опубликовал Игорь Востриков (zkorpus) в раздел Программирование - Универсальные функции

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

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

Принцип следующий: дополняем строку кода с изъятым префиксом до двойной длины, что бы исключить "пропавшие" нули(для них то и используется неудобная функция вычисления длины конкретного кода), выравнивая до длины кода, что то типа функции Прав("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. Дмитрий Кузнецов (kudim) 21.11.14 13:26
В результат выводит число с учетом Рег. установок системы...
Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Число(Результат.Выгрузить().Код) + 1, ДлинаКода,"0");

Такой вариант будет правильнее:
Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Формат(Число(Результат.Выгрузить()[0].Код) + 1,"ЧГ=0"), ДлинаКода,"0");
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа