Вход | Регистрация



Зачем ТЗ хранит в себе количество когда-либо созданнных колонок и строк?

Зачем ТЗ хранит в себе количество когда-либо созданнных колонок и строк?
Я
   SeiOkami
 
23.09.16 - 09:01
Случайно наткнулись на такую вещь. Если создать ТЗ и получить её текст через ЗначениеВСтрокуВнутр(), то в тексте хранится количество когда-либо созданных ранее колонок и строк. Зачем это?
 
 
   SeiOkami
 
1 - 23.09.16 - 09:02
Для примера можно выполнить этот код в "обычном" тостом клиенте:



//Создаём новую ТЗ

ТЗ    = Новый ТаблицаЗначений;

//Сохраняем ТЗ во временный файл

ИмяПервогоФайла = ПолучитьИмяВременногоФайла();
ТекстовыйДокумент    = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ЗначениеВСтрокуВнутр(ТЗ));
ТекстовыйДокумент.Записать(ИмяПервогоФайла);


//Поочередно добавляем и удаляем колонку три раза

ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();

//Поочередно добавляем и удаляем строку четыре раза

ТЗ.Добавить();
ТЗ.Очистить();
ТЗ.Добавить();
ТЗ.Очистить();
ТЗ.Добавить();
ТЗ.Очистить();
ТЗ.Добавить();
ТЗ.Очистить();


//Сохраняем ТЗ во временный файл

ИмяВторогоФайла = ПолучитьИмяВременногоФайла();
ТекстовыйДокумент    = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ЗначениеВСтрокуВнутр(ТЗ));
ТекстовыйДокумент.Записать(ИмяВторогоФайла);

//Запускаем сравнение текстов

СравнениеФайлов = Новый СравнениеФайлов;
СравнениеФайлов.ПервыйФайл = ИмяПервогоФайла;
СравнениеФайлов.ВторойФайл = ИмяВторогоФайла;
СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент;
СравнениеФайлов.Сравнить();
СравнениеФайлов.ПоказатьРазличия();
    
// Удаление временных файлов

УдалитьФайлы(ИмяПервогоФайла);
УдалитьФайлы(ИмяВторогоФайла);
   1dvd
 
2 - 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.
   dmpl
 
7 - 23.09.16 - 09:46
(5) А зачем обнулять индекс? Это происходит в конструкторе объекта. Обнуление после очистки - ненужное усложнение. И потенциальные проблемы: если затем где-то произойдет обращение к очищенной колонке, то в текущей реализации вылетит исключение и ошибка будет легко поймана разработчиками. А если обнулить - то в той же ситуации может просто произойти обращение к другой колонке и будут непонятные глюки, которые разработчики будут выслушивать от пользователей, но не смогут воспроизвести.
   SeiOkami
 
8 - 23.09.16 - 09:46
Нет, это не "индекс колонки". Индекс добавляется +1 к максимальному индексу СУЩЕСТВУЮЩИХ на данный момент колонок, а не к когда-либо существовавщих

Мне просто интересно зачем это. xml и json тут не причём
   Лефмихалыч
 
9 - 23.09.16 - 09:50
(8) ну, попробуй создать объект, хотя бы отдаленно напоминающий ТЗ на C++, Java или C# и сам всё поймешь.
Обнулять можно было бы, но не обнулять тоже можно.
   SeiOkami
 
10 - 23.09.16 - 09:50
(9), так а зачем вообще хранить это? Это как используется?
 
 Рекламное место пустует
   Лефмихалыч
 
11 - 23.09.16 - 09:52
(10) от этого значения, вычисляется индекс колонки при ее создании.
   SeiOkami
 
12 - 23.09.16 - 09:52
(11), я ж уже сказал:

"Индекс добавляется +1 к максимальному индексу СУЩЕСТВУЮЩИХ на данный момент колонок, а не к когда-либо существовавщих "
   SeiOkami
 
13 - 23.09.16 - 09:53
вот такой код выведет "1", а не "3"

ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
Сообщить(ТЗ.Колонки.Индекс(ТЗ.Колонки.Добавить("б")));
ТЗ.Колонки.Очистить();
   Лефмихалыч
 
14 - 23.09.16 - 09:56
(12) ну, ты сказал неправильно, потому и не сходится.
https://i.imgur.com/dOgRUJJ.png
   SeiOkami
 
15 - 23.09.16 - 09:58
(14), что неправильно? Ты вообще не на то число смотришь. Я ж пример привел. Просто выполни код и увидишь
   Лефмихалыч
 
16 - 23.09.16 - 10:00
(15) я вообще-то выполняю и вижу, и даже скрины показываю, как я вижу.

> что неправильно?
Вот это неправильно "+1 к максимальному индексу СУЩЕСТВУЮЩИХ". Прибавляется не к существующим колонкам, а к числу, которое не обнуляется и хранится отдельно.
   dmpl
 
17 - 23.09.16 - 10:01
(12) Попробуй представить как оно внутри работает. Наиболее логично обращаться к колонке с помощью внутреннего индекса (который никакого отношения не имеет к тому индексу, что в 1С виден). Тогда, например, колонки менять местами, добавлять и удалять можно просто поменяв несколько байт в заголовке таблицы (описание соответствия индекса 1С и индекса внутреннего), а не лопатить всю таблицу.
   SeiOkami
 
18 - 23.09.16 - 10:03
(16), почему неправильно, если:

вот такой код выведет "1", а не "3"

ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
ТЗ.Колонки.Очистить();
ТЗ.Колонки.Добавить("а");
Сообщить(ТЗ.Колонки.Индекс(ТЗ.Колонки.Добавить("б")));
ТЗ.Колонки.Очистить();
   SeiOkami
 
19 - 23.09.16 - 10:04
(17), смотрит (18).
"+1 к максимальному индексу СУЩЕСТВУЮЩИХ на текущий момент колонок".
   SeiOkami
 
20 - 23.09.16 - 10:06
(16), и, кстати, ты не привёл ни одного скрина, где бы ты выполнил пример из (1)
   Лефмихалыч
 
21 - 23.09.16 - 10:06
(18) потому, что ТЗ.Колонки.Индекс() не использует это значение, а обходит коллекцию колонок.
   Лефмихалыч
 
22 - 23.09.16 - 10:06
(20) ты тоже
   SeiOkami
 
23 - 23.09.16 - 10:07
+ последний твой скрин показывают не то. Число "9" в ТЗ есть всегда, даже если ты не добавлял никакой колонки. Это тоже не индекс последней колонки. Но я тебе вообще о другом числе говорю
   gitotuta
 
24 - 23.09.16 - 10:08
покажи скрин результата
   SeiOkami
 
25 - 23.09.16 - 10:11
(21), ааа
то есть 1Ска имеет "настоящий" индекс колонки, но в методе Индекс() возвращает рассчитываемый?
   Mauser
 
26 - 23.09.16 - 10:13
Индекс != Идентификатор
   gitotuta
 
27 - 23.09.16 - 10:13
(25) Считай, что у ТЗ есть недокументированный метод: ПолучитьИдентификатор()
   SeiOkami
 
28 - 23.09.16 - 10:13
(26), то бишь у нас есть в ТЗ у колонок и строк как Индекс так и Идентификатор?
   gitotuta
 
29 - 23.09.16 - 10:14
А если по середине колонку удалить? дырка же будет
   dmpl
 
30 - 23.09.16 - 10:15
(28) Дык как и в справочнике есть Код, а есть внутренний идентификатор. Код для удобства человека, идентификатор для системы.
   Провинциальный 1сник
 
31 - 23.09.16 - 10:16
Читал, что в ib/fb тоже есть подобная багофича, там используется общий счетчик изменений метаданных, который только инкрементируется при любых изменениях, и может наступить момент когда он переполнится - и внести изменения в структуру БД будет невозможно. Причем он там какой-то смешной размер имеет, 16 бит или около того.
   Лефмихалыч
 
32 - 23.09.16 - 10:17
(28) у колонки - только идентификатор. А у таблицы есть еще отдельное поле, изи которого она вычисляет идентификаторы для всех вновь создаваемых колонок
   SeiOkami
 
33 - 23.09.16 - 10:41
В УФ у реквизита ТЗ есть метод у строки ПолучитьИдентификатор(). Так вот он он возвращает настоящий индентификатор, а не расчитываемый индекс строки
 
 
   Лефмихалыч
 
34 - 23.09.16 - 10:47
(33) и да, и нет. Он возвращает индекс строки из ДанныеФормыКоллекция, к самой ТЗ это не имеет прямого отношения
   dmpl
 
35 - 23.09.16 - 10:48
Вообще, если вести речь о функции ЗначениеВСтрокуВнутр(), то неужто вы думаете, что ее специально делают под каждый объект? Она ведь универсальная, поэтому просто выводит все реквизиты класса. Так что в самом результате может быть куча служебных данных, неодходимых только для работы платформы. Более того, состав и порядок следования этих значений могут отличаться в разных версиях платформы.
   Провинциальный 1сник
 
36 - 23.09.16 - 15:49
(35) Но по сути, мы имеем потенциальные грабли. Этот внутренний счетчик-индекс в принципе может когда-нибудь переполниться, если в большом цикле создавать-удалять строки. И тогда будет непредсказуемое поведение - то ли вылет платформы, то ли просто исключение при попытке создать строку.
   kaliliga
 
37 - 23.09.16 - 15:51
(36) ну кто попробует там MaxInt32 записать и проверить?


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует