gifts2017

получение внутреннего ИД объекта в 1С штатными средствами

Опубликовал Алексей Лустин (lustin) в раздел Программирование - Практика программирования

проба реализации нескольких функций глобального модуля (для НЕлюбителей 1С++)
Преамбула
задача была поставлена так:
1. есть конфигурация с процедурой ПриИзмененииОбъекта в глобальном модуле
2. необходимо регистрировать изменившиеся объекты и использовать их в отдельной конфе с 1С++
3. использовать 1С++ нельзя исходя из тезиса владельца конфигурации "Оно не 1С Совместимо и не стабильно"

Ситуация

как бы то ни было а регистрировать объекты мне лучше по внутреннему ИД ,
и если у 1С++ есть в функционале объект MetaDataWork (http://www.1cpp.ru/docum/icpp/html/ODBC.html#metadatawork)
то тут приходится выкручиваться

"Боянистые функции"

в конфигурацию были включены три функции
Функция ЗначениеВСтрокуБД(_значение) Экспорт
Функция ЗначениеВДлиннуюСтрокуБД(_значение) Экспорт
Функция ЗначениеВСамуюДлиннуюСтрокуБД(_значение) Экспорт


реализовано конечно быстро и на коленке, поэтому тут же был написан тест на сравнение с MetaDatawork

Описание программы

программа представляет собой тест на получаемые значения штатными средствами и с помощью объекта MetaDatawork
а также производит замеры по скорости с выдачей значения "коэффициент скорости" (во сколько раз штатный механизм медленнее механизма 1С++)

если есть несовпадение в сравнении - выдает сообщение об этом

Собственно всё кроме того что - обработка считает что либо в КаталогеИБ(), либо в КаталогеПрограммы() 1cpp.dll у вас присутствует

PS Если кто вдруг знает как реализовать эти функции быстрее - милости просим

PSS собственно сами функции

мои результаты

результаты замеров (коэффициент скорости - параметр во сколько раз быстрее 1С++ чем штатный механизм)

Среднее штатно ИД =0.00009888201111672562 1срр =0.00001572764022233451
коэффициент скорости = 6.28714859437751004016

Среднее штатно длинного ИД =0.00007579585649317837 1срр =0.00000919024759979788
коэффициент скорости = 8.24742268041237113402

Среднее штатно самого длинного ИД =0.00006237367357251137 1срр =0.00000903233956543709
коэффициент скорости = 6.90559440559440559441


 
//======================================================================
 Функция ЗначениеВСтрокуБД(_значение) Экспорт
 	Перем _строкаИД;
 	Попытка
 		СтрокаПредставленияОбъекта = ЗначениеВСтрокуВнутр(_значение);
 	
 		СтрокаПредставленияОбъекта = Сред(СтрокаПредставленияОбъекта,2,СтрДлина(СтрокаПредставленияОбъекта)-2);
 		временныйСписокЗначений = ЗначениеИзСтрокиВнутр("{""VL"",{}}"); //быстрее чем создать объект
 		временныйСписокЗначений.ИзСтрокиСРазделителями(СтрокаПредставленияОбъекта);
 		_строкаИД = _IdToStr(временныйСписокЗначений.ПолучитьЗначение(7));
 		длинаНашегоИД = СтрДлина(_строкаИД)+1;
 		Для сч=длинаНашегоИД По 9 Цикл
 			_строкаИД = _строкаИД + " ";
 		КонецЦикла;
 	Исключение
 		Сообщить(ОписаниеОшибки(),"!!!");
 	КонецПопытки;
 	Возврат _строкаИД;
 КонецФункции // ЗначениеВДлиннуюСтркоуБД
 
//======================================================================
 Функция ЗначениеВДлиннуюСтрокуБД(_значение) Экспорт
 	Перем _строкаИД;
 	Попытка
 		СтрокаПредставленияОбъекта = ЗначениеВСтрокуВнутр(_значение);
 	
 		СтрокаПредставленияОбъекта = Сред(СтрокаПредставленияОбъекта,2,СтрДлина(СтрокаПредставленияОбъекта)-2);
 		временныйСписокЗначений = ЗначениеИзСтрокиВнутр("{""VL"",{}}"); //быстрее чем создать объект
 		временныйСписокЗначений.ИзСтрокиСРазделителями(СтрокаПредставленияОбъекта);
 		_строкаИД = _IdToStr(временныйСписокЗначений.ПолучитьЗначение(7));
 		длинаНашегоИД = СтрДлина(_строкаИД)+1;
 		Для сч=длинаНашегоИД По 9 Цикл
 			_строкаИД = _строкаИД + " ";
 		КонецЦикла;
 		ВидОбъекта = _IdToStr(временныйСписокЗначений.ПолучитьЗначение(4));
 		ВидОбъекта = Сред(ВидОбъекта,3);
 		_строкаИД = ВидОбъекта + _строкаИД;
 	Исключение
 		Сообщить(ОписаниеОшибки(),"!!!");
 	КонецПопытки;
 	Возврат _строкаИД;
 КонецФункции // ЗначениеВСтрокуБД
 
 //======================================================================
 Функция ЗначениеВСамуюДлиннуюСтрокуБД(_значение) Экспорт
 	Перем _строкаИД;
 	Попытка
 		СтрокаПредставленияОбъекта = ЗначениеВСтрокуВнутр(_значение);
 	
 		СтрокаПредставленияОбъекта = Сред(СтрокаПредставленияОбъекта,2,СтрДлина(СтрокаПредставленияОбъекта)-2);
 		временныйСписокЗначений = ЗначениеИзСтрокиВнутр("{""VL"",{}}"); //быстрее чем создать объект
 		временныйСписокЗначений.ИзСтрокиСРазделителями(СтрокаПредставленияОбъекта);
 		_строкаИД = _IdToStr(временныйСписокЗначений.ПолучитьЗначение(7));
 		длинаНашегоИД = СтрДлина(_строкаИД)+1;
 		Для сч=длинаНашегоИД По 9 Цикл
 			_строкаИД = _строкаИД + " ";
 		КонецЦикла;
 		ВидОбъекта = _IdToStr(временныйСписокЗначений.ПолучитьЗначение(4));
 		ВидОбъекта = Сред(ВидОбъекта,3);
 		ТипОбъектa = временныйСписокЗначений.ПолучитьЗначение(1)+"1";
 		_строкаИД = ТипОбъектa + ВидОбъекта + _строкаИД;
 		
 		длинаПолногоИД = СтрДлина(_строкаИД)+1;
		Для сч=длинаПолногоИД По 23 Цикл
			_строкаИД = _строкаИД +" ";
		КонецЦикла;
 	Исключение
 		Сообщить(ОписаниеОшибки(),"!!!");
 	КонецПопытки;
 	Возврат _строкаИД;
 КонецФункции // 

 


Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
-
.1217764574 43,00Kb
25.09.09
82
.1217764574 43,00Kb 82 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Олег Веселов (sml) 06.08.08 13:52
а зачем пробелы в цикле добавлять? не быстрее ли было:

_строкаИД = лев(_строкаИД + " ",9)

и еще 1 момент. Наскока я понимаю, данная обработка не будет работать для баз УРБД. Там правые 3 символа внутреннего ИД как раз представляют код базы УРБД.
2. Олег Веселов (sml) 06.08.08 13:55
(+) 1
в кавычках указать 9 пробелов (я указал, но сервак почему-то их сожрал)
3. desty (lustin) 07.08.08 12:58
для УРБД я не пробовал - у меня большая но не распределенная - сегодня, завтра надо будет запустить тесты
4. nickVZ (nickVZ) 13.08.08 00:09
Вообще-то, мне хватило одной функции... Для "полного ID". Выход: строка в 15 символов. Три последних - под УРБД.
Части можно получить, раздербанив полученное строковое значение штатными функциями.
Плюс "обратная" функция: по "полному ID" получить ссылу на объект...
Использовал для синхронизации баз. Т.е. документы и справочники.
Виды расчета - тоже проверилось. Но не для синхронизации - чисто трюковое использование ;)
5. desty (lustin) 19.08.08 08:19
нарыл таки почему эти функции это "боян"
http://www.sinor.ru/~my1c/knowhow/get_id.html
6. nickVZ (nickVZ) 19.08.08 15:25
Ну, выложить модификацию "бояна" - то же неплохо :)
Упомянутые в (4) функции имеют тот же источник, из синора ;) Только я
предпочел вывод не в СЗ, а в текстовую строку. Что удобно для заполнения полей...
И позиционно-зависимое содержание, чтобы легко вытаскивать нужные фрагменты:
Первый символ: обозначение вида объекта (B - справочник, O - документ и т.д.)
Символы 2 - 6: тип объекта (дес.), совпадает с "числовой частью" соответствующей таблицы, где хранятся объекты
Последние 9 символов - это то же самое, что хранится в поле ID соответствующей таблицы (включая "метки" УРБД)
Вот "обратная" функция, возвращает ссылку, пригодную для методов типа спр.НайтиЭлемент(ссылка)
Функция НайтиПоСжатомуКоду(знач ВКСжато)
Сжато = СокрЛП(ВКСжато);
Восстановлено="{"""+Лев(Сжато,1)+""",""0"",""0"","""+СокрЛ(сред(сжато,2,5))+""",""0"",""0"","""+Прав(" "+_StrToID(СокрЛП(сред(Сжато,7,6))),10)+Прав(" "+сред(Сжато,13),3)+"""}";
ссылка = ЗначениеИзСтрокиВнутр(Восстановлено);
Возврат ссылка;
КонецФункции

7. Денис Гуров (Denis1c) 23.11.10 14:43
в (6) в Функции в качестве передаваемого параметра, что за строка должна быть?
8. Валерий Агеев (awa) 27.01.11 12:47
(0) Алексей, у меня нет возможности написать Вам личное сообщение, у Вас в настройках приватности, видимо, это запрещено.
Других контактных данных в Вашем профиле я также не вижу. Поэтому пишу комментарий здесь, в Вашей публикации, в надежде, что Вы увидите этот комментарий. Пожалуйста, или откройте возможность написать Вам личное сообщение, или сообщите другие свои контактные данные.
9. desty (lustin) 18.02.11 03:25
(8)
Еще бы знать где меняется эта настройка приватности - я ее честно не менял никогда.

...update - наше где меняются настройки ;-) - видимо по умолчанию на Инфостарте приватность по максимуму
10. Виталий Онянов (Tavalik) 22.03.14 11:51
Скажите, а возможно ли как-нибудь изменить внутренний ИД у объекта в 1С 7.7?
11. Алексей Лустин (lustin) 23.03.14 02:13
(10) Tavalik, не совсем понял что значит изменить. Уже сформированный ? Ну так он же не в MD хранится, он в базе лежит - тот который 9 знаков, идентификатор типа - вот он насколько я помню живет в md. Надо достать из загашника gcomp и посмотреть так ли это.

P.S. 6 лет прошло - оперативная память головы уже заполнена другой информацией. ;-)
12. Виталий Онянов (Tavalik) 29.03.14 07:25
Да, интересует, как можно изменить внутренний ID объекта в базе данных.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа