Методика оптимизации программного кода 1С: проведение документов

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

Обработки - Обработка документов

анализ производительность оптимизация проведение документов

63
Описание простого метода анализа производительности программного кода 1С, способов его оптимизации и оценки результатов в виде числовых показателей прироста производительности. Не требует сторонних программных продуктов, используются только типовые возможности платформ 1С. Методика проверена на линейке платформ начиная с 1С:Предприятие 8.2 (обычные формы, управляемые формы). Позволяет ускорить проведение проблемных документов в 3 и более раз, провести проверку корректности формирования проводок оптимизированным кодом и подтвердить результаты оптимизации реальными замерами производительности в режиме предприятия. К публикации приложены демонстрационные базы для режимов обычного и управляемого приложения на платформе 1С:Предприятие 8.3 (8.3.9.2033).

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

Поэтому данная статья посвящена исключительно программной оптимизации. 

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

Во-вторых, при оценке программного кода необходимо руководствоваться здравым смыслом и не рассматривать его исключительно через призму рекомендаций 1С. В крупных информационных системах действуют свои законы и правила работы с данными. Очень часто, следуя рекомендациям 1С, мы достигаем противоположного эффекта. Для примера - использование временных таблиц. Из личного опыта: в 90% случаев причина зависаний и отказов 1С в клиент-серверном режиме - бездумное и необоснованное использование команды "Поместить" при построении запросов к базе данных. 

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

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

I. Подготовка конфигурации.

Выгружаем конфигурацию из демонстрационной базы и добавляем из нее в оптимизируемую конфигурацию новые объекты :
 - справочник "Дополнительные константы" для хранения настроек;
 - общий модуль "МодульОптимизация" с сервисными функциями и процедурами; 
 - параметр сеанса "ВклОптимизации" для переключения режима использования модулей (исходных/оптимизированных). Добавляем в модуль сеанса его  инициализацию; 
 - регистр "ОтложенноеПроведениеДокументов" для формирования очереди отложенного проведения документов. Используется для исключения конфликтов блокировок.
 - обработка "Регламент" для запуска регламентных заданий в файловом режиме работы (демонстрация отложенного проведения).
 - обработка "ТестПроведения" для анализа результатов оптимизации.
 - обработка "ТестоваяНагрузка" для дополнительной нагрузки системы во время теста.
Не забываем добавить права на новые объекты в общедоступную роль.

Подсистема реализует следующие возможности:

  1. Автоматический запуск указанного количества нагрузочных сессий для приближения условий теста в тестовой базе к реальным условиям работы.
  2. Включение/выключение использования оптимизированного кода "на лету" в режиме предприятия;
  3. Включение/выключение использования оптимизированного кода только для выбранных пользователей;
  4. Включение/выключение использования оптимизированного кода только для выбранных функций и процедур оптимизируемых модулей;
  5. Включение режима отложенного проведения документов. При этом выбранные документы выстраиваются в очередь и проводятся регламентом на сервере. Исключается длительное ожидание проведения документа пользователем. Исключаются блокировки за счет последовательного проведения.
  6. Автоматическая сверка движений документов, проведенных с вкл/выкл режимом оптимизации.

II. Определение проблемных зон кода 

1. Информацию о проблемах при проведении получаем от наших пользователей - они предоставляют ее в избытке.
2. Выбираем объект, работа которого наиболее критична для бизнеса.
3. В конфигураторе открываем модуль формы обработки "ТестПроведения".
4. Устанавливаем точки останова в процедуре "ВыполнитьТест" до и после основного цикла тестового проведения (в исходной обработке для обычных форм №стр 341 и 444).


5. Запускаем 1С в режиме отладки. 
- Открываем в сессии отладки обработку "ВыполнитьТест".


- Выбираем из списка выбора вид тестируемого документа.
- Устанавливаем количество тестовых проведений. Параметр используется для получения более точных средних показателей.
- Выбираем способ отбора тестируемых объектов: проведение выбранного документа или проведение выборки за период.


- Выполняем команду "Выполнить тестирование".

6. При остановке на первой точке останова включаем режим замера производительности и продолжаем отладку:

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

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

III. Анализ и исправление проблемных зон 
1. Переходим к найденным участкам кода, анализируем на возможность оптимизации. О методах оптимизации кода статей множество, поэтому кратко, на что обращаем внимание:
 - многократное выполнение одинаковых запросов к БД( к примеру, в цикле), с пониманием того, что получение через точку свойств ссылочных объектов, это так же запросы к БД;
 - Использование в тексте запросов инструкции "Поместить". Если есть возможность построить качественный запрос без использования временных таблиц, обязательно используйте эту возможность. Темповая база - это самое узкое место в массивных информационных системах. Проведение через нее потоков данных должно быть серьезно обосновано.
 - уровень использования принудительного кеширования для значений, часто используемых в коде (к примеру, ссылок на организацию, статью движения, номенклатуру и пр.). Методов кеширования множество - хранение этих значений в локальных или глобальных переменных типа таблица или структура, подключение функций общих модулей с повторным использованием значений и пр.

2. Если найден сомнительный код и появились идеи по его исправлению, добавляем в общий модуль "МодульОптимизация" копию найденой процедуры(функции) с именем, содержащим префикс <Вид оптимизируемого документа>. Объект документа передаем в параметре.


3. Оптимизируем код в новой процедуре(функции).
4. Добавляем в начало исходной процедуры(функции) переключение по значениям параметра сеанса на новую процедуру(функцию)
5. Повторяем алгоритм, описанный в п.II, но перед запуском команды "Выполнить тестирование" меняем настройки режима тестирования:
устанавливаем флаги "Автоматическое тестирование кода до/после оптимизации" и "Сверка проводок, сформированных до и после включения режима оптимизации":

6. После завершения теста в окне сообщений отобразится результат ваших стараний - показатели до и после использования оптимизированного кода. 

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

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


Центральным объектом метода оптимизации является обработка "ТестПроведения". Описание настроек:

 - "Количество тестовых попыток записи/проведения документов" определяет количество перепроведений выбранного документа в режиме темта по 1 документу. В режиме теста по выборке за период параметр определяет количество отбираемых документов. Особенность теста по выборке - при повторном тестировании при формировании выборки исключаются документы, участвовавшие в предыдущих тестах.
 - Флаг "Оптимизация включена для текущего пользователя" включает режим использования оптимизированных модулей для текещего пользователя.
 - Флаг "Оптимизация включена для всех пользователей" включает режим использования оптимизированных модулей для всех пользователей.
 - Флаг "Автоматическое тестирование кода до/после оптимизации" включает режим тестирования с  автоматическим переключением использования оптимизированных модулей. При этом объекты теста перепроводятся дважды: с использованием исходного кода и с использованием оптимизированных модулей;    
 - Флаг "Сверка проводок, сформированных до и после включения режима оптимизации" включает режим сверки проводок документа, сформированных оптимизированным и не оптимизированным кодом;
 - Флаг "Перезаписывать только проведенные" - для тестирования будут отбираться только проведенные документы;
 - Флаг "Режим записи без проведения" - при тестировании документы будут записываться без проведения;
 - Флаг "Автозапуск нагрузочных сессий" - перед началом тестирования будут запущены нагрузочные сессии 1С. После окончания теста нагрузочные сессии будут автоматически закрыты;
 - "Каталог сохранения лога тестирования" определяет путь к каталогу, в котором автоматически сохранится результат теста;
-  Команда "Выполнить тестовое проведение всех документов периода" запускает пакетное перепроведение всех документов выбранного периода. При этом документы перепроводятся партиями по 10, поочередно и в обычном режиме и в режиме оптимизации. Команда предназначена для анализа разультата оптимизации и сверки проводок в потоке. 
 - Флаг "Выполнить тест процедуры" - при тестировании будет выполнятся только код указанной процедуры;

Настройки нагрузочных сессий:
 - "Количество нагрузочных сессий" - количество сессий, которые будут запущены автоматически;
 - "Месяц отбора документов для нагрузки" - определение месяца, в пределах которого будут отбираться документы для перепроведения в нагрузочных сессиях;

VI. Запуск режима оптимизации для рабочей базы.

Перед включением режима оптимизации для всех пользователей рабочей базы рекомендую включить оптимизацию для 1-2х пользователей, которые особенно нагружены и недовольны зависаниями и сбоями. Во-первых это даст объективную оценку результата, во-вторых - это дополнительный пользовательский тест алгоритмов, которые в результате проведения оптимизации кода могут существенно отличаться от исходных. Как правило, достаточно эксплуатировать базу в таком режиме 3-5 дней, после чего можно включить режим оптимизации для всех.

Включение и выключение режима оптимизации производится с помощью предопределенного элемента "ВключениеОптимизации" справочника "ДопКонстанты".

Включение и выключение режима для всех пользователей производится установкой поля "Значение" элемента "ВключениеОптимизации" в "Истина" или "Ложь" соответственно. Для этого можно использовать флаг "Оптимизация включена для всех пользователей" в обработке ТестПроведения.

Для включения оптимизированных обработчиков только для конкретного пользователя необходимо добавить в табличную часть "Значения" элемента "ВключениеОптимизации" строку, поместив в поле "Ключ" код пользователя, а в поле "Значение" - значение "Истина". 

Для включения/выключения использования определенной оптимизированной процедуры(функции), необходимо добавить в табличную часть "Значения" элемента "ВключениеОптимизации" строку, поместив в поле "Ключ" имя этой процедуры, а в поле "Значение" - значение "Истина" или "Ложь" соответственно. 

Все эти настройки реализованы в тестовой демонстрационной базе.

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

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

63

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

Наименование Файл Версия Размер
Методика оптимизации программного кода 1С - Обычные формы
.dt 108,29Kb
19.03.19
5
.dt 108,29Kb 5 Скачать
Методика оптимизации программного кода 1С - Управляемые формы
.dt 107,82Kb
19.03.19
7
.dt 107,82Kb 7 Скачать

См. также

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

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. vandalsvq 1101 19.03.19 12:02 Сейчас в теме
(0) правда и ДокументОбъект.Автор.Код тоже не самое оптимальное решение, в таком случае рекомендуется запросом получать значение конкретного поля. А то ведь обращение ДокументОбъект.Автор.(ЛюбойРеквизит) приведет к полному чтению данных ссылки "Автор" и помещению в память на какое-то время
w.r.; CyberCerber; mysm; user-z99999; wowik; +5 Ответить
17. dmitrydemenew 106 19.03.19 14:36 Сейчас в теме
(1)Согласен, с точки зрения правильного кода - да, запрос более оптимальное решение. Еще более оптимальное решение - получение этого параметра, к примеру, функцией модуля с повторным использованием возвращаемых значений. Но в рамках демо-примера ни то ни другое не окажет существенного влияния на производительность, т.к. параметр находится за рамками проблемной зоны кода, за границей цикла. Код в примере - всего лишь тестовая нагрузка, не более.
46. w.r. 213 22.03.19 07:50 Сейчас в теме
(17)
(1)Согласен, с точки зрения правильного кода - да, запрос более оптимальное решение. Еще более оптимальное решение - получение этого параметра, к примеру, функцией модуля с повторным использованием возвращаемых значений. Но в рамках демо-примера ни то ни другое не окажет существенного влияния на производительность, т.к. параметр находится за рамками проблемной зоны кода, за границей цикла. Код в примере - всего лишь тестовая нагрузка, не более.

С модлями с повторным использованием лучше не играться. Если реквизит код или номер документа - еще можно использовать и то с опаской. Если это любой другой реквизит, который с высокой вероятностью может быть исправлен пользователем во время сеанса - то будут возвращаться устаревшие данные. Поэтому лучше всего - это запрос конкретных реквизитов
2. capitan 1193 19.03.19 12:11 Сейчас в теме
Очередная статья и очередной велосипед )
Без обид, методика интересная и имеет право на жизнь.

На мой взгляд, первопричина зависаний и плохой работы программы 1С - неправильное проектирование информационной системы, а потом уже некачественный программный код модулей этой самой 1С.
Оптимизировать программный код можно до опупения, но как правило в 90% есть решение выноса части функционала например на нерабочее время и т.п. в том числе и железячные.
Я конечно 15 лет не изучаю вопросы оптимизации, но загнав tempdb на RAM диск или на SSD если не помещается вы в разы ускорите вашу ситуацию
Поэтому (пишется вместе) в отрыве от реальных событий сложно сказать про данную методику, тем более она на обычных формах.
PLAstic; Идальго; Irwin; fancy; wowik; +5 Ответить
3. user-z99999 18 19.03.19 12:35 Сейчас в теме
(2)
Складывается впечатление, что вы стараетесь кого-то обидеть своими комментариями.
Я конечно 15 лет не изучаю вопросы оптимизации, но загнав tempdb на RAM диск или на SSD если не помещается вы в разы ускорите вашу ситуацию

Очень мощный сервер может спрятать недостаток опыта плохого программиста, иногда.
CyberCerber; oleg-x; Rustig; +3 Ответить
8. capitan 1193 19.03.19 13:15 Сейчас в теме
(3)Я же написал - без обид.
И обидеть никого не хочу.
Просто мне например не хватает информации из публикации, а заявление что tempdb - зло я не принимаю.
Если не слишком удачно скрестить виртуальные таблицы то у вас оптимизатор БД выберет сканирование таблиц, что на базе 500 Гб будет фиаско.
Отсюда tempdb и вырос в 1С и во всех языках даже чистом SQL он есть
GOshaSaveiko; bulpi; GreenDragon; wowik; pavlov_dv; Vladimir Litvinenko; +6 Ответить
9. dmitrydemenew 106 19.03.19 13:37 Сейчас в теме
(8) Основные факторы, определяющие мое отношение к этой проблеме таковы:
1. Реально наблюдаемое огромное количество трудоемких физических операций с жестким диском, в разы превышающих число операций с БД хранения и вызванных обработкой временных данных (обоснование во вложении).
2. В результате выполнения этих трудоемких операций, что вполне логично при их критическом увеличении, "зависает" 1С и пользователи программы ощущают существенное неудобство.
3. Я, как специалист, отвечающий за отсутствие этого неудобства, недоволен источником этих неудобств, и был бы рад, если бы использование этого инструмента (ВТ) было всегда технически обоснованным.

Это исключительно мое личное мнение и я его никому не навязываю.
Прошу всех не обсуждать и не поднимать тему использования ВТ в рамках этой публикации.
Прикрепленные файлы:
14. capitan 1193 19.03.19 14:21 Сейчас в теме
(9)дело в том, что скорость работы 1С при правильном написании кода не зависит от размера базы, до тех пор пока не начинается сканирование таблиц разумеется.
В идеале 2 Гб и 2 Тб базы должны вам информацию с регистра остатков например поднять с одинаковой скоростью тем более с SSD
И если этого не происходит, то ни фига это не во ... таблицах дело
В принципе в ... таблице откуда взяться такому большому объему ? если вы предварительно фильтры накладываете разумеется
Т.е. надо брать профайлер и долго курить ваши запросы
Тогда может и не надо будет так скрупулезно замерять результат оптимизации - вы его услышите по крикам ура и брызгам шампанского из бухгалтерии )
33. GreenDragon 20.03.19 17:47 Сейчас в теме
(9) Судя по вашему скрину, время ответа по вашим выделенным строкам 12 и 14 мс. Вы где-то увидели проблему? То, что длина очереди 5, практически ни о чём не говорит.

Процитирую статью с sqlcom.ru

Правило, по которому глубина очереди не должна для одного диска превышать 2 (и другие сопутствующие признаки) не соотносятся напрямую с глубиной очереди, определённой по счётчикам производительности операционной системы. Таким образом, получило распространение несколько иное правило, гласящие, что задержки при обращении к диску не должны превышать примерно 10 – 20 ms, что было вычислено из прежнего правила глубины очереди 2 на диск (вероятно, для дисков с 7200/10000 об/мин), причём, без учёта описанных выше дополнительных признаков.
34. dmitrydemenew 106 20.03.19 17:51 Сейчас в теме
(33)Вот только длина очереди не 5, а 50...
38. asved.ru 36 21.03.19 08:13 Сейчас в теме
(9)
Прошу всех не обсуждать и не поднимать тему использования ВТ в рамках этой публикации.


В таком случае не следовало рекомендовать отказ от использования временных таблиц. Сейчас же получается, что Вы даете откровенно вредную рекомендацию и просите ее не обсуждать. В джентльменском обществе за такое канделябром бьют :)
Wdivine; PLAstic; +2 Ответить
39. dmitrydemenew 106 21.03.19 08:21 Сейчас в теме
(38)В публикации нет рекомендаций отказа от временных таблиц, есть лишь рекомендация использовать этот инструмент обдумано и технически обосновано.
41. TODD22 17 21.03.19 10:12 Сейчас в теме
(39)
есть лишь рекомендация использовать этот инструмент обдумано и технически обосновано.

Но про техническое обоснование ни слова... про обдуманность то же...
43. dmitrydemenew 106 21.03.19 10:35 Сейчас в теме
(41) Повторюсь: предложенная методика дет возможность измерить обоснованность (с точки зрения производительности) использования любых способов построения программного кода в цифрах. Все мои выводы основаны исключительно на результатах этих измерений в информационных системах, которые мне приходилось оптимизировать.
44. starik-2005 1858 21.03.19 10:45 Сейчас в теме
(41) так статья не ставит цель рассказать, что такое обоснованность и обдуманность - она для этого по формату не пройдет на сайт, ибо модератор не сможет дочитать произведение, в полной мере раскрывающее вышеописанное, до конца. Есть совершенный код Макконнелла, есть труды Дейкстры, Вирта, Кнута - не нужно тут про обоснованность и обдуманность, ибо читающие должны быть с приведенными литературными произведениями как минимум ознакомлены.

Другое дело, что автор статьи не привел список литературы, которая могла бы помочь обосновать и обдумать. В те времена, когда пионеры были большими, пруфы даже в школьных докладах были. Но в российской действительности указать ссылки на дополнительные или используемые материалы редко кто способен (видимо, кризис высшего образования), поэтому я современную русскую литературу по бизнесу и прочему стараюсь не читать.
5. dmitrydemenew 106 19.03.19 12:40 Сейчас в теме
(2)На моем текущем месте работы не только tempdb, но и все рабочие базы расположены на SSD. Напоминаю, что все мои рассуждения и выводы относятся исключительно к крупным и высоконагруженным информационным системам. Лично мне сейчас приходится работать с базами, средний размер которых более 500 ГБ и расположены они на топовом серверном оборудовании.
"Поэтому" исправил, действительно глаза режет, спасибо. Представленная методика не зависит от режима запуска 1С. Во вложении демки для вариантов запуска как в режиме управляемых, так и обычных форм.
4. user-z99999 18 19.03.19 12:36 Сейчас в теме
Автор молодец, почти воспроизвел APDEX "Оценка производительности" из БСП.
PLAstic; Irwin; A_Max; +3 Ответить
6. VmvLer 19.03.19 12:58 Сейчас в теме
практическая ценность тестов в каких-то демо-базах сомнительна.

я не призываю светить тут учетные данные баз от 500 гб., но только выводов по результатам
тестирования недостаточно. Необходимы визуальные результаты(статистика) тестов именно по таким базам.
7. dmitrydemenew 106 19.03.19 13:13 Сейчас в теме
(6)Практическая ценность этих тестов не сомнительна - она отсутствует. Эти демо-базы только для того, чтобы перед принятием решения, использовать или нет описанную методику в рабочем режиме, опробовать ее в тесте и предварительно оценить результат ее работы.
10. user-z99999 18 19.03.19 13:58 Сейчас в теме
(7)
Может следующая статья будет про ошибки (время выполнения) в запросах 1с, оптимизация ?
Т.е. как было и как исправили. Например, самые частые ошибки.
11. dmitrydemenew 106 19.03.19 14:05 Сейчас в теме
12. capitan 1193 19.03.19 14:10 Сейчас в теме
(10)А вы бы не хотели то же самое почитать на ИТС ?
Так сказать из первоисточника
13. user-z99999 18 19.03.19 14:17 Сейчас в теме
(12)
Первоисточник -это хорошо.
Просто любопытно, какие ошибки самые частые у программистов 1с.

Например, ИТС рекомендует делать индексы на временные таблицы, а по факту - это замедляет работу запроса.
На ИТС не показано во что превращается запрос 1с на MS SQL сервере, когда поля составные.
Вот и хочется в жанре ужасы почитать ))

Ещё,
фирма 1с придумала объектную модель обращения к данным, чтобы программисты 1с использовали её, а не запросы.
Т.е. чтобы 1с работала не слишком быстро ))
alest; bulpi; sergathome; +3 Ответить
47. buganov 57 05.05.19 09:59 Сейчас в теме
(15)

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


кэп, а Вы пробовали загнать несколько миллионов записей во временную таблицу? Или не так, а что будет, если сделать соединение с подзапросом, где на одном из уровней будет таблица данных? Что в таком случае покажет план запроса? Вот долго я ломал голову, а с чего это вендор, у которого есть экзамен Эксперт по технологическим вопросам такие советы дает. Оказалось просто. Постгре не умеет работать с подзапросами, потому и MS SQL досталось на орехи.

Временные таблицы не зло, это умеренное зло, если в конкретно данном случае, в конкретно данной задаче они обоснованы и производительнее, чем подзапрос.
51. capitan 1193 05.05.19 12:22 Сейчас в теме
(47)Честно скажу я с трудом могу представить задачу в которой нужно загнать несколько миллионов записей во временную таблицу.
План запроса вероятно покажет фулл скан с таблицей из которой у вас во временную с отборами набралось несколько миллионов записей
Не понял вопроса.
Что касается рекомендации - она намного раньше дружбы с постгри появилась.
Да и при таком масштабе задач опять же только по моему мнению уже не до экономии на лицензиях
53. buganov 57 05.05.19 14:54 Сейчас в теме
(51)Элементарно, Ватсон, продажи за месяц в нескольких разрезах дают огромный поток данных. И, если обороты загнать во временную, то пользовательский кеш сразу выталкивается наружу.

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

По поводу рекомендации, да, раньше, но и MS SQL раньше не очень дружил с подзапросами
56. capitan 1193 06.05.19 09:53 Сейчас в теме
(53)Я что то начал терять нить вашего возмущения.
Вы постом раньше были за подзапросы, а в этом посте вроде против.
Миллиона записей о продажах за месяц у меня нет
16. capitan 1193 19.03.19 14:28 Сейчас в теме
(13)И тут Остапа понесло...
Ещё, фирма 1с придумала язык 1С чтобы программисты 1с использовали его, а не ассемблер )
18. dmitrydemenew 106 19.03.19 15:28 Сейчас в теме
(16) Я считаю платформу 1С - лучшей средой разработки. А язык 1С - лучшим для решения задач по автоматизации любых процессов, и пока что не встречал ни одной задачи, которую бы нельзя было решить быстро, удобно и качественно доступными в 1С средствами .
20. user1180228 19.03.19 16:36 Сейчас в теме
(18) Изучаю 1С почти год, до этого был опыт в других языках. Насчет быстро и удобно, это не совсем правда. Нет наследования и классов, без чего практически линейное программирование в 1с. А это прошлый век!
30. A_Max 16 20.03.19 09:54 Сейчас в теме
(20) Всё как обычно 80/20 (А в нашем случае я думаю выйдет даже 90/10). Т.е. для реализации подавляющего большинства задач мощь ООП с наследованием и полиморфизмами не нужны. И, мало этого, при их наличии провоцировало бы неокрепшии умы на творческие экзерцисы которые было бы нетривиально сопровождать.

Частенько задумываюсь, что хотелось бы иметь полноценные свойства объектов с обработчиками get/set. Но опять таки это плюшки и "синтаксический сахар".
48. buganov 57 05.05.19 10:03 Сейчас в теме
(20) Вы тут лукавите, классы есть, достаточно взглянуть на дерево метаданных.
Про наследование. А для чего оно здесь? Что Вы собираетесь наследовать и для чего?
Плохо Вы изучаете 1С, если до сих пор не поняли, что этот "прошлый век" выполняет функции автоматизации бизнеса, и справляется в этом очень даже хорошо. И без наследования и смс.

Вот банальный пример. Нужно написать небольшую автоматизацию, скажем, киоска.
Даны два ЯП - 1С и любой тру на Ваш выбор. Как Вы думаете, кто быстрее автоматизирует киоск, тру или "парапрограммист" 1С? Ответ очевиден, и микроскопом можно гвоздь забить, но зачем?
50. acanta 56 05.05.19 11:07 Сейчас в теме
(48) итак мы вернулись к тому с чего начали. Конкуренция за автоматизацию киосков это хорошо.
Вроде как раньше узким местом была стоимость компьютера с 256 мб памяти. Сегодня- наличие мобильной связи на телефоне с 5 Гб оперативки.
52. buganov 57 05.05.19 14:54 Сейчас в теме
(50) Я совсем не понял, что Вы хотели этим сказать
57. user1180228 07.05.19 08:25 Сейчас в теме
(48) Быстрее всего я напишу на BSScript, похожая на 1С система, только в разы продвинутая. 1С - это что? - Готовые объекты, которые заточены на выполнение каких то стандартных операций. Как только отступление - танцы с бубнами и никакой оптимизации. Да много COM приложений. А без COM и ни туды и ни сюды... Хотите нормальный функционал - пишите COM, а это очень увеличивает время разработки. 1С есть куда развиваться.

По поводу бизнеса также не согласен, бизнес стонет от "тормозов" 1C.
58. buganov 57 07.05.19 09:53 Сейчас в теме
(57)Ок, давайте представим, что Вы сделали свою шикарную систему автоматизации киоска. Все работает отлично и гораздо быстрее, чем 1С. И вот, в один прекрасный момент у Вашего заказчика наступил момент, когда бизнес вырос с этапа счетов до калькулятора. Вы будете пару месяцев дорабатывать свою систему и даже что то получится на выходе. Не ERP, конечно, но уже и не эксель. И тут Вы поняли, что жизнь проживается зря, а внутри рвется художник, и вообще, программирование для других, Ваше же дело жизни - руководить. Скажем, менеджером проектов где-нибудь в Италии, на берегу моря. И что делать Вашему заказчику? Правильно. Искать специалистов. Но, как Вы думаете, легко ему это будет сделать? Нет. Легко масштабировать свою систему? Тоже нет. Если из УТ можно довольно просто эволюционировать в комплексную, а там в ERP, то Вашими усилиями будет убита сама идея автоматизировать бизнес, который, к слову, далеко не глупый и выбирает 1С не просто, что где-то слышал, а как возможность сделать свою систему, при этом без слишком высоких трудозатрат на поиски программиста. Это так, лирика.

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

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

Да, 1С есть куда развиваться, ИЧСХ она и делает.
59. starik-2005 1858 07.05.19 10:00 Сейчас в теме
(58)
Правильно. Искать специалистов. Но, как Вы думаете, легко ему это будет сделать? Нет. Легко масштабировать свою систему? Тоже нет.
Вот! Золотые слова. Поэтому берете астрального питонщика или PHP-шника и не мучаетесь всякими БССкриптами или чем-там-еще. И никакого 1С, никаких лицензий, дешевые разработчики, которых в западном индостане девать некуда, масштабируемость отличная - хоть киоск, хоть фэйсбук (на пентиуме 1-м даже), ...
60. buganov 57 07.05.19 11:55 Сейчас в теме
(59)PHPшники ох как дорого стоят хорошие)
61. starik-2005 1858 07.05.19 13:31 Сейчас в теме
(60)
PHPшники ох как дорого стоят хорошие)
Индусы? Да они за тарелку супа готовы душу продать! )))
28. GreenDragon 20.03.19 09:49 Сейчас в теме
(16) И на что только люди не пойдут, чтобы не набирать машинный код сразу...
bulpi; capitan; acanta; +3 Ответить
32. capitan 1193 20.03.19 17:07 Сейчас в теме
(28)Это еще что. На что люди пошли чтобы безгранично коннектиться посредством блюпуп и вифи.
А как хорошо было раньше.

Один пpогpаммеp пpишел в гости к дpугому. Сидят, пиво попивают. Тут на кухню заваливает огpомный сеpый котяpа.
- Это мой кот. Зовут Модем.
- Почему Модем?
- Смотpи. - беpет веник, тычет в кота. - Модем! Коннект!
(Кот): - Шшшшшшшшш...
19. VmvLer 19.03.19 16:23 Сейчас в теме
1. возьмите свою базу в 500 гиг
2. напишите отчет где есть интенсивное обращение к многим оборотным регистрам, регистрам сведений и пр. с количеством записей в таблицах 100-500КК.
3. Напишите вариант отчета из пункта 2 с грамотным использованием ВТ в фильтрах виртуальных таблиц
3.1. Предложите, чтобы 100 пользователей единовременно в течение часа формировали отчет из п.3 с одним и тем же набором "жирных" фильтров
3.2. Соберите статистику по "загрузке" дисков, памяти, процессора, замеры времени сколько работал SQL и сколько сервер приложений 1С "жевал" то, что отдал SQL и пр.
4. Напишите вариант отчета из пункта 2 БЕЗ использования ВТ
4.1. Предложите, чтобы 100 пользователей единовременно в течение другого часа формировали отчет из п.4 с одним и тем же набором "жирных" фильтров как в. 3.
4.2. Соберите статистику по "загрузке" дисков, памяти, процессора замеры времени сколько работал SQL и сколько сервер приложений 1С "жевал" то, что отдал SQL и пр.
5. Сделайте сравнительный анализ п.3.2 - 4.2.

Только после сверки можно делать выводы и пенять на код.
21. user1180228 19.03.19 16:54 Сейчас в теме
(19) Тема интересная но так "просто" не решаемая. Для оценки производительности нужно собирать стенд и там проводить исследование производительности. Я так понял, что никто этого еще не делал.
Согласен с автором статьи, что неоптимизированный код влияет на производительность.
22. dmitrydemenew 106 19.03.19 17:10 Сейчас в теме
(19)предложенная методика как раз содержит инструменты, позволяющие выполнить Ваш алгоритм без издевательств над нашими пользователями - достаточно запустить необходимое количество нагрузочных сессий с выполнением необходимых алгоритмов. Предлагаю Вам воспользоваться предложенными инструментами и поделиться результатами исследований - это будет лучшим доказательством Вашей правоты.
23. starik-2005 1858 19.03.19 21:58 Сейчас в теме
Результат = СтрШаблон("%1%2%3%4%5", Результат, СокрЛП(КодАвтора), Лев(КодАвтора,1), Сред(КодАвтора, 2, 1), Прав(КодАвтора,1));
A_Max; metmetmet; +2 Ответить
26. PerlAmutor 35 20.03.19 07:10 Сейчас в теме
(23) Тогда уж:

КодАвтора = СокрЛП(ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДокументОбъект.Автор, "Код"));
Шаблон = "%1%2%3%4%5";
ЛевКодАвтора = Лев(КодАвтора);
СредКодАвтора = Сред(КодАвтора, 2, 1);
ПравКодАвтора = Прав(КодАвтора, 1);
Для а = 1 По 1000 Цикл
    Результат = СтрШаблон(Шаблон, Результат, КодАвтора, ЛевКодАвтора, СредКодАвтора, ПравКодАвтора);
КонецЦикла;
Показать
29. starik-2005 1858 20.03.19 09:50 Сейчас в теме
(26) сам код как я понял у автора демонстрационный. Правильнокодавтора (или что иное) брать из результата запроса, а не из ссылки. Здесь автор не учел, что платформа ссылки кеширует. То, что он называет здесь оптимизацией - это просто придуманная проблема, которая красиво отобразилась в топе длительных операций. Статья о том, как искать проблему, а не о том, как ее решать. Ценность данного произведения отсюда ИМХО мала предельно
insurgut; +1 Ответить
45. TODD22 17 21.03.19 11:51 Сейчас в теме
(29)
Статья о том, как искать проблему, а не о том, как ее решать.

Как пользоваться замером производительности.
42. starik-2005 1858 21.03.19 10:33 Сейчас в теме
(26) тогда уж:
КодАвтора = СокрЛП(ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДокументОбъект.Автор, "Код"));
ЛевКодАвтора = Лев(КодАвтора);
СредКодАвтора = Сред(КодАвтора, 2, 1);
ПравКодАвтора = Прав(КодАвтора, 1);
ИтогоКодАвтора = СтрШаблон("%1%2%3%4", КодАвтора, ЛевКодАвтора, СредКодАвтора, ПравКодАвтора);
Для а = 1 По 1000 Цикл
    Результат = СтрШаблон("%1%2", Результат, ИтогоКодАвтора);
КонецЦикла;
31. A_Max 16 20.03.19 09:56 Сейчас в теме
(23) Да вообще когда уже полноценную форматную строку сделают printf :(
24. 3vs 20.03.19 06:50 Сейчас в теме
"К публикации приложены демонстрационные базы для режимов обычного и управляемого приложения на платформе 1С:Предприятие 8.3 (8.3.9.2033)."

А БП3 уже требует платформы
"Внимание! Текущая версия конфигурации "Бухгалтерия предприятия" предназначена для использования с версией технологической платформы 1С:Предприятие 8 не ниже 8.3.12.1685."
Не подустарела информация?

И, не пора ли уже предложить 1С добавить поддержку в сервере СУБД в оперативной памяти, таких как СУБД для данных в оперативной памяти, обеспечивающие их сохранность: Redis, Aerospike, Tarantool?
А то, с каждым обновлением платформы, базы работают всё медленней...
25. dmitrydemenew 106 20.03.19 07:03 Сейчас в теме
(24) В публикации описана методика, которую можно применить в любой конфигурации на любой платформе 1С V8.x.
27. 3vs 20.03.19 08:26 Сейчас в теме
35. Serg O. 171 20.03.19 23:29 Сейчас в теме
во многих конфигурациях - есть обработка "Групповая обработка справочников и документов"
простейшее "нагрузочное" тестирование можно аналогично сделать...

однако, это "чистое" движение (проведение) - не открывая формы документа !? и не возвращаясь в список документов... в котором может быть куча подзапросов и "авторасчетов", расцветки и т.п.

стандартный замер - прекрасная вещь
и в дополнение к нему можно использовать УниверсальныеПодборИОбработкаОбъектов.epf
с диска ИТС - в ней кроме отборов можно делать "произвольный алгоритм"... в том числе открывать и закрывать формы... и что угодно делать кроме этого

******* автору для его разработки (увидел в листинге) *****
1) Таймер() - скорее всего какая-то "своя" функция... лучше заменить на 1С-кую ТекущаяУниверсальнаяДатаВМиллисекундах() - даже в 8.2 есть (с 8.2.19.83 версии точно)

2) вывод...из просто сообщить()... лучше сделать запись в текстовую переменную
а потом её можно и сообщить() и в Текстовый / HTML-Файл (для красоты)... сохранять

3) хорошо оформлена статья, спасибо, удобно читать было
+
36. itmind 247 21.03.19 07:03 Сейчас в теме
Очередная статья, в которой говорится, что временные таблицы - зло. Но у меня другой пример.
Штатный отчет Валовая прибыль из УПП 1.3 (УТ 10.3). Простой запрос, где левым соединением выборка из таблицы себестоимости.
Вставляем этот запрос в СКД один в один, запускаем на базе > 600Гб и получаем зависания на 2-3 часа (при этом иногда выполняется быстро, за несколько секунд). При этом сам запрос, не в СКД, выполняется очень быстро.
Переписываем запрос в СКД на временные таблицы и все работает быстро, никаких зависаний. Предполагаю, что оптимизатор SQL лучше работает на временных таблицах.
Исходя из данной проблемы можно сказать, что вложенные запросы в соединениях еще большее зло, чем временные таблицы.
37. dmitrydemenew 106 21.03.19 07:50 Сейчас в теме
(36)В этой статье нет ни слова о том, что ВТ - зло. Единственное назначение публикации - описание одного из множества способов анализа и оценки оптимизации программного кода модулей проведения документов. С помощью предложенной методики вы можете сами объективно оценить ту роль (позитивную или негативную), которую играет использование ВТ в проблемных местах Вашей информационной системы.
55. dmurk 213 05.05.19 17:53 Сейчас в теме
(37) И вообще, индексация временных таблиц творит чудеса ))
40. ELInfinito 21.03.19 08:28 Сейчас в теме
(36) Запрос в СКД может работать иначе, чем исполнение в консоли запросов или просто кодом.
Причина проста - СКД трансформирует запрос по неким своим принципам и на сервер улетает совсем не то, что написали вы в наборе/наборах данных .
Далеко не факт, что применение временных таблиц поможет...но я не говорю, что это зло ) В контексте 1С их здравое применение решает. Если временные таблицы применяет неофит, натыкивая их везде где надо и не надо. да еще и индексируя все подряд...это конечно зло )
49. buganov 57 05.05.19 10:09 Сейчас в теме
(36) а этот запрос Вы берете прямо из СКД, который она сама развернула или то, что пишете в конструкторе?
СКД иногда пихает отборы так криво, что образуются дополнительные соединения с таблицами, отсюда и просадка.
54. dmurk 213 05.05.19 17:50 Сейчас в теме
На текущем этапе развития (для меня) статья не актуальна. Пару замечаний
- Получение в коде временных отметок имеет крайне высокую гранулярность, на моем тестовом сервере это 43 миллисекунды, что делает неэффективным подобный механизм на измерениях оптимизированных запросов
- Погрешность отклонения в замерах производительности может составлять 200 миллисекунд
- Параллельные способы выполнения кода в кластере 1С могут не только снижать скорость выполнения отдельных строк кода, но и повышать скорость обмена данными между модулями объектов и общими модулями
Всем успехов!
Оставьте свое сообщение