|
|
| ||
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 | |||
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 | |||
SeiOkami 20 - 23.09.16 - 10:06 | |||
Лефмихалыч 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 записать и проверить? |
|
Список тем форума
|