Имя: Пароль:
1C
1C 7.7
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
Отбор - пока не планируется...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.