Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

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

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

179
Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

Практикум языка запросов

 

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

 

Поговорим про условия в секции «ГДЕ».

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

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

 

Следующий момент. Очень часто при анализе чужого кода я наблюдаю конструкцию: «ВЫБОР КОГДА…ТОГДА ИСТИНА».

 

Видимо, не все знают, что SQL в качестве полей умеет использовать результаты вычисления условий. Мне кажется, что это же условие гораздо понятнее записывать так, как показано на слайде. Не нужно писать «ВЫБОР» везде, где вам это захотелось – делайте ваш код проще, чтобы с ним было легче управляться.

 

Также не все знают, что конструкцию ЕСТЬNULL можно использовать прямо в секции условий вместо того, чтобы писать какие-то сложные параметрические условия. Для случая, когда левое соединение не отрабатывает, у вас есть значение по умолчанию – это очень удобно, очень наглядно.

 

Объединения таблиц и индексы

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

 

Например, очень часто в документах перемещения (выпуска продукции, комплектации номенклатуры) одну и ту же таблицу требуется двинуть по регистрам дважды – в приход и в расход. И, чтобы движение cформировалось быстрее, его результат рассчитывается в запросе. Но тут получается, что мы к одной и той же таблице обращаемся два раза, хотя у нас отличаются только поля «ВидДвижения», «&СкладОтправитель», «&СкладПолучатель».

Вместо этого можно сгенерировать таблицу «в памяти», которая вообще не будет обращаться к СУБД – и делать левое соединение с ней.

 

Вот, например, наиболее сложный случай, когда используется какой-то «&СкладВПути», и в одном документе надо объединить 4 таблицы.

 

 

А вот пример, как это оптимизируется – мы делаем левое соединение с двумя числовыми селекторами и в конструкциях «ВЫБОР КОГДА… ТОГДА» подставляем нужные значения полей – именно то, которое нам необходимо. Одну из таблиц SQL при этом держит в памяти и, по мере выборки из второй физической таблицы, он ее строки размножает. В результате мы получаем наборы движений, обратившись к СУБД только один раз. Это – значительно эффективнее.

 

 

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

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

 

Например, как здесь, эта «ТаблицаСписания» в дальнейшем используется для отбора виртуальной таблицы оборотов по полям «Склад» и «СерияНоменклатуры».

 

 

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

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

 

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

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

 

Речь идет о свойствах таблиц в памяти SQL-сервера сохранять рассчитанные хэш-значения измерений до вытеснения таблиц из ОЗУ, что позволяет выполнять HASH JOIN в планах запросов без значимых потерь производительности. Множественные вложенные запросы повышают риск длительного выполнения запроса.

 

Дисковая нагрузка

Все видели эту стандартную 1С-ную картинку типового конвейера записи в СУБД.

 

Надо понимать следующее – при использовании левых соединений или конструкции «ОБЪЕДИНИТЬ» (в отличие от «ОБЪЕДИНИТЬ ВСЕ») сервер MS SQL может принимать решение о том, что в таблице временных файлов будет выполнена предварительная сборка вашего результата запроса – построчное хэширование (формирование хэша для каждой записи в вашей промежуточной таблице) для последующего обращения к уже условно проиндексированному результату. Это накладывает определенные требования к оборудованию – у него должна быть аппаратная поддержка функций по работе с хэшем.

 

Что откуда читается и куда пишется? MS SQL имеет три группы дисковых нагрузок.

  • Основной файл базы данных с расширением mdb;
  • Файл журналов транзакций;
  • И системная база данных tempdb, куда складываются все выборки вложенных запросов и все временные таблицы, которые вы генерируете.

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

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

Дисковая нагрузка для кластера 1С – это дикая штука. Почему?

Например, в каталог кластера 1С могут складываться результаты выборки запросов. Как это выглядит? На сайте 1С:ИТС существует рекомендация не использовать выгрузку таблицы из результатов запроса, поскольку это накладывает ограничения на память, а использовать вместо этого метод «Выбрать()». И тут возникает такой момент: когда вы для результата запроса делаете «Выгрузить()», у вас весь результат запроса попадает в память вне зависимости от размера таблицы. А когда вы делаете «Выбрать()», результат запроса попадает на диск. Получается, что если вы из запроса хотите выбрать 4 строчки, то кластер 1С сначала запишет весь результат где-нибудь у себя на медленный диск, а потом эти 4 строчки начинает открывать TCP-соединениями и отдавать вашему клиенту. И можно увидеть такую картину – СУБД отрабатывает в течение долей секунды, а выборка результатов затормаживается – особенно, если кластер 1С развёрнут на некэшируемых дисках с отказоустойчивым рейдом.

 

Согласно материалам ИТС, данное поведение кластера 1С наблюдается только в 32-битной редакции платформы при большой загрузке ОЗУ.

Также важен быстрый доступ в каталог TEMP пользователя, от имени которого запущен кластер 1С. Этот каталог используется для обмена данными через временное хранилище (когда вы вызываете «ПолучитьИзВременногоХранилища» и «ПоместитьВоВременноеХранилище») и работы с фоновыми заданиями – при использовании фоновых заданий туда попадают их параметры.

 

На слайде показано, каким образом дисковая нагрузка MS SQL Server привязывается непосредственно к коду 1С. Это – код запросов.

  • Чёрными кружками обозначено, где идет нагрузка на базу tempdb;
  • А зелеными – где идет чтение из основной базы данных.

Казалось бы, все очевидно.

 

Теперь посмотрим обычный код.

  • Здесь показан этот же запрос (я его немножко свернул), он при выполнении вызывает два типа дисковой нагрузки – на файлы базы данных и на файл tempdb, куда будет сложена выборка из результатов запросов.
  • И затем, когда мы вызываем метод «Выбрать()», возникает дисковая нагрузка в каталоге кластера 1С (этот тип нагрузки показан розовым кружком) – результат выборки запроса пишется на диск.

 

А на этом слайде голубым кружком показано, в каком месте кода возникает нагрузка на каталог TEMP пользователя, от имени которого запущен кластер 1С.

 

Давайте разберемся, как происходит процесс обмена данными между основным потоком приложения и фоновыми заданиями:

  • Клиент 1С помещает данные во временное хранилище;
  • В этот момент в каталоге TEMP пользователя на стороне клиента образуется файл, в котором закодировано все, что вы передаете.
  • Затем открывается TCP-соединение, и этот файл практически сторонними средствами (через winsock.dll) передается на сервер;
  • И только после того, как закроется соединение, сервер подберет этот файл и начнет с ним работать.

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

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

Если вы, допустим, запустите параллельно 5-10 фоновых заданий и расставите в отладчике для них точки останова – например, поставите точку останова в первом фоновом задании, а в остальных не поставите. Казалось бы, когда у вас в этом первом фоновом задании срабатывает точка останова, остальные должны работать. Так? Нет, не так.

Дело в том, что кластер 1С генерирует процессы для выполнения вашего кода на серверной стороне. И если у вас сгенерирован один процесс, который обрабатывает 256 соединений с базой данных, то весь контекст выполнения ваших 5-10 фоновых заданий будет находиться в рамках одного физического процесса на стороне кластера. И, останавливая одно фоновое задание, вы останавливаете сразу все фоновые задания, которые крутятся в этом же процессе. Поэтому, пока вы в отладчике не пойдете дальше, ничего не пойдет дальше.

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

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

  • В случае, если фоновое задание и ваш основной код находятся в одном физическом процессе, указатель копируется из памяти в память, и результаты вашего фонового задания попадают в основной код – вы их получаете и работаете с ними дальше.
  • А если они находятся в разных физических процессах, то на одном экземпляре кластера 1С TCP-соединение открывается, к нему подключается второй экземпляр кластера 1С, и они начинают героически обмениваться результатами вашего фонового задания по сети для того, чтобы вернуть их с одного экземпляра на другой.

Смешно, да? То есть, с SQL мы умеем работать через Shared Memory, а внутри кластера 1С не умеем. Это замечательно, это гениальное решение разработчиков.

 

Бэкграунд нашего проекта

 

 

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

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

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

И получается, что в одном документе на 600 морских контейнеров у нас генерируется 112 000 движений. Для нашего старого сервера Fujitsu это было больно – он проводил документ полтора часа. Бесполезно что-то оптимизировать, если оборудование вообще не способно подобный массив данных как-то «пережевывать». Поэтому после исследования вопроса была выдана рекомендация закупать новое железо.

 

Немного о «железках»

 

Сначала мы выбирали платформу для сервера – в качестве вариантов рассматривали либо Intel Xeon E5, либо EPYC (новые процессоры AMD, которые могут содержать огромное количество ядер).

Как мы принимали решение? Очень просто – Intel стоит 3000 долларов на один сокет, а EPYC – 750 долларов. Разница в 4 раза – о чем дальше говорить? Но сказать нужно.

Дело в том, что у Intel очень мало линий PCI Express – на одном чипе всего лишь 28 линий, а так как часть из них задействована для нужд чипсета, то максимально на один сокет можно будет получить всего лишь один полноскоростной 16-канальный разъем PCI Express.

А AMD EPYC нам сразу понравился тем, что там на один сокет 128 линий. То есть, туда можно втыкать просто невообразимое количество высокоскоростных плат расширения.

Сэкономленные на Intel деньги мы пустили на покупку лицензий. Это избавило нас от «писем счастья» Microsoft, где было бы написано, что по их данным в нашей компании эксплуатируется не совсем правильное ПО.

 

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

  • Контроллер RAID 5 – в нем куча памяти, но к нему подключены медленные шпиндельные диски с SAS-интерфейсом. То есть, он в состоянии принять в себя до 16 гигабайт данных, после чего у него резко падает производительность приема данных на запись.
  • SSD-диск. Он чуть медленнее принимает данные на запись, зато в состоянии очень быстро выдавать данные на чтение.
  • Intel Optane характерен тем, что стек команд у него переполняется где-то в 2 раза медленнее, чем у SSD, и он в состоянии чутко реагировать на большое количество мелких запросов. То есть, если у SSD дисков Samsung стек запросов кратен 64 килобайтам (это физическая организация SSD-дисков, где один блок – 64 килобайта), то у Intel Optane один блок – это 4 килобайта. А MS SQL, как вы знаете, читает данные двумя 8-килобайтными страницами (за 1 одну операцию чтения MS SQL считывает 16 килобайт). Поэтому очередь запросов к дискам Intel Optane переполняется несколько медленнее, чем к обычным SSD-дискам.
  • И для того, чтобы хранить бэкапы, мы выбрали медленный диск с максимальной в отрасли надежностью – Hitachi. Он имеет наименьшее количество отказов на тысячу проданных накопителей – 0,4% за весь жизненный период. Бэкапы у нас хранятся там.

 

Настройка системы – простые сложные потоки

 

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

Дисковый массив на RAID 5 был разделен на 2 части:

  • Одна часть – для работы в нормальном режиме эксплуатации, со сбрасыванием буфера записи на диск.
  • А для второй части обязательное сбрасывание дискового кэша на физические носители было отключено. На этом диске с отключенной записью был развернут кластер 1С для того, чтобы не наблюдалось проблем с обращением к методу «Выбрать()» и складыванием на диск всех результатов в выборке. Также на этот диск был перенесен каталог всех пользователей.

Это дало значительный выигрыш по скорости обмена данными между различными экземплярами 1С (клиентскими, серверными), между фоновыми заданиями и т.д.

 

 

Как мы настраивали MS SQL? На слайде показаны наши настройки параллелизма.

  • В инструкции Microsoft описано, что максимальное количество потоков не стоит выставлять больше восьми. А реальное количество потоков должно быть равно количеству физических ядер в одной ноде (если это NUMA-архитектура), либо в одном физическом процессоре (если это процессор Intel, который не умеет применять NUMA-архитектуру). На EPYC первого поколения в одной ноде находится 4 физических ядра и максимальная степень параллелизма была выставлена равной 4.
  • Стоимостной порог для параллелизма был подобран опытным путем – мы установили его равным 3, это дало наибольший эффект в наших условиях.

 

Следующий шаг – настройка tempdb. На слайде показано, как можно «размножить» tempdb для ускорения обработки запросов. Причем, этот прием работает и на предыдущих версиях MS SQL – на 2016, на 2014, на 2008.

Есть только одна проблема – tempdb у вас должен лежать на диске, который не выполняет приоритизацию трафика. Потому что если tempdb лежит на обычном RAID-контроллере MegaRAID, то он при поступлении в стек какого-то очень большого запроса выставляет приоритет на всю дальнейшую обработку данных и тормозит все остальные потоки. И получается, что если мы будем размещать tempdb на обычном RAID-контроллере, то реально будет работать только 1 файл из 8. Поэтому tempdb должен лежать либо на SSD-диске, либо на диске Intel Optane, либо на диске в памяти, но это нерационально.

Что дает «размножение» tempdb? Дело в том, что tempdb – это системная база данных в MS SQL, на которую не распространяются ограничения по условиям лицензирования. Поэтому даже если вы используете Developer Edition, tempdb у вас сможет параллельно работать с 8 файлами. Но с вашими базами данных tempdb будет работать в один поток.

 

Согласно документации Майкрософт на настройку «affinity mask Server Configuration Option», применяются строгие лицензионные ограничения как для автоматического, так и для ручного режима, что и приводит к отличиям в эксплуатации Enterprise Edition от бесплатных редакций:

«Licensing Issues 

Dynamic affinity is tightly constrained by CPU licensing. SQL Server does not allow any configuration of affinity mask options that violates the licensing policy».

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

 

 

Далее – создаем новую базу данных 1С. Ничем ее не заполняем. Потом заходим в SQL и выполняем настройку базы данных, задавая количество файлов журналов транзакций для нее в пропорции 3:1, то есть на каждые три файла базы данных нам понадобится 1 файл журнала. Эта пропорция была выявлена экспериментальным путём. Общее количество файлов здесь 16.

Почему именно 16? Дело в том, что, покупая сервер на 32 физических ядра, который может обрабатывать 64 логических потока, мы сначала решили посмотреть, как это все будет крутиться на 32. Потому что было непонятно: нужны ли нам лицензии на все 64 логических ядра или нам хватит лицензий на 32.

В дальнейшем этот вопрос выяснился следующим образом. Опять же, как пишет Microsoft, технологии Hyper-Threading, а также технологии SMT – это не про MS SQL. Потому что это работает следующим образом: когда первый логический поток в вашем физическом ядре запрашивает данные, которых нет в кэше первого и второго уровня, его выполнение останавливается, и контекст выполнения переключается на второй логический поток. То есть, в кэше процессора должны быть данные либо для первого, либо для второго потока вашего Hyper-Threading. Либо у вас Windows будет показывать красивую картинку, что процессор загружен на 100%, но это всего лишь означает, что он ждет поступления данных из памяти в кэш. А ребята из Microsoft умные – они за 224 такта до того, как эти данные в кэше понадобятся, посылают команду загрузить их из памяти.

Практика использования MS SQL показала, что включение многопоточности (использование 64 потоков вместо 32), и, соответственно, повышение порога параллелизма с 4 до 8, даёт 5%-ый прирост. Но этот 5%-ый прирост возникает не потому, что технология позволяет, а потому что где-то на задворках начинают эффективно параллелиться DLL-ки Windows, а SQL все равно работает с той же самой скоростью. Предзагрузка данных полностью нивелирует преимущества Hyper-Threading. Поэтому если вы сидите на Intel Xeon с 4 физическими ядрами и 8 потоками, помните, что на самом деле ваш SQL Server крутит все на 4 ядрах, а не на 8 – значение имеют только физические ядра.

 

 

Первоначально, на новом сервере, как только мы достали его из коробки, проведение нашего документа с сотней тысяч движений выполнялось 15 минут. Это нас очень опечалило. Потому что на старом сервере оно выполнялась 10 минут. И надо было как-то объяснить, почему новый дорогой сервер работает на 50% медленнее.

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

После распараллеливания нагрузки и оптимизации аппаратных настроек нам удалось добиться уменьшения времени проведения с 15 до 2,2 минут.

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

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

Для уменьшения времени инициализации было решено использовать обработчик формы «ПриСозданииНаСервере», где мы настроили запуск 15 фоновых заданий (по одному на каждую таблицу управленческих данных). Дело в том, что обработчик управляемой формы «ПриСозданииНаСервере» запускается до того, как вообще начинается инициализация. Это особенно хорошо было видно на старых сырых версиях веб-интерфейса 1С: если при создании происходило обращение к данным формы, то браузер не успевал их сгенерировать, и выскакивали сообщения вида «is not null» и т.д. Поэтому в обработчике «ПриСозданииНаСервере» мы генерируем фоновые задания по выборке данных, объединенные в 3 группы, которые подобраны по среднему времени выполнения. Эмпирическим путем таблицы побольше были отнесены к третьей группе фоновых заданий, поменьше – ко второй и самые маленькие к первой.

  • Первыми у меня отрабатывают самые маленькие 8 таблиц - я ожидаю выполнения 8 фоновых заданий и когда получаю от системы информацию, что они отработали, забираю эти данные и начинаю размещать их на управляемой форме;
  • На следующем этапе производится выборка данных по второй группе таблиц, куда относится обработка заказов поставщикам и заказов покупателей;
  • И на последнем этапе формируется самая большая таблица - это обеспечение заказов:
    • обеспечение за счет перемещаемых товаров (внутрискладские перемещения);
    • обеспечение за счет еще не выполненных заказов поставщику;
    • и обеспечение за счет существующих складских остатков (это самый длинный запрос, для которого в принципе нереально его дальнейшее разделение на более элементарные задачи).

После того как мы переместили выборку данных в фоновые задания, и эти выборки стали обрабатываться параллельно, самый длительный запрос при первом обращении к СУБД на SSD-диске у меня получился 1,5 секунды. Я имею в виду стартовое чтение данных с SSD-диска, когда их еще нигде больше нет, при втором обращении, когда SQL-сервер уже держит все данные в памяти, показатели гораздо меньше.

Теперь самым «узким» местом стала инициализация управляемой формы – непосредственно уже 1С-овский механизм. И тут первое, что выяснилось – работа клиента 1С внутри виртуального Windows-сервера происходит быстрее, чем внутри физического Windows-сервера. Т.е. на хосте сервера в принципе никогда нельзя запускать клиента 1С, потому что это – системный супервайзер, и там работа клиентских приложений будет постоянно «спотыкаться» о различные системные проверки, запросы прав доступа. Поэтому для клиента 1С использовать RDP на виртуалку выгоднее, чем RDP на хост.

Дальше – после анализа этих «узких» мест был найден замечательный процессор в линейке Intel – это NUC7i7BNH Baby Canyon, процессор с кэшем четвертого уровня на базе памяти eDram. Intel позиционирует эти процессоры как «тихие» рабочие станции, которых не слышно, не видно и которые быстро работают.

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

В итоге мы добились уменьшения времени открытия рабочего стола с 15 до 0,3 секунд, теперь он открывается «на щелчок» – очень быстро, очень хорошо.

Update: текстовая версия доклада исправлена 27.06.2019.

 

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

Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2018 EDUCATION. Больше статей можно прочитать здесь.

В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.

Выбрать мероприятие.

179

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

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. bulpi 158 11.06.19 18:45 Сейчас в теме
Статья полезная, хотя некоторые приемы программирования спорны. Но это дело вкуса.
Summer_13; dmurk; +2 Ответить
12. dmurk 273 12.06.19 14:00 Сейчас в теме
(1) Приходите на конференцию Инфостарт 2019, обсудим ))
97. Summer_13 22.06.19 07:19 Сейчас в теме
(12) На счет пункта 2 "Вычисляем условия" посмотрите вот эту статью https://infostart.ru/public/1075458/.
Может это правда только в СКД такая бурда,но с таким написанием надо быть бдительным.
98. dmurk 273 22.06.19 17:11 Сейчас в теме
(97) Спасибо, эту статью видел. СКД в основных задачах не использую, только стандартные запросы.
2. GeraltSnow 117 11.06.19 18:56 Сейчас в теме
Статья впечатляет. Чем больше нового узнаю, тем больше понимаю, что ничего не понимаю.
Boulala; dmurk; +2 Ответить
13. dmurk 273 12.06.19 14:00 Сейчас в теме
(2) В этом году планирую продолжение
114. Rustig 1221 28.06.19 07:14 Сейчас в теме
(13) ваш кейс уникален, мне очень понравился!
прошу раскрыть информацию - за какой период времени вы пришли к положительному результату, сколько сил и времени было вложено в достижение дзен-пути под названием "многопоточное ускорение однопользовательских нагрузок + МС 2017"
127. dmurk 273 30.06.19 22:42 Сейчас в теме
113. Rustig 1221 28.06.19 07:09 Сейчас в теме
(2) без паники :)
продолжайте изучать алгоритмы программы - и найдете много мест для оптимизации кода - еще раз рефакторинг, еще раз убрать лишние проверки.
...ну и обходите стороной все хотелки учредителя (это сарказм), иначе придется встрять на 1,5 года, а то и больше, чтобы вывести 15 таблиц за 3 сек одному самому важному человеку компании.
nvv1970; acanta; +2 Ответить
10. dmurk 273 12.06.19 13:57 Сейчас в теме
(3) Это не перевод )) Это боль из жизни
Rustig; acanta; +2 Ответить
4. unichkin 1250 12.06.19 02:45 Сейчас в теме
Доброго времени. Так вышло, что совсем недавно пытал профайлер, пытаясь понять работает ли индекс ВТ при условии типа
(Измерение1, Измерени2) В (ВЫБРАТЬ ВТ.Измерение1, Измерение2 ИЗ ВТ КАК ВТ)
У меня так вышло, что индекс не окупается.
Мой тест


Это противоречит вашей рекомендации индексировать поля ВТ. Могли бы подсказать пример, чтобы убедиться в его эффективности?
Прикрепленные файлы:
5. Fox-trot 108 12.06.19 08:29 Сейчас в теме
(4) попробуй в конфигураторе поменять местами измерения МестоХранения и Раздел, если это самый частый запрос
если нет, то можно попробовать добавить отедльный индекс(ы)
36. unichkin 1250 12.06.19 23:18 Сейчас в теме
(5)
(4) попробуй в конфигураторе поменять местами измерения МестоХранения и Раздел, если это самый частый запрос

Да это просто тест, чтобы проверить. Поможет ли индекс ВТ в этой ситуации, или нет. Судя по ответам я сделал правильные выводы.
11. dmurk 273 12.06.19 13:59 Сейчас в теме
(4) Заниматься созданием индексов имеет смысл только если вы не располагаете tempdb на медленных дисках. У меня для tempdb используется Intel Optane 118 Гб с латентностью 8 микросекунд.
14. dmurk 273 12.06.19 14:14 Сейчас в теме
(4) Пример запроса. 56 тысяч записей - с индексированием запрос 510 мс, без индексирования - 450 мс
Прикрепленные файлы:
starik-2005; +1 Ответить
40. unichkin 1250 12.06.19 23:37 Сейчас в теме
(14) Не понял ваш пример. Это же просто выборка? Здесь какой смысл в индексах? Не вижу отбора.
45. dmurk 273 13.06.19 06:38 Сейчас в теме
(40) Здесь индексы необходимы для того, чтобы дальнейшие левые соединения с этой временной таблицей не тормозили
47. unichkin 1250 13.06.19 10:04 Сейчас в теме
(45) В (4) я не имел в виду левые соединения. С ними понятно все. Я хочу для себя решить раз и навсегда - нужен ли индекс по полям отбора в этом конкретном примере.
61. dmurk 273 13.06.19 13:16 Сейчас в теме
(47) Думаю, это серьезно зависит от размера временной таблицы. Ориентируйтесь на 8 килобайт / ширину строки временной таблицы в байтах. Если у вас вся ВТ маленькая и помещается на одну страницу, то любое обращение к ВТ всегда грузит её в память SQL сервера целиком
24. dmurk 273 12.06.19 14:48 Сейчас в теме
(4) У вас в принципе нет необходимости во временной таблице в вашем примере. Используйте данные напрямую:

"ВЫБРАТЬ
| ДенежныеСредстваВУОстатки.Портфель КАК Портфель,
| ДенежныеСредстваВУОстатки.МестоХранения КАК МестоХранения,
| ДенежныеСредстваВУОстатки.Раздел КАК Раздел
|ИЗ
| РегистрНакопления.ДенежныеСредстваВУ.Остатки(
| ,
| (Портфель, Раздел) В
| (&ТаблицаОтбора)
| ) КАК ДенежныеСредстваВУОстатки"
Запрос.УстановитьПараметр("ТаблицаОтбора", ТаблицаОтбора.Скопировать( , "Портфель, Раздел"));
unichkin; +1 Ответить
37. unichkin 1250 12.06.19 23:19 Сейчас в теме
39. unichkin 1250 12.06.19 23:35 Сейчас в теме
(24)
| (&ТаблицаОтбора)

И у меня не вышло использовать таблицу значений, как вы это показываете.

Запрос.Текст = "ВЫБРАТЬ
| ДенежныеСредстваВУОстатки.Портфель КАК Портфель,
| ДенежныеСредстваВУОстатки.МестоХранения КАК МестоХранения,
| ДенежныеСредстваВУОстатки.Раздел КАК Раздел
|ИЗ
| РегистрНакопления.ДенежныеСредстваВУ.Остатки(, (Портфель, Раздел) В (&ТаблицаОтбора)) КАК ДенежныеСредстваВУОстатки";

{ВнешняяОбработка.Тест.Форма.Форма.Форма(49)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(6, 68)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
РегистрНакопления.ДенежныеСредстваВУ.Остатки(, (Портфель, Раздел) <<?>>В (&ТаблицаОтбора)) КАК ДенежныеСредстваВУОстатки
____________________________
Запрос.Текст = "ВЫБРАТЬ
| ДенежныеСредстваВУОстатки.Портфель КАК Портфель,
| ДенежныеСредстваВУОстатки.МестоХранения КАК МестоХранения,
| ДенежныеСредстваВУОстатки.Раздел КАК Раздел
|ИЗ
| РегистрНакопления.ДенежныеСредстваВУ.Остатки(
| ,
| (Портфель, Раздел) В
| (ВЫБРАТЬ
| ТО.Портфель,
| ТО.Раздел
| ИЗ
| &ТаблицаОтбора КАК ТО)) КАК ДенежныеСредстваВУОстатки";

{ВнешняяОбработка.Тест.Форма.Форма.Форма(49)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
Содержимое объекта данных может быть выбрано только во временную таблицу
44. dmurk 273 13.06.19 06:36 Сейчас в теме
(39) У тебя проблема с ограничениями типов в колонках возвращаемой таблицы. Потому и индексирование не эффективно либо используй ВЫРАЗИТЬ( ) для индексируемых полей переданной таблицы, либо не ленись при создании таблицы значений указывать ограничения типов
Прикрепленные файлы:
49. unichkin 1250 13.06.19 10:25 Сейчас в теме
(44) действительно, с типами были проблемы. Эту таблицу я получал выгрузкой из запроса, при этом в описании типов колонки присутствует NULL. Не думал что сработает, спасибо.
51. dmurk 273 13.06.19 11:11 Сейчас в теме
136. nvv1970 28.07.19 11:56 Сейчас в теме
(24) Здесь уместно рассказать об НЕ использовании индексов в конструкции "(Портфель, Раздел) В ..." потому что происходит вычисление полей, например (_Fl001 + _Fl002) in ....
Поэтому нужно быть осторожным.
А вот соединение с таблицей остатков (без условий в параметрах) с вероятностью в 99,9999% пройдет с использованием индексов, т.к. велик и могуч оптимизатор в MSSQL.
А на слоне все может быть совершенно иначе.
137. dmurk 273 28.07.19 15:18 Сейчас в теме
(136) При незначительных размерах таблицы значений прямой поиск будет быстрее
87. nicxxx 236 14.06.19 11:19 Сейчас в теме
(4)
вместо "Просмотр строк таблицы" появился "Clustered index scan" - а это для ВТ по сути то же самое: раньше просматривались строки таблицы, теперь индексы этих строк. Это потому что в ней комбинации значений уникальны, либо близки к уникальным - количество значений индекса равно количеству строк.

Насчет изменения сущности написано не совсем верно, вот здесь:
теперь индексы этих строк
- кластерный индекс это и есть таблица, упорядоченная по полям индекса, поэтому технически ничего не поменялось - просматривается та же таблица.
88. unichkin 1250 14.06.19 11:25 Сейчас в теме
(87)
- кластерный индекс это и есть таблица, упорядоченная по полям индекса, поэтому технически ничего не поменялось - просматривается та же таблица.

Спасибо! Да, я это и имел в виду.
6. serg_gres 139 12.06.19 09:35 Сейчас в теме
Многоуважаемый автор, статья называется "Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017",
в статье много десятков станиц со скриншотами и диаграммами, а про многопоточность и, связанное с этим ускорение, написано в самом конце менее 10 строк.
При чем написано абсолютно не понятно что. Какие еще программа генерирует видео - примитивы ? О чем это ?
Абсолютно не понимаю как время открытия рабочего стола было 15 минут и после запуска 15 фоновых заданий стало 0,3 секунды.
Что это за фоновые задания ? Что они выполняли ? За счет чего произошло ускорение ?
Если 15 фоновых заданий распараллелили нагрузку, то почему время открытия стало не 1 мин, а 0,3 сек ?
В стате очень много информации не относящейся к заданной заголовком теме, в про саму тему не написано по сути ничего.
rmIvanT; AlX0id; mirco; mivari; unichkin; a_titeev; Dream_kz; Xershi; +8 Ответить
9. Xershi 762 12.06.19 10:47 Сейчас в теме
(6) я так понял там было одно фоновое задание, а возможно серверный код, который они распаралелили на порции и запустили в 15 потоков. Как итог серверного кода нету и данные в фоне получаются со временем, а 0.3 это фикция скорее всего визуальный эффект для пользователя не более.
17. dmurk 273 12.06.19 14:23 Сейчас в теме
(9) Вы не совсем правы. Эта "фикция" с января 2019 доступна штатными объектами 1С в корпоративной редакции платформы
18. Xershi 762 12.06.19 14:27 Сейчас в теме
(17) а я не говорил что это истина. Это лишь предположение, которое должен автор либо подтвердить либо опровергнуть.
Либо другой специалист, который понял и реализовал, то о чем говорил автор.
Вы я так понял немного в теме. Вы и есть автор)))
115. Rustig 1221 28.06.19 07:15 Сейчас в теме
(17) а до января 2019 года что было?
128. dmurk 273 30.06.19 22:45 Сейчас в теме
(115) А до января пришлось выкручиваться и разрабатывать view на регистрах сведений
15. Dach 285 12.06.19 14:17 Сейчас в теме
(6) тоже очень интересно про ускорение открытия формы рабочего стола. Что конкретно там засунули в фоновые обработчики? Автор, можно код в студию?
22. dmurk 273 12.06.19 14:42 Сейчас в теме
(15) кода там 4771 строк запроса данных у СУБД, 866 строк запуска и обработки результатов фоновых заданий, и 8568 строк постобработки результатов на клиенте в вариантах исполнения Тонкий клиент, Веб клиент.

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

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

выложить код нельзя, это конфиденциально
116. Rustig 1221 28.06.19 07:18 Сейчас в теме
(22) ну вот - бизнес-процесс клиента пришлось изучить досконально , а бизнес-логику программы изменить под себя кардинально - наверное убрали все лишнее -все лишние вызовы процедур и функций, все лишние проверки ????!!!!!
Сколько лет понадобилось , чтобы прийти к этому пониманию?
130. dmurk 273 30.06.19 22:51 Сейчас в теме
(116) Это нетиповое решение. Оно проектировалось и писалось на основе УТ 10.3, а необходимость оптимизаций возникла при понимании что старенький сервер не в состоянии выдавать соединения таблиц в требуемых количествах. При этом, понимая что оптимизация решения на старом сервере займет лишние годы, сначала закупили и настроили новый сервер.
Rustig; acanta; +2 Ответить
16. dmurk 273 12.06.19 14:21 Сейчас в теме
(6) Продолжение доклада снято в другом зале.

а) Про многопоточность написано вполне понятно - правильно настраивайте файлы ИБ в MSSQL, используйте многопоточные накопители, покупайте лицензии, иначе все остальные усилия использовать многопоток со стороны 1С будут срезаны на уровне СУБД.

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

Разделяйте вычислительные задачи к СУБД на несколько фоновых заданий - и получите ускорение, если выполнены условия а) и б)
57. DarkAn 906 13.06.19 12:32 Сейчас в теме
(16)
покупайте лицензии

Это действительно необходимо? я с точки зрения, что скуль ими оперирует при работе с базой?

Где то можно посмотреть текущее состояние по лицензиям (правда скуль у нас староват 2008R2). ?

И еще вопрос, в докладе вы сказали, что tempdb не стоит класть на RAM - почему?


Дмитрий, спасибо за доклад.
64. starik-2005 1979 13.06.19 13:24 Сейчас в теме
(57)
tempdb не стоит класть на RAM - почему?
Я бы тут два отметил момента:
1. Памяти много не бывает, зачем ее засирать еще и временными таблицами, которые в 1С при достаточном количестве пользователей выкушают ее сколько бы ее ни было. Исходя из этого стоит их заснуть на быстрый диск, т.к. они все равно до кучи еще кешируются ОСью. Т.е. засунем в ОЗУ - и это у нас двойной расход ОЗУ.
2. Подумал о надежности, но понял, что смысла для надежности держать временные таблицы вне памяти нет никакого.
70. dmurk 273 13.06.19 15:43 Сейчас в теме
(57) Количество параллельных потоков а) вычислительных б) дисковых в плане выполнения любого запроса ограничено сверху количеством установленных лицензий. Не распространяется на вычислительные/дисковые операции в tempdb.

Посмотреть количество лицензий вы можете при скачивании вашего экземпляра SQL с сайта Microsoft. Из вашего кабинета пользователя раздается инсталляция SQL с вашим количеством лицензий.

SQL 2008R2 рекомендую забыть, даже на старых серверных ОС можно впихнуть SQL 2014, если ОС новая, то SQL 2017.

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

Большинство драйверов RAM имеет серьезные проблемы производительности, что делает их более медленными чем NVMe накопители. Кроме того, дисковый кэш в памяти может решать те же задачи, а вот задачу когда закончилось место на RAM диске вы решить не сможете.
76. DarkAn 906 13.06.19 17:13 Сейчас в теме
(70)
Из вашего кабинета пользователя

Тут проблема, наша организация под санкциями :) Личный кабинет недоступен :(

Тем более это же в облаке, а на сервере как посмотреть?

(70)
SQL 2008R2 рекомендую забыть, даже на старых серверных ОС можно впихнуть SQL 2014

Это было бы да, но надо покупать, а это опять п.1

(70)
задачу когда закончилось место на RAM диске вы решить не сможете

Почему? Можно же сделать 2 файла, один в рам, другой на физике.
Дмитрий Юхтимовский рассказывал, что для того чтобы использование было с приоритетом в РАМ, необходимо ему задать объем больше чем физике, например, 1 к 100, кроме того задать ограничение на объем.
79. dmurk 273 13.06.19 17:43 Сейчас в теме
Тем более это же в облаке, а на сервере как посмотреть?

Зайдите в ручную настройку processor affinity. Укажите ручное распределение. Начните расставлять флажки. В момент когда SSMS выругается вы поймете что лицензии закончились. Если нигде не выругалось, скорее всего у вас триал на 1 поток.

Это было бы да, но надо покупать, а это опять п.1

Developer Edition бесплатный. Enterprise Edition без проблем покупается через Минск.

Почему? Можно же сделать 2 файла, один в рам, другой на физике.

Практика показывает, что другие типы дисков работают с аналогичной скоростью либо тупо быстрее. Во вложении пример скорости бесплатного драйвера RAM-disk. При этом скорость решения сложных задач даже на оптимизированном драйвере значительно повысится только при выделении значительных объемов памяти. Мне, например, выделить 128 Гб DDR4 ОЗУ под RAM диск - это потратить на это дополнительные 800$, а задействовать Optane - всего 300$.

пример:
AVAGO SAS RAID контроллер LSI MegaRAID SAS 9361-4i +16 Gb Cache Vault
- Скорость чтения из кеша 4,0 Gb/сек // Скорость записи в кеш 7,8 Gb/сек // 112 тысяч IOPS
SSD диск INTEL Optane 800P 118 Гб SSDPEK1W120GA01 M.2 PCI-Express - 145 тысяч IOPS на 4К блоках (1132 Mb/сек на 8-кб страницах) именно его всем рекомендую под tempdb в качестве основного файла, т.к. латентность 8 микросекунд. Построение индексов на таком диске проходит абсолютно безболезненно, что и позволяет извращаться по остальным направлениям.
SSD диск Samsung 960 PRO 2 Тб MZ-V6P2T0BW M.2 PCI-Express - 360000 IOPS (3,5 Gb/s чтение из СУБД)
Прикрепленные файлы:
28. dmurk 273 12.06.19 15:13 Сейчас в теме
(6) Опечатка при наборе доклада на основании видео. В докладе рассматривалось две задачи:

1. Проведение большого документа. Распараллеливание позволило добиться 15:00 мин -> 2:20 мин
2. Открытие рабочего стола. Распараллеливание и рефакторинг позволило добиться 15 сек -> 0,3 сек
62. DarkAn 906 13.06.19 13:17 Сейчас в теме
(28) Распараллеливание документа??? Это как? А транзакция?
63. dmurk 273 13.06.19 13:18 Сейчас в теме
(62) Решено! ))

Голосуйте за мой новый доклад - в сентябре расскажу.
7. starik-2005 1979 12.06.19 10:07 Сейчас в теме
За эпик от красных отдельный плюс))) И, кстати, у него за 750 баксов 8 каналов памяти, в интелах только в самых дорогих 12, в попроще - за 3к - 6.
26. dmurk 273 12.06.19 14:57 Сейчас в теме
(7) 12 канальные интел - это та ещё фикция. У них между сокетами используется PCI express x4 третьей версии в каждом направлении. А это всего 3,8 ГБ/с. Никогда не видели, как во время бакапа СУБД на четырехсокетных Intel'ах терминалы в виртуалках виснут? )))
8. Xershi 762 12.06.19 10:42 Сейчас в теме
На картинке "Привязка кода 1С к дискам" мне кажется ошибка в написании кода?)
Или в чем смысл такой многоходовки?
19. dmurk 273 12.06.19 14:28 Сейчас в теме
(8) Смысл в том что фоновое задание на сервере имеет один входящий параметр - идентификатор временного хранилища, обращается к СУБД, получает и обрабатывает данные, после чего результат обработки отдается через временное хранилище обратно на клиент
20. Xershi 762 12.06.19 14:29 Сейчас в теме
(19) у вас 2 картинки названы одинаково. Я про первую!
21. dmurk 273 12.06.19 14:33 Сейчас в теме
(20) Дело в том что на большом экране во время доклада многострочный код практически нечитаем, поэтому это выдернутая из контекста иллюстрация показывающая разницу в дисковой нагрузке от двух разных методов. Метод результата запроса "Выбрать" складывается на диск в каталог SRVINFO, а метод "Выгрузить" перекладывается из окна доступа к памяти SQL (shared memory) в память кластера 1С. Из-за этого эффекта даже на сверхмалых таблицах можно внезапно получать +200 мс к выполнению запроса
23. Xershi 762 12.06.19 14:45 Сейчас в теме
(21) теперь стало понятно, что это не опечатка. но тогда другой вопрос. На малых таблицах все пойдет в память, а что тогда для сверх больших? Тогда будет огромный расход памяти и возможно при нехватке еще большее замедление?
25. dmurk 273 12.06.19 14:49 Сейчас в теме
(23) Конечно замедление возможно. Пример дан с целью того, чтобы подтолкнуть слушателей осознанно принимать решение об использовании Выбрать или Выгрузить
Rustig; Xershi; +2 Ответить
27. Xershi 762 12.06.19 15:04 Сейчас в теме
(25) Я всегда использую выбрать. Сомнительный выигрыш в скорости по сравнению с дырой в памяти.
Но если очень нужно, то как вариант ускорения сойдет.

Точнее не всегда, а в большинстве случаев. Когда нужно получить ТЗ, то выбрать не использую.
29. acanta 81 12.06.19 16:49 Сейчас в теме
(27) правильно ли я понимаю, что таблицу значений в 8ке нельзя использовать из за размещения их в оперативной памяти без освобождения при обнулении переменной?
30. Sashares 18 12.06.19 17:27 Сейчас в теме
(29)Память освобождается по завершению процедуры, в которой обнулили переменную, а не в момент обнуления.
31. dmurk 273 12.06.19 19:38 Сейчас в теме
(29) таблицу значений использовать можно и нужно. особенно с индексами
32. starik-2005 1979 12.06.19 20:46 Сейчас в теме
(31) както коллега тестил поиск по индексированной ТЗ (не путать с ВТ) - до 100 позиций был проигрыш по сравнению с неиндексированной, что меня несколько удивило
33. dmurk 273 12.06.19 22:12 Сейчас в теме
(32) Если вы в таблицу значений добавили индексы по полям "Номенклатура, СерияНоменклатуры, Склад" а поиск выполняете по структурам "Номенклатура, Характеристика", то индекс работать не будет.

Что это означает. Если вы ищете по ТЗ разными структурами отбора, в индексах у вас должен присутствовать каждый вариант набора искомых полей по которым будет выполняться поиск.

Индексы.Добавить("Номенклатура")
Индексы.Добавить("Номенклатура, Характеристика")
Индексы.Добавить("Номенклатура, Характеристика, Склад")

и гэтак далей ))

Кроме того, при аппаратной поддержке инструкций хэширования вашим процессором, индексация таблицы будет занимать менее 1% времени её заполнения, а на старых процессорах может доходить и до 30%.
nvv1970; Rustig; acanta; +3 Ответить
35. starik-2005 1979 12.06.19 23:17 Сейчас в теме
(33) америку открыл)))

По поводу аппаратных инструкций, то разные алгоритмы хеш не только мд5 и подобные делают - там все иначе. И поиск хеша при мд5 - это выборка с О(лог2н), равнозначная поиску в любом упорядоченном списке. Хнш джоин использует другого уровня хеш, который у Макконнелла описан как табличная оптимизация - это обычно 16-24 битное целое, а все эти аппаратные хеши - это куда больше бит и их в приемлемой величины память уже не упаковать.

Да, Вы всегда можете рассказать нам, как это все работает "на самом деле" и про аппаратный расчет хеша, и где оно там юзается. Было бы интересно ознакомиться с Вашими соображениями и заметить в них неточности)))
117. Rustig 1221 28.06.19 07:36 Сейчас в теме
(29) в уме держать такого рода нюансы невозможно. тут принцип такой:
1) сначала пишите алгоритм - используете все что хотите - Выбрать() или Выгрузить()
2) тестируете не только корректность получаемого результата, но и включаете замер производительности
3) если скорость вас не устраивает, меняете алгоритм и заодно проверяете гипотезу, что лучше из Выбрать() или Выгрузить()
34. dmurk 273 12.06.19 22:13 Сейчас в теме
Специально для тех кому не хватило доклада, выкладываю стенограмму окончания доклада в прикрепленном файле.
Прикрепленные файлы:
Многопоток продолжение.txt
stoptime; e][tend; serg_gres; acanta; +4 Ответить
68. e][tend 13.06.19 15:08 Сейчас в теме
(34) Дмитрий, спасибо за доклад и стенограмму. Правда из нее не совсем понял момент связанный с тонкими клиентами, которые с кешем 4 уровня. Я правильно вас понимаю, что вы клиентов пересадили на тонкие клиенты и они у вас подключались сразу к серверу 1С?
Если да, то такой вариант именно на этом процессоре, получается производительней, чем RDP сессия на вирт. сервак, с которого выполняется подключение к серверу 1С?
69. dmurk 273 13.06.19 15:32 Сейчас в теме
(68) Всё верно. Достижение максимальной производительности является совокупностью решений
38. starik-2005 1979 12.06.19 23:28 Сейчас в теме
Кстати, на тему недостатков хеш джоина:
Условием соединения может быть только равенство.Большая потребность в памяти для построения хеш-таблицы, что крайне ограничивает масштабируемостьалгоритма при увеличении размеров меньшей таблицы.Хеш-таблица должна быть построена полностью, до того как первый результат будет записан в результирующую таблицу, что делает этот вид соединения неприемлемым при необходимости получить первую строку результата как можно быстрее.
42. dmurk 273 13.06.19 06:26 Сейчас в теме
(38) Думаю, это отличный вопрос для простого исследования
43. dmurk 273 13.06.19 06:30 Сейчас в теме
(38) В ситуациях когда необходимо работать со случайно расширяемыми данными незначительного объема, я использую соответствия, могу использовать один или два раза вложенные структурами. Это решает в первую очередь вопрос быстрого нахождения строки в списке, в которой необходимо отразить изменение данных
48. starik-2005 1979 13.06.19 10:24 Сейчас в теме
(43) а есть информация о том, как работает соотвветствие со стороны 1С? Лично мне думается, что соответствие - это мемсет, который является упорядоченным хрантлищем ключей и соответствующих им значений. Ключ нормализуется хеш-функцией, дальше поиск и вставка за логарифм по основанию 2 из размера - это вполне себе быстро.
Но как быть со скулом? Там соединение берет малую таблицу, к ней берет хеширующую таблицу на 16 бит, например, - это 64*4=256 килобайт сразу, забивает ее пространство нулями и указателями на элемент, а если хеш получается с коллизией, то и на кортеж элементов, дальше пробегается по второй таблице и сравнивает 16-битный хеш от полей на равенство с ячейкой в 256 кб и если там 0 - идет дальше, а если указатель - берет его и смотрит, кортеж там или элемент. Дальше происходит сравнение ключей, т.к. во второй таблице хеш тоже может получиться с колизией. И если они равны (ключи) - тогда результат идет в результирующую выборку.

Теперь вопрос: где здесь 30% при отсутствии аппаратного хеширования и что за функция такая аппаратная (мнемоника ассемблерная) используется?
50. dmurk 273 13.06.19 11:06 Сейчас в теме
(48) Со скулом работа индексов и хешей исчерпывающе объяснена здесь https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-2017. В блогах инженеров натыкался на пояснения, что при аппаратной поддержке hash алгоритмов, используется аппаратный расчет хешей.

30% - это на собственном опыте. В феврале 2011 года от известной в 1С команды поступила задача на оптимизацию медленного ссылочного склеивания 19-ти таблиц документов в 1С: Документооборот в виде ВЫБРАТЬ Ссылка ИЗ ... ОБЪЕДИНИТЬ ВЫБРАТЬ Ссылка ИЗ ... и т.п.
Одним источником проблемы было наличие конструкции ОБЪЕДИНИТЬ вместо ОБЪЕДИНИТЬ ВСЕ в тексте запроса, вторым - виртуализация среды с маскировкой версии процессора, третьим - то что это все крутилось на чем-то очень древнем с частотой 2,4 Ггц.

Как итог - запрос выполнялся 45 секунд когда поступил мне, и 1,5 секунды когда был отдан обратно.
55. starik-2005 1979 13.06.19 11:34 Сейчас в теме
(50) ну 1.5 сек против 45 - это не 30%. 30% - это 0.5 сек от 1.5 сек. Так что это не объяснение.

А по поводу аппаратной поддержки хеша, то тут системы с шифрованием показывают хорошую овер 2 раза производительность на шифровании и расшифровке, что, кстати, у АМД работает даже в однопотоке быстрее, чем у штеуда.

Возвращаясь к напечатанному хочу сказать, что народ нынче пошел в 1С плохо разбирающийся в структурах данных и механизмах работы с ними. У Макконнелла, кстати, очень хорошо описаны алгоритмы хеш-табличной оптимизации, просто там нет слова "хеш". Все эти хеши - это многим как культ Карго воспринимается - ребята с MIT, которые математику не прогуливали, запилили, упомянув про хеш-таблицы, а остальые, кто пединституты поназаканчивал, им поверили и вдаваться в подробности не стали. А современный разработчик вообще прочитает и обретет какое-нить божественное просветление, напридумывав себе чисто из непонимания, как нужно опиммизировать запросы.

Зы: сдается мне, что даже пилильщики 1С-ного ядра толком не понимают, как это работает, поэтому вся их оптимайз основана на технологии try-repeat..
58. dmurk 273 13.06.19 12:46 Сейчас в теме
(55) 45 секунд делим на 18 объединений 19-ти таблиц, получаем 40% увеличение времени на одном объединении
65. starik-2005 1979 13.06.19 13:41 Сейчас в теме
(58)
18 объединений 19-ти таблиц
Ну а как Вы себе представляете хеш-джойн этих 19-ти таблиц?

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

Если предположить, что скул писали не совсем долбики, то можно подумать, что они написали как-то так:
1. Берем самую маленькую таблицу и делаем из нее хеш-таблицу по совокупности ключей (у нас тут объединение, а не соединение, поэтому все поля участвуют).
2. Соединяем ее со второй таблицей. Из непопавших в хеш записей делаем новые кортежи.
3. Идем к пункту 1, убрав из него вторую таблицу (ну и первую тоже).

Даже при таком раскладе количество посчитанных хешей равно количеству строк во всех таблицах. И, предположим, новый алгоритм ускоряет на 30% расчет хешей, это приведет к тому, что общий итог должен быть равен 45 сек - 30% = 30 сек (и это только в том случае, что процессор древний у нас ничего кроме хешей не считает). А у нас 1,5 сек, да? К какому выводу приходим? У меня их ровно два: с Вашей точки зрения получается, что создатели скула те еще долбики и считают хеши в изначальном варианте с апаратно-недееспособным сервером не на 30% больше времени, а на 3000% (в 30 раз). Но как? Они в том и другом случае считают хеши одинаковое количество раз (надеюсь Вы понимаете, почему?) - и это по Вашему же утверждению должно повысить производительность только на 30%, откуда здесь 3000%? Второй вариант - это аппаратная виртуализация, отсутствие которой действительно может затормозить систему в овер 10 раз, но и то весьма сомнительно, т.к. паравиртуализация и динамическая трансляция, как основные средства программной виртуализации, тормозят систему ну может раза в два-три - не более, хотя включение аппаратной работы с памятью хоста из виртуальной машины способно значительно, как пишут в документации к ВМ, повысить производительност guest-систем, но, опять же, не на 3000%.
66. dmurk 273 13.06.19 14:03 Сейчас в теме
(65) К сожалению, повторить тот давний опыт я не в состоянии. Но именно он меня подтолкнул от программирования 1С перейти к изучению работы SQL
67. starik-2005 1979 13.06.19 14:10 Сейчас в теме
(66)
от программирования 1С перейти к изучению работы SQL
С/С++ спасет отца русской демократии, ибо там, конечно, есть map, но он реализован на С/С++, а не на языке 1С )))
84. dmurk 273 14.06.19 00:41 Сейчас в теме
(65) проверил идею как что работает:

При первом выполнении плана запроса каждая таблица, которая написана с маркером ОБЪЕДИНИТЬ замедляет выполнение запроса на время необходимое для хеширования измерений всех строк из всех источников

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

Так как в моем примере существует частичное слияние результатов, то для повторных запусков быстрее отрабатывает ОБЪЕДИНИТЬ, а для первых - ОБЪЕДИНИТЬ ВСЕ.
Прикрепленные файлы:
59. dmurk 273 13.06.19 12:47 Сейчас в теме
(55) Пилильщики 1С-ядра несколько раз 100% поменяли штатный состав за 10 лет.
60. acanta 81 13.06.19 12:51 Сейчас в теме
(59) Огромная благодарность за доклад и автору и комментаторам. Нашла ответы на очень многие вопросы.
119. Rustig 1221 28.06.19 07:45 Сейчас в теме
(55) да, вы правы, многие не понимают то, о чем вы здесь дискутируете. я в том числе....
122. starik-2005 1979 28.06.19 08:21 Сейчас в теме
(119) автор привел интересную сцылку на мелкософтовский сайт, где достаточно подробно рассказывается, что и как с индексами. Но знать нужно то, что соединение с использованием индексов не всегда дает лучший результат, ибо тот же хеш джоин не нуждается в индексе и для средних таблиц очень хорошо работает, а для маленьких таблиц вообще в индексах смысла нет, ибо затраты на их чтение в разы боьше, чем тупой перебор в цикле внутри цикла. Поэтому я бы рекомендовал Макконнелла для начала прочитать, но так, чтобы понятно стало, а не просто по-верхам. И вот тогда все начнет проясняться. А все эти курсы - просто средство отъема денег, ибо рецептов универсальных не так много и по большему счету они все описаны на ИТС, уложившись в пару страниц не очень мелкого текста: временные таблицы, индексы по полям поиска/соединения, отключение параллелизма - в общем-то и все, если не считать автоматического разделения файлов временных таблиц на современных версиях скула. Остальное - это поиск длинных запросов в профайлере или ТЖ, разделение OLTP и OLAP на продуктовой базе и прочие "серебряные пули", которые уже не совсем рецепты, ибо индивидуальны...
Boulala; wingdog; Rustig; acanta; +4 Ответить
123. Rustig 1221 28.06.19 08:45 Сейчас в теме
(122) очень рад, что вы лояльно отнеслись к моему вопросу.
Стив Макконел - автор книги "Совершенный код" ?

может кому пригодится - есть в издательстве Питер.com раздел Библиотека программиста
https://www.piter.com/collection/biblioteka-programmista
56. starik-2005 1979 13.06.19 11:53 Сейчас в теме
(50) кстати, чрезвычайно интересная статейка и там даже есть слово "30%" - вот оно:
If two index keys are mapped to the same hash bucket, there is a hash collision. A large number of hash collisions can have a performance impact on read operations. A realistic goal is for 30% of the buckets contain two different key values.
Но это, конечно, о другом)))
118. Rustig 1221 28.06.19 07:42 Сейчас в теме
(50) круто! это после конференеции к вам стали обращаться?
129. dmurk 273 30.06.19 22:47 Сейчас в теме
(118) Обращаться начинают после третьей конференции. Со словами - там же вроде твоя тема была...
brr; acanta; +2 Ответить
53. dmurk 273 13.06.19 11:15 Сейчас в теме
(48) со стороны 1С соответствие воспринимается как какая-то коллекция, которая используется для быстрого доступа к значениям по ключам. В C# есть полный аналог - IDictionary.
54. starik-2005 1979 13.06.19 11:26 Сейчас в теме
(53) и все это по факту сбалансированные деревья.
94. dmurk 273 18.06.19 15:16 Сейчас в теме
(38) В докладе в 2013-м году приводил пример оптимизации при соединении на неравенство
46. asved.ru 36 13.06.19 07:50 Сейчас в теме

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

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


Что это за бред? Зачем вы выдумываете несуществующие термины?
Откройте для себя такие вещи, как план запроса, операции sort и merge join в нем. В описанном примере, читая индекс, оптимизатор понимает, что выборка из него будет упорядочена по ключевым полям, как следствие цена sort + merge join будет ниже, чем hash join, т.к. sort не требуется.

Вложенный запрос может отрабатывать быстрее в тех случаях, когда оптимизатору удается построить для него достаточно хороший план, экономия возникает на отсутствии ожиданий tempdb. Грубо говоря, tempdb - это костыль, применяемый когда данные в основной БД лежат настолько неудобно для нашего запроса, что их проще перекомпоновать.

PS TSQL - не императивный, а описательный язык. Сервер СУБД делает не то, что Вы написали в запросе, а то, что сам решит нужным для получения затребованного вами результата. А до сервера еще есть движок SDBL, который тоже зачастую делает не совсем очевидные вещи. Поэтому в терминах текста запроса на BSL говорить о его производительности имеет смысл только в формате стандарта "так делать нельзя".
52. dmurk 273 13.06.19 11:12 Сейчас в теме
(46) Вся платформа 1С с точки зрения sql.ru это один большой несуществующий термин ))

Когда я начинал изучать программирование в 1986-м, терминология которую вы в данный момент используете ещё не была придумана, а документ ANSI X3.135-1986 не содержал даже приблизительных упоминаний о HASH JOIN.

Однако реляционные СУБД уже существовали и слово "наследование" было понятно моим собеседникам.
72. asved.ru 36 13.06.19 16:04 Сейчас в теме
(52)
документ ANSI X3.135-1986 не содержал даже приблизительных упоминаний о HASH JOIN


В T-SQL нет термина hash join. От слова совсем.


(52)
и слово "наследование" было понятно моим собеседникам

Может быть, это о том наследовании, которое с инкапсуляцией и полиморфизмом? :) Ну так выборка из таблицы - это не объект класса, а набор данных, структурированный определенным образом.
А индекс - это физическая таблица, из которой выбираются данные. Причем практически для всех объектов 1С существует индекс, хранящий вообще все данные таблицы, и не существует кучи. Выборка может наследовать порядок индекса. А может и не наследовать. Но не сам индекс.

Более того, возьмем три запроса:

sel ect * fr om table where A and B
и
sel ect * fr om (sel ect * fr om table where A) where B
и
sel ect * fr om (select * fr om table where B) wh ere A


и посмотрим на их планы - они окажутся идентичны.
74. dmurk 273 13.06.19 16:08 Сейчас в теме
(72) Для того чтобы вам оппонировать, необходимо дополнительное исследование вопроса, в данный момент не готов ответить
81. starik-2005 1979 13.06.19 17:54 Сейчас в теме
(74)
необходимо дополнительное исследование вопроса
В транзакционном SQL (т.е. T-SQL), и в любом другом ANSI SQL и т.д. нет hash join, там есть left/right*inner/outer/full join. Но это SQL. Дальше есть работа с данными, их выборки, объединения, соединения и вся прочая муть на уровне системы. И вот там есть понятия hash join, nested loops и некоторые другие, которых в SQL нет от слова совсем. Т.е. мы с Вами беседовали об одном, а человеек тут пришел и не нашел поиском в стандарте слов hash и join и принял это за какую-то проблему )))
Boulala; nvv1970; acanta; dmurk; +4 Ответить
83. dmurk 273 13.06.19 18:05 Сейчас в теме
(81) А ведь он абсолютно прав! Каждый человек выстраивает для себя картину мира, и всё что с ней не совпадает, является проблемой.

Он бы хотел, чтобы на аудиторию в 500 человек был доклад именно с такими терминами. Пытаешься изложить как можно более доступно, получаешь от организаторов замечание о чрезмерной сложности первой версии доклада, а тут бац! Терминология не специфическая ))
nvv1970; acanta; +2 Ответить
85. dmurk 273 14.06.19 01:21 Сейчас в теме
(72) Подумал. Вы не правы.

- в приведенном в докладе примере, виртуальная таблица из которой производится выборка, является не структурированным набором данных, это сущность, которая обладает:
- инкапсуляцией
- полиморфизмом

- что касается наследования, о котором я говорил, то оно работает следующим образом:
- при выборке данных из _виртуальных_ таблиц остатков и оборотов данные попадают в вышестоящую группировку из кластеризованных индексов совместно с предварительно рассчитанными хешами измерений, вследствие чего группировака вышестоящей таблицы по индексируемым измерениям не требует её предварительного хеширования, т.к. эта информация уже существует во вложенном запросе
89. nicxxx 236 14.06.19 11:29 Сейчас в теме
(72)
В T-SQL нет термина hash join. От слова совсем.

Я бы поспорил.
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/hints-transact-sql-join?view=sql-server-2017
91. starik-2005 1979 14.06.19 14:46 Сейчас в теме
(89)
Я бы поспорил.
Да, хинты там есть. А еще они есть в постгресе и конфиге постгреса. Но хинты - это типа такие "помощники" оптимизатора запросов, но в стандарте ANSI SQL не совсем понятно, есть они или нет - он (стандарт) в инете есть за 60 баксоф.
71. V_V_V 13.06.19 15:58 Сейчас в теме
Я что-то упустил или точно нигде не сказано на каком именно релизе 1С:Предприятия всё тестировалось\оптимизировалось?
Оставьте свое сообщение

См. также

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

Агрегатные функции СКД, о которых мало кто знает 356

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    16491    ids79    44       

Обмен данными. Консистентность vs Многопоточность 28

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Интеграция

Рассмотрим теоретические основы обмена данными. Какие бывают обмены, какие гарантии при этом даются, зачем идти на компромиссы и что при этом может пойти не так. Есть ли идеальная схема?

03.09.2019    5215    m-rv    1       

Перенос данных УТ 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 руб.

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 265

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    19479    ids79    31       

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

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

Обработчики событий при записи объектов. Зачем и что за чем? 216

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    15623    4    AlbinaAAA    24       

Создание отчетов с помощью СКД - основные понятия и элементы 219

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    24497    ids79    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 руб.

Подсистема "Варианты отчетов". Используете ли Вы ее правильно? 222

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Работа с интерфейсом БСП (Библиотека стандартных подсистем)

Небольшая история про использование подсистемы "Варианты отчетов" из БСП. Используете ли Вы ее правильно?

04.06.2019    19867    YPermitin    49       

Выгрузка документа по условию 5

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    7968    m-rv    2       

Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо

Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.

9000 рублей

Как настроить правильную техподдержку (helpdesk, service desk на коленке) 39

Статья Программист Бизнес-аналитик Руководитель проекта Нет файла v8 УУ Управление взаимоотношениями с клиентами (СRM) Документооборот и делопроизводство Монитор заказов Учет рабочего времени Бесплатно (free) Управление услугами и сервисом

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

24.04.2019    9303    siddy    0       

Преобразование EXCEL в таблицу значений без COM и других извращений 216

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Загрузка и выгрузка в Excel

Получение таблицы значений из excel в 1С v8, без COM, внешних источников данных и т.д. EXCELВТаблицуЗначений() - За 10 строчек кода! Реализация протестирована на 1С 8.3.12.1714 (x64).

18.04.2019    15005    9    Eret1k    43       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    10518    m-rv    16       

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

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

29700 руб.

Копирование числовых ячеек из 1С в Excel 26

Статья Системный администратор Программист Нет файла v8 1cv8.cf Windows Бесплатно (free) Загрузка и выгрузка в Excel Администрирование данных 1С

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

15.01.2019    13197    itriot11    21       

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

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

19700 руб.

Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке 509

Статья Программист Нет файла v8 v8::СПР ЗКГУ3.0 ЗУП3.x БУ Зарплата Управление персоналом (HRM) Бесплатно (free) Универсальные функции

В статье размещен список стандартных процедур и функций с примерами, которые могут помочь при разработке (доработке) конфигураций Зарплата и управление персоналом ред. 3.1 и Зарплата и кадры государственного учреждения 3.1. Иногда бывает довольно сложно правильно получить данные или долго, поэтому лучшим вариантом будет использование стандартных процедур. Буду очень признателен, если Вы поделитесь своим опытом и предложите свои варианты стандартных процедур которые помогают в работе. Или предложите, как дополнить имеющиеся процедуры.

14.11.2018    39736    GeterX    94       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 129

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    23998    ids79    40       

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

Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.

29700 руб.

Git + 1С. Часть 1. Как подключиться к команде разработки и начать использовать Git 282

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Инструментарий разработчика Управление проектом

Первая статья из цикла инструкций по работе с Git в 1С-разработке. Рассмотрим, как настроить рабочее место, как получить свою "копию" проекта для разработки и приступить к полезным действиям. Все примеры будут изложены в рамках трёх практических кейсов: 1. Моя команда дорабатывает типовую конфигурацию, использует приватный репозиторий на BitBucket, в котором версионируются внешние отчеты/обработки, расширения конфигураций и правила обмена; 2. Я участвую в стартап-команде, которая разрабатывает свою конфигурацию с использованием Git и GitLab; 3. Я принимаю участие в развитии OpenSource-продукта на GitHub как заинтересованный разработчик (контрибьютор).

18.10.2018    40040    stas_ganiev    72       

Вспомогательные инструкции в коде 1С 107

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    22272    tormozit    100       

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

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

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

Из Excel в 1С запросом 33

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Загрузка и выгрузка в Excel

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

14.08.2018    15429    m-rv    5       

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

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

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

Повышаем эффективность разработки правил обмена 125

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

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

25.06.2018    21711    olegtymko    47       

Как сделать запрос на изменение данных 75

Статья Программист Нет файла v8 v8::Запросы 1cv8.cf Бесплатно (free) Практика программирования

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    23358    m-rv    21       

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

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

6500 рублей

Строим графы средствами 1С (без GraphViz) 44

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    19126    slozhenikin_com    20       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    13343    Rustig    9