|
v7: ЗначениеВстрокуВнутр() - длина строки? | ☑ | ||
---|---|---|---|---|
0
Злопчинский
09.09.13
✎
19:29
|
Какая максимальная длина строки для ЗначениеСтрокиВнутр(НекийОбъектБазы)..?
|
|||
1
Эльниньо
09.09.13
✎
19:36
|
Мне с Внутр 64 хватало. Без Внутр - не знаю.
|
|||
2
NS
09.09.13
✎
19:40
|
(0) Неограничено. Но при большом размере начинаются тормоза.
|
|||
3
Злопчинский
09.09.13
✎
19:41
|
да, вот надо составной индекс в справочник запихнуть
Документ+Контрагент . пихать индекс в Наитменование хочу, максимальная длиня = 100 - вот хватит для двух Внутр? |
|||
4
Злопчинский
09.09.13
✎
19:42
|
(2) не, не может быть внутр неограниченной длины - разумный предел какой-то есть...?
|
|||
5
NS
09.09.13
✎
19:42
|
(3) Так получи два внутренних кода объектов.
Тип документа + вн.код документа + вн.код контрагента. |
|||
6
NS
09.09.13
✎
19:42
|
(4) Загони в него ТЗ из мильёна строк.
|
|||
7
Злопчинский
09.09.13
✎
19:44
|
а вн.код документа - разве однозначно не идентифицирует сам документ...? по идее можно без типа документа обойтись??
|
|||
8
NS
09.09.13
✎
19:45
|
(7) Не помню.
|
|||
9
vcv
09.09.13
✎
19:52
|
Может не стоит ЗначениеВСтрокуВнутр? Оно может неожиданно меняться. На сколько помнится.
Док = СоздатьОбъект("Документ"); Док.НайдиДокумент(ВыбДокумент); Сообщить(ЗначениеВСтрокуВнутр(Док)); вернет одно значение. Док = СоздатьОбъект("Документ.Реализация"); Док.НайдиДокумент(ВыбДокумент); Сообщить(ЗначениеВСтрокуВнутр(Док)); вернет другое значение Док = СоздатьОбъект("Документ.Реализация"); Док.НайдиДокумент(ВыбДокумент); Сообщить(ЗначениеВСтрокуВнутр(Док.ТекущийДокумент())); третье. Точно не обещаю, но где-то так. Лучше на основе ЗначениеВСтрокуВнут() генерировать какой-то свой уникальный идентификатор? Заодно и индекс компактней будет. |
|||
10
NS
09.09.13
✎
19:54
|
(9) А кто мешает сделать
Сообщить(ЗначениеВСтрокуВнутр(Док.ТЕКУЩИЙДОКУМЕНТ());? И зачем всё в строку гнать, если можно выцепить ID. |
|||
11
vcv
09.09.13
✎
19:59
|
(10) На сколько помнится, будет разница из-за того, является ли Док переменной документ определенного вида, или документ неопределенного вида или просто неопределенного типа. Разница в расположении внутреннего идентификатора вида в строковом представлении ЗначениеВСтрокуВнутр() и еще в чем-то... точно не помню.
|
|||
12
vcv
09.09.13
✎
20:00
|
У меня в конфе используются такие функции (делал для себя, если кто будет использовать, я ни за что не ручаюсь):
Функция глПолучитьИдентификаторОбъекта(Объект) Экспорт Перем Результат, Идентификатор, Элементы; Результат = ""; Идентификатор = ЗначениеВСтрокуВнутр(Объект); Идентификатор = Сред(Идентификатор,2,СтрДлина(Идентификатор)-2); Элементы = СоздатьОбъект("СписокЗначений"); Элементы.ИзСтрокиСРазделителями(Идентификатор); Для Номер=1 По Элементы.РазмерСписка() Цикл Если Номер=1 Тогда ИначеЕсли Номер = Элементы.РазмерСписка() Тогда Элемент = Элементы.ПолучитьЗначение(Номер); Результат = Результат + ?(Результат="","","-") + СокрЛП(_IdToStr(Число(Лев(Элемент,СтрДлина(Элемент)-3)))) + ?(ПУстоеЗначение(СокрЛП(Прав(Элемент,3)))=1,"","-"+СокрЛП(Прав(Элемент,3))); Иначе Элемент = Элементы.ПолучитьЗначение(Номер); Если Элемент <> "0" Тогда Результат = Результат + ?(Результат="","","-") + СокрЛП(_IdToStr(Число(Элемент))); КонецЕсли; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции // глПолучитьИдентификаторОбъекта //********************************************************************** Функция глПолучитьОбъектПоИдентификатору(Знач Идентификатор) Экспорт Перем Результат, Элементы; Результат = ПолучитьПустоеЗначение(); Если ПустоеЗначение(Идентификатор) = 0 Тогда Попытка Элементы = СоздатьОбъект("СписокЗначений"); Элементы = глРазделитьВСписок(Идентификатор,"-"); ВидОбъекта = _StrToId(Элементы.ПолучитьЗначение(1)); КодОбъекта = Формат(_StrToId(Элементы.ПолучитьЗначение(2)),"Ч10"); Попытка КодИБ = Лев(Элементы.ПолучитьЗначение(3)+" ",3); Исключение КодИБ = " "; КонецПопытки; Идентификатор = "{""B"",""0"",""0"","""+ВидОбъекта+""",""0"",""0"","""+КодОбъекта+КодИБ+"""}"; Результат = ЗначениеИзСтрокиВнутр(Идентификатор); Исключение Сообщить("Ошибка получения объекта по внутреннему идентификатору <"+СокрЛП(Идентификатор)+">","!"); КонецПопытки; КонецЕсли; Возврат Результат; КонецФункции // глПолучитьОбъектПоИдентификатору |
|||
13
NS
09.09.13
✎
20:09
|
(11) Текущийдокумент() в любом случае возвращает одно и тоже. И вот ссылка на проверенный более чем десятилетием вариант.
http://web.archive.org/web/20060107214804/http://www.sinor.ru/~my1c/knowhow/get_id.html |
|||
14
vcv
09.09.13
✎
20:34
|
(13) Действительно, не могу сейчас проблему воспроизвести. Когда-то наткнулся на разное поведение ЗначениеВСтрокуВнутр() при формировании внутренних идентификаторов в справочнике партий. Не смотря на использование ТекущийЭлемент() вид в строковом представлении ЗначениеВСтрокуВнутр был то отдельно, то вместе с ИД элемента. В зависимости от того, из какого места конфигурации вызывалось формирвание идентификатора.
Процедуры по ссылке не без недостатков. Меня, лично, когда-то они не устроили, поэтому и сделал свой велосипед. Во-первых, в них нет идентификатора типа/вида объекта. И в разных справочниках будут встречаться одинаковые идентификаторы. Не всем это надо. Во-вторых, у меня строковое представление компактней. Когда приходится хранить в базе развесистые множественные фильтры, это ценно. Да и уменьшение размера индекса, там где идентификатор используется для поиска, не помешает. |
|||
15
NS
09.09.13
✎
20:41
|
(14) Внимательней прочитай то что по ссылке.
Там ровно тот-же код что и у тебя. |
|||
16
NS
09.09.13
✎
20:42
|
Функция ПолучитьИД_Вариант1(Объект)
Перем Стр; Стр=ЗначениеВСтрокуВнутр(Объект); СЗ=СоздатьОбъект("СписокЗначений"); СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2)); Возврат СЗ.ПолучитьЗначение(СЗ.РазмерСписка()); КонецФункции Сообщить("Вариант 1: "+_IdToStr(ПолучитьИД_Вариант1(Объект.ТекущийЭлемент()))); |
|||
17
Злопчинский
09.09.13
✎
20:43
|
читаю...
|
|||
18
NS
09.09.13
✎
20:47
|
(14) Ты просто не использовал Текущийэлемент()
|
|||
19
Злопчинский
09.09.13
✎
20:48
|
ух, мозголомство какое... не понял навскидку
есть, например, 1. реквизит документа, реквизит типа = "Документ.Реализация" 2. реквизит документа, реквизит типа = "Документ" . и в том, и в другом случае надо получить одинаковый ид для документа, хранящегося в реквизите ???? |
|||
20
NS
09.09.13
✎
20:48
|
(19) Дописать .текущийдокумент()
|
|||
21
Злопчинский
09.09.13
✎
20:49
|
(18) т.е. просто желать так
ТекДок = ВыбДок.РеквизитТипаДокумент; ТекДок = ТекДок.ТекущийДокумент(); |
|||
22
Злопчинский
09.09.13
✎
20:49
|
(20) ок. и со справочниками аналогично..? текущийЭлемент()
|
|||
23
NS
09.09.13
✎
20:49
|
(22) Да.
|
|||
24
Chai Nic
09.09.13
✎
20:51
|
(23) Ну, суть в том, что ".ТекущийЭлемент()", это, говоря восьмерочным языком, ".Ссылка". А собственно объект типа Документ.xxx - это как бы не сам документ, а менеджер документов..
|
|||
25
NS
09.09.13
✎
20:52
|
(24) Я знаю.
|
|||
26
vcv
09.09.13
✎
20:57
|
(15)(16) И? Для объекта глПользователь твой код вернул < E>, шесть символов, без кода ИБ, без идентификатора типа/вида объекта. Моя функция для глПользователь возвращает <U-E-ЦБ>. Тоже шесть символов, но гораздо больше информации внутри. К тому же, моя функция нечуствительна к тому, добавишь ли ты .ТекущийОбъект() или нет. Меньше возможности случайно накосячить.
|
|||
27
NS
09.09.13
✎
21:02
|
(26) Я тебя не понимаю. В (0) не нужен тип справочника, не нужен код УРБД.
И кто тебе мешает написать сокрлп()? |
|||
28
NS
09.09.13
✎
21:04
|
(26) Эсли ты косячишь, то допиши
Функция ПолучитьИД_эл_справочника(Объект) Перем Стр; Стр=ЗначениеВСтрокуВнутр(Объект.текущийэлемент()); СЗ=СоздатьОбъект("СписокЗначений"); СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2)); Возврат СЗ.ПолучитьЗначение(СЗ.РазмерСписка()); КонецФункции |
|||
29
NS
09.09.13
✎
21:05
|
Или ты хочешь сказать, что ты умеешь дописать несколько символов к строке (тип справочника и код ИБ), так что длина не меняется? :)
|
|||
30
jarett
09.09.13
✎
21:17
|
при наличии ID гонять в строкуВнутр() хуже чем лысого гонять.
|
|||
31
vcv
09.09.13
✎
21:24
|
(27) Вид справочника не нужен, а вот про вид документа не понятно. Упомянут просто "документ" произвольного вида. И про наличие или отсутствие РБД ТС ничего не упоминал. Так что предложение идентификатора без вида документа и кода ИБ несколько некорректно.
(29) Я заменяю цепочку пробелов на разделители. Получается три разделителя (теряю три байта), но экономлю больше за счет исключения пробелов. Канонический идентификатор документа/справочника занимает двадцать три байта. А у меня, к примеру, внутренний идентификатор партии, полный, с видом объекта и кодом ИБ, укладывается в 11 байт. Не смотря на то, что количество элементов в справочнике партий около 900 тысяч. |
|||
32
КонецЦикла
09.09.13
✎
23:07
|
Тебе с какой целью индекс?
Насколько помнится отбор работать не будет для строки длиннее 23 символов :) Но в эту длину вполне можно впихнуть пару значений в виде ID |
|||
33
NS
09.09.13
✎
23:38
|
Всегда можно сделать ключ хеш-функцией.
|
|||
34
vcv
10.09.13
✎
05:58
|
(32) На сколько помнится, в реквизит неопределенного типа можно запихать строковое значение не более 23 символов. А максимальная длина индексного значения, на сколько помнится, не более 112 символов.
|
|||
35
Злопчинский
10.09.13
✎
06:04
|
(32) лабаю альтернативную "ГП" - чтобы восстанавливать можно было не всю базу чохом, а по выбранному клиенту... соответственно в справочнике индекс Контрагент+ТекущийДокумент - этот индекс указывает на ГП для конкретного клиента.
|
|||
36
Злопчинский
10.09.13
✎
06:12
|
блин, ны вы все понаписали...
мне нужно всего-то реквизиты документа, которые могут иметь тип "Справочник.Контрагенты" или "Документ" положить в строку и все. независимо от того, какой будет вид реквизита "Документ" - все документы, или Документ.Конкретный . делаю сейчас просто: СтрДляКонтрагента=ЗначениеВСтрокуВнутр(ВыбКонтрагент.ТекущийЭлемент()); СтрДляДокумента=ЗначениеВСтрокуВнутр(ВыбДокумент.ТекущийДокумент()); . УРБД - нет, но для универсальности бы не помешало учитывать... |
|||
37
vcv
10.09.13
✎
07:38
|
Ну поиск-то по этой строке делать будешь? Индекс с отбором? Тогда длина критична. Сейчас попробовал для первого попавшегося элемента справочника партий стандартное ЗначениеВСтрокуВнутр и свою функцию. Получил:
{"B","0","0","214","0","0"," 666660ЦБ "} 5Y-EAEC-ЦБ Для лучше для индекса, сам понимаешь, не неофит таки :) Или из ссылки в (13) сделать нужное. |
|||
38
Злопчинский
10.09.13
✎
08:17
|
Отбор - пока не планируется...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |