![]() |
|
Зачем ТЗ хранит в себе количество когда-либо созданнных колонок и строк? | ☑ | ||
---|---|---|---|---|
0
SeiOkami
23.09.16
✎
09:01
|
Случайно наткнулись на такую вещь. Если создать ТЗ и получить её текст через ЗначениеВСтрокуВнутр(), то в тексте хранится количество когда-либо созданных ранее колонок и строк. Зачем это?
|
|||
1
SeiOkami
23.09.16
✎
09:02
|
Для примера можно выполнить этот код в "обычном" тостом клиенте:
//Создаём новую ТЗ ТЗ = Новый ТаблицаЗначений; //Сохраняем ТЗ во временный файл ИмяПервогоФайла = ПолучитьИмяВременногоФайла(); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(ЗначениеВСтрокуВнутр(ТЗ)); ТекстовыйДокумент.Записать(ИмяПервогоФайла); //Поочередно добавляем и удаляем колонку три раза ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); //Поочередно добавляем и удаляем строку четыре раза ТЗ.Добавить(); ТЗ.Очистить(); ТЗ.Добавить(); ТЗ.Очистить(); ТЗ.Добавить(); ТЗ.Очистить(); ТЗ.Добавить(); ТЗ.Очистить(); //Сохраняем ТЗ во временный файл ИмяВторогоФайла = ПолучитьИмяВременногоФайла(); ТекстовыйДокумент = Новый ТекстовыйДокумент; ТекстовыйДокумент.УстановитьТекст(ЗначениеВСтрокуВнутр(ТЗ)); ТекстовыйДокумент.Записать(ИмяВторогоФайла); //Запускаем сравнение текстов СравнениеФайлов = Новый СравнениеФайлов; СравнениеФайлов.ПервыйФайл = ИмяПервогоФайла; СравнениеФайлов.ВторойФайл = ИмяВторогоФайла; СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент; СравнениеФайлов.Сравнить(); СравнениеФайлов.ПоказатьРазличия(); // Удаление временных файлов УдалитьФайлы(ИмяПервогоФайла); УдалитьФайлы(ИмяВторогоФайла); |
|||
2
1dvd
23.09.16
✎
09:06
|
(1) Спасибо за
СравнениеФайлов = Новый СравнениеФайлов; никогда не сталкивался, а может быть полезным |
|||
3
Лефмихалыч
23.09.16
✎
09:31
|
Напомнило старый анекдот:
- Доктор, я когда вот тут так делаю, а потом пытаюсь дотянуться пяткой до носа, у меня всё болит. - Не делайте так Что бы будешь делать с ответом на вопрос, если его получишь? |
|||
4
Лефмихалыч
23.09.16
✎
09:34
|
У меня ЗначениеВСтрокуВнутр() содержит только те колонки, которые реально есть в ТЗ:
https://i.imgur.com/SZnlyAl.png Так что - пробирки надо чище мыть, чтобы результаты экспериментов не были неожиданными... |
|||
5
Лефмихалыч
23.09.16
✎
09:39
|
Или ты имеешь в виду, что номер колонки, который перед ее именем, не обнуляется после вызова Колонки.Очистить()?
Думаю, это не зачем-то конкретным, а просто так было проще. В Объекте хранится максимальный индекс колонки и при добавлении новой к нему прибавляется единичка. При очистке колонок этот индекс просто не обнуляется. Не почему, потому что |
|||
6
Лефмихалыч
23.09.16
✎
09:40
|
и это... перестань уже выдумывать велосипеды для сериализации и межпроцессного взаимодействия, используй xml или json.
|
|||
7
dmpl
23.09.16
✎
09:46
|
(5) А зачем обнулять индекс? Это происходит в конструкторе объекта. Обнуление после очистки - ненужное усложнение. И потенциальные проблемы: если затем где-то произойдет обращение к очищенной колонке, то в текущей реализации вылетит исключение и ошибка будет легко поймана разработчиками. А если обнулить - то в той же ситуации может просто произойти обращение к другой колонке и будут непонятные глюки, которые разработчики будут выслушивать от пользователей, но не смогут воспроизвести.
|
|||
8
SeiOkami
23.09.16
✎
09:46
|
Нет, это не "индекс колонки". Индекс добавляется +1 к максимальному индексу СУЩЕСТВУЮЩИХ на данный момент колонок, а не к когда-либо существовавщих
Мне просто интересно зачем это. xml и json тут не причём |
|||
9
Лефмихалыч
23.09.16
✎
09:50
|
(8) ну, попробуй создать объект, хотя бы отдаленно напоминающий ТЗ на C++, Java или C# и сам всё поймешь.
Обнулять можно было бы, но не обнулять тоже можно. |
|||
10
SeiOkami
23.09.16
✎
09:50
|
(9), так а зачем вообще хранить это? Это как используется?
|
|||
11
Лефмихалыч
23.09.16
✎
09:52
|
(10) от этого значения, вычисляется индекс колонки при ее создании.
|
|||
12
SeiOkami
23.09.16
✎
09:52
|
(11), я ж уже сказал:
"Индекс добавляется +1 к максимальному индексу СУЩЕСТВУЮЩИХ на данный момент колонок, а не к когда-либо существовавщих " |
|||
13
SeiOkami
23.09.16
✎
09:53
|
вот такой код выведет "1", а не "3"
ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); Сообщить(ТЗ.Колонки.Индекс(ТЗ.Колонки.Добавить("б"))); ТЗ.Колонки.Очистить(); |
|||
14
Лефмихалыч
23.09.16
✎
09:56
|
||||
15
SeiOkami
23.09.16
✎
09:58
|
(14), что неправильно? Ты вообще не на то число смотришь. Я ж пример привел. Просто выполни код и увидишь
|
|||
16
Лефмихалыч
23.09.16
✎
10:00
|
(15) я вообще-то выполняю и вижу, и даже скрины показываю, как я вижу.
> что неправильно? Вот это неправильно "+1 к максимальному индексу СУЩЕСТВУЮЩИХ". Прибавляется не к существующим колонкам, а к числу, которое не обнуляется и хранится отдельно. |
|||
17
dmpl
23.09.16
✎
10:01
|
(12) Попробуй представить как оно внутри работает. Наиболее логично обращаться к колонке с помощью внутреннего индекса (который никакого отношения не имеет к тому индексу, что в 1С виден). Тогда, например, колонки менять местами, добавлять и удалять можно просто поменяв несколько байт в заголовке таблицы (описание соответствия индекса 1С и индекса внутреннего), а не лопатить всю таблицу.
|
|||
18
SeiOkami
23.09.16
✎
10:03
|
(16), почему неправильно, если:
вот такой код выведет "1", а не "3" ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); ТЗ.Колонки.Очистить(); ТЗ.Колонки.Добавить("а"); Сообщить(ТЗ.Колонки.Индекс(ТЗ.Колонки.Добавить("б"))); ТЗ.Колонки.Очистить(); |
|||
19
SeiOkami
23.09.16
✎
10:04
|
(17), смотрит (18).
"+1 к максимальному индексу СУЩЕСТВУЮЩИХ на текущий момент колонок". |
|||
20
SeiOkami
23.09.16
✎
10:06
|
(16), и, кстати, ты не привёл ни одного скрина, где бы ты выполнил пример из (1)
|
|||
21
Лефмихалыч
23.09.16
✎
10:06
|
(18) потому, что ТЗ.Колонки.Индекс() не использует это значение, а обходит коллекцию колонок.
|
|||
22
Лефмихалыч
23.09.16
✎
10:06
|
(20) ты тоже
|
|||
23
SeiOkami
23.09.16
✎
10:07
|
+ последний твой скрин показывают не то. Число "9" в ТЗ есть всегда, даже если ты не добавлял никакой колонки. Это тоже не индекс последней колонки. Но я тебе вообще о другом числе говорю
|
|||
24
gitotuta
23.09.16
✎
10:08
|
покажи скрин результата
|
|||
25
SeiOkami
23.09.16
✎
10:11
|
(21), ааа
то есть 1Ска имеет "настоящий" индекс колонки, но в методе Индекс() возвращает рассчитываемый? |
|||
26
Mauser
23.09.16
✎
10:13
|
Индекс != Идентификатор
|
|||
27
gitotuta
23.09.16
✎
10:13
|
(25) Считай, что у ТЗ есть недокументированный метод: ПолучитьИдентификатор()
|
|||
28
SeiOkami
23.09.16
✎
10:13
|
(26), то бишь у нас есть в ТЗ у колонок и строк как Индекс так и Идентификатор?
|
|||
29
gitotuta
23.09.16
✎
10:14
|
А если по середине колонку удалить? дырка же будет
|
|||
30
dmpl
23.09.16
✎
10:15
|
(28) Дык как и в справочнике есть Код, а есть внутренний идентификатор. Код для удобства человека, идентификатор для системы.
|
|||
31
Провинциальный 1сник
23.09.16
✎
10:16
|
Читал, что в ib/fb тоже есть подобная багофича, там используется общий счетчик изменений метаданных, который только инкрементируется при любых изменениях, и может наступить момент когда он переполнится - и внести изменения в структуру БД будет невозможно. Причем он там какой-то смешной размер имеет, 16 бит или около того.
|
|||
32
Лефмихалыч
23.09.16
✎
10:17
|
(28) у колонки - только идентификатор. А у таблицы есть еще отдельное поле, изи которого она вычисляет идентификаторы для всех вновь создаваемых колонок
|
|||
33
SeiOkami
23.09.16
✎
10:41
|
В УФ у реквизита ТЗ есть метод у строки ПолучитьИдентификатор(). Так вот он он возвращает настоящий индентификатор, а не расчитываемый индекс строки
|
|||
34
Лефмихалыч
23.09.16
✎
10:47
|
(33) и да, и нет. Он возвращает индекс строки из ДанныеФормыКоллекция, к самой ТЗ это не имеет прямого отношения
|
|||
35
dmpl
23.09.16
✎
10:48
|
Вообще, если вести речь о функции ЗначениеВСтрокуВнутр(), то неужто вы думаете, что ее специально делают под каждый объект? Она ведь универсальная, поэтому просто выводит все реквизиты класса. Так что в самом результате может быть куча служебных данных, неодходимых только для работы платформы. Более того, состав и порядок следования этих значений могут отличаться в разных версиях платформы.
|
|||
36
Провинциальный 1сник
23.09.16
✎
15:49
|
(35) Но по сути, мы имеем потенциальные грабли. Этот внутренний счетчик-индекс в принципе может когда-нибудь переполниться, если в большом цикле создавать-удалять строки. И тогда будет непредсказуемое поведение - то ли вылет платформы, то ли просто исключение при попытке создать строку.
|
|||
37
kaliliga
23.09.16
✎
15:51
|
(36) ну кто попробует там MaxInt32 записать и проверить?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |