Имя: Пароль:
1C
 
Зачем ТЗ хранит в себе количество когда-либо созданнных колонок и строк?
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
(12) ну, ты сказал неправильно, потому и не сходится.
https://i.imgur.com/dOgRUJJ.png
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 записать и проверить?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.