Эффективная обработка данных в оперативной памяти за счет использования коллекции "соответствие"

Публикация № 79285

Разработка - Практика программирования

237
Разработчики, перешедшие с 7-ки на 8-ку по привычке продолжают использовать универсальные коллекции "список значений", "таблица значений" в задачах, которые в 8-ке существенно быстрее решаются с использованием новой коллекции "соответствие". Эта статья для тех, кто еще не оценил всех преимуществ новой структуры данных. Статья позволит создавать Вам максимально быстрые программы. Приведено несколько примеров, в том числе, решение для задач на графах.

 

1. Место коллекции "соответствие" среди других универсальных коллекций значений.

Мы знаем, что: 

массив предназначен для доступа к элементам массива; 

структура используется для хранения небольшого количества значений, каждое из которых имеет некоторое имя;

список значений - это не сохраняемый в базе данных объект, который позволяет строить динамические наборы значений и манипулировать ими;

таблица значений - почти тоже, что список, только еще с колонками. 

А вот про соответствие в хелпе написано только что данный объект "Представляет доступ к соответствию".

Не собираюсь поправлять техписателей 1С - другого определения давать не буду.

С моей точки зрения, соответствие занимает промежуточное положение между структурой и массивом, с одной стороны, и списком и таблицей значений, с другой, объединяя хорошие черты этих коллекций.

Все коллекции хранят множества элементов. Структура позволяет получить нужный элемент по имени, массив - по номеру, список и таблица значений - поиском (отбором) среди других элементов. А соответствие позволяет выбрать или изменить нужный элемент по "ключу" этого элемента. При этом в качестве ключа может использоваться значение почти любого типа (например, ссылка). Возможность выбора и изменения по ключу дает возможность обрабатывать заранее неизвестное количество элементов, при этом никак их не нумеруя. Получаем практически таблицу значений, проиндексированную по колонке "ключ".

И вот тут, думаю, для многих будет сюрпризом, что доступ к элементу соответствия по ключу происходит почти со скоростью доступа к массиву или элементу структуры! - Как будто по номеру!

Приведем пример:

Будем подавать на вход обработки случайные числа в диапазоне от 1 до КоличествоРазличныхЭлементов.  Обработка должна будет проверять каждое число, чтобы определить: не встречалось ли очередное число в текущей последовательности раньше. Если такого числа не было - оно добавляется в коллекцию, иначе - увеличивается число его повторений.

То есть оценивается время выполнения конструкции "..." в цикле (фиг1)

fig1

В качестве конструкции "..." используется:

Вариант 1. Массив (фиг2)

fig2

Вариант 2. Соответствие (фиг3)

fig3

Вариант 3. Индексированная ТаблицаЗначений (фиг4)

fig4

Результаты сравнения показали, что отметка в массиве занимает на тестовом компьютере 2,45 мкс, в соответствии - 7,06 мкс, в индексированной таблице значений - 15,06 мкс, причем это время не зависит от числа элементов в коллекции! Прилагаемый к статье отчет "БыстродействиеКоллекций" позволит Вам перепроверить эти результаты. 

Скорость доступа к элементам соответствия и независимость скорости доступа от размера коллекции "соответствие" может удивлять, если не догадываться о ее устройстве. Можно предположить, что используется хеш-функция и хеш-таблица. Хеш-функция вычисляет номер строки хеш-таблицы, где лежит ссылка на элемент. Простая косвенная адресация! Одно лишнее (по сравнению с массивом) обращение к памяти! 

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

В комментариях к статье также уже посоветовали отметить, что еще одна прелесть соответствия в том, что перед присваиванием Соответствие[Ключ] = Значение не нужна проверка на существование элемента с этим ключом, так как отсутствующий элемент в этом случае вставляется в соответствие. В приведенных примерах этому красивому приему, к сожалению, места не нашлось.

2. Пример использования соответствия в задаче подсчета повторений слов.

Приведем пример программы, подсчитывающей число повторений каждого слова в заданном тексте. Обычное решение - запоминание отдельных слов в строках таблицы значений и последующая свертка по полю "Слово". Соответствие ускоряет основную операцию в этом алгоритме минимум в два раза! При этом получается не только самый быстрый, но и выразительный код. Чтобы учесть, что слово, прочитанное в переменную "Слово" строкового типа,  встретилось еще раз, используется наглядная запись: Частота[Слово] = Частота[Слово] + 1. Правда, чтобы определить, что символ является буквой, использовать соответствие будет уже неправильно: встроенная функция поиска подстроки работает быстрее!

Текст программы приведен на фиг5 и в приложенном к статье отчете "ЧастотаСлов", позволяющем проанализировать любой текстовый файл.

fig5

Прилагаемый к статье скриншот показывает результат определения частоты слов в данной статье.

3. Пример использования соответствия в задаче представления ориентированного графа.

Если стоит задача сохранить в оперативной памяти и проанализировать связи объектов информационной базы, то эффективной оказывается использование следующей структуры: Соответствие "Граф" хранит связи объекта, ссылка на который определяется ключом. Значением соответствия "Граф" является вложенное соответствие "Связи", которое для каждого связанного элемента хранит вес связи.  

Например, если переменные "Элемент1" и "Элемент2" хранят ссылки на два элемента справочника "Номенклатура", причем второй входит в спецификацию первого с весом 2, то выражение

Граф[Элемент1][Элемент2] будет равно 2

Если связи нет, то выражение Граф[Элемент1][Элемент2] будет равно "Неопределено".

Если нужно сделать вес связи равным 1, это сделает следующий код: Граф[Элемент1][Элемент2] = 1.

При этом Элемент1 и Элемент2 могут быть как ссылкой на справочник, так и ссылкой на документ и другие объекты. То есть так можно обрабатывать любые связи!

Стоит предупредить, что обращаться к элементам вложенного соответствия можно только, если во внешнем соответствии существует ключ первого элемента. Поэтому перед обращением к связям требуется проверка Граф[Элемент1] <> Неопределено.

На фиг6 приведен фрагмент кода программы, который производит чтение из базы данных в оперативную память связей номенклатуры, задаваемых в конфигурации "Бухгалтерия предприятия" в справочнике "СпецификацииНоменклатуры".

fig6

Текст самой обработки (разузлования) графа спецификаций БП, построенной целиком на соответствиях, Вы можете загрузить по ссылке к статье [//catalog.mista.ru/public/78371/]. Там всего десяток строк!

Заключительные замечания.

1. Ничего нового здесь не изобретено, просто делюсь опытом. Сам узнал о сравнительной эффективности коллекций из статьи Сергея Осипова. Спасибо ему!

2. Использование соответствия в решении задач позволяет исключить поиск при обработке заранее непронумерованных данных. Таким образом существенно ускоряется реализация многих базовых алгоритмов. Пользуйтесь соответствием в случаях, когда не нужен весь функционал таблиц значений!

3. Несмотря на ориентированность языка 1С на решение бизнес-задач, в нем есть место настоящему программированию - кодингу, в том числе и самому хитроумному. Поэтому изучайте теорию алгоритмов и программ, не мусорьте в коде и сможете сберечь нервы и время пользователей, строки кода, место на дисках, циклы процессора, электроэнергию. Делайте мир лучше!

 

237

Скачать файлы

Наименование Файл Версия Размер
БыстродействиеКоллекций.erf
.erf 6,87Kb
11.12.10
164
.erf 6,87Kb 164 Скачать
ЧастотаСлов.erf
.erf 7,14Kb
10.12.10
65
.erf 7,14Kb 65 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. cool.vlad4 45 11.12.10 00:57 Сейчас в теме
:D молодчина, уважаю, знания в массы!
2. hogik 430 11.12.10 01:54 Сейчас в теме
(0)
"...есть место настоящему программированию - кодингу"(с)
"Кодирование является лишь частью программирования, наряду с анализом, проектированием, компиляцией, тестированием и отладкой, сопровождением. В узких кругах кодирование также может называться «кодинг» (англ. coding)."(с)
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D0%BD%D0%B3
4. ildarovich 6793 11.12.10 10:31 Сейчас в теме
(2) Не спорю.
Я использовал здешнее понимание "кодинга" не как кодирование, то есть перевод алгоритма в конструкции языка, а как определение процедурного подхода к программированию, когда требуется определять последовательность вычислений. В отличии от декларативного - "запросного" подхода, против которого я ничего не имею (Пролог - один из моих любимых языков).
HystriX; hogik; +2 Ответить
3. Ish_2 1044 11.12.10 06:32 Сейчас в теме
Отлично.
Гораздо приятнее общаться по такому поводу.
Замечание 1.
Нужно поправить в теме.
Прелесть соответствия именно в том , что проверка перед присвоением не нужна.
Вместо
         Соотв =  Новый Соответствие;
         Если Соотв[1]= НеОпределено Тогда 
              Соотв.Вставить(1,0);
         КонецЕсли;

Мы пишем :
	Соотв =  Новый Соответствие;
	Соотв[1]=0;

Другими словами, в последнем примере если не найден ключ , то автоматически вставляется в соответствие новая пара ключ, значение.

Замечание 2.

Эффективное использование Соответствие в Вашей обработке графа стало для меня неожиданностью.
Ваша обработка даже при облегченном контроле зацикливания, неучитывающем "глубокие" кольца,
должна была проиграть не в 3 раза в SQL-варианте , а в 10-15 раз, если бы использовалась таблица значений.
Другими словами, если бы не соответствие Ваш алгоритм бы просто "рухнул".
Сколько же проиграет Ваш вариант при полноценном , неурезанном функционале осталось загадкой.
pm74; IDija; +2 Ответить
5. ildarovich 6793 11.12.10 10:33 Сейчас в теме
(3) С замечанием 1 согласен - уже поправил в статье.
6. ildarovich 6793 11.12.10 10:50 Сейчас в теме
(3) С замечанием 2 не согласен категорически.
Есть анекдот: "Звонок: Шеф! Будьте осторожнее! - В вашем районе один ненормальный едет по встречке! Ответ шефа: Да какой один! - Их тут сотни!"
Вы один высказываете ошибочное мнение, что "абсолютно полный контроль зацикливания есть абсолютно тупое перечисление циклических путей".
По крайней мере четыре человека в Вашей теме считают по-другому: "абсолютно полный контроль зацикливания есть простое перечисление всех дуг, приводящих к зацикливанию".
Число циклических путей может быть близко к бесконечности. Число ошибочных дуг мало. Их перечисление практически не скажется на быстродействие моей обработки разузлования и других "процедурных" методов, которые на практике в сотни и тысячи раз быстрее Вашего запроса. Все разными словами и разными способами (только на баяне не играли) пытались Вас в этом убедить. Станьте на минутку не писателем, а читателем - ознакомьтесь с нашими доводами! Может быть, наконец, поймете?
Арчибальд; hogik; +2 Ответить
7. Ish_2 1044 11.12.10 11:29 Сейчас в теме
(6) Для выяснения спорных вопросов и нужно тестирование. Оно состоялось. Результаты Вы знаете.
Жаль, что до конца мы не выяснили этот вопрос.
8. Sk0rp 113 11.12.10 17:04 Сейчас в теме
ИМХО, достаточно было просто написать, что это hash-map
Silenser; +1 Ответить
9. Русский 12.12.10 07:44 Сейчас в теме
Поменьше увлекайтесь коллекциями значений! А то уже надоело плеваться при виде кода, в котором данные самым апендицитным образом прогоняются через кучу коллекций значений, вместо того, чтобы грамотно быть извлеченными из ИБ, и воспользоваться универсальными способами(типа ЗаполнитьЗначенияСвойств()).

P. S. в 8.2 самой частоиспользуемой универсальной коллекцией должна быть структура.

P. P. S. соответствие, наряду с быстродействием при извлечении данных из нее, проигрывает в быстродействии записи данных в оную по сравнению с той же структурой... Проще говоря, если есть некий массив данных, для которого требуется многократный поиск по значению, то стоит пользоваться соответствием, а если не требуется такого интенсивного, многократного поиска, то лучше воспользоваться другими коллекциями...
10. ildarovich 6793 12.12.10 11:44 Сейчас в теме
(9) Вы сделали правильные выводы. Крайностей быть не должно. Я тоже не призываю использовать соответствие вместо структуры. В приведенном коде, например, структура замечательно подошла для передачи параметров в функцию "ПолучитьСлово()".
Что касается "ЗаполнитьЗначенияСвойств()". - Исключительно удобная вещь! Постоянно применяю эту конструкцию. Более того, в исходном варианте статьи был "Вариант 4" для таблицы значений, записанный так, как я обычно делаю:
Строка = ТаблицаЗначений.Найти(Элемент, "Ключ"); 
Если Строка = Неопределено Тогда ЗаполнитьЗначенияСвойств(ТаблицаЗначений.Добавить(), Новый Структура("Ключ, Значение", Элемент, 1)) 
Иначе Строка.Значение = Строка.Значение + 1 
КонецЕсли

В окончательном варианте этот пример, как более медленный (хоть и более красивый), я убрал. Он остался в прилагаемом отчете "БыстродействиеКоллекций"
11. Ish_2 1044 12.12.10 22:31 Сейчас в теме
Проверяя высказывание (9), в задаче заполнения графа интересно было бы сравнение использования Структуры и Соответствия.
Если в БП 1.6 (2.0) поле код уникально в справочнике ,
то вполне можно допустить использование этотого символьного иденификатора для обозначения элемента справочника.
И тогда какой выигрыш дало бы использование Структуры вместо Соответствия ?
19. Русский 13.12.10 11:19 Сейчас в теме
(11) ну я же говорил, в некоторых случаях соответствие лучше структуры.

(13)
artbear пишет:
в итоге в реальной жизни Структура слабо применима

И тем не менее, на структуре в 1С:Предприятии построено куча прикладных механизмов, тот же интерфейс завязан на структурах ;) А соответствие только для специфических целей...

И я же говорю, соответствие - индексированная коллекция, она быстрее других при извлечении данных, но медленнее той же структуры при сохранении данных в нее.

(18) в структуре меньшие накладные расходы на запись данных, в соответствии на чтение, вот и получилось, что они "на равных". Увеличьте количество поисков по коллекции (скажем, в 100000 элементов попытаться найти нужные элементы 3000000 раз) и Вы увидите, как структура отстает.
20. ildarovich 6793 13.12.10 16:18 Сейчас в теме
(11)(19) В примерах, приведенных в статье, использовать структуру просто не получится.
В структуре ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.
В хелпе написано, что структура используется для хранения относительно небольшого количества объектов.
Другими словами, если структура - hash-map, то его capacity - ограничено. Проведя эксперименты, получим, что структура может хранить максимум 999 свойств!
В одном из текстов от 1С я видел черным по-белому написанное предостережение от использования структуры в подобных задачах.
Но даже если ограничить число объектов 999, то структура как Вариант 5 отстает. Цифры такие: структура - 8,98 мкс, соответствие - 7,52.
Если есть желание приводить ключи к хорошему типу, используйте тип число и массив! Будет быстрее! Так сделано в тексте статьи [http://infostart.ru/public/78371/]
в варианте "массив".
21. Ish_2 1044 13.12.10 16:21 Сейчас в теме
22. Русский 13.12.10 17:22 Сейчас в теме
(20) ну Вы уж прямо опустили структуру...

Вот только что открыл конфу Управление торговлей 11.0.4.6. И покурил глобальный поиск, вот что он мне показал:
Искать: Новый Структура - 2979
Искать: Новый Соответствие - 215

Не трудно разглядеть, что разработчики типовой УТ используют структуру более чем в 20 раз чаще, нежели соответствие... Это без учета того, что "внутри" формы, параметры формы представляют собой структуру, и не создаются конструктором Новый.

P. S. соответствие не панацея, а всего лишь универсальная коллекция, и не стоит ее сувать куда ни попадя. А данная статья и добрая часть комментариев к ней так и призывают это делать...
23. ildarovich 6793 13.12.10 19:44 Сейчас в теме
(22) Вы первый упомянули здесь (9) про структуру. Я вообще в статье эту коллекцию не рассматривал, считая, что у соответствия и структуры - совершенно разное назначение.
Структура - это модель объекта в оперативной памяти, ее задача придать разнородным данным об объекте необходимую общность, чтобы обращаться с ними как с единым целым.
999 свойств хватит для описания любого мыслимого объекта. На проигрыш долей микросекунд
при более ясном и выразительном коде никто не смотрит.
А соответствие я использовал для ссылок на однородные данные (числа, слова, номенклатура). Ясно, что их может быть гораздо больше 999. Так что никто здесь не умаляет важности и нужности структуры. И приводимая Вами статистика - тому подтверждение.
Pipapalamm; +1 Ответить
38. LordKim 19.07.18 17:41 Сейчас в теме
(23)
Максимальное количество элементов Соответствия 99999 (в платформе 8.3.6)

Это ограничивает использование (например, если с помощью соответствия организовывать поиск по ТЗ в которой больше 100к строк)
39. LordKim 23.07.18 21:22 Сейчас в теме
(38)
Дополнительная проверка (по замечаниям сообщества) выявила что это не так (при тестировании опирался на набор уникальных ключей, количество которых в ТЗ было 99999, хотя строк в ТЗ было больше)
ildarovich; +1 Ответить
24. bulpi 158 15.12.10 11:57 Сейчас в теме
(22)
То, что разработчики типовой используют структуру чаще, чем соответствие, никак не доказывает, что структура лучше :) Скорее, это компрометирует структуру :))
ephemeralin; artbear; +2 Ответить
25. Русский 15.12.10 12:44 Сейчас в теме
(24) :o
Позвольте узнать, каким образом это компроментирует структуру? :)
26. artbear 1165 15.12.10 15:12 Сейчас в теме
28. KliMich 19.09.11 19:29 Сейчас в теме
40. alexsey777 25.02.19 10:38 Сейчас в теме
(22)Ну это объяснимо. УТ 11 построена на управляемых формах. Стало быть нужно передавать данные с клиента на сервер. Собственно для этого идеально подходит структура. Если исходить из вашего комментария выше. Количество элементов небольшое. И читать их на клиенте как правило не нужно. Да и после передачи структуры на сервер как правило извлекать по многу раз данные не нужно.
Можно конечно это решить и через соответствие. Но, как по мне это уже будет избыточно. Использовать соответствие имеет смысл, если ключом должна быть не строка. Но такие случаи весьма редко встречаются. Отсюда и такая разница в использовании. ИМХО
13. artbear 1165 13.12.10 07:47 Сейчас в теме
(9) Структура не так универсальна, как соответствие :(
Ключом структуры не может быть любая строка, а только строка, подходящая для использования в качестве идентификаторе в языке 1С.
т.е. нельзя написать Структура.Вставить("ид с пробелом", 1) или Структура.Вставить("1253", 1) и т.п.
в итоге в реальной жизни Структура слабо применима.
Соответствие надежнее :) + пошустрее будет :)
14. Ish_2 1044 13.12.10 08:03 Сейчас в теме
(13) Ты не погорячился ?
Из твоего поста : Ограничения на значения ключа..Соответствие надежнее.. пошустрее будет ..

Получается что применение структуры избыточно.
Функционал Соответствия полностью покрывает функционал Структуры ,"как бык овцу".
Структура не нужна ? Так ?
15. artbear 1165 13.12.10 08:42 Сейчас в теме
(14) ИМХО конечно, избыточна :)
Возможно, что во внутренностях структуры есть некая оптимизация для использования строк-ключей, но я что-то по тестам ее не замечал :(
12. Арчибальд 2708 13.12.10 07:37 Сейчас в теме
Сам узнал о сравнительной эффективности коллекций из статьи Сергея Осипова
Это то, о чем я подумал, или, пардон, я неправ? :o
16. ildarovich 6793 13.12.10 09:11 Сейчас в теме
17. Арчибальд 2708 13.12.10 09:16 Сейчас в теме
18. Yashazz 2906 13.12.10 09:56 Сейчас в теме
А, снова гений1С... В своё время я замерял на самописной конфе 8.1, так вот структура побыстрее работает, чем соответствие. Точных цифр уже нема, но результат помню. Операций считывания и записи было поровну.
27. Rustig 1221 10.01.11 14:37 Сейчас в теме
...может быть спросить, что "лучше" среди коллекций, у разработчиков 1С, и добавить их ответ в эту статью?
...для нас, внедренцев, платформа - черный ящик. благо, что есть справка по платформе и этот форум. :)
29. Dnki 4 08.05.12 11:49 Сейчас в теме
Спасибо за статью, она избавила меня от экспериментов предполагаемого. Но!
У Соответствия выявилась слабая сторона:
1) В качестве ключа иногда нужен поиск по комбинации нескольких полей. Например: Товар+Склад+Партия.
2) Мне также понадобилось в качестве Значения хранить пару (а может и больше) чисел.
Пытался запихнуть в него Структуру, но отрабатывает молча, а результата не дает, т.к. Соответствие запоминало не копию данных структуры, а ее адрес. В случае с ТЗ для решения задачи я бы создал несколько колонок.

Вывод: Соответствие для простых схем. Или для использования в комбинации с ТЗ.
30. Necytij 22.05.12 23:18 Сейчас в теме
(29) Dnki,
Соответствие не для простых схем. А там где нужно много искать по одноименному ключу.
Две структуры даже с одинаковыми наборами кортежей ключ-значение, различны, как, например, два документа с одинаково заполненными реквизитами. Поэтому соответствие тут ни при чем. )) Тут уже ваша голова подвела.
Если искать нужно по нескольким параметрам, то, пожалуй, лучше индексированная ТЗ. А соответствие полезно там где, нужно часто и быстро находить соответствие одному значению, а если не нужно много раз этого делать и набор данных не ОЧЕНЬ большой, то все равно что пользовать.
Где то встречал совет если не хотите ТЗ, можно сделать соответствием с ключом "значениевстроку(Новый структура("ключ1,..",параметр1,2,..))". Но метод как сейчас показали мне тесты довольно плох. Проигрывает индексированной ТЗ в 1.5-2 раза, хоть обыгрывает не индексированную во столько же.
Заинтересовался немного. Написал обработочку. Берем 1000 поз. номенклатуры, и ищем по совпадении позиций (ссылка, наименование, код). В итоге при поиске 160 000 раз по соответствию получаем около 12.3 сек, из них 10.7 это как раз формирование значениевстроку. Т.е. на сам поиск ушло около 1.5 сек. Для не индексированной ТЗ 18.9 сек. Для индексированной по этим трем столбцам - 5.8 сек.
Для чистоты тут же и обработка.
Прикрепленные файлы:
ПроверкаСоотвПротивИндТЗ.epf
31. Dnki 4 23.05.12 20:16 Сейчас в теме
(30) Necytij, Вы меня просто окрылили! Сами может не подозревая. Значит я на верном пути.
Посмотрел Ваш пример. И мне не понравилось время на преобразование объекта в строку. Поэтому и я протестировал различные варианты и именно этого фрагмента. В файле я привел полный текст (сам отчет не пойдет, у нас разные базы). А коротко, я сравнил именно такие команды:
1) Идентификаторы:
Функция КлючПоискаИдент(П_Товар, П_Склад = Неопределено, П_Партия = Неопределено)
Возврат Строка(П_Товар.УникальныйИдентификатор())+ Строка(П_Склад.УникальныйИдентификатор())+ Строка(П_Партия.УникальныйИдентификатор());


2) В строку
Функция КлючПоискаВстроку(П_Товар, П_Склад = Неопределено, П_Партия = Неопределено)
Возврат ЗначениеВСтрокуВнутр(Новый Структура("Товар,Склад,Партия", П_Товар, П_Склад, П_Партия));

3) В строку, вариация. Сама структура создана вне цикла.
Функция КлючПоискаВстр2(П_Структура)
Возврат ЗначениеВСтрокуВнутр(П_Структура);

Так и есть! ЗначениеВСтрокуВнутр медленнее раза в 2-3 чем сложение идентификаторов. Да и, наверное, строка более длинная.
А вот предположение потерь от создания объекта Структура подтвердилось частично. Время ускорилось лишь на 1/3.

Вывод: Разумеется использование индексированной таблицы более толково, системно. Но комбинированная строка - вполне приемлемо. Особенно, если число обращений невелико.
Прикрепленные файлы:
ПреобразованиеВстроку.txt
32. Necytij 23.05.12 21:12 Сейчас в теме
(31) Dnki,
Не подумал сразу что следует для ускорения вынести инициализацию структуры из цикла. НО все же ваш 3й вариант, не совсем верен, вы в цикле должны были переопределять заново параметры для текущего поиска, вы ведь не одну и ту же позицию искать будете. Так что выигрыш от вынесения из цикла инициализации будет еще меньше чем 1/3. А так удачи вам в созидании отчета. Если будет еще полезная информация по этой теме - поделитесь, пожалуйста...
33. Жолтокнижниг 249 13.11.12 19:29 Сейчас в теме
Каждый тип данных заточен под определенные задачи, и спорить что лучше, что хуже не имеет смысла. Основные преимущества соответствия перед другими(на мой взгляд) почти любой тип ключа и скорость поиска. И исходя из этого надо думать где и как применять.
34. DrAku1a 1305 14.11.12 08:54 Сейчас в теме
Про коллекции и про их быстродействие уже немало сказано:

http://infostart.ru/public/142517/
http://infostart.ru/public/116404/
http://infostart.ru/public/105104/

В двух словах:
Самый быстрый поиск => Соответствие
Моделирование данных* => Структура
Представление пользователю => СписокЗначений, ТаблицаЗначений, ДеревоЗначений
Прочие нужды => Массив.
*-Организованное хранение и удобное обращение в коде к данным как к реквизитам, возможность использовать ЗаполнитьЗначения()

Удобно!
Synoecium; nixel; VZhulanov; wowik; +4 Ответить
35. chemezov 26 22.11.12 09:35 Сейчас в теме
36. mec 22.03.13 10:49 Сейчас в теме
Отличная статья.
Уже много лет кодирую на 1С, но вот соответствиями как-то пренебрегал. Теперь буду стараться чаще его использовать в своих работах. Сергей, спасибо за преподнесенный материал
37. Foma4382 08.08.13 23:27 Сейчас в теме
Познавательная статья. Спасибо!
Оставьте свое сообщение

См. также

Описание формата внутреннего представления данных 1С в контексте обмена данными 153

Статья Программист Внешняя обработка (ert,epf) v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования Внешние источники данных Разработка

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    6864    6    Dementor    27       

Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо

Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.

24700 руб.

Вам нравятся запросы в 1С? 14

Инструменты и обработки Программист Конфигурация (md, cf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования Разработка

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    11381    1    m-rv    79       

1С:Ассемблер. Немного летнего веселья! 314

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования Разработка

Все вы, наверное, слышали, что 1С-ники жалуются на свою систему, считая язык 1С недостаточно низкоуровневым, скучным и т.п. Все они с тоской поглядывают в сторону "настоящих" языков программирования. Так вот, господа, они неправы. В системе 1С есть места, где можно размять программерский мозг и получить удовольствие от низкоуровневой техники. Предлагаю вам погрузиться в недра виртуальной машины 1С и понять, как она работает. Там есть свой "ассемблер" и мы попробуем его в действии!

1 стартмани

21.06.2019    16001    50    Evil Beaver    116       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Простые примеры сложных отчетов на СКД 270

Статья Программист Архив с данными v8 v8::СКД 1cv8.cf Абонемент ($m) Практика программирования

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    15752    11    Hatson    22       

Безопасная работа с транзакциями во встроенном языке 190

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    17665    8    tormozit    44       

Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо

Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!

29700 руб.

Баг или фича? Неожиданное поведение платформы 172

Статья Системный администратор Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования Тестирование и исправление Разработка

Рассмотрим несколько случаев неожиданного поведения платформы 1С, а также что с этим можно cделать.

18.02.2019    13960    32    YPermitin    88       

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 562

Инструменты и обработки Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

1 стартмани

31.01.2019    31250    281    bonv    117       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX 172

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Универсальные обработки Практика программирования Разработка

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    15946    66    Synoecium    37       

Отладка сложных отчетов на СКД 140

Отчеты и формы Программист Расширение (cfe) v8 v8::СКД 1cv8.cf Россия Абонемент ($m) Практика программирования

Расширение для отладки сложных отчетов на СКД (в т.ч. для собираемых программно "на лету") и быстрого перехода к отладке таких отчетов в консоли запросов и отчетов на СКД.

1 стартмани

28.12.2018    15759    61    maxx    56       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Реализация простого http-сервиса "Просмотр карточки номенклатуры(товара) в браузере" 144

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Практический пример реализации простого http-сервиса средствами 1С Предприятие 8.3. Обеспечивает просмотр списка товаров и просмотр данных товара в браузере.

1 стартмани

07.12.2018    14859    10    dmitry1975    31       

Использование подсистемы БСП "Заполнение объектов" 135

Статья Программист Расширение (cfe) v8 v8::УФ 1cv8.cf Россия Абонемент ($m) Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем)

Применение механизмов БСП для добавления новых команд заполнения к формам различных объектов. Использование расширений конфигурации для доработки. Шаблоны для реализации собственных команд заполнения.

1 стартмани

23.11.2018    15163    8    ids79    22       

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

Работа с публикациями "Инфостарт" 14

Инструменты и обработки Программист Архив с данными v8 УУ Абонемент ($m) Практика программирования О сообществе WEB

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    10753    10    RocKeR_13    16       

HTTP Сервисы: Путь к своему сервису. Часть 3 138

Инструменты и обработки Системный администратор Программист Расширение (cfe) v8 1cv8.cf Абонемент ($m) Инструментарий разработчика Практика программирования

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    18488    32    dsdred    13       

Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!

29700 руб.

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции 65

Инструменты и обработки Программист Бизнес-аналитик Приложение (apk) v8 Windows Абонемент ($m) Инструментарий разработчика Практика программирования

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    17377    23    informa1555    26       

Работа с данными выбора 41

Инструменты и обработки Программист Архив с данными v8 Россия Абонемент ($m) Практика программирования Работа с интерфейсом

В управляемом интерфейсе заложена мощная возможность описывать связи реквизитов формы через параметры. Установка параметров связей позволяет ограничить выбор данных так, чтобы целостность данных была обеспечена на этапе ввода. Однако без дополнительного программирования задать можно только самые простые связи. Такие условия связи, как зависимость от реквизита через точку или зависимость через дополнительное отношение, заданное в регистре сведений - уже задать без программирования не получится.

1 стартмани

17.07.2018    24359    14    kalyaka    15       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

HTTP Сервисы: Путь к своему сервису. Часть 1 287

Статья Системный администратор Программист Расширение (cfe) v8 1cv8.cf Абонемент ($m) Практика программирования WEB

Уже много было написано про http-сервисы, но то и дело всплывают «Новые» статьи по обмену между базами V8 по COM, что «Немножко» удивляет. Решил внести свои 5 копеек, поработаем с http-сервисом.

1 стартмани

15.07.2018    43159    17    dsdred    22       

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") 105

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    21002    86    m-rv    57       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.

19700 руб.

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному 242

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования БСП (Библиотека стандартных подсистем)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    29554    28    dsdred    34       

1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.

6500 рублей

Как выполнить отчет на СКД через COM и получить данные отчета? 86

Статья Программист Архив с данными v8 УПП1 Россия Windows Абонемент ($m) Практика программирования

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    19117    10    wowik    3       

Работа со схемой запроса 176

Статья Программист Конфигурация (md, cf) v8 v8::Запросы Абонемент ($m) Инструментарий разработчика Практика программирования

Стандартом взаимодействия с реляционной базой данных стал язык SQL. Приемником SQL в 1С является язык запросов. Язык запросов, также как и SQL, является структурированным. Составляющие структуры запроса отвечают на разные вопросы о том, какие данные требуется получить и какие манипуляции с множествами данных необходимо произвести при получении. В простых случаях текст запроса можно написать вручную, однако в сложных случаях, а также при программном формировании, - лучше воспользоваться объектной моделью запроса и использовать объект "Схема запроса". В статье дается описание объектной модели и особенностей работы с ней, а также приводится решение, упрощающее взаимодействие с объектом "Схема запроса".

1 стартмани

24.04.2018    30372    75    kalyaka    34       

Базовый курс для начинающих 1С-программистов. Пятый поток. Онлайн-курс с 12 февраля по 15 апреля 2020 г. Промо

Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.

4500/9500 рублей

Асинхронная запись и чтение файла без использования модальных методов и временных файлов 134

Статья Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Практика программирования

В статье рассмотрено решение задачи формирования и записи файла на основе данных информационной базы. Формирование происходит на стороне сервера с помощью механизма потоков. Используются асинхронные методы передачи файлов между клиентом и сервером. Также рассмотрено решение обратной задачи - чтение файла и запись его данных в информационную базу. Статья ориентирована прежде всего на новичков, также приведенный код может использоваться в качестве шаблона.

1 стартмани

10.04.2018    20107    18    Alxby    23       

Заполняем по шаблону (по умолчанию) 69

Инструменты и обработки Программист Архив с данными v8 v8::УФ 1cv8.cf Абонемент ($m) Практика программирования

Простой в подключении, универсальный и достаточно удобный механизм заполнения реквизитов произвольных документов/справочников значениями по умолчанию. Реализован в расширении, но может быть и непосредственно включен практически в любую конфигурацию на управляемых формах простым копированием одной формы и двух команд. Весь код в статье.

1 стартмани

08.02.2018    18872    20    mvxyz    17       

Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.

29700 руб.

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов 124

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    26573    62    rpgshnik    46       

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула 8

Отчеты и формы Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) Печатные формы документов Практика программирования Универсальные функции

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    24867    21    agent00mouse    0