gifts2017

Мощность коллекции 1с8

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

Неплохо было бы иметь платформенную функцию для вычисления размера коллекции, но пока этого нет, напишем функцию для мощности сами.

Иногда при отладке нужно посчитать мощность коллекции. В 1С8 коллекции должны быть ограничены в размерах.

В сложных структурах сложно на глаз вычислить размер, а он все растет, и растет, причем непонятно где. Поэтому возможность вычислить мощность коллекции очень полезна.

Код по вычислению мощности выглядит так:

Функция обМощностьКоллекции(К) Экспорт

                Перем Р, Эл, Кол;

                Р = 0;

                Попытка

                Для Каждого Эл Из К Цикл //Список, Структура, Соответствие, ТЗ

                               Попытка

                                               Р = Р + обМощностьКоллекции(Эл.Значение); //Список, Структура, Соответствие

                               Исключение

                               КонецПопытки;

                               Попытка

                                               Для Каждого Кол Из К.Колонки Цикл

                                                               Р = Р + обМощностьКоллекции(Эл[Кол.Имя]);

                                               КонецЦикла;

                               Исключение

                               КонецПопытки;

                              

                               Р = Р + 1; //Один элемент есть

                КонецЦикла;

                Исключение

                КонецПопытки;

                Возврат Р;

               

КонецФункции

 

Для проверки можно использовать структуру мощностью 10:

П = Новый Структура();

П.Вставить("ТЗ", Новый ТаблицаЗначений());

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

Стр = П.ТЗ.Добавить();

Стр.Зн = Новый СписокЗначений();

Стр.Зн.Добавить(1);

Стр.Зн.Добавить(2);

 

СС = Новый Структура();

СС.Вставить("Ага", 1);

СС.Вставить("БугАга", 2);

 

Стр = П.ТЗ.Добавить();

Стр.Зн = Новый Соответствие();

Стр.Зн.Вставить(1,1);

Стр.Зн.Вставить(2, СС);

 

Стр = П.ТЗ.Добавить();

Стр.Зн = "Маша";

 

Сообщить(обМощностьКоллекции(П));

 

Буду благодарен за выявленные ошибки.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Станислав Шепталов (sCHTASS) 10.02.12 11:36
Эмм... Что-то никак не могу придумать практическое применение расчета мощности коллекции 1с.
2. Осипов Сергей (fixin) 10.02.12 11:44
(1) я использовал в отладчике. Чтобы понимать, большая у меня структура или нет. Это в некоторых случаях важно.
3. qweasd qweasdzc (serega3333) 10.02.12 12:38
похоже на очередной пример по применению рекурсии
4. Илья Олегович Червяков (amiralnar) 10.02.12 12:53
СтрДлина(ЗначениеВСтрокуВнутр(Коллекция))
5. Осипов Сергей (fixin) 10.02.12 13:08
(3) рекурсия - один из мощных инструментов программирования, не удивительно что она тут применяется.
6. Осипов Сергей (fixin) 10.02.12 13:09
(4) это в чем? в условных байтах? Меня интересует количество вложенных объектов.
Кстати, попробуй зацикленную структуру преобразовать во внутреннюю строку и вылетишь из программы.
Правда я не помню, я учитываю циклы или нет.
7. Сергей Водаков (WaterSmith) 10.02.12 13:10
С "попытками" не аккуратненько как-то, может лучше было бы все же проверять типы значений?
И понятие "большой" структуры очень расплывчато. Если важна например нагрузка на память, то мне кажется, вариант предложенный (4) информативнее. Ну а то, что он банально проще, это и так видно всем =)

А как образец рекурсии конечно пойдет.
8. Сергей Водаков (WaterSmith) 10.02.12 13:14
(6) fixin, "Зацикленная структура", это как? Нет умом я понимаю, чисто теоретически, это структура содержащая в одном из элементов себя, ссылку на саму себя. Только вот как создать такое из списков, структур, соответствий и ТЗ?
9. Осипов Сергей (fixin) 10.02.12 13:19
(8)
С = Новый Структура();
С.Вставить("С", С);
10. Сергей Водаков (WaterSmith) 10.02.12 13:23
(9) fixin, Хм, допустим, а зачем? Я к тому, что это ведь уже ошибочная ситуация?
11. Осипов Сергей (fixin) 10.02.12 13:29
(10) вы что, программирование не изучали? Не знаете где применяются рекурсивные ссылки?
подумайте, или вам сразу разжевать. Пример - закольцованный список, например (Prev, Next)
12. Трактор Трактор (Трактор) 10.02.12 13:30
(10)
это ведь уже ошибочная ситуация?

Ошибочная или нет - не важно. Главное что это возможная ситуация.
13. Осипов Сергей (fixin) 10.02.12 13:32
(7) честно говоря, уже не помню, зачем мне это нужно было. видимо, нужна была нагрузка на память. но структура точно была закольцована.
14. Сергей Водаков (WaterSmith) 10.02.12 13:32
(11) fixin, Не изучал. Подумаю =)
Но если у вас была закольцованная структура, то где в вашем алгоритме условие выхода? По моему ваш алгоритм зациклиться при закольцованной структуре.
wolfsoft; +1 Ответить
15. Илья Олегович Червяков (amiralnar) 10.02.12 14:29
(6) fixin,

Меня интересует количество вложенных объектов.


СтрЧислоВхождений(ЗначениеВСтрокуВнутр(Новый Структура("Стркутура", Новый Структура("Структура"))), "{""#""") = 2
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа