О несоответствии Соответствия

26.12.25

Разработка - Механизмы платформы 1С

Производительность платформы как она есть: Соответствие в веб-клиенте тратит O(N) на поиск/вставку элемента по ключу вместо положенных O(1). Ждём сортировку "пузырьком"? 🤦
 
 Нафига оно вообще надо
 
 Про структуры данных
 
 Остап чтил уголовный кодекс 


Некоторое время назад зарубился с участником форума starik-2005 по поводу эффективности массивов и структур/соответствий в 1С. В процессе пришлось накидать тестовые сценариии для различных структур/операционных систем/платформ/клиентов. И, внезапно, была обнаружена ацкая просадка Соответствия в веб-клиенте. Пришлось копнуть эту субстанцию чуть глубже и обнаружилось, что: 

Соответствие в веб-клиенте 1С реализовано через массив {key, value}[]

  • Поиск по ключу занимает O(N)
    Они тупо перебирают весь массив в поиске ключа
  • Вставка элемента занимает O(N):
    Перед вставкой идут (линейно) по массиву, смотрят, что там нет нового значения и после этого наконец вставляют это новое в конец коллекции. 
    Для добавления N элементов в пустое Соответствие получится 1 + 2 + ... N = O(N²). Квадрат, Карл!

В древнючем Лиспе, который весь такой целиком из скобочек, hash tables вполне себе были каноническими O(1) на все операции, вставка N элементов была прямо пропорциональна N

 
 Какие ваши доказательства?

Делаем пустую тестовую базу, вешаем куда-нибудь следующию код (я сделал пустой справочник и повесил кнопку в форму списка. просветите нуба, как сделать проще)

&НаКлиенте
Процедура НесоответствиеСоответствия(Команда)
    Соответствие = Новый Соответствие();
    Соответствие.Вставить("100500", 100500);
    Соответствие.Вставить("100501", 100501);
    Соответствие.Вставить("100502", 100502);
    Соответствие.Вставить("100503", 100503);    
КонецПроцедуры

Поднимаем локальный апач(тут можно отдельную статью запилить, как это правильно сделать, чтобы оно подтянуло локальную community лицензию))), запускаем это щастье в браузере.
Открываем dev tools -> debugger, открываем scripts/mod_main_mainform.js?sysver=8.3.25.1520, жмем "pretty print". Эта сцука, ессно, обфусцирована, некоторое время пришлось потратить на поиск сути. Там много интересного, но щаз речь о следующем:  

Ищем ZS.prototype.Xd = function (a) {

Это прямо оно, то самое, которое делает Соответствие.Вставить(). Видим, что оно вызывает nvc(this, a)...

Ищем "function nvc(a, b) {".

Видим, что оно тупо идет в цикле по массиву(крайне криво идет, но это спишем на  webpack) и ищет там ключ. Ставим breakpoint, жмем заветную кнопку.

Переходим на закладку Console, смотрим что там у нас в этом "a"

И таки да, это дикая дичь, которая хранит ключи и значения в массиве items. ЧТД, расходимся.

 

P.S. Для произвольной платформы поиск нужной обфусцированной функции такой:
запускаем поиск по "Вставить" в файле mod_main_loader.js?sysver=<тут будет ваша версия платформы>
оно даст несколько вхождений, дальше надо посмотреть глазами и понять, где речь про описание объекта Соответствие. Можно не вникать, а поставить брекпоинты вообще на всех найденных строках. Жмем кнопку "НесоответствиеСоответствия", проваливаемся в дебагер и вперед...

Есть ли у кого-то идеи, зачем оно так сделано в вебе, когда в js есть нативные объекты, которые суть hash tables?  

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    26693    TitanLuchs    106    

146

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    14772    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    16345    user2122906    9    

60

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    26855    dsdred    77    

143

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    24707    bayselonarrend    22    

175

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    13586    dsdred    22    

85
Отзывы
20. SerVer1C 998 29.12.25 09:18 Сейчас в теме
(16) Публикация НЕ о правильности обрабатывать документы на клиенте, а о том, что структура хранения данных или коллекция значений (в терминах 1с) "Соответствие" на веб клиенте НЕ является хэш-таблицей, как заявлено. Т.е. поведение соответствия на веб клиенте не соответствует таковому на обычном клиенте/сервере. Доступы к элементам происходят за O(N) и за O(1) соответственно на разных системах исполнения кода. Это лютая жесть и про это надо срочно писать в саппорт фирмы 1с !!!
ansverrr; kalyaka; kako1toxren; ivanov660; qwinter; Cocky_Idiot; +6 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 998 26.12.25 11:57 Сейчас в теме
Да уж.... Это фиаско
Пора уже заставить разрабов платформы читать умные книги
10. qwinter 683 28.12.25 09:01 Сейчас в теме
(1) Им некогда, они заняты важным делом: проектируют интерфейс замедляющий работу пользователей.
Dmitryiv; jan-pechka; ivanov660; lostcay; pkorneenko; maksa2005; t278; +7 Ответить
2. AntonProgma 50 27.12.25 09:32 Сейчас в теме
3. gybson 27.12.25 15:39 Сейчас в теме
Один раз перебрать весь массив это и есть O(1)
4. SerVer1C 998 27.12.25 15:43 Сейчас в теме
(3) не пишите ерунду
5. gybson 27.12.25 15:56 Сейчас в теме
(4) ну будем реалистами
не будет здесь реального О(1) никогда и обещать его странно
7. Cocky_Idiot 33 27.12.25 17:13 Сейчас в теме
(5)
Странно писать чушь и публично демонстрировать собственную некомпетентность.
А обещать О(1) - как раз нормально.
8. gybson 27.12.25 19:45 Сейчас в теме
(7) для структуры может быть, но для соответствия это может быть большой проблемой

ну не смогли для веб-клиента сделать 100% гарантию, что там всегда будет хешируемое значение
25. starik-2005 3209 29.12.25 10:52 Сейчас в теме
(7)
А обещать О(1) - как раз нормально.
Да там далеко не О(1) (не, бывает, конечно, что и О(1), но редко, особенно при интенсивном использовании, но если хранить там пару ключей - да, но тут и массива хватит). Мы ж с тобой разбирались уже.
6. Cocky_Idiot 33 27.12.25 16:02 Сейчас в теме
(3)
Тонковато для сарказма. Или вы все-таки серьезно?
9. пользователь 28.12.25 09:00
Сообщение было скрыто модератором.
...
11. user_1880116 28.12.25 22:39 Сейчас в теме
Отчет требуется обрабатывать построчно, создавая новый документ "заказ" для каждой строки.

Осталось понять, нахера это надо делать на клиенте. Тем более на веб-клиенте.
Best40000; alex_sayan; +2 2 Ответить
12. Cocky_Idiot 33 28.12.25 23:12 Сейчас в теме
(11)
Осталось понять, почему вы решили, что кто-собирается создавать заказы на клиенте, тем более на веб-клиенте ;)

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

P.S. А на клиенте - потому что я не собираюсь гонять на сервер и обратно ненужные мегабайты данных из внешнего АПИ. Я их отвалидирую на клиенте, консолидирую данные, переложу их в структуру, удобную серверу, дам пользователю возможность посмотреть/поправить/поменять данные, и, наконец-то отдам серверу чистые данные, на основании которых сервер создаст нужные документы. Все, что может быть сделано на клиенте - делаем на клиенте. Сервер беспокоим только тогда, когда без него никак.
14. alex_sayan 69 29.12.25 07:27 Сейчас в теме
(12)
не собираюсь гонять на сервер и обратно ненужные мегабайты данных из внешнего АПИ

Любые прикладные данные могут попасть на клиента только с сервера. Так что гоняние мегабайтов тут как раз обеспечено
18. Cocky_Idiot 33 29.12.25 09:06 Сейчас в теме
(14)
HTTPЗапрос на клиенте отменили?
28. alex_sayan 69 29.12.25 13:20 Сейчас в теме
(18) зачем его выполнять на клиенте? Один фиг результат http-запроса будет утащен на сервер
user_1936660; +1 Ответить
42. Cocky_Idiot 33 29.12.25 19:22 Сейчас в теме
(28)
Навсидку:

- Этикетка маркетплейса на грузовое место, которую надо напечатать на клиенте, наклеить на коробку и забыть про нее навсегда. Зачем она может понадобиться на сервере?
- Данные сервиса проверки контрагентов вам зачем на сервере? Можно, конечно придумать сценарий, но чаще всего результат его вызова - это просто плашка-алерт в интерфейсе пользователя.

Есть масса сценариев, когда можно(и нужно) лишний раз не грузить сервер и спокойно все сделать на стороне клиента.
jan-pechka; artbear; SerVer1C; +3 Ответить
45. alex_sayan 69 30.12.25 05:04 Сейчас в теме
(42)
Есть масса сценариев, когда можно(и нужно) лишний раз не грузить сервер и спокойно все сделать на стороне клиента

Что-то я не вижу в этих сценариях места проблемам с соответствием. Там соответствия либо не будет, либо оно будет маленьким, и заведомо никаких проблем не вызовет.

Данные сервиса проверки контрагентов вам зачем на сервере?

Нам понадобилась. Мы делали автоматические проверки, с сохранением результатов.

Ну вот всё равно, подавляющее большинство вариантов работы с http это получить и конвертировать какие-то данные, либо серелизовать и отправить какие-то данные, то есть заведомо нужен сервер. Лично я сколько работал с http, у меня даже мысли не возникло делать это на клиенте
49. Cocky_Idiot 33 01.01.26 18:46 Сейчас в теме
(45)
С Новым Годом!

Понимаю, что скорее всего будет отсылка на NDA/неразглашение, но таки спрошу: зачем вы храните ответ сервиса проверки контрагентов в БД?

Если есть возможность, объясните, плиз, в каком сценарии эти сохраненные данные могут понадобиться бизнесу?
53. alex_sayan 69 02.01.26 08:58 Сейчас в теме
(49) данные по контрагентам могут меняться, то что в сервисе сравнивается с тем что в БД и при необходимости корректируется
55. Cocky_Idiot 33 04.01.26 02:27 Сейчас в теме
(53)
Зачем? В каком сценарии оно может понадобиться бизнесу?
56. alex_sayan 69 08.01.26 20:32 Сейчас в теме
(55) сравнили, исправили реквизиты (если нужно), сохранили элемент справочника и забыли
29. user_1936660 29.12.25 14:07 Сейчас в теме
(18)
отменили
Сделали слабо пригодным.
Прикрепленные файлы:
alex_sayan; Sashares; +2 Ответить
57. ONLYTILT 26 15.01.26 10:22 Сейчас в теме
(29) 1С тут не причем, это ограничение браузеров. Правда с терминологией у них беда как обычно, ограничения накладываются Same Origin Policy, а CORS как раз способ обхода этих ограничений
15. user_1880116 29.12.25 07:41 Сейчас в теме
(12)
почему вы
А на клиенте - потому что я
Л -> Логика.
13. alex_sayan 69 29.12.25 07:21 Сейчас в теме
... тут какая-то бизнес-логика, требующая вызова серверной процедуры для каждой строки отчета

На клиенте никакой бизнес-логики быть не должно
user_1880116; +1 3 Ответить
16. user_1880116 29.12.25 07:46 Сейчас в теме
Автор не осилил показать пример на синтетике, пришлось выдумывать (или, что еще забавнее, хвастаться своим) практическую задачу. И внезапно раскрылся.
17. Cocky_Idiot 33 29.12.25 09:04 Сейчас в теме
(16)
У меня по графику кормление троллей - последнее воскресенье месяца.
Если реально голодны - маякните, и 25 января накину вам еды.
19. user_1880116 29.12.25 09:10 Сейчас в теме
(17)
У меня
Да ты уже всё продемонстрировал что мог, спасибо. Дальше мы без тебя уж обойдемся
21. user_1936660 29.12.25 09:23 Сейчас в теме
(17)
маякните
Боженьки, как же ты предсказуем.
Вступить в диалог и тут же внести автора в чёрный список, чтобы оставить последнее слово за собой, это очень свежий прием, несомненно.

В сухом остатке.
Есть особенности реализации виртульной машины языка 1С в веб-клиенте на javascript. При грамотной архитектуре и разработке, учитывающей, что на той стороне может быть, например, дохлый телефон на андроиде, это не имеет никакого значения.
50. Cocky_Idiot 33 01.01.26 19:10 Сейчас в теме
(21)
Боженьки, как же вы непоследовательны - последнее слово было как раз за вами:
(19)
Дальше мы без тебя уж обойдемся

А второй аккаунт - очень свежий прием, несомненно. Подтверждает, что в ЧС вас вносят регулярно, ибо лень кормить.

В сухом остатке: на дохлом телефоне на андроиде эти ваши виртуальные машины в веб-клиенте просто не заведутся. Проблемы Соответствия там будут на предпоследнем месте, это действительно не имеет никакого значения.
20. SerVer1C 998 29.12.25 09:18 Сейчас в теме
(16) Публикация НЕ о правильности обрабатывать документы на клиенте, а о том, что структура хранения данных или коллекция значений (в терминах 1с) "Соответствие" на веб клиенте НЕ является хэш-таблицей, как заявлено. Т.е. поведение соответствия на веб клиенте не соответствует таковому на обычном клиенте/сервере. Доступы к элементам происходят за O(N) и за O(1) соответственно на разных системах исполнения кода. Это лютая жесть и про это надо срочно писать в саппорт фирмы 1с !!!
ansverrr; kalyaka; kako1toxren; ivanov660; qwinter; Cocky_Idiot; +6 Ответить
22. user_1936660 29.12.25 09:24 Сейчас в теме
(20)
надо срочно
Займешься? Ответ от них тогда сюда сбрось, пожалуйста.
23. SerVer1C 998 29.12.25 09:26 Сейчас в теме
(22) К сожалению, у меня нет туда доступа, а то бы я их там всех.... А вот у кого есть, обязательно пишите. Молчаливое кивание гривой НЕ изменит ситуацию.
24. starik-2005 3209 29.12.25 10:47 Сейчас в теме
(20)
Это лютая жесть
Нельзя не согласится.
про это надо срочно писать в саппорт фирмы 1с
Да они вроде бы читают этот сайт - он наполовину их.

Это как наличие ТЗ и ДЗ на клиенте с сериализациями и всем таким прочим, но политически так заведено, что между клиентом и сервером они не ездят.

Вообще, https://habr.com/ru/companies/timeweb/articles/828068/ - тут про реализацию хеш-таблицы в js, если по какой-то причине не хватает встроенных (map/set) - они, кстати, в 1С работают. Пусть почитают товарищи с 1Са.
Cocky_Idiot; VyacheslavShilov; +2 Ответить
26. user_1936660 29.12.25 10:54 Сейчас в теме
(24)
наличие ТЗ и ДЗ на клиенте
Это не политика, на веб клиенте их нет. Так что это артефакт наборот - на тонком можно втихую создать.
27. starik-2005 3209 29.12.25 10:56 Сейчас в теме
(26)
на веб клиенте их нет
Ужос-кошмар-памагите...
pkorneenko; +1 Ответить
30. Sashares 33 29.12.25 15:09 Сейчас в теме
(24)
Да они вроде бы читают этот сайт - он наполовину их.

Разработчики платформы свой форум то не всегда читают, а ты про инфостарт.
user_1936660; +1 Ответить
32. starik-2005 3209 29.12.25 15:31 Сейчас в теме
(30)
Разработчики
Ну разработчики - ладно, вряд ли они сами себе задачи ставят, а вот какие-нить менеджеры чего-то там типа проекта может и читнут за чашкой какава с зефирками.
31. awk 745 29.12.25 15:20 Сейчас в теме
Влепил минус за натягивание совы на глобус. А конкретно, за неправильную постановку задачи, и удивление результату.
Best40000; +1 3 Ответить
33. starik-2005 3209 29.12.25 15:33 Сейчас в теме
(31)
за неправильную постановку задачи
А что за постановка? Статья, конечно, противоречивые чувства вызывает. Но зато оформлена хорошо.
34. awk 745 29.12.25 15:46 Сейчас в теме
(33) От тебя не ожидал "за" за статью. Ты понимаешь:
1. Что "Создание документов и кэширование артикулов" должно идти на сервере, а не на клиенте. Там C++, а не JS.
2. Согласно https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Data_structures, в JS не гарантируют O(1), а приблизительно гарантируют O(log n).
3. И вишенкой на торте у 1С в документации не написано, что это hashtable или hashmap. Мы только подозреваем это.
jan-pechka; Best40000; +2 1 Ответить
35. starik-2005 3209 29.12.25 16:10 Сейчас в теме
(34) Ну про 1 - ежу понятно. Я тут не особо топлю за автора, скорее за тему.
2. Любая хеш-таблица - это компромисс между количеством памяти и быстродействием. Народ иногда шутит, что лучший архиватор - md5, но некоторые из этого народа даже не в курсе, что два разных значения могут породить один и тот же хеш. А хеш-таблица просто берет несколько бит из этого условного md5 (хеш-функции) и использует их в качестве индекса бакета. Когда бакет заполняется происходит рехеширование - далеко не бесплатная операция, суть которой в том, что вместо Х бит теперь используется Х+1 бит. И да, в идеальной ситуации у нас будет О(1), но в жизни все иначе. Но и в жизни ситуация, где будет О(log2N), будет далеко не каждый раз. Скорее для ряда значений. Об этом мы с автором, кстати, когда-то и спорили.
3. У 1С вообще все плохо с документацией. Да и вообще многим кажется, что расчет хеша - операция бесплатная. Но на современных процессорах при больших объемах данных расчет хеша все-же быстрее, чем поиск в дереве.
43. Cocky_Idiot 33 29.12.25 20:20 Сейчас в теме
(34)
1. Что "Создание документов и кэширование артикулов" должно идти на сервере, а не на клиенте. Там C++, а не JS.

Статья немного не об этом. А в примере речь об том, что Соответствие - правильная структура для кэширования.

(34)
2. Согласно https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Data_structures, в JS не гарантируют O(1), а приблизительно гарантируют O(log n).

Ресурс, конечно, авторитетный. Но давайте обратимся к стандарту ecmascript: Maps must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection.
Нет там про логарифм ни слова, зато есть sublinear. Логарифм, ессно, лучше, чем O(N), но утверждать, что мэпы на js "приблизительно гарантируют O(log n)" никак нельзя, оно зависит от реализации.

В v8 (chrome, nodejs) они, например, O(1). Описание структуры тут , разбор на Хабре - здесь.

(34)
3. И вишенкой на торте у 1С в документации не написано, что это hashtable или hashmap. Мы только подозреваем это.

Да, уж, тут не поспоришь, вы абсолютно правы.
44. Cocky_Idiot 33 30.12.25 00:53 Сейчас в теме
(34)
И, кстати, вы слегка передергиваете: никакого С++ на сервере нет. Есть виртуальная машина, написанная на С++, которая занимается интерпретированием кода 1С(ну или, для любителей строгих формулировок, выполнением на этой машине скомпилированого байт-кода 1С). Код этой машины закрыт, о качестве можно судить только по косвенным признакам.

Так-то и js на C++ исполняется.
46. alex_sayan 69 30.12.25 05:07 Сейчас в теме
(44) на сервере Соответствие работает отлично, проверено много раз на больших данных
47. alex_sayan 69 30.12.25 05:08 Сейчас в теме
(44)
Так-то и js на C++ исполняется.

Да ладно?
36. SerVer1C 998 29.12.25 16:34 Сейчас в теме
(31) да что вы, блин, несёте? Применяю соответствие в каждой второй своей публикации, и понимаю, что оно в *цать раз будет быстрее любой другой коллекции в 1с. Алгоритмов можно множество придумать, где надо именно на клиенте обработать. А когда выходит такая подстава на веб-клиенте, что взаимодействие с соответствием занимает внезапно несколько часов, а не секунду, то начинаешь нервничать. И не надо топить, что тут JS виноват - он всего лишь на порядок медленнее плюсов. Я согласен бы подождать 10 сек, а не 1 сек, но получить гарантированный и ожидаемый результат от соответствия в своём алгоритме, а не смотреть в зависший браузер, матерясь на платформу.
kalyaka; jan-pechka; Cocky_Idiot; +3 1 Ответить
37. awk 745 29.12.25 17:02 Сейчас в теме
(36) Можно реальный пример, без нарушения стандартов разработки, когда у соответствия будет больше 10000 тысяч ключей, ну что бы гарантированно веб завис.
Best40000; user_1936660; +2 Ответить
38. Cocky_Idiot 33 29.12.25 18:27 Сейчас в теме
(37)
Всю статью можно уместить в одном предложении: "Соответсвие в веб-клиенте реализовано через массив, работает неэффективно, имеет O(N) на поиск по ключу".

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

Различных кросс-компиляторов в JS полно. Обычно все справляются, и нативный hash table на вебе превращается в аналогичную по O-сложности структуру на JS. 1С не смогла.
40. user_1936660 29.12.25 18:31 Сейчас в теме
(38)
Различных кросс-компиляторо
У 1С там не кросс компилятор, а полноценная виртуальная машина, выполняющая опкоды. Иначе бы закрытые модули не работали и тебе пришлось бы писать другую статью
51. Cocky_Idiot 33 01.01.26 19:29 Сейчас в теме
(40)
Полноценную виртуальную машину смогли, а хэш-таблицу на ней не осилили?
Про опкоды оно знает, а про хотя бы отсортировать массив по ключам и сделать логарифм не в курсе. Босота...
48. awk 745 30.12.25 09:37 Сейчас в теме
(38) О всей 1С можно сказать: "Веб клиент 1С - это эрзац инструмент и требует отдельного проектирования для нормальной работы".
52. Cocky_Idiot 33 01.01.26 20:16 Сейчас в теме
(48)
sed 's/Веб клиент //g'
39. user_1936660 29.12.25 18:29 Сейчас в теме
(36)
взаимодействие с соответствием занимает внезапно несколько часов
А приведи, пожалуйста, пример реальной задачи, в которой будет использоваться соответствие. От которого ты, вооруженный знаниями этой статьи, ожидаешь времени выполнения в несколько часов.
G_113175999039825682603; +1 1 Ответить
41. пользователь 29.12.25 19:01
Сообщение было скрыто модератором.
...
Для отправки сообщения требуется регистрация/авторизация