Распространенные ошибки разработчиков, приводящие к проблемам производительности

09.09.21

База данных - HighLoad оптимизация

Рассмотрим примеры ошибок, анализ, исправление и мероприятия по недопущению подобного в будущем. Всего будет 18 примеров.

В данной статье коснемся проблемной стороны разработки кода. Посмотрим на примеры кода и ситуаций, которые могут привести или приводят к проблемам производительности. Диалог будем вести от «простых» ситуаций к сложным.

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

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

Коллеги делитесь в комментариях описанием Ваших вариантов/ситуаций, будем рады почитать, спасибо!

 

О чем поговорим?


 

I) Разбор ситуаций

Типы ошибок.


 

  • Проблемы знаний – привносит нам проблемы, связанные с неопытностью разработчика. Иногда вместо правильного решения мы можем увидеть брутфорс и т.п. Свойственно в основном разработчику начального уровня. 
    Исключение таких ошибок решается повышением квалификации специалистов. Список мероприятий:
    • курсы,
    • патронаж/наставничество,
    • тех-часы,
    • самообучение,
    • код-ревью (обзор-кода),
    • парное кодирование (очень мощная практика, но дорогая тратится время сразу двух специалистов).
    • другие.
  • Ошибки кодирования – ошибки, допускаемые любыми специалистами. Это могут быть опечатки, проблемы копирования/вставки или другие подобного рода. 
    Мероприятия для их отлова:
    • проверка статическим анализатором 1С,
    • запуск тестов (тестирование),
    • обзор-кода.
  • Быстрое решение – свойственно создание костыльного, не масштабируемого, плохого решения, в котором в угоду скорости (нужно было вчера) приносится в жертву качество. В результате в дальнейшем сталкиваемся с обрастанием костылями и проблемами в работе. Эта ошибка всегда увеличивает технический долг.
    Могут быть исправлены процедурой, которая называется - рефакторинг кода. 
  • Архитектурные – самые страшные ошибки. Исправление этих ошибок самый трудоемкий процесс иногда может означать полностью переделку системы. Если система модульная, то исправление еще возможно в обозримые сроки. 
    Недопущение:
    • проведение архитект-ревью,
    • заимствование решений из проверенных конфигураций,
    • мозговой штурм,
    • консультаций и технический аудит опытными специалистами.

 

1. Храним файлы в реквизитах объекта

 

Постановка задачи

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

Реализация:

  • Добавляем реквизит с типом «Хранилище Значений» и храним картинку в объекте.


Проблема

  • Картинки могут быть большие и при обращении к данным объекта через точку (это тоже плохо) или при открытии карточки объекта мы будем каждый раз перекачивать мегабайты изображений.

Реализация данного решения свойственна новичку в разработке.

Решение

  • Откатываем механизм хранения файлов в объекте.
  • Используем из БСП подсистему файлов (ссылка на ИТС БСП подсистема файлов): 
    • Добавляем новый справочник «Пользователи Присоединенные Файлы»;
    • Добавляем реквизит ссылку в самом справочнике;
    • Добавляем обвязку подсистемы.


Мероприятия:

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

 

2. Забыли добавить условие отбора

 

Что происходит

  • О проблеме сообщили, когда накопился большой объем данных более 200 тысяч документов. 
  • При выводе на печать состава товаров документа «Маршрутный лист» время печати возросло с 2 до 40 секунд.

Проблема

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

 
Решение

  • Добавили условие отбора ("ТаблицаВыходныеИзделия.Ссылка В (&МассивСсылок)"). Результат решения приведен на рисунке ниже.
 
 Пример кода с исправлением

 

Мероприятия:

  • Проверять длительные запросы.
  • Выполнять тесты
  • Выполнять обзор-кода (новый чек поинт).

 

3. Используем неоптимальный поиск при обработке данных в циклах

 

Постановка задачи:

  • Заказчик попросил создать обработку загрузки товаров из файла (Excel) в документы ввода остатков (данных больше 1000 позиций)

Подобный код часто используется в обработках загрузки данных, различных программных обработках данных (удивила конфигурация УХ, из-за которой и появился этот пункт)

Быстрый код:

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

 

Проблема:

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

Решение:

  • Требуется добавить индекс на поля участвующие в отборе ("ТаблицаКеша.Индексы.Добавить("НоменклатураСтрокой");")
  • Или использовать тип "Соответствие" для поиска (хешированную таблицу) кешированных данных
 
 Хорошее решение

 

Мероприятия:

  • Обзор-кода
  • Ведем базу знаний
  • Обсуждаем хорошие практики

 

4. Используем директиву &НаСервереБезКонтекста

 

Что происходит

  • Обрабатываем большой объём данных;
  • При работе на управляемой форме происходят длительные «подвисания» при попытке выбрать склад, изменить значение элемента или других действий с реквизитами.

Проблема

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


Решение

  • Для вызовов серверных расчетов с клиента необходимо использовать операнд «&НаСервереБезКонтекста»;
  • При работе на управляемой форме надо максимально снижать количество вызовов с клиента контекстных серверных;
  • Стараться работать с меньшим объемом данных – используйте фильтры;
  • То, что можете получить на сервере и нужно на сервере – получайте и обрабатывайте там;
  • Измените, обдумайте снова логику приложения.

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

 
 Исправленное решение

 

Мероприятия:

  • Обзор кода 
  • Чек лист для обзора кода
  • Читаем статьи про то как работает клиент-серверное взаимодействие

 

5. Используем директиву &НаКлиентеНаСервереБезКонтекста

 

Что происходит:

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

Реализация:

  • Создаем две функции, которые на клиенте и сервере и называем "ФункцияНаКлиенте" и "ФункцияНаСервере".
  • Создаем одну функцию, но на сервере
 
 Вариант реализации

Проблемы:

  • Возможно дублирование кода, если реализовать две отдельных функции
  • Выполнение лишних передач данных между клиентом и сервером, т.к. используем "НаСервере"

Решение:

  • Создаем одну функцию с директивой "&НаКлиентеНаСервереБезКонтекста"
 
 Вариант хорошего решения

 

6. Отсутствие индекса по соединяемым полям в пакетных запросах

 

Что происходит

  • По результатам анализа длительных запросов по отчету конфигурации «Мониторинг производительности» было выявлено необычное, плавающее появление длительных запросов регламентного задания. 
  • Нормальное время выполнения 2-3 секунды
  • Аномалия выполнялась 120-600 секунд.
 
 Ниже приведен кусок кода описывающий проблемную ситуацию


 Проблема

  • План запросов может выбираться не оптимальный
  • Длительное время выполнения загружает сервер
  • Мешает пользователям (особенно в высоконагруженных базах) 
  • Чем больше активность, тем значительнее влияние


Решение

  • Индексируем все поля, которые в пакетных запросах участвуют в соединениях, условиях/отборах.
    По факту вы можете возразить, что будет потрачено лишнее время на данную процедуру. Но в большинстве случаев – это доли секунды и со временем основного запроса несопоставимы. Зато у вас появляется стабильность. В следующей статье мы рассмотрим как выглядят изменения в плане построения запросов для разных случаев.
    В данном случае требуется добавить для временной таблицы ВтСклады описание индексирования "ИНДЕКСИРОВАТЬ ПО Склад".
 
 Исправленный код

 

7. Условия по измерениям вне виртуальных таблиц

 

Что происходит

  • Разработчик не соблюдает стандарты разработки и выполняет отборы вне виртуальных таблиц «Остатки», «Обороты», «Остатки и Обороты», «Срез Последних» и др. 
  • Подход тяп ляп и в «боевую» базу.

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

 
Пример плохого кода: 

Проблема

  • Такой подход необоснованно перегружает оборудование;
  • Плохой стиль.


Решение:

  • Перенести отборы в виртуальную таблицу;
  • Следовать стандартам и рекомендациям в разработке на платформе 1С.

Мероприятия:

  • Отправить джуна на курсы
  • Обзор-кода
  • Просмотр длительных запросов
 
 Правильный код:


8. Используем объектную модель, а не запросную

 

Пример

  • При проведении заказа клиента в модуле объекта «При Записи» выполняем проверку наличия в договоре признака «Лимитный»                
 
 Плохая реализация в контексте модуля объекта документа «Заказ клиента»:

 
Проблема:

  • Права доступа (у пользователя может не быть доступа к части реквизитов объекта)
  • Получается весь объект целиком (это документ с несколькими сотнями строк в ТЧ или вы в реквизитах храните мегабайты с архивом договора)
  • Сама проверка плоха (если у вас есть выгрузки между базами и вместо договора битая ссылка, то вы этот документ не откроете никогда)


Решение

  • Используем запросную модель;
  • Можно поставить получение данных в привилегированном режиме.
 
 Хороший код:

     


9. Добавляем поля из таблицы в динамический список

 

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


Постановка задания

  • В динамическом списке документа «Задание на перевозку», заказчик попросил вывести получателя из табличной части распоряжения (аргумент: 90% с одним или одинаковым получателем)
     

 
 Вариант быстрого решения

 

Проблема

  • Снижаем производительность лишними соединениями;
  • Это явный костыль;
  • Если мы захотим вывести что-то еще из другой табличной части?

Решение

  • Добавляем новый реквизит в шапку документа, который назовем «xyz_КонтрагентДляСписка»/«Первый Получатель Отправитель» 
  • При записи документа выбираем для заполнения первого получателя из табличной части если есть.

 

 
 Хороший вариант реализации


 

10. Вывод полей через точку от составного типа в динамических списках, отчетах, АРМ

 

Постановка задачи

  • Нам требуется в списке для ссылочных (обычно составных) полей «Регистратор», «Документ Расчетов», «Объект Расчетов» и т.п. вывести дополнительные информационные поля: «Дата», «Номер» и т.д. 

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

 
 Плохой код

 

Проблема

  • Это очень сплошная «боль» для пользователей при использовании РЛС. 
  • Доступ к данным сразу потребует наличия доступа ко всем документам регистраторов.
  • Производится неявное лишнее соединение ко всем таблицам документов при РЛС.
  • Страдает быстродействие.

Решение

  • Используем дополнительный регистр (будут храниться все часто используемые реквизиты документов, который заполняем при записи документа или справочника). В типовых конфигурациях есть регистр сведений «Реестр Документов».

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

 
 Вариант хорошего решения:


 Мероприятия:

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

 

11. Очень сложный запрос в динамических списках

 

Постановка задачи:

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

Реализация:

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

 
 вариант быстрой реализации

Проблема:

  • Данное решение довольно медленно отрабатывает из-за сложной структуры – неоправданно много данных просчитывается на SQL сервере для того чтобы отобразить 25 первых строчек.
  • Время ожидания у пользователей под ограничениями находится в приделах 100-200 сек
  • Поиск по подобно увеличивает время до 400-500 сек
  • Особенно это заметно, когда в базе довольно много документов и движений.

Если вы застали раннюю версию УТ11 (до выхода ERP), то могли видеть подобную проблему для динамического списка подбора номенклатуры по товарам. Это решение очень сильно тормозило даже на маленькой нагрузке, и бизнес испытал "легкий" шок при попытке поработать на этой пилотной конфигурации. К счастью, в скором времени они исправились и переделали на более оптимальный вариант.

Решение:

  • Создаем новый регистр сведений с измерением «Заказ клиента» и состоянием вспомогательного процесса выполнения заявок.
  • Переписываем запрос на соединение двух списка документов «Заказы клиентов» с новым регистром сведений «Выполнение заявок»
  • В результате время отклика ушло в нормальные значения, а поиск по подобно снизился до 10-20 сек.
 
 вариант исправленный

 

Мероприятия:

  • Повышаем квалификацию разработчиков:
  • Посещаем конференции, 
  • Обсуждаем варианты реализации, 
  • Смотрим планируем на будущее (в базе будет много документов, а не 20-30 как на демонстрационном стенде)

 

12. Использование временных таблиц в динамических списках 

 

Постановка задачи:

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

Решение:

  •  В динамический список была добавлена временная таблица, которая формировала список сделок по партнеру при наличии отбора. (одно радует, что стиль "рваный запрос" не применялся)
 
 Пример быстрого кода решения поставленной задачи

 

Проблема:

  • Проблема быстродействия. Если с обычным списком форма открывалась в самом худшем случае до 10 секунд, то теперь могла зависать на 60-200 секунд
  • Лучше не использовать временные таблицы в динамических списках - это вам не отчеты
  • Не учтены рекомендации не использовать в условиях и соединениях конструкции "Выбор", что в свою очередь просаживало быстродействие при наложении РЛС с использованием шаблона "ПоНаборамЗначений", не очень хорошо в условиях использовать отрицание условия - "НЕ РАВНО" когда нет отбора по основному индексу (все условия наиболее эффективно работают при условии "РАВНО").

Решение:

  • Было решено исключить использование временной таблицы
  • Исключить использование конструкции "Выбор"
  • Получать список партнеров в привилегированном режиме и добавление их в запрос с помощью команды "ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка
 
 Пример хорошего решения решения

 

Мероприятия:

  • Код-ревью
  • Повышаем знания по основным механизмам БСП

 

13. Использование типа «Любая ссылка»

 

Что происходит:

  • Хотим заложить заранее возможность использования любого документа, справочника (проектирование звездолетов)
  • В задачах и бизнес-процессах – это предмет.

 

Проблема

  • Предприятие 1С для проверки RLS доступа по составному типу добавляет в проверку условия по всем входящим объектам.
  • Получаем «дикие» тормоза в списках. На практике наблюдал по замерам время отработки прорисовки списков задач и бизнес процессов с длительностью 30 и более минут.


Решение

  • Не используем тип «Любая ссылка»;
  • Выбираем типы, которые действительно используем;
  • В списках выведем заранее поля использующие данные из агрегирующего регистра по подобию «Реестр документов».

 

14. Создаем лишние роли

 

Что происходит

  • Заказчик разработать новую подсистему «Производственно-технологическая подсистема»;
  • Нужны новые справочники, документы, регистры.

Реализация

  • Добавили роли под каждый объект, на чтение и изменение: «Чтение справочника рабочие центры», «Добавление и изменение справочника рабочие центры», «Чтение справочника рабочие участки» и т.д.


Проблема

  • Лишние роли увеличивают сложность настройки прав;
  • Больше ролей применяется к пользователю и тем самым усложняются проверки при использовании RLS.


Решение

  • Создавать кумулятивные роли: «Добавление и изменение НСИ», «Чтение технологических данных», «Чтение производственных данных» и т.д.

 

15. Выбор из множества с плохой уникальностью

 

Что происходит:

  • Подбор серии при вводе по строке. Производится поиск существующих серий по данным регистра «Движение серий».

Проблема:

  • Сложный запрос на каждый ввод символа,
  • Используется «ПОДОБНО»,
  • Часто вводят 0 или 1 – это каждая вторая серия при их количестве более 100 тысяч – бессмысленная подсказка.
  • Используем разрешенные и добавляем ограничение RLS там где не нужно (похоже на своеобразный, но не удачный фильтр) - это дополнительно увеличивает время обработки (иногда 60 и более секунд)
 
 Описание проблемы

 

Решение:

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

 

16. При записи или проведении выполняем сложные расчеты

 

Постановка задачи на разработку:

  • Заказчик попросил пересчитывать процент оплаты заказа клиента при расчетах по заказам.
  • Или рассчитать себестоимость - ФИФО по партиям.

Реализация:

  • Мы вставляем в процедуру проведения алгоритм для пересчета статусов по регистру сведений статусы расчетов.

Проблема:

  • Это длительная процедура (используется ФИФО, большой объема документов)
  • Блокировки (пользователи работают по тем же метаданным и аналитикам)
  • Кто-то запустил пере проведение набора документов - система уходит в offline

Решение:

  • Данный функционал выносится в отдельное фоновое задание. 
  • Данные для обновления расчетов при записи объектов добавляются в регистр сведений «К Расчету Процента Оплаты» или «К расчету себестоимости»
  • Отдельный регистр с расширенной аналитикой

 

17. Создаем узкое горлышко

 

Что происходит:

  • Переходим с одной версии на другую;
  • Переходим на новый механизм «Видов запасов», т.е. появляются устаревшие виды. Много позиций ходового товара попало в устаревшие виды запасов, т.е. много менеджеров "одномоментно" продают товар из разных подразделений.

Реализация:

  • Добавили новый регистр сведений «Устаревшие виды запасов с остатками» с одним измерением «Вид запасов»;
  • Добавили блокировку на этот регистр при списании товаров организаций;
 
 Поясняющий проблему код

 

Проблема:

  • Устаревшие виды запасов используются по множеству складов и организаций;
  • При активных продажах ходового устаревшего «вида» ловим блокировки;
  • Система «умирает» при пике пользователей (более 300-500 online) в некоторые моменты времени.

Решение

  • Так делать нельзя! 
  • Требуется переосмысление реализации подсистемы – добавление большего числа аналитик в измерения (Склад, Организация, ВидНоменклатуры, Номенклатура и т.п.), отложенная процедура списания устаревших товаров с остатками, другие мероприятия.

 

18. Используем com соединение

 

Что происходит

  • Для получения данных из внешней базы – кросс отчеты, сравнения документов и т.п.
  • Перенос данных.

Проблема:

  • Долгая процедура инициализации (подгружает всю конфигурацию)
  • Соответствие версий предприятия 1С для баз данных
  • Доступно только для Windows.

Решение:

  • Используем конвертацию, выгрузку/загрузку из файлов. 
  • Используем REST сервисы


II) Мероприятия по повышению качества продукта

 
1. Знание основ (БСП, правила разработки и др.)

 

Мы повышаем общий уровень разработчиков и команды в целом. В результате у нас будет:

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

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

 

2. Кейсы, база знаний

 

Знания и приемы, которые команда получает в процессе работы:

  • Можно создать вики ресурс
  • Использовать Confluence от JIRA
  • Excel в общей папке или еще что-то

 

3. Код-ревью

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

Иными словами - это проверка качества кода, прежде чем поместить ветку в мастер:

4. Архитект-ревью

 

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

  • Позволит избежать провалов в архитектуре
  • Обсуждение и выбор оптимального решение
  • Методика разработки «сверху вниз»

 

5. Тестирование

 

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

  • Юнит-тесты
  • Сценарные тесты
  • Нагрузочное тестирование
  • Интеграционное тестирование

 

III) Инструменты


1. Конфигурации проверки качества кода «АПК»

Позволяет вам довольно успешно проверять код на наличие требованием стандартов (1С:Совместимо). В комплексе с данным инструментом можно развернуть и Sonar Cube с плагином для 1С проверки на «запах кода».

 

2. Конфигурация «Мониторинг производительности»

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

Список долгих запросов:

 

Тексты ошибок:

  • Уже настроен, если вы выполнили пункт выше)
  • Показывает проблемные точки в работе программы
  • Есть интеллектуальная классификация существующих ошибок

Метрики состояния в готовом виде:

  • Позволяет анализировать наличие проблем производительности в реальном режиме времени
  • Есть возможность выполнять оперативные воздействия по результатам анализа
  • Интеллектуальное детектирование проблем и информирование через различные мессенджеры

 

3. SQL Профайлер (Microsoft SQL Profiler) или Microsoft SQL Management Studio Extended Events

Инструмент, позволяющий в реальном времени анализировать запросы, которые приходят из 1С. И думать над задачей оптимизации. В следующей статье мы рассмотрим пример работы с ним для части рассмотренных выше случаев, будет интересно, по крайней мере у нас в команде было очень интересно обсудить эту тему. Также рассмотрим в связке с уже бесплатным инструментом "SQL Sentry Plan Explorer".


4. Блокнот и RegExpr

Это, на мой взгляд, очень сложные мероприятие, когда под рукой есть готовые инструменты. Если вы только не являетесь специалистом 80-го уровня и на завтрак едите планы запросов.

 

Видео выступления

 
 Видео с конференции


Заключение

 

  • Учитесь и развивайтесь
  • Используйте автоматизацию
  • Используйте правильные подходы
  • Используйте мировые практики
  • Участвуйте в open source проектах

 

Ссылки на источники информации

 

Все ссылки и дополнительные соберем в одном месте.

  1. Фреймворк «Мониторинг производительности»
  2. Фреймворк «Тестирование 3.0»
  3. Как завести у себя в команде код-ревью. Отвечаем на вопросы
  4. По следам код-ревью
  5. Анализ проблем производительности по динамике мониторинга RAS 1C 
  6. 5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С
  7. Как работает серверный вызов в 1С
  8. 1C ITS

проблемы быстродействия качество кода

См. также.

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

Поделюсь своим опытом аудита кода авторских продуктов с Infostart.ru как одним из элементов применения DevOps-практик внутри Инфостарт. Будет настоящий код, боевые скриншоты, внутренние мемы от команды ИТ-лаборатории Инфостарт и прочее мясо – все, что любят разработчики.

10.04.2024    10178    artbear    84    

102

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

1 стартмани

15.02.2024    9601    195    ZAOSTG    74    

105

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    8405    doom2good    49    

67

HighLoad оптимизация Системный администратор Программист Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    10718    ivanov660    6    

78

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5872    a.doroshkevich    20    

73

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    17443    skovpin_sa    14    

102

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    19717    Филин    37    

115
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1828 02.08.21 11:32 Сейчас в теме
Не очень хорошо в условиях использовать отрицание условия - "НЕ РАВНО"
Что-то новенькое... Можно пояснение?
3. ivanov660 4442 02.08.21 11:54 Сейчас в теме
(1)Поправил фразу в контексте примера. СКЛ хорошо работает с условиями на "РАВНО", по крайней мере должно быть обязательно основное условие с использованием равно, а вот уже дополнительные условия могут содержать другие операторы, в противном случае не будет эффективно использован индекс. Сходу на ИТС нашел только эту ссылку: Эффективные условия запросов
Далее планирую рассмотреть план запроса для части примеров, там мы сможем увидеть поведение сервера.
fatman78; Innuil; +2 Ответить
11. tolyan_ekb 105 02.08.21 13:25 Сейчас в теме
(3) Я тоже об этом читал, но проверить руки не дошли. Было бы здорово увидеть пример.
61. buganov 203 05.08.21 10:17 Сейчас в теме
(1) НЕ РАВНО в запросе равносильно непопаданию в индекс.
Попробуйте взять запрос на РАВНО и на НЕ РАВНО в условии и в плане с вероятностью 99.9% появится скан таблицы

https://ru.stackoverflow.com/questions/727401/sql-server-%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-sarg-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82
abasovit; fatman78; Lucechiaro; Irwin; Aleskey_K; Merkalov; ivanov660; +7 Ответить
63. ivanov660 4442 05.08.21 10:23 Сейчас в теме
(61)Вроде так и было, в следующей статье мы посмотрим как меняются планы запросов при изменении.
67. buganov 203 05.08.21 11:52 Сейчас в теме
(63) Еще подкину идею для следующего выпуска:
поиск по массиву, когда Т.Поле В(&Список)
И список состоит из 10 элементов и когда из 1000, в плане прямо наглядно видно, как меняется план запроса.
И еще, как меняется план при разной селективности и что скан может вылезти даже при поиску по индексированному, но низкоселективному полю. Это к слову о проектировании регистров очень важную роль играет
65. ixijixi 1828 05.08.21 10:42 Сейчас в теме
(61) Окей, принято, хотя в ссылке немного про другое. А если вместо конструкции
Т.Поле <> &Поле
использовать
Не Т.Поле = &Поле
Тут уже не будет скана таблицы?
66. buganov 203 05.08.21 11:48 Сейчас в теме
(65) Если поле индексировано, то будет поиск по индексу
68. ixijixi 1828 05.08.21 12:18 Сейчас в теме
(66) Да, индексировано. Предположим, что это поле "Ссылка". Забавно получается. Если условие "=", то идет поиск по индексу. А если "<>" - то скан, хотя поле индексированное? Нелогично, не находите?
69. ivanov660 4442 05.08.21 13:01 Сейчас в теме
(68)Зачем запросу план и кто его выполняет? в статье хорошо описаны основные операторы получения данных. И особенности их работы - как раз варианты условий при которых они используются
70. buganov 203 05.08.21 14:15 Сейчас в теме
(68) Все очень логично. Представьте себе ситуацию, что на стоянке стоят различные автомобили, пусть ауди, которые размещены по модели. Если Вы ищете, например, А6 и для этого Вы сразу подойдете к месту, где они стоят. Но если же ищете любую не А6, то Вам придется перебрать всю стоянку. Что, в целом, логично. Тут так же. Индекс это всего то дерево, где слева меньшие, справа большие. И из примера выше, А3 будут стоять левее, а Q7 правее.
71. ixijixi 1828 06.08.21 11:45 Сейчас в теме
(70)
Но если же ищете любую не А6, то Вам придется перебрать всю стоянку.
Нет, я найду все А6, все остальные будут удовлетворять условию.
72. ivanov660 4442 06.08.21 12:42 Сейчас в теме
(71)не уверен, что так работает оптимизатор СКЛ. Даже если это так, то план запроса будет гораздо сложнее, чем проверка на равенство.
73. ixijixi 1828 06.08.21 12:55 Сейчас в теме
(72) Можете проверить? Сначала Т.Поле <> &Поле, затем Не Т.Поле = &Поле. Будет план отличаться?
74. ivanov660 4442 06.08.21 14:47 Сейчас в теме
(73)посмотрю, буду на выходных писать
75. buganov 203 09.08.21 09:53 Сейчас в теме
(71) перефразирую. Вам нужно выгнать все машины со стоянки, кроме А6. Вам же нужно почесть строки и вернуть клиенту. Теперь логика несколько поменялось, не так ли? И наиболее оптимально будет проверить всю стоянку и каждую машину на шильдик А6 и, если условие выполняется, выгнать автомобиль за пределы
76. ixijixi 1828 10.08.21 08:13 Сейчас в теме
(75) Выгнать != Найти, в контексте обсуждения это скорее удалить, но и операция тут другая
2. bulpi 215 02.08.21 11:53 Сейчас в теме
Плюс поставил.
Замечания :
1)Часть пунктов встречается во всех типовых конфигурациях :)
2)Неприязнь к com - соединению - это личное у автора. Не нужно возводить личную неприязнь в ранг общего правила.
5. ivanov660 4442 02.08.21 11:57 Сейчас в теме
(2)
1. Сами 1С-ники рекомендуют отказываться от Com.
2. Дополнительно попробуйте запустить частый обмен на одной базе через com - этак с 10-20 бухгалтерий ( 5 минут).
Aleskey_K; +1 Ответить
26. bulpi 215 02.08.21 16:21 Сейчас в теме
(5)

2. Ну запускаю. Ну работает. 1-2 секунды на соединение. Потом все так, как будто это и не com.
1.Понятно, что веб и http сервисы современнее и универсальнее. Но если специально для передачи 1 документа между двумя базами надо на сервере запускать IIS, то ну его на фиг. Тем более, что не всегда есть на это права. И не всегда сисадмин поведется на такое безобразие.
(5)
28. ivanov660 4442 02.08.21 16:47 Сейчас в теме
(26)Применять или не применять на ваше усмотрение и текущую ситуацию.
46. Yashazz 4759 03.08.21 11:21 Сейчас в теме
(5) Насчёт отказа от СОМ - а вы посмотрите типовые конфигурации, и сколько там его использований. От СОМ уже лет 15 "отказываются" )))
47. ivanov660 4442 03.08.21 11:48 Сейчас в теме
(46) Смотрел эволюцию УХ. В консолидации был только COM, в УХ появилось использование вебсервисов. Т.ч. работы в этом направлении идут, ожидать, что это будет сделано за 1-2 месяца - наивно.
50. Yashazz 4759 03.08.21 12:01 Сейчас в теме
(47) если вы ожидали 1-2 месяцев, то да, это было наивно) Не огорчайтесь, лет через 10, может, от СОМ и правда почти откажутся)
А пока что его пихают куда ни попадя, от пауз и регулярных выражений до запуска приложений.
4. maksa2005 537 02.08.21 11:57 Сейчас в теме
Код-ревью - Вам надо - Вы и делайте) Меня и так устраивает
sapervodichka; smit1c; +2 Ответить
6. muskul 02.08.21 12:10 Сейчас в теме
Это все конечно прекрасно, но та же типовая УПД в УТ работает ужасно долго, один запрос заполнение строки "к платежно-расчетному документу" делается значительное время что легче его просто убрать. вот такая вот оптимизация
7. BigClock 02.08.21 12:10 Сейчас в теме
Хотел бы спросить по пункту 2, секция "Пример кода с исправлением". В этом запросе сначала идет объединение двух ТЧ по всем документам (секция запроса "ИЗ"), а затем отбор по нужным документам (секция запроса "ГДЕ"). Насколько это оптимально по производительности? Возможно, лучше сначала сделать отбор по одной ТЧ и поместить его результаты во временную таблицу а затем уже левое соединение.
ВЫБРАТЬ
	ТаблицаВыходныеИзделия.Ссылка КАК Ссылка,
	ТаблицаВыходныеИзделия.КлючСвязиОперации КАК КлючСвязиОперации, 
	ТаблицаВыходныеИзделия.НомерСтроки КАК НомерСтроки,
	ТаблицаВыходныеИзделия.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_ВыходныеИзделия
ИЗ
	Документ.МаршрутныйЛистПроизводства.ВыходныеИзделия КАК ТаблицаВыходныеИзделия
ГДЕ
	ТаблицаВыходныеИзделия.Ссылка В (&МассивСсылок)
;

ВЫБРАТЬ
	ВТ_ВыходныеИзделия.Ссылка КАК Ссылка,
	ВТ_ВыходныеИзделия.НомерСтроки КАК НомерСтроки,
	ВТ_ВыходныеИзделия.Номенклатура КАК Номенклатура,
	ВТ_ВыходныеИзделия.Номенклатура.Код КАК НоменклатураКод,
	ВТ_ВыходныеИзделия.Номенклатура.Артикул КАК НоменклатураАртикул,
	ТаблицаОпераций.Операция КАК Операция,
	ТаблицаОпераций.РабочийЦентр КАК РабочийЦентр,
	ТаблицаОпераций.ВидРабочегоЦентра КАК ВидРабочегоЦентра
ИЗ
	ВТ_ВыходныеИзделия КАК ВТ_ВыходныеИзделия
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.МаршрутныйЛистПроизводства.Операции КАК ТаблицаОпераций
		ПО ВТ_ВыходныеИзделия.Ссылка = ТаблицаОпераций.Ссылка
			И ВТ_ВыходныеИзделия.КлючСвязиОперации = ТаблицаОпераций.КлючСвязи
;

...
Показать
8. ivanov660 4442 02.08.21 12:22 Сейчас в теме
(7) Это пример кода из типовой конфигурации и акцент сделан на пропуске условия. Относительно оптимальности всего запроса, то надо смотреть в рамках всего контекста. На оператор "В", тоже есть ограничения. При большом количестве данных, сервер может преобразовывать в соединение.
9. ipoloskov 164 02.08.21 13:03 Сейчас в теме
"6. Отсутствие индекса по соединяемым полям в пакетных запросах"
На курсах по Эксперт по Технологическим вопросам сказали, что нет смысла индексировать временную таблицу, если там не 100.000 строк. Или в случае использования ее в параметрах виртуальной таблицы есть какой-то нюанс? Как-то непонятно - SQL уже знает, сколько строк в таблице ВТ_Склад. Как он может построить неоптимальный запрос?
dabu-dabu; +1 Ответить
10. ivanov660 4442 02.08.21 13:21 Сейчас в теме
(9)
1. Это пример из реальной ситуации. Пока не проиндексировали, был плавающий план запросов, который мы наблюдали. Почему СКЛ так делает ответа у меня нет (существенное влияние оказывает нагрузка на сервере).
2. Как они обосновали такое заявление? Почему 100 000, а не 90 000? Сказали верьте нам на слово? По факту они иногда что-то говорят, а потом меняют позицию.
51. Sapiens_bru 4 03.08.21 12:58 Сейчас в теме
(10) Это видимо были такие курсы. На хороших курсах говорят примерно так "Не нужно бездумно включать индексы в любых ситуациях. Смотрите на результаты без индексов(причем не в моменте а статистически) и включайте индексы там где они действительно нужны"
62. buganov 203 05.08.21 10:21 Сейчас в теме
(9) На курсе говорили про то, что не всегда индекс сработает и что нужно проверять на конкретных данных. Не всегда индекс отработает, но бывает, что очень помогает, хоть и такое случается редко, чаще всего на больших ВТ можно наоборот ухудшить ситуацию, ибо построить индекс тоже стоит ресурсов.
64. ivanov660 4442 05.08.21 10:25 Сейчас в теме
(62)На мой взгляд - вообще всегда надо работать с данными, по которым стоит фильтр (оперативные действия). Если вы конечно пересчитываете себестоимость, то это другая ситуация и решения уже должны быть архитектурные.
12. tolyan_ekb 105 02.08.21 13:28 Сейчас в теме
Спасибо за примеры с кодом и рассуждениями.
ivanov660; +1 Ответить
13. biimmap 1946 02.08.21 13:29 Сейчас в теме
Если позволишь я тоже немного прикопаюсь к COM-соединению. Мой текущий проект на COM работает обмен между самописной базой Управленческие табеля и типовыми ЗУПами 2.5; 3.1 + Беларусь и Казахстан. Довольно удобно всё получилось. само чтение данных не так уж долго идёт. Учитывая 6000 сотрудников на выгрузку в самописную базу (именно чтение!) занимает 20 секунд, на выгрузку в ЗУП тоже меньше минуты секунд 50. Данных очень много в обе стороны гуляет. Назад вообще данные об отработанном времени, там главная таблица больше 100 тыс записей.

Ну и собственно клиент настоял на COM технологии. Я им предлагал веб сервис.

Также я успешно её использую сейчас при переводе 2.5 на 3.1. Проверяю и корректирую данные через COM обработками.
16. ivanov660 4442 02.08.21 14:04 Сейчас в теме
(13)Если устраивает пользуйтесь, но нас не устроило. И у меня на на опыте было много примеров, когда даже запуск фонового задания существенно влиял на быстродействие (пришлось минимизировать количество запусков). Это действительно нагруженные системы и задачи.
21. biimmap 1946 02.08.21 14:22 Сейчас в теме
(16) у нас рег. задание 1 раз в час обновляет данные. всё норм. Видел бы ты как у них было))) Тебе материала хватило бы на 5 таких статей))) Процесс формирования табелей с нескольких суток превратился в 1,5 часа.
rabid_otter; +1 Ответить
14. Eremkin 02.08.21 13:50 Сейчас в теме
Добрый день. Спасибо за такую статью. Нужно больше таких статей )
Вопрос к примеру №9. По мне не самый удачный вариант решения такой проблемы, если в будущем необходимо выводить еще и значения других полей из табличных частей. Вот здесь как раз необходимо сделать архитект-ревью. Хорошим решением будет решение из примера №11. Плодить реквизиты в самом документе по мне не очень красиво.
18. ivanov660 4442 02.08.21 14:17 Сейчас в теме
(14)Согласен, иногда решение зависит от поставленной задачи и других моментов. Но это самый быстрый вариант.
15. Sashares 35 02.08.21 13:59 Сейчас в теме
В 9 в варианте быстрого решения условие "И (Р.НомерСтроки = 0)" - это не ошибка?
Реально условие по номеру строки 0?
17. ivanov660 4442 02.08.21 14:16 Сейчас в теме
(15)Опечатался, когда перебивал пример (НомерСтроки=1), но идея должна быть ясна.
19. Sashares 35 02.08.21 14:21 Сейчас в теме
20. MikhailDr 02.08.21 14:22 Сейчас в теме
Можно вопрос по шестому примеру. Я далек от эксперта, но удивлен что создание индекса в таблице с одной колонкой, а это ссылка привело к ускорению работы. Просто я всегда думал, что индексирование имеет смысл только когда количество колонок больше двух. Ведь на одной колонке индекс будет равен этой самой колонке, в чем тогда выигрыш времени?

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

Продолжение будет?
22. ivanov660 4442 02.08.21 14:26 Сейчас в теме
(20)Мы использовали кеш из Соответствия.
А про таблицы, если вы их используете не забывайте добавлять индексы особенно для составного ключа (в примере УХ, там действительно составной ключ).
23. Sashares 35 02.08.21 15:15 Сейчас в теме
(20) Индексирование имеет смысл если в таблице много строк и/или выполняется многократный поиск.
Количество колонок в этом случае не важно. Просто если колонка одна, то нет смысла использовать именно таблицу значений.
30. adamx 36 02.08.21 17:25 Сейчас в теме
(20)Индекс строится в виде бинарного дерева. На поиск элемента при наличии индекса уходит в 2^N раз меньше времени, чем при сканировании. Строится индекс за время A * N * О(log N) вроде. Поэтому все будет зависеть от количества записей в левой таблице и метода соединения их. (A - коэффициент сложности построения)
То есть например на 1000 записей в правой таблице надо А * 1000 * 10 = А* 10 000 операций на построение дерева + 10 операций на поиск нужного элемента.
И если в левой таблице 5 записей - то проще сканом перебрать и получится всего 5 000 операций (это максимум, если неуникальные записи). А если например 200 записей - то уже получится скорее всего выигрыш.
38. ivanov660 4442 03.08.21 08:29 Сейчас в теме
(20)Будет, ожидайте. Рассмотрим как это выглядит на плане запросов.
24. adamx 36 02.08.21 15:46 Сейчас в теме
10-й пункт нарушает седьмой. надо в условие оборотного регистра по регистратору добавлять условие.
И самое интересное - отборы не равнозначны? Это точно приемлемое решение в 10-м пункте?
25. ivanov660 4442 02.08.21 15:58 Сейчас в теме
(24)В 10м пункте используется именно соединение, а не отбор. т.е. мы к результирующим данным добавляем поля.
Не рекомендуется соединять между собой несколько виртуальных таблиц. Можно конечно вынести виртуальную таблицу во временную таблицу и потом соединять, но для динамического списка - это будет плохим решением.
29. adamx 36 02.08.21 17:01 Сейчас в теме
(25)
"ВЫБРАТЬ
|	Т.Регистратор КАК Регистратор,
|	РД.ДатаДокументаИБ КАК ДатаДок,
|	РД.НомерДокументаИБ КАК НомерДок,
|	РД.Комментарий КАК КомментарийДок,
|	Т.ЗаказКлиента КАК ЗаказКлиента,
|	Т.СуммаОборот КАК СуммаОборот
|ИЗ
|	РегистрНакопления.РасчетыСКлиентами.Обороты(, , Регистратор, ) КАК Т
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РД
|		ПО Т.Регистратор = РД.Ссылка
|			И (РД.ДополнительнаяЗапись = ЛОЖЬ)"
Показать


В этом запросе внутреннее соединение. Его нужно оставить.
Я имею ввиду конструкцию (РегистрНакопления.РасчетыСКлиентами.Обороты(, , Регистратор,
//****
Регистратор В (Выбрать Таб.Регистратор ИЗ РегистрСведений.РеестрДокументов КАК Таб ГДЕ (Таб .ДополнительнаяЗапись = ЛОЖЬ))
//*****
) )

Внизу условие И (РД.ДополнительнаяЗапись = ЛОЖЬ)" - надо убрать.
Тогда левая таблица будет с меньшим количеством строк (к ней уже применено это условие), а правая будет соединяться по хорошо проиндексированному полю с большой селективностью.

Это в теории ( :-). Как я понимаю рекомендации 1с.). На практике может оптимизатор запутаться именно в виртуальной таблице и зависнуть... :-)))
31. ivanov660 4442 02.08.21 17:36 Сейчас в теме
(29)В регистре расчеты с клиентами 10-15 типов документов, а в реестре документов больше 40, поэтому тут как минимум должен быть отбор по типам. Как это будет в реальности выглядеть тяжело представить, посмотреть план запроса.
Но пример немного о другом - о том, что через точку плохо выбирать.
27. SlavaKron 02.08.21 16:27 Сейчас в теме
В 9-м пункте, наверно, всё-таки ПередЗаписью.
32. adamx 36 02.08.21 17:55 Сейчас в теме
В 15 примере

Запрос.УстановитьПараметр("СтрокаПоиска", "%" + СокрЛП(Параметры.СтрокаПоиска) + "%");

Не видно использования функции ОбщегоНазначения.

Функция СформироватьСтрокуДляПоискаВЗапросе(Знач СтрокаПоиска) Экспорт
	
	ИтоговаяСтрокаДляПоиска = СтрокаПоиска;
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "~", "~~");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "%", "~%");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "_", "~_");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "[", "~[");
	ИтоговаяСтрокаДляПоиска = СтрЗаменить(ИтоговаяСтрокаДляПоиска, "-", "~-");
	
	Возврат ИтоговаяСтрокаДляПоиска;
	
КонецФункции
Показать

Она экранирует спецсимволы. Ее желательно ведь использовать? Иначе например серию Р[5.7] не получится найти...
ivanov660; +1 Ответить
34. ivanov660 4442 02.08.21 20:20 Сейчас в теме
(32)Оптимизирован типовой код и именно рассматриваемая задача, ваше замечание действительно полезное.
33. sapervodichka 6846 02.08.21 19:37 Сейчас в теме
Хороший урок! (из последнего что сам столкнулся это лишние роли - профили в 1500 ролей кладут базы)
35. rabid_otter 134 02.08.21 22:03 Сейчас в теме
очевидные вещи написаны. адекватный программист это все и так знает.
DJ_Codebase; Yashazz; +2 Ответить
36. ivanov660 4442 02.08.21 22:11 Сейчас в теме
(35)Конструктив будет? Может поделитесь каким-нибудь полезным life hack?

Любой программист проходит стадию новичка, для них это полезно, сеньоры должны знать (но бывают исключения).
54. rabid_otter 134 03.08.21 14:18 Сейчас в теме
(36) хз, что добавить... обычная средняя статья для новичков.
по поводу использования НаКлиентеНаСервереБезКонтекста для избежания дублирования кода не соглашусь.
в типовых там еще передают всю форму, что нивелирует суффикс "БезКонтекста" по сути.
читайте макконнелла "совершенный код", применяйте и будет вам счастье.
советую еще почитать "Элегантные объекты. Java Edition", мне зашло.

по поводу того, что полезно: не громоздить кучи кода в клиентских формах.
потому что при передаче данных на сервер в форме, передается еще и весь код, большие блоки текста желательно инкапсулировать в клиентские общие модули.
это было единственным замечанием начальника отдела разработки в компании «Билайн» после ревью моего кода на собеседовании (которое я прошел, но не пошел в Билайн из-за более интересного предложения).
еще полезно держать кэш частых ссылок и служебных данных на форме, чтобы снизить частоту обращения к серверу.
58. rabid_otter 134 03.08.21 15:20 Сейчас в теме
(36) и еще - очень много любителей зачем-то гонять большие таблицы на сервер с клиента. это тоже замедляет работу системы. в статье не увидел таких очевидных вещей.
выбирать в запросах как можно меньше полей, ограничивать выборку - это тоже каждому должно быть очевидно.
если почитать всякие SOLID, KISS, YAGNI, дзен Питона например, все станет очень понятно. многие концепты можно применить и в 1С.
39. biimmap 1946 03.08.21 09:10 Сейчас в теме
(35) и много ли в Вашем окружении адекватных? В какой они стране??? Я вот постоянно с г..нокодерами сталкиваюсь! Поэтому да вещи очевидные, но слишком много неадекватных...
ivanov660; +1 Ответить
41. rabid_otter 134 03.08.21 09:56 Сейчас в теме
(39) хз, всякое бывает, но то что я вижу в большинстве случаев - норм. сижу на самописках уже года 4.
37. Nigra 03.08.21 07:27 Сейчас в теме
Покоробило
"
Если НЕ ЕстьБлокировкаОбъекта(Контрагент)=Истина Тогда
//...
КонецЕсли;
"
первая заповедь программиста: "Не мудри!"
по-моему проще написать
Если ЕстьБлокировкаОбъекта(Контрагент)=Ложь Тогда
или (если функция возвращает булевы значения)
Если Не ЕстьБлокировкаОбъекта(Контрагент) Тогда
Aleskey_K; Albert_2008; +2 Ответить
40. Yashazz 4759 03.08.21 09:44 Сейчас в теме
Если честно, всё это уже обсуждалось столько раз, что аж на зубах скрипит. Уже больше 50 точно. Уже просто такой баян, что сил нет. Да, аккуратно и грамотно оформлено, но и только. Всё свалено в кучу, ошибки разнородные, разноплановые, просто собраны вместе по малопонятному принципу. И как всегда, оживлённые баталии в комментах, "а как же всё-таки правильно". Честное слово, надоело. Кроме как очередной раз плюсики собрать, ни малейшей пользы - пионэры как косячили, так и косячат, БСП как писали хрень, не лезущую в их же стандарты, так и пишут... Осточертело уже.

А если кому нужен конструктив, то вот, из личного опыта. Никогда не называйте переменные, реквизиты и параметры зарезервированными именами. Г-внокодеров из 1С-центральной поубивать надо за переменные с именем "запрос" или "строка". Потому что существует ряд случаев, когда это аукается большими и неочевидными проблемами. И я сейчас даже не про сом-соединение или работу в "Выполнить" или вызываемое из функций СКД. Я про глюки платформы. В своё время один реквизит формы, названный "ТабличныйДокумент", стоил нашей фирме проваленных сроков по проекту, сорванного контракта, кучи скандалов, судебного преследования и попадания лично РП на 5 лямов. Потому что 8.3.7 начинала ооочень своеобразно себя вести в работе с такой формой. Она спонтанно её переобновляла, кэшировала фрагментами какие-то данные, порой не отрабатывала расположение элементов или запоминание настроек, а в тонком клиенте падала.
Багов в платформе много, подобное ещё может всплыть где угодно. Желающие встать на грабли могут продолжать писать "Структура = Новый Структура".
Aggressorak; Cерый; cdiamond; VirDim; rabid_otter; +5 Ответить
42. ivanov660 4442 03.08.21 10:05 Сейчас в теме
(40)
1. Коллега, будьте любезны и приведите пару ссылок - статьи в которых приводится разбор примеров по аналогии статьи выше (не будьте голословны).
2. Про стиль кодирования мы с вами обсуждали в предыдущей статье, тут мы говорим совсем про другое.
3. Я выше уже писал, что сеньоры вашего уровня могут спокойно проходить мимо.
4. По факту я вижу как подобного рода статьи меняют качество программистов - на своей команде, при общении с коллегами на конференции, в общении в личном общении. Я рад этому.
5. Я лично всегда поощряю данные статьи и подобные начинания, а гнать хейт по крайней мере не профессионально.
fatman78; Артано; +2 Ответить
43. Yashazz 4759 03.08.21 10:55 Сейчас в теме
1. Вы не хуже меня знаете, какой на ИС "хороший" поиск. Будет время - разыщу. Не будет - не взыщите. Но что таких полно - факт.
2. А я не про стиль, я про грубые и опасные ошибки, которые начинающий, беря за образец типовую конфу, может совершить.
3. Бывает, я тоже нахожу нечто ранее неизвестное, посему каждую такую публикацию читаю внимательно.
4. Рад за вас, а я вот - напротив, вижу уровень ниже плинтуса.
5. Я просто не понимаю, зачем пережёвывать одно и то же стопицотый раз. Какой смысл писать об этом, если раньше уже писали? Про ту же индексацию временных таблиц - ну уже нереально сколько раз говорено, зачем опять одно и то же? Вы можете вывести универсальный рецепт? Нет, он невозможен. Вы можете досконально расписать, как именно и в каких случаях ведут себя разные СУБД с разными настройками при индексации ВТ? Тоже нет. Всё, что можно сказать, это "ребята, держите ухо востро, вот список факторов, вот инструменты, дальше включайте мозг сами". Нахрена ещё обсасывать?
DJ_Codebase; Артано; +2 Ответить
48. ivanov660 4442 03.08.21 11:54 Сейчас в теме
(43) Согласно вашему комментарию 90% статей инфостарта можно удалить, т.к. уже все расписано было (по крайней мере на ИТС).
Gilev.Vyacheslav; +1 Ответить
49. Yashazz 4759 03.08.21 11:58 Сейчас в теме
(48) Ага! И вот тогда вместо кучи барахла мы бы получили легко отыскиваемые, дельные, нужные и порой уникальные материалы. Но увы.
59. Yashazz 4759 03.08.21 18:58 Сейчас в теме
(48) А согласно вашей позиции, я могу сейчас пойти и запостить повтор того, что, к примеру, год назад уже было. Так?)
44. Артано 764 03.08.21 10:58 Сейчас в теме
(40) Яков, статьи такие будут появляться ровно до тех пор пока косячить не перестанут. Я вот, тоже по этой теме периодически статьи пуляю и про ошибки года три назад писал. Потому что куда ни придёшь хоть бери любой модуль и выписывай новые примеры =)
45. Yashazz 4759 03.08.21 11:09 Сейчас в теме
(44) В этом плане интересно бы исследовать, насколько появление принципиально новых инструментов (система взаимодействия, "кагбэ асинхронность", базы-копии и базы-для-отчётов) влияют на появление новых ошибок и, главное, новых категорий ошибок.
Ошибка ведь что? Когнитивно-перцептивно-психологическое явление, помноженное на технологию. Вот это бы раскопать - повторяются ли , "проецируются" ли старые классические ошибки на новый инструмент, и что может породить качественно иной класс ошибок.
56. Артано 764 03.08.21 14:36 Сейчас в теме
(45) В своих исследованиях приближался к этому вопросу, но не углублялся, копая там, где было достаточно для понимания процессов. Если в общем, то ошибки повторяются всегда. Тут проблема именно в генном коде, а не программном. Просто часть ошибок могут быть формализованы и их легко идентифицировать, иные же не видны пока не наступишь на хорошо спрятанные грабли.
Про принципиально новые классы ошибок, затрудняюсь ответить. Если только ошибки связанные строго с использованием некого нового инструмента, но опять же, причины этих ошибок будут скорее всего одни и те же.
52. savostin.alex 83 03.08.21 13:24 Сейчас в теме
"При записи документа выбираем для заполнения первого получателя" - наверное, перед записью?
53. AntonProgma 47 03.08.21 13:57 Сейчас в теме
В 9-ом примере в реквизит шапки xyz_КонтрагентДляСписка попадает получатель из первой строки без проверки, что в остальных строках. По условию задачи в таблице "90% с одним или одинаковым получателем". А в 10% разные получатели? В смысле, "хорошее решение" - это оптимизация вывода данных, которые в 10% ошибочны? Я 5 раз перечитал и не могу поверить.
55. lobonosov@mail.ru 03.08.21 14:31 Сейчас в теме
По 6 пункту: проблема не в том что нет индекса в ВТ, а в том что выбираются записи без отбора на период. Создавать ВТ и помещать туда почти весь справочник склады не вижу смысла. Достаточно условия НЕ Склад.ПометкаУдаления.
По пункту 14: Если нужна тонкая настройка доступа, то лучше как раз использовать 2-й подход: создавать роли-функции. Все типовые конфигурации как раз придерживаются данного подхода.
Больше ролей применяется к пользователю и тем самым усложняются проверки при использовании RLS - это происходит только в том случае, если на 1 объект конфигурации назначено несколько ролей с разным текстом RLS. И при 2-м подходе найти ошибку гораздо быстрее, достаточно проверить 2 роли: одну на добавление и одну на чтение.
57. mikl79 119 03.08.21 14:43 Сейчас в теме
60. RustRR 04.08.21 12:16 Сейчас в теме
13. Использование типа «Любая ссылка»
Решение: 
Не используем тип «Любая ссылка»;

*картинка Okay*
77. Hatson 531 08.09.21 11:54 Сейчас в теме
Пункт 9. Необходимо использовать обработчик ПередЗаписью(Отказ), а не ПриЗаписи(Отказ)
Оставьте свое сообщение