Еще 10 мифов о платформе 1С

08.10.25

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

Что работает быстрее – http- или web-сервисы? Действительно ли снижается нагрузка на сервер при использовании веб-клиентов? Каковы преимущества использования микросервисов в 1С? Что лучше – XML или JSON? И почему перепроведение одним сотрудником документов на файловой базе, опубликованной на веб-сервере, подвешивает работу остальных пользователей? Докопаемся до сути и разберемся, что скрывает в себе платформа 1С.

Продолжим тему предыдущего доклада «15 мифов в платформе 1С» и дополним его еще десятком новых проверок и исследований платформы.


Миф №1. «""+Строка(Ссылка)» медленнее, чем «""+Ссылка»
Подтверждено


Считается, что за счет двойного преобразования к типу «Строка» вариант «""+Строка(Ссылка)» будет работать медленнее, чем «""+Ссылка».

 


Давайте разберемся – когда вообще используется конструкция «""» (две кавычки), и для чего она может понадобиться?

Когда 1С обрабатывает сложение значений, она сначала получает первое значение и определяет его тип, а потом пытается привести к тому же типу все остальные суммируемые. То есть, когда мы используем «""+Ссылка» для второго значения происходит неявное преобразование к строке. Таким образом теоретически никакого замедления быть не должно, потому что в обоих случаях происходит преобразование к строке.

Но когда мы проверили время выполнения каждого варианта, результат оказался такой, как на слайде – скорость работы второго варианта незначительно, но все-таки медленнее.

Мы считаем, что это происходит из-за двойного преобразования к строке и наличия в коде дополнительного оператора – на его выполнение тратится время. Небольшое, но, тем не менее.


Миф №2. Расширения работают медленнее
Подтверждено


Мы уже обсуждали миф о том, что один и тот же код, вынесенный во внешнюю обработку, работает медленнее, чем в случае его добавления в конфигурацию. И это оказалось действительно так.

 

 

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

А теперь по просьбам сообщества разбираемся, как обстоят дела у расширения.

 

 

В первый раз мы запустили этот код в конфигурации, во второй раз – в расширении, а в третий раз – во внешней обработке. И получили такой результат: код в расширении выполняется на 5,78% медленнее, а во внешней обработке – еще медленнее.

И этому есть реальное объяснение, которое дается на сайте ИТС в статье https://its.1c.ru/db/metod8dev/content/5940/hdoc.

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

 

 

И если запустить нагрузочный тест на 100 пользователях, для каждого из которых последовательно вызываются пустые методы модуля обработки (32000 строк) и модулей 120 ее различных форм, расширение покажет на 39% больше загрузку процессора и замедление времени выполнения на 26%. Поэтому миф считается подтвержденным.

Фирма «1С» исходя из этого дает следующую рекомендацию:

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


Миф №3. Использование http-сервисов снижает нагрузку на сервер
Подтверждено
 


Когда пользователи подключаются к 1С через обычный тонкий клиент, на каждого из них создается по отдельному сеансу, имеющему определенные числовые характеристики – количество переданных данных, объем занятой памяти, время вызовов и т.д.
 


Но если такой же пользователь зайдет через HTTP-сервис, для него будет создан сеанс с видом «Модуль расширения веб-сервиса», у которого потребление данных на одного пользователя значительно меньше.

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


Представьте, что ваш сервер – это кафе, в котором есть всего четыре места под кассы.

Кассиров там изначально нет.
 


В кафе заходит первый посетитель – он подходит к кассе и вызывает кассира. Чтобы кассир вышел и касса заработала, необходимо некоторое время.
 


Кассир обслужил посетителя, но не уходит, а остается на кассе в ожидании следующих гостей.
 


И когда приходит другой клиент, касса готова его обслужить сразу.

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


Если посетителей становится больше, открываются новые кассы.
 


Так происходит до тех пор, пока все кассы не будут заняты.
 


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


С точки зрения пользователя компьютера это выглядит так: вы пытаетесь выполнить команду, на экране крутится индикатор загрузки, но никаких действий не происходит.
 


Теперь давайте посмотрим, как это можно визуально изобразить уже применительно к HTTP-сервисам. Представим, что у нас есть некий сервер, который способен одновременно обслуживать не более 4 сеансов.

Когда к HTTP-сервису обращается пользователь или внешний сервис, выполняется запрос, длительность выполнения которого составляет, допустим, 6 единиц времени.

Какое-то время пользователь ждет, а затем выполняет к сервису второй и третий запрос.

То есть, в случае, когда с сервисом работает один пользователь, загрузка сервера распределяется так: запрос-пауза-запрос-пауза-запрос и так далее.
 


Работа с сервисом нескольких пользователей будет выглядеть примерно так.

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


Если же несколько пользователей отправляют запросы сервису одновременно, то поднимается второй сеанс, третий и так далее.

Количество сеансов в диспетчере задач начинает увеличиваться. И когда “придет пятый посетитель”, он просто не поместится. Ему придется подождать, пока один из сеансов не освободится, и тогда за тем сеансом, который закончил работу быстрее других, следом пойдет сеанс пятого пользователя.

То есть, все запросы выстраиваются в очередь. Это важно. И время, обозначенное здесь черным квадратиком – это время, которое ему придется подождать, в это время у него там будет отображаться индикатор загрузки.
 


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

А теперь представьте, что будет, если тысяча пользователей просто зайдет в обычный тонкий клиент, даже ничего там не делая – сколько они займут при этом памяти на сервере. Поэтому, однозначно, миф считается подтвержденным.

Причем работу HTTP-сервисов можно ускорить еще сильнее, если:

  • увеличить ресурсы сервера;

  • сократить количество запросов;

  • уменьшить время выполнения каждого запроса
     


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

Сокращение количества запросов также дает ощутимый эффект, потому что каждый Http-запрос, помимо передачи полезных данных, тратит время на установку соединения – оно здесь помечено заштрихованными промежутками. То есть, если пользователь записывает документ и относящиеся к нему файл с картинкой отдельными запросами, это создает избыточные задержки. А если объединить эти три запроса в один, можно сэкономить время на соединении – в приведенном примере выигрыш составил две единицы времени. На первый взгляд это немного, но именно этих двух единиц не хватило предыдущему клиенту, чтобы получить результат без ожидания. Поэтому такая оптимизация тоже позволяет ускорить запросы и улучшить удобство работы пользователей.
 

Миф №4. Http-сервисы оптимальнее web-сервисов
Подтверждено с оговорками
 


Нельзя однозначно сказать, что http-сервисы лучше web-сервисов. Это равнозначно ответу на вопрос: «Что вкуснее – пельмени или торт Наполеон?» Мне нравится и то, и другое: пельмени на второе, торт – на десерт. То же самое и с сервисами.
 


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

Но в web-сервисах есть проверка параметров и возвращаемых значений, там можно установить запрет возврата пустых значений – анализируется, что подано в качестве параметров и что будет получено в качестве результата. В http-сервисах этого нет.

Поэтому:

  • Web-сервисы нужно использовать, когда требуется поддержка стандартов и строгая структура, а также при взаимодействии 1С с другими базами на 1С.

  • А http-сервисы – при работе с внешними веб-приложениями
     


Допустим, у нас есть web-сервис, который просто возвращает значение, принимая на вход один параметр указанного типа. Причем мы прямо в конфигурации можем указать, какого типа должен быть параметр и возвращаемое значение.

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

Это удобно для обычных 1С-ников – именно поэтому они любят использовать web-сервисы. Если выставить наружу веб-сервис, можно быть уверенным, что в него на вход не попадет ничего неподходящего: платформа сама проверяет корректность параметров и избавляет от необходимости писать дополнительный код для их валидации и обработки.
 


Если подать на вход такому методу web-сервиса два параметра, мы получим сообщение об ошибке.
 


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


На слайде приведена цитата с одного из форумов, где четко описано, в чем состоит различие между web-сервисами и http-сервисами. Обратите внимание на важное замечание в конце: «Web-сервис – это всего лишь частный случай http-сервиса, а именно - это POST-запрос строго определенного формата».
 


А вот так выглядит работа с http-сервисами: все данные, которые нам попадают на вход, мы должны проверять сами. Собираем всю информацию из параметров, из тела запроса, из заголовков – и потом с этим работаем. Да, при работе с внешними приложениями это дает интеграции определенную гибкость в качестве преимущества.

Но важно помнить: нельзя однозначно утверждать, что http-сервисы оптимальнее web-сервисов. Преимущество http-сервисов только в объеме передаваемых данных. А реальная оптимальность метода обмена информацией определяется не только скоростью, но и другими зачастую более значимыми факторами. Поэтому здесь решение остается за разработчиком: в одних случаях удобнее применять web-сервисы, в других – http-сервисы.
 

Миф №5. При передаче данных между базами 1С через http и web-сервисы обязательно преобразование данных в тип «Строка»
Не подтверждено


Считается, что при обмене данными между базами 1С через http- и web-сервисы обязательно преобразовывать все значения в строковый тип. Давайте разберемся, правда ли это необходимо.
 


Возьмем предыдущий пример и немного его модифицируем: поменяем тип возвращаемого значения для функции GetVersion со строки на ValueStorage – теперь функция GetVersion возвращает массив, в котором есть строка, число и ссылка на справочник «Номенклатура».
 


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

Конечно, чтобы ссылка была передана корректно, базы должны быть идентичными (например, копии одной и той же базы). Если в другой базе уже есть эта ссылка, мы ее получим, и нам не потребуется никакого преобразования значений. А это очень большой плюс для обменов между базами 1С – достаточно просто поднять web-сервис и передавать данные напрямую.
 


То же самое работает и в обратную сторону – через хранилище значения мы можем передать в качестве параметра структуру или массив, практически что угодно. Потому что хранилище значения можно использовать в 1С для того, чтобы не приводить данные к строковому типу. Преобразование там в любом случае происходит, но делает это уже сама платформа неявно. Поэтому миф о необходимости при передаче данных через http- и web-сервисы всегда преобразовывать их в строку считаем неподтвержденным.

Здесь, естественно, есть определенные ограничения, описанные на ИТС в статье https://its.1c.ru/db/metod8dev/content/2597/hdoc. Передавать через веб-сервис объекты с типом ХранилищеЗначения (ValueStorage) можно только для тех данных, которые сериализуются. При этом поддерживается передача объектов типа Картинка и Двоичные данные, а также таблиц значений и структур.

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

Миф №6. JSON оптимальнее XML
Подтверждено с оговорками
 


Выбор между JSON и XML вызывает у меня точно такую же ассоциацию выбора между пельменями и тортом, о которой я говорил ранее.
 


На первый взгляд JSON действительно выглядит привлекательнее: он проще читается и визуально воспринимается лучше, чем XML. Видно, что объем передаваемых данных в JSON меньше, поэтому веб-разработчики чаще выбирают JSON, а 1С-ники – почему-то XML. Давайте разберемся, почему.
 


Если сравнить основные параметры сообщения, упакованного в JSON и XML, первые три строки – все в пользу JSON. Но последние три – все в пользу XML.

Дело в том, что XML – это не только формат передачи данных, это еще и полноценный инструмент для их обработки. XML можно загрузить в объектную модель DOM и поработать с его элементами – добавить или переименовать узлы, найти нужные данные по идентификаторам, используя XPath и другие механизмы. Поэтому в платформе 1С XML применяется гораздо шире.
 


Пример из практики – нужно передать между базами 1С сложную структуру, внутри которой есть код запроса с различными символами.
 


С точки зрения метаданных структура выгрузки представляет собой дерево значений. Как его сохранить?
 


С помощью XML мы это делаем несколькими строками готового кода, найденного в интернете. А попытка реализовать то же самое через JSON приводит к ошибкам, потому что JSON ругается на недопустимые данные, требует указания кодировки и так далее. То есть, применять XML при работе с данными в конфигурации 1C однозначно удобнее.



Поэтому JSON мы используем при взаимодействии с внешними приложениями, а XML – при взаимодействии с другими конфигурациями 1С.

Таким образом, JSON действительно оптимальнее, и это подтверждено, но с оговорками. Все зависит от случая.
 

Миф №7. Методы GET, POST и прочие путать нельзя
Не подтверждено с оговорками
 


Согласно стандартам, метод GET необходимо использовать только для получения информации, POST – только для добавления, DELETE – для удаления и так далее. Если перепутаешь – тебя ждет кара. Но на практике все не так однозначно.
 

Рассмотрим стандартный пример GET-запроса для поиска картинок.
 



GET-запрос состоит из адреса и набора параметров в формате «ключ=значение», упакованных в одну строку.


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

Мы с этим в свое время столкнулись. Пробовали все запросы отправлять в свою систему 1С через GET-запрос, и в какой-то момент обратили внимание, что без вложений файлов запрос выполняется без проблем, а с вложениями – ломается.
 


Это происходило потому, что у GET-запросов есть ограничение по длине – 4 килобайта. А у нас запрос получился длиной 195 килобайт.

Поэтому мы решили, что будем использовать POST-запросы везде. Тем более, что сама 1С при работе web-сервисов использует только этот метод.
 


Вот так теперь выглядит применяемые у нас методы HTTP-запросов – везде POST и все.
 


И затем мы исследовали интернет и убедились, что большинство разработчиков пришло к этому же выводу – что для решения большинства задач достаточно использования метода POST.

У GET-запросов еще и с безопасностью могут быть проблемы, потому что они иногда кэшируются браузерами. А если мы передаем через GET-запрос логин и пароль, то, даже несмотря на HTTPS, их потом оттуда можно извлечь, что является большим минусом.
 

Миф №8. Файловая база виснет при работе через веб-сервер
Не подтверждено с оговорками
 

Считается, что когда база опубликована на веб-сервере, то стоит одному пользователю запустить формирование отчета - и остальные уже не смогут работать.
 


На стороне сервера это выглядит вот так: одно ядро загружено на 100%, а остальные простаивают, но запросы от других пользователей не обрабатываются.
 


С точки зрения пользователя это выглядит примерно вот так.
 

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


Причина в том, что база 1С, работая через веб-сервер (Apache, IIS и др.) использует единую точку входа для всех запросов. Попадая туда, «тяжелый» запрос занимает очередь и блокирует работу остальных, пока не завершится.
 


Но это лечится. На Инфостарте есть разработка, которая так и называется – «Решение проблемы однопоточности модуля веб-сервера при работе с файловой базой».

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


В результате у вас появится несколько служб Apache, и каждый пользователь будет работать со своей службой. Нагрузка перераспределится, и система продолжит работать стабильно

Поэтому миф не подтвержден с оговорками – т.е. проблема есть, но она решается.
 

Миф №9. 32-битный клиент медленнее 64-битного
Подтверждено
 


Здесь мы опять использовали алгоритм, с помощью которого уже сравнивали скорость выполнения кода в расширении и конфигурации, и запустили его в 32 и 64-битном клиенте.

Получилось, что 32 бита действительно медленнее.
 


Здесь перечислены причины, почему так происходит.
 


Особенно ярко эта разница проявляется на сервере:

  • Слева – результаты тестирования на 32 битах, с файловой базой без проблем могли работать только 6 пользователей. Как только заходил седьмой, система начинала тормозить. На SQL базе максимальное количество пользователей – 30.

  • Справа – на той же версии платформы, но уже в версии приложения 64 бит, уже могло без проблем работать 170 и 1000 пользователей в файловом и SQL варианте – просто потому что поменяли версию приложения.

Поэтому данный миф считается подтвержденным.
 


Кроме этого, мы еще сравнивали расход памяти: был момент, когда 32-битное приложение больше памяти занимало, но чаще всего больше памяти отъедает все-таки 64-битное приложение. Это тоже факт.

Итого: миф подтвержден – 64-битный клиент работает быстрее, хотя и может расходовать больше ресурсов.
 

Миф №10. В платформе 1С нет модульности
Не подтверждено
 

Считается, что микросервисная архитектура и независимая доработка отдельных подсистем – это не про 1С. На самом деле это не так, просто многие разработчики не хотят этим пользоваться.
 


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

Но мы в какой-то момент решили выделять некоторые подсистемы в отдельные конфигурации.
 


У нас был клиент, у которого база весила 500 гигабайт, причем 95% занимали присоединенные файлы, 3% – документы «Электронное письмо», и только 2% – остальные данные. Мы просто вынесли документы «Электронное письмо» и присоединенные файлы в отдельную базу и настроили работу с этой базой через http-сервисы: пользователи подключаются в основную мастер-базу, а дополнительная информация получается из других баз через http-запросы.
 


На слайде – пример работы такого подхода. В этот веб-интерфейс кабинета сотрудника выведены данные из баз Документооборот и ЗУП:

  • Из Документооборота – задачи.

  • А из ЗУП мы берем информацию об остатках отпусков и все остальные данные.

У распределенной конфигурации 1С есть особенности:

  • Скорость разработки и ее удобство снижаются, причем существенно.

  • Но работать такая система будет быстро, как минимум, не медленнее. Проверяли.

  • Необязательно сразу всю конфигурацию делать распределенной. Можно выносить ее в такой формат частями.

  • Зато у такой базы существенно повышается живучесть: недоступность одного сервера не всегда влечет за собой полный отказ системы
     


Пример: вот так выглядит в нашем кабинете карточка сотрудника.

Обратите внимание: база ЗУП в данный момент временно недоступна, но пользователь все равно видит 90% другой нужной ему информации. Как только мы восстановим доступ к базе ЗУП, пользователь вернется и посмотрит то, что ему нужно.

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

Вопросы и ответы


Можно ли настроить время ожидания http-сеансов – сколько времени сеанс открывается, и через какое время он потом закроется?

На то, чтобы поднять сеанс http-сервиса, обычно тратится 2?3 секунды – это время зависит от используемой конфигурации.

А после того, как сеанс выполнил первый http-запрос, он обычно живет 20 минут – эту настройку можно поменять в конфигураторе: «Администрирование» – «Публикация на веб-сервере». Там в параметре «Время жизни соединения» по умолчанию установлено значение 1200 секунд. Это оно и есть. Вы его можете менять – как в сторону уменьшения, так и в сторону увеличения.

Параметр «Таймаут проверки» не влияет на создание http-соединения?

Не влияет. «Таймаут проверки» значит, что если мы в течение какого-то времени до сервера не достучались, запрос просто отвалится.

Есть ли разница с точки зрения ресурсов сервера у стандартного веб-клиента и тонкого клиента?

С точки зрения ресурсов сервера – скорее всего, нет. Это наше предположение, но скорее всего, нет.

Однако мы предполагаем, что с точки зрения нагрузки на клиентскую машину веб-клиент более ресурсоемкий, потому что весь исполняемый код нужно преобразовать в JavaScript – нарисовать интерфейс, дополнить его обработчиками, все это на JS.

А тонкий клиент работает на нативных функциях, которые намного быстрее выполняются и более компактные.

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

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

Есть ли разница между тонким клиентом, подключенным к серверу через http, и тонким клиентом, который подключен к серверу напрямую?

Здесь точно есть различия, потому что у прямого подключения нет промежуточного звена в виде веб-сервера.

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

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TEAMLEAD & CIO EVENT.

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

См. также

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

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

16.07.2025    20117    TitanLuchs    105    

134

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

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

03.02.2025    11752    bayselonarrend    126    

64

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

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

14.01.2025    19628    dsdred    77    

133

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

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

23.06.2024    20461    bayselonarrend    22    

169

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

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

13.03.2024    11568    dsdred    22    

84

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

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    42402    YA_418728146    35    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Cocky_Idiot 7 09.10.25 02:03 Сейчас в теме
Есть подозрение, что вы не понимаете, что измеряете
Миф №1
2980 ms vs 3040 ms - это 2%. Сколько запусков вы выполняли? Оценивали ли среднее время?
Миф №2
Вы реально меряли чистое время выполнения цикла? Или таки меряли время Обработка.<Имя Обработки>.Создать()? Понятно, что работа с массивом занимает ноль целых, хрен десятых от всего времени выполнения. Основное время уходит на чтение кода обработки из базы по сети(или на поднятие кода этой же обработки из кэша).
Ну и вдогонку: вы понимаете, как работает Массив.Добавить()?
Массив не предназначен для добавления элементов. Это крайне дорогая операция, связанная с реаллокацией памяти. Основное время уйдет на выделение памяти под новый элемент массива: машине нужно найти на куче(heap) место для нового элемента. С хорошей долей вероятности, это место не найдется "в конце" указателя текущего массива. Придется искать кусок памяти, в который новый массив влезет целиком: скопируем старый массив в новую область памяти, удалим старый массив. В итоге, вы меряете не скорость 1С, а скорость аллокатора машины. Увеличьте первый счетчик цикла до миллиона и будете мерять скорость файла подкачки. Но при чем здесь 1с?

Вы вообще не понимаете, что именно меряете. Примерно во всех случаях вы меряете сеть. Иногда - диск. И никогда - сервер 1С.
BaphoBush; Sashares; +2 Ответить
3. RustIG 1918 09.10.25 09:17 Сейчас в теме
(1)
Ну и вдогонку: вы понимаете, как работает Массив.Добавить()?
Массив не предназначен для добавления элементов. Это крайне дорогая операция, связанная с реаллокацией памяти. Основное время уйдет на выделение памяти под новый элемент массива: машине нужно найти на куче(heap) место для нового элемента. С хорошей долей вероятности, это место не найдется "в конце" указателя текущего массива. Придется искать кусок памяти, в который новый массив влезет целиком: скопируем старый массив в новую область памяти, удалим старый массив. В итоге, вы меряете не скорость 1С, а скорость аллокатора машины. Увеличьте первый счетчик цикла до миллиона и будете мерять скорость файла подкачки. Но при чем здесь 1с?


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

Если вы об этом знаете, просто подарите знания этому миру... И смените логин - может и характер изменится в лучшую сторону ...
13. Cocky_Idiot 7 09.10.25 14:18 Сейчас в теме
(3)
да и при разработке алгоритмов для бизнес-нужд компаний о таком даже не думаешь - "Как будет добавляться элемент в массив"


Возможно, вам просто не стоит заниматься разработкой алгоритмов для бизнес-нужд компаний?

Ну или стоит уже разобраться с базовыми вещами: структурами данных, оценкой сложности алгоритмов. На Радченко computer science не заканчивается. Читайте статьи и книги, смотрите видео, растите в профессиональном плане.
15. RustIG 1918 09.10.25 15:21 Сейчас в теме
(13)
Возможно, вам просто не стоит заниматься разработкой алгоритмов для бизнес-нужд компаний?

согласен с вами, Коки_Идиот...
...давно хочу соскочить с этой темы
19. starik-2005 3197 10.10.25 17:32 Сейчас в теме
(3)
"Как будет добавляться элемент в массив"
Не напрягайся так сильно. Если у тебя 1С работает давно и там в памяти много дыр накопилось, то в момент создания объекта (и массива - тоже) система вытащит из памяти какой-то кусок и отдаст его массиву. Кусок этот вряд ли будет равен по размеру одному элементу (фактически, указателю, т.е. 64 бита = 8 байт). Обычно этот кусок куда больше. Дальше ты добавляешь элемент в массив. И если бы 1С писали студенты, то можно было бы подумать, что каждый раз динамический массив переносится на новое место. Но пацаны там не зря какао пьют, поэтому сделали все по уму и перенос массива делается далеко не каждый раз, как хотелось бы этого вашему оппоненту. Могу даже предположить, что массив может фрагментироваться, но вряд ли, т.к. это убивает основное его преимущество - вставка и доступ к элементу за О(1).
user1827801; bulpi; RustIG; +3 Ответить
18. starik-2005 3197 10.10.25 17:26 Сейчас в теме
(1)
Массив не предназначен для добавления элементов.
Вот прям серьезно? А для чего он предназначен?

А еще соответствие для этого не предназначено, т.к. оно вообще не только память каждый раз аллоцирует, а еще и хеш-функцию меняет.
22. Cocky_Idiot 7 11.10.25 04:23 Сейчас в теме
(18) Угу, почти серьезно.

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

Если нужна структура для быстрого добавления в конец/начало - надо рисовать очередь/стек, в платформе штатно их нет.

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

Фразу про изменение хэш-функции не очень понял, если честно. Поясните, плиз, если не сложно.
23. starik-2005 3197 12.10.25 00:55 Сейчас в теме
(22)
Поясните, плиз, если не сложно.
А ты не в курсе, что такое хеш-функция и что такое "коллизия"?

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

Я вообще никому на слово не верю, поэтому написал обработину, которая вставляет 100к элементов в массив и в соответствие по 100 штук, и измеряет каждый раз время вставки. Отсортировал по времени. Картинки прикрепил. Разберетесь, какая картинка про соответствие, а какая про массив? Время в мс.

ЗЫ: на экран попало то, что больше единицы (ну и парочка единиц тоже, т.к. того, что больше единицы, было мало).

ЗЫЗЫ: что будет при количестве значений х10?
Прикрепленные файлы:
21. starik-2005 3197 10.10.25 18:06 Сейчас в теме
(1)
Вы вообще не понимаете, что именно меряете.
Сложно не согласиться. Но истина в том, что никто ничего не понимает. Никто.
2. Cocky_Idiot 7 09.10.25 02:34 Сейчас в теме
Миф №3. Использование http-сервисов снижает нагрузку на сервер. Подтверждено
Снижает нагрузку по сравнению с чем? Тут вы решили ничего не мерять, но нарисовали картинок, збсь.

Миф №4. Http-сервисы оптимальнее web-сервисов
Цитата: "Если выставить наружу веб-сервис, можно быть уверенным, что в него на вход не попадет ничего неподходящего: платформа сама проверяет корректность параметров и избавляет от необходимости писать дополнительный код для их валидации и обработки"
Тут есть разумное зерно, но загуглите JSON-Schema. Точно так же без проблем валидируется ответ внешнего сервиса....

Туда же идет
Миф №6
xml vs json: весь нормальный мир десять лет назад всё для себя уже решил

Миф №7
Вы не понимаете, как устроен http. Вы не знаете про возможность кеширования GET и невозможность кэширования POST и какие плюшки это может принести на реальном highload? Представьте, что GET можно закэшировать на reverse proxy и отдать клиенту ответ без нагрузки на сервер 1С: тыща запросов к справочнику даже не дойдет до 1С, все вернется из cached proxy.

Файловые базы(миф №8) и клиентов 32 бит(миф №9) оставим на вашей совести.
Скорее всего всё так и есть, но разве кому-то не пофиг на файловые базы на 32-битных архитектурах??

Миф №10. В платформе 1С нет модульности
Да, в платформе вообще нет модульности. Поэтому видим простыни кода на 10K LOC.
То что вы разбили одного монстра на два поменьше не делает систему модульной.

P.S. А то что вы вытащили 475Gb файлов из одной БД и положили их в другую - это вообще зашквар. Зачем вам файлы в БД? Есть ли у вас бэкапы и сколько они занимают? Слышали ли вы о переносе файлов в тома ФС?
zqzq; Artem-B; syberman; +3 Ответить
4. dhurricane 09.10.25 09:47 Сейчас в теме
(2)
загуглите JSON-Schema
Разве она есть в платформе? Тут же исключительно возможности платформы обсуждаются.
7. gybson 09.10.25 10:51 Сейчас в теме
(2) если использовать swagger и json-schema, то уже не так все быстро и просто и инструменты не все под рукой. А для SOAP все в платформе уже есть.
9. RocKeR_13 1454 09.10.25 11:23 Сейчас в теме
(2)
Да, в платформе вообще нет модульности. Поэтому видим простыни кода на 10K LOC.
То что вы разбили одного монстра на два поменьше не делает систему модульной.

А почему модуль обязательно должен быть только на пару сотен строк? Монструозность же модуля будет напрямую зависеть от сложности задачи, которую он будет решать. Сейчас в семействе УТ/КА/ERP, хорошо прослеживается трансформация кода в направлении к модульности, например, в плане проведения документов.

P.S. А то что вы вытащили 475Gb файлов из одной БД и положили их в другую - это вообще зашквар. Зачем вам файлы в БД? Есть ли у вас бэкапы и сколько они занимают? Слышали ли вы о переносе файлов в тома ФС?

Тоже не понял суть этого телодвижения. Места занимают столько же, только теперь нужно тратить время на http-запросы для взаимодействия с файлами в другой базе. Почему не перенести было файлы в тома хранения файлов - большая загадка.
10. Sashares 33 09.10.25 11:53 Сейчас в теме
(2)
Миф №7
Представьте, что GET можно закэшировать на reverse proxy и отдать клиенту ответ без нагрузки на сервер 1С: тыща запросов к справочнику даже не дойдет до 1С, все вернется из cached proxy.


А что делать, если данные в базе меняются? То есть изменили данные в базе, а клиенты получают старое значение из cached proxy.
12. Cocky_Idiot 7 09.10.25 14:11 Сейчас в теме
(10)

There are 2 hard problems in computer science: cache invalidation, naming things, and off-by-1 errors. -- Leon Bambrick

Вы реально рассчитываете, что вам вот так, в комментариях к статье, объяснят, как решать задачу инвалидации кэша??

Но если вдруг вам действительно интересна эта тема, то начните с гугления "squid cache invalidation".
14. Sashares 33 09.10.25 14:43 Сейчас в теме
20. starik-2005 3197 10.10.25 18:05 Сейчас в теме
(10)
А что делать, если данные в базе меняются?
Ну а что делать, если данные в базе меняются, а в чеке уже выбрано то, чего в базе уже нет? Без всяких там веб-сервисов. Ответ простой: проверять при фиксации изменений. В большинстве ситуаций коллизий и так не будет, но если ты формируешь корзину, то проверяй остатки при превращении корзины в заказ. И флоу такой: выбираешь товар -> создаешь заказ -> товар резервируется (проверяются остатки и все такое прочее) -> возвращается актуальная корзина. При том если цена поменяться успела, то тут тоже две стратегии: если в корзину добавлено в течение часа, то оставить цену из корзины, а если раньше, то предупредить об изменении цены.

Жизнь вообще чуть сложнее и проще, чем низкий уровень СУБД.
5. skeptik2105 09.10.25 10:28 Сейчас в теме
мы решили, что будем использовать POST-запросы везде.

Глупость какая - то... Так и рождаются сервисы, которые ждут один единственный параметр в теле запроса...
Есть подозрение, что автор не понимает реальное отличие GET от POST.

сама 1С при работе web-сервисов использует только этот метод

Хотел бы я посмотреть, как Вы сделаете web-сервис через GET... Говорю же, нет понимая принципиального отличия GET от POST. Вычитали в первой ссылке про получение и отправку...

Web-сервисы нужно использовать, при взаимодействии 1С с другими базами на 1С.

Глупость же... Web-сервисы МОЖНО использовать для взаимодействия с другими базами. А можно и не использовать. Можно и HTTP-сервисы использовать... и никто Вас за это не расстреляет.

Поэтому JSON мы используем при взаимодействии с внешними приложениями, а XML – при взаимодействии с другими конфигурациями 1С.

Ага, "восьмерка еще сырая"...
8. RocKeR_13 1454 09.10.25 10:58 Сейчас в теме
(5)
Глупость же... Web-сервисы МОЖНО использовать для взаимодействия с другими базами. А можно и не использовать. Можно и HTTP-сервисы использовать... и никто Вас за это не расстреляет.

Неистово плюсую. Web-сервисы из-за своей "бюрократичности" как раз-таки любят разные гос.сервисы) И в принципе это и есть ключевое отличие от http-сервисов. Тут следует учитывать, что при каких-то точечных изменениях формата (например, для одного клиента добавили доп.поля в формат) в случае REST API достаточно изменить только код на принимающей стороне и одном узле, а вот при использовании SOAP скорее всего потребуется модифицировать ПО на всех узлах. Так что тут действительно неважно, кто участвует в обмене. Непонятно совершенно, почему такой вывод сделал автор статьи.
6. RocKeR_13 1454 09.10.25 10:47 Сейчас в теме
С помощью XML мы это делаем несколькими строками готового кода, найденного в интернете. А попытка реализовать то же самое через JSON приводит к ошибкам, потому что JSON ругается на недопустимые данные, требует указания кодировки и так далее.


Вот на практике у меня было ровно наоборот: десереализация XML валилась на простейших на первый взгляд XML, пока не добавишь в конфигурацию соответствующий XDTO-пакет. А вот проблем с десереализацией JSON вообще ни разу не было. По большому счету все-таки довольно редко встречаются задачи, когда нужно считать информацию из файла обмена частично или модифицировать его, поэтому последние 3 пункта (на мой взгляд последний всё-таки довольно спорный), по которым XML выигрывает у JSON, довольно-таки специфичны.
11. booksfill 09.10.25 13:33 Сейчас в теме
Что касается скорости работы через внешние обработки, объяснение самой 1С выглядит понятней.
Не понимаю, почему добавление чего-то в массив на стороне внешней обработки будет медленней (ресурсы на обслуживание создания самой обработки опустим, иначе смысл мифа - "не дергайте внешние обработки для часто вызываемого кода"), чем в обработке, встроенной в конфигурацию?
Этой обработке, 1С режет память или вводит ограничения по использованию ресурсов процессора?
Как-то странно.

По поводу модульности, не могу согласиться.
Если пойти на принцип, то и excel можно научить управлять бензоколонкой.
Ну, да, если писать новую конфигурацию, то можно создать реально модульную систему, обменивающуюся данными, например, через брокер сообщений или даже websockets. Но модульности "из коробки" в 1С я не заметил, может покажете такой пример?

А вообще, спасибо, было интересно почитать.
16. siamagic 10.10.25 03:59 Сейчас в теме
PUT - во всем мире идемпотентный и создает данные, post обновляет.
тема пулов http сервисов не раскрыта - там нет авторизации - сессия то не закрывалась.
17. starik-2005 3197 10.10.25 17:25 Сейчас в теме
И этому есть реальное объяснение, которое дается на сайте ИТС в статье https://its.1c.ru/db/metod8dev/content/5940/hdoc.

Объяснение:
Важным отличием внешних обработок от обработок, встроенных в конфигурацию является то, что компиляция модулей встроенных в конфигурацию выполняется однократно в процессе инициализации, тогда как для внешних обработок компиляция будет выполняться многократно, отдельно для каждого пользователя. Это приводит как к снижению производительности (компиляция модуля требует времени), так и существенному повышению нагрузки на CPU (компиляция модуля требует ресурсов процессора).


Давайте попробуем ответить на простой вопрос: "сколько раз будет компилироваться модуль внешней обработки"?
Cocky_Idiot; RustIG; +2 Ответить
24. cdiamond 236 13.10.25 14:05 Сейчас в теме
Опять путаются форматы XML, JSON и инструменты, с ними связанные. То что SOAP строгий энтерпрайзный протокол, супер удобен для 1С, вовсе не потому что XML такой надежный и простой, а JSON неподходящий, а просто потому что он во-первых сильно старее, а во-вторых это свойство написанного кода, который обрабатывает этот формат. Никто не мешает написать еще более строгий протокол SOAP Extended Super Puper Pro на JSON или YAML, который даст отлуп за лишний пробел и запятую не в том месте.

Про то что можно использовать POST или PUT вместо GET - это уже довольно давно заезженное место, даже я помнится тут писал несколько лет назад что можно по приколу весь API написать на методе DELETE (нет запрета передавать в нём тело запроса).
Для отправки сообщения требуется регистрация/авторизация