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

04.10.12

Разработка - Универсальные функции

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

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

Принцип следующий: дополняем строку кода с изъятым префиксом до двойной длины, что бы исключить "пропавшие" нули(для них то и используется неудобная функция вычисления длины конкретного кода), выравнивая до длины кода, что то типа функции Прав("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, при работе с одинаковыми товарами но разными контрагентами и складами, общие контрагенты и склады обрабатывались по другим правилам.



 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    2961    Abysswalker    7    

43

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5807    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    47301    dimanich70    83    

167

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7072    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    58791    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8807    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kudim 21.11.14 13:26 Сейчас в теме
В результат выводит число с учетом Рег. установок системы...
Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Число(Результат.Выгрузить().Код) + 1, ДлинаКода,"0");

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