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

09.09.21

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

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

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

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

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

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

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Инструмент для тех, кто устал читать модули по 50 тысяч строк и искать ошибки глазами. MetaVision загружает выгруженные файлы конфигурации и за секунды строит графы функций, находит уязвимости и подсвечивает проблемы производительности. Ключевые возможности: Визуализация логики функций (графы условий, циклов, транзакций и вызовов). Статический аудит безопасности (RCE, SSRF, COM-инъекции, пароли в коде). Поиск проблем производительности (запросы в циклах, вложенные блокировки). Полнотекстовый поиск по всем модулям конфигурации. Статистика по объектам и функциям. Безопасность: Программа работает строго локально. Код вашей конфигурации не отправляется в интернет и не анализируется на сторонних серверах. Попробуйте MetaVision сегодня — узнайте, что скрывает ваш код.

20.04.2026    13892    1384    KHoroshulinAV    63    

95

Рефакторинг и качество кода Программист Россия Бесплатно (free)

GRASP-паттерны в 1С: меньше хаоса, больше архитектуры.

28.08.2025    14828    lapinio    49    

62

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

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

21.04.2025    21903    RPGrigorev    32    

59

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

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

18.02.2025    14749    ivanov660    39    

62

Инструментарий разработчика Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Расширяемый форматтер структуры модулей 1С. Умеет автоматически расставлять стандартные области и раскидывать по ним процедуры и функции модуля, оформлять стандартные комментарии к методам с помощью ИИ. Также умеет анализировать модуль - извлекать структуру вызовов, используемые поля и т.д. Реализован в виде расширения (.cfe). Можно использовать как платформу для обработки кода в своих задачах автоматизации разработки.

12.02.2025    17400    1084    wonderboy    50    

149

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

SOLID – принципы проектирования программных структур (модулей). Акроним S.O.L.I.D. образован из первой буквы пяти принципов. Эти принципы делают код более гибким, упрощают разработку. Принято считать, что принципы SOLID применимы только в объектно-ориентированном программировании. Но их можно успешно использовать и в 1С. Расскажем о том, как разобраться в принципах SOLID и начать применять их при работе в 1С.

22.08.2024    23759    alex_sayan    47    

70

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

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

24.06.2024    17267    ivanov660    13    

64

Рефакторинг и качество кода 1С:Предприятие 8 Бесплатно (free)

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

10.04.2024    20753    artbear    89    

113
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2160 02.08.21 11:32 Сейчас в теме
Не очень хорошо в условиях использовать отрицание условия - "НЕ РАВНО"
Что-то новенькое... Можно пояснение?
3. ivanov660 4981 02.08.21 11:54 Сейчас в теме
(1)Поправил фразу в контексте примера. СКЛ хорошо работает с условиями на "РАВНО", по крайней мере должно быть обязательно основное условие с использованием равно, а вот уже дополнительные условия могут содержать другие операторы, в противном случае не будет эффективно использован индекс. Сходу на ИТС нашел только эту ссылку: Эффективные условия запросов
Далее планирую рассмотреть план запроса для части примеров, там мы сможем увидеть поведение сервера.
fatman78; Innuil; +2 Ответить
11. tolyan_ekb 80 02.08.21 13:25 Сейчас в теме
(3) Я тоже об этом читал, но проверить руки не дошли. Было бы здорово увидеть пример.
61. bugagashenka 206 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 4981 05.08.21 10:23 Сейчас в теме
(61)Вроде так и было, в следующей статье мы посмотрим как меняются планы запросов при изменении.
67. bugagashenka 206 05.08.21 11:52 Сейчас в теме
(63) Еще подкину идею для следующего выпуска:
поиск по массиву, когда Т.Поле В(&Список)
И список состоит из 10 элементов и когда из 1000, в плане прямо наглядно видно, как меняется план запроса.
И еще, как меняется план при разной селективности и что скан может вылезти даже при поиску по индексированному, но низкоселективному полю. Это к слову о проектировании регистров очень важную роль играет
65. ixijixi 2160 05.08.21 10:42 Сейчас в теме
(61) Окей, принято, хотя в ссылке немного про другое. А если вместо конструкции
Т.Поле <> &Поле
использовать
Не Т.Поле = &Поле
Тут уже не будет скана таблицы?
66. bugagashenka 206 05.08.21 11:48 Сейчас в теме
(65) Если поле индексировано, то будет поиск по индексу
68. ixijixi 2160 05.08.21 12:18 Сейчас в теме
(66) Да, индексировано. Предположим, что это поле "Ссылка". Забавно получается. Если условие "=", то идет поиск по индексу. А если "<>" - то скан, хотя поле индексированное? Нелогично, не находите?
69. ivanov660 4981 05.08.21 13:01 Сейчас в теме
(68)Зачем запросу план и кто его выполняет? в статье хорошо описаны основные операторы получения данных. И особенности их работы - как раз варианты условий при которых они используются
70. bugagashenka 206 05.08.21 14:15 Сейчас в теме
(68) Все очень логично. Представьте себе ситуацию, что на стоянке стоят различные автомобили, пусть ауди, которые размещены по модели. Если Вы ищете, например, А6 и для этого Вы сразу подойдете к месту, где они стоят. Но если же ищете любую не А6, то Вам придется перебрать всю стоянку. Что, в целом, логично. Тут так же. Индекс это всего то дерево, где слева меньшие, справа большие. И из примера выше, А3 будут стоять левее, а Q7 правее.
71. ixijixi 2160 06.08.21 11:45 Сейчас в теме
(70)
Но если же ищете любую не А6, то Вам придется перебрать всю стоянку.
Нет, я найду все А6, все остальные будут удовлетворять условию.
72. ivanov660 4981 06.08.21 12:42 Сейчас в теме
(71)не уверен, что так работает оптимизатор СКЛ. Даже если это так, то план запроса будет гораздо сложнее, чем проверка на равенство.
73. ixijixi 2160 06.08.21 12:55 Сейчас в теме
(72) Можете проверить? Сначала Т.Поле <> &Поле, затем Не Т.Поле = &Поле. Будет план отличаться?
74. ivanov660 4981 06.08.21 14:47 Сейчас в теме
(73)посмотрю, буду на выходных писать
75. bugagashenka 206 09.08.21 09:53 Сейчас в теме
(71) перефразирую. Вам нужно выгнать все машины со стоянки, кроме А6. Вам же нужно почесть строки и вернуть клиенту. Теперь логика несколько поменялось, не так ли? И наиболее оптимально будет проверить всю стоянку и каждую машину на шильдик А6 и, если условие выполняется, выгнать автомобиль за пределы
76. ixijixi 2160 10.08.21 08:13 Сейчас в теме
(75) Выгнать != Найти, в контексте обсуждения это скорее удалить, но и операция тут другая
2. bulpi 218 02.08.21 11:53 Сейчас в теме
Плюс поставил.
Замечания :
1)Часть пунктов встречается во всех типовых конфигурациях :)
2)Неприязнь к com - соединению - это личное у автора. Не нужно возводить личную неприязнь в ранг общего правила.
ЧИА; zqzq; +2 Ответить
5. ivanov660 4981 02.08.21 11:57 Сейчас в теме
(2)
1. Сами 1С-ники рекомендуют отказываться от Com.
2. Дополнительно попробуйте запустить частый обмен на одной базе через com - этак с 10-20 бухгалтерий ( 5 минут).
Aleskey_K; +1 Ответить
26. bulpi 218 02.08.21 16:21 Сейчас в теме
(5)

2. Ну запускаю. Ну работает. 1-2 секунды на соединение. Потом все так, как будто это и не com.
1.Понятно, что веб и http сервисы современнее и универсальнее. Но если специально для передачи 1 документа между двумя базами надо на сервере запускать IIS, то ну его на фиг. Тем более, что не всегда есть на это права. И не всегда сисадмин поведется на такое безобразие.
(5)
28. ivanov660 4981 02.08.21 16:47 Сейчас в теме
(26)Применять или не применять на ваше усмотрение и текущую ситуацию.
46. Yashazz 4933 03.08.21 11:21 Сейчас в теме
(5) Насчёт отказа от СОМ - а вы посмотрите типовые конфигурации, и сколько там его использований. От СОМ уже лет 15 "отказываются" )))
47. ivanov660 4981 03.08.21 11:48 Сейчас в теме
(46) Смотрел эволюцию УХ. В консолидации был только COM, в УХ появилось использование вебсервисов. Т.ч. работы в этом направлении идут, ожидать, что это будет сделано за 1-2 месяца - наивно.
50. Yashazz 4933 03.08.21 12:01 Сейчас в теме
(47) если вы ожидали 1-2 месяцев, то да, это было наивно) Не огорчайтесь, лет через 10, может, от СОМ и правда почти откажутся)
А пока что его пихают куда ни попадя, от пауз и регулярных выражений до запуска приложений.
4. maksa2005 380 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 4981 02.08.21 12:22 Сейчас в теме
(7) Это пример кода из типовой конфигурации и акцент сделан на пропуске условия. Относительно оптимальности всего запроса, то надо смотреть в рамках всего контекста. На оператор "В", тоже есть ограничения. При большом количестве данных, сервер может преобразовывать в соединение.
9. ipoloskov 165 02.08.21 13:03 Сейчас в теме
"6. Отсутствие индекса по соединяемым полям в пакетных запросах"
На курсах по Эксперт по Технологическим вопросам сказали, что нет смысла индексировать временную таблицу, если там не 100.000 строк. Или в случае использования ее в параметрах виртуальной таблицы есть какой-то нюанс? Как-то непонятно - SQL уже знает, сколько строк в таблице ВТ_Склад. Как он может построить неоптимальный запрос?
dabu-dabu; +1 Ответить
10. ivanov660 4981 02.08.21 13:21 Сейчас в теме
(9)
1. Это пример из реальной ситуации. Пока не проиндексировали, был плавающий план запросов, который мы наблюдали. Почему СКЛ так делает ответа у меня нет (существенное влияние оказывает нагрузка на сервере).
2. Как они обосновали такое заявление? Почему 100 000, а не 90 000? Сказали верьте нам на слово? По факту они иногда что-то говорят, а потом меняют позицию.
51. Sapiens_bru 4 03.08.21 12:58 Сейчас в теме
(10) Это видимо были такие курсы. На хороших курсах говорят примерно так "Не нужно бездумно включать индексы в любых ситуациях. Смотрите на результаты без индексов(причем не в моменте а статистически) и включайте индексы там где они действительно нужны"
62. bugagashenka 206 05.08.21 10:21 Сейчас в теме
(9) На курсе говорили про то, что не всегда индекс сработает и что нужно проверять на конкретных данных. Не всегда индекс отработает, но бывает, что очень помогает, хоть и такое случается редко, чаще всего на больших ВТ можно наоборот ухудшить ситуацию, ибо построить индекс тоже стоит ресурсов.
64. ivanov660 4981 05.08.21 10:25 Сейчас в теме
(62)На мой взгляд - вообще всегда надо работать с данными, по которым стоит фильтр (оперативные действия). Если вы конечно пересчитываете себестоимость, то это другая ситуация и решения уже должны быть архитектурные.
12. tolyan_ekb 80 02.08.21 13:28 Сейчас в теме
Спасибо за примеры с кодом и рассуждениями.
ivanov660; +1 Ответить
13. biimmap 2121 02.08.21 13:29 Сейчас в теме
Если позволишь я тоже немного прикопаюсь к COM-соединению. Мой текущий проект на COM работает обмен между самописной базой Управленческие табеля и типовыми ЗУПами 2.5; 3.1 + Беларусь и Казахстан. Довольно удобно всё получилось. само чтение данных не так уж долго идёт. Учитывая 6000 сотрудников на выгрузку в самописную базу (именно чтение!) занимает 20 секунд, на выгрузку в ЗУП тоже меньше минуты секунд 50. Данных очень много в обе стороны гуляет. Назад вообще данные об отработанном времени, там главная таблица больше 100 тыс записей.

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

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

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

Продолжение будет?
22. ivanov660 4981 02.08.21 14:26 Сейчас в теме
(20)Мы использовали кеш из Соответствия.
А про таблицы, если вы их используете не забывайте добавлять индексы особенно для составного ключа (в примере УХ, там действительно составной ключ).
23. Sashares 34 02.08.21 15:15 Сейчас в теме
(20) Индексирование имеет смысл если в таблице много строк и/или выполняется многократный поиск.
Количество колонок в этом случае не важно. Просто если колонка одна, то нет смысла использовать именно таблицу значений.
30. adamx 37 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 4981 03.08.21 08:29 Сейчас в теме
(20)Будет, ожидайте. Рассмотрим как это выглядит на плане запросов.
24. adamx 37 02.08.21 15:46 Сейчас в теме
10-й пункт нарушает седьмой. надо в условие оборотного регистра по регистратору добавлять условие.
И самое интересное - отборы не равнозначны? Это точно приемлемое решение в 10-м пункте?
25. ivanov660 4981 02.08.21 15:58 Сейчас в теме
(24)В 10м пункте используется именно соединение, а не отбор. т.е. мы к результирующим данным добавляем поля.
Не рекомендуется соединять между собой несколько виртуальных таблиц. Можно конечно вынести виртуальную таблицу во временную таблицу и потом соединять, но для динамического списка - это будет плохим решением.
29. adamx 37 02.08.21 17:01 Сейчас в теме
(25)
"ВЫБРАТЬ
|	Т.Регистратор КАК Регистратор,
|	РД.ДатаДокументаИБ КАК ДатаДок,
|	РД.НомерДокументаИБ КАК НомерДок,
|	РД.Комментарий КАК КомментарийДок,
|	Т.ЗаказКлиента КАК ЗаказКлиента,
|	Т.СуммаОборот КАК СуммаОборот
|ИЗ
|	РегистрНакопления.РасчетыСКлиентами.Обороты(, , Регистратор, ) КАК Т
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РД
|		ПО Т.Регистратор = РД.Ссылка
|			И (РД.ДополнительнаяЗапись = ЛОЖЬ)"
Показать


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

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

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

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

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

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

Она экранирует спецсимволы. Ее желательно ведь использовать? Иначе например серию Р[5.7] не получится найти...
ivanov660; +1 Ответить
34. ivanov660 4981 02.08.21 20:20 Сейчас в теме
(32)Оптимизирован типовой код и именно рассматриваемая задача, ваше замечание действительно полезное.
33. sapervodichka 7623 02.08.21 19:37 Сейчас в теме
Хороший урок! (из последнего что сам столкнулся это лишние роли - профили в 1500 ролей кладут базы)
35. rabid_otter 134 02.08.21 22:03 Сейчас в теме
очевидные вещи написаны. адекватный программист это все и так знает.
kuzyara; DJ_Codebase; Yashazz; +3 Ответить
36. ivanov660 4981 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 2121 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 Сейчас в теме
Покоробило
"
Если НЕ ЕстьБлокировкаОбъекта(Контрагент)=Истина Тогда
//...
КонецЕсли;
"
первая заповедь программиста: "Не мудри!"
по-моему проще написать
Если ЕстьБлокировкаОбъекта(Контрагент)=Ложь Тогда
или (если функция возвращает булевы значения)
Если Не ЕстьБлокировкаОбъекта(Контрагент) Тогда
kuzyara; Aleskey_K; Albert_2008; +3 Ответить
40. Yashazz 4933 03.08.21 09:44 Сейчас в теме
Если честно, всё это уже обсуждалось столько раз, что аж на зубах скрипит. Уже больше 50 точно. Уже просто такой баян, что сил нет. Да, аккуратно и грамотно оформлено, но и только. Всё свалено в кучу, ошибки разнородные, разноплановые, просто собраны вместе по малопонятному принципу. И как всегда, оживлённые баталии в комментах, "а как же всё-таки правильно". Честное слово, надоело. Кроме как очередной раз плюсики собрать, ни малейшей пользы - пионэры как косячили, так и косячат, БСП как писали хрень, не лезущую в их же стандарты, так и пишут... Осточертело уже.

А если кому нужен конструктив, то вот, из личного опыта. Никогда не называйте переменные, реквизиты и параметры зарезервированными именами. Г-внокодеров из 1С-центральной поубивать надо за переменные с именем "запрос" или "строка". Потому что существует ряд случаев, когда это аукается большими и неочевидными проблемами. И я сейчас даже не про сом-соединение или работу в "Выполнить" или вызываемое из функций СКД. Я про глюки платформы. В своё время один реквизит формы, названный "ТабличныйДокумент", стоил нашей фирме проваленных сроков по проекту, сорванного контракта, кучи скандалов, судебного преследования и попадания лично РП на 5 лямов. Потому что 8.3.7 начинала ооочень своеобразно себя вести в работе с такой формой. Она спонтанно её переобновляла, кэшировала фрагментами какие-то данные, порой не отрабатывала расположение элементов или запоминание настроек, а в тонком клиенте падала.
Багов в платформе много, подобное ещё может всплыть где угодно. Желающие встать на грабли могут продолжать писать "Структура = Новый Структура".
kuzyara; Aggressorak; Cерый; cdiamond; VirDim; rabid_otter; +6 Ответить
42. ivanov660 4981 03.08.21 10:05 Сейчас в теме
(40)
1. Коллега, будьте любезны и приведите пару ссылок - статьи в которых приводится разбор примеров по аналогии статьи выше (не будьте голословны).
2. Про стиль кодирования мы с вами обсуждали в предыдущей статье, тут мы говорим совсем про другое.
3. Я выше уже писал, что сеньоры вашего уровня могут спокойно проходить мимо.
4. По факту я вижу как подобного рода статьи меняют качество программистов - на своей команде, при общении с коллегами на конференции, в общении в личном общении. Я рад этому.
5. Я лично всегда поощряю данные статьи и подобные начинания, а гнать хейт по крайней мере не профессионально.
fatman78; Артано; +2 Ответить
43. Yashazz 4933 03.08.21 10:55 Сейчас в теме
1. Вы не хуже меня знаете, какой на ИС "хороший" поиск. Будет время - разыщу. Не будет - не взыщите. Но что таких полно - факт.
2. А я не про стиль, я про грубые и опасные ошибки, которые начинающий, беря за образец типовую конфу, может совершить.
3. Бывает, я тоже нахожу нечто ранее неизвестное, посему каждую такую публикацию читаю внимательно.
4. Рад за вас, а я вот - напротив, вижу уровень ниже плинтуса.
5. Я просто не понимаю, зачем пережёвывать одно и то же стопицотый раз. Какой смысл писать об этом, если раньше уже писали? Про ту же индексацию временных таблиц - ну уже нереально сколько раз говорено, зачем опять одно и то же? Вы можете вывести универсальный рецепт? Нет, он невозможен. Вы можете досконально расписать, как именно и в каких случаях ведут себя разные СУБД с разными настройками при индексации ВТ? Тоже нет. Всё, что можно сказать, это "ребята, держите ухо востро, вот список факторов, вот инструменты, дальше включайте мозг сами". Нахрена ещё обсасывать?
DJ_Codebase; Артано; +2 Ответить
48. ivanov660 4981 03.08.21 11:54 Сейчас в теме
(43) Согласно вашему комментарию 90% статей инфостарта можно удалить, т.к. уже все расписано было (по крайней мере на ИТС).
Gilev.Vyacheslav; +1 Ответить
49. Yashazz 4933 03.08.21 11:58 Сейчас в теме
(48) Ага! И вот тогда вместо кучи барахла мы бы получили легко отыскиваемые, дельные, нужные и порой уникальные материалы. Но увы.
59. Yashazz 4933 03.08.21 18:58 Сейчас в теме
(48) А согласно вашей позиции, я могу сейчас пойти и запостить повтор того, что, к примеру, год назад уже было. Так?)
44. Артано 803 03.08.21 10:58 Сейчас в теме
(40) Яков, статьи такие будут появляться ровно до тех пор пока косячить не перестанут. Я вот, тоже по этой теме периодически статьи пуляю и про ошибки года три назад писал. Потому что куда ни придёшь хоть бери любой модуль и выписывай новые примеры =)
45. Yashazz 4933 03.08.21 11:09 Сейчас в теме
(44) В этом плане интересно бы исследовать, насколько появление принципиально новых инструментов (система взаимодействия, "кагбэ асинхронность", базы-копии и базы-для-отчётов) влияют на появление новых ошибок и, главное, новых категорий ошибок.
Ошибка ведь что? Когнитивно-перцептивно-психологическое явление, помноженное на технологию. Вот это бы раскопать - повторяются ли , "проецируются" ли старые классические ошибки на новый инструмент, и что может породить качественно иной класс ошибок.
56. Артано 803 03.08.21 14:36 Сейчас в теме
(45) В своих исследованиях приближался к этому вопросу, но не углублялся, копая там, где было достаточно для понимания процессов. Если в общем, то ошибки повторяются всегда. Тут проблема именно в генном коде, а не программном. Просто часть ошибок могут быть формализованы и их легко идентифицировать, иные же не видны пока не наступишь на хорошо спрятанные грабли.
Про принципиально новые классы ошибок, затрудняюсь ответить. Если только ошибки связанные строго с использованием некого нового инструмента, но опять же, причины этих ошибок будут скорее всего одни и те же.
52. savostin.alex 43 03.08.21 13:24 Сейчас в теме
"При записи документа выбираем для заполнения первого получателя" - наверное, перед записью?
53. AntonProgma 50 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 121 03.08.21 14:43 Сейчас в теме
60. RustRR 04.08.21 12:16 Сейчас в теме
13. Использование типа «Любая ссылка»
Решение: 
Не используем тип «Любая ссылка»;

*картинка Okay*
77. Hatson 540 08.09.21 11:54 Сейчас в теме
Пункт 9. Необходимо использовать обработчик ПередЗаписью(Отказ), а не ПриЗаписи(Отказ)
78. pvlunegov 160 21.10.25 12:02 Сейчас в теме
пункт 15.
есть решение из нескольких пунктов. В варианте реализации я уведел лишь 1 пункт. А где остальные?
79. ivanov660 4981 21.10.25 13:30 Сейчас в теме
(78) Можешь спросить меня в ЛС, я расскажу
Для отправки сообщения требуется регистрация/авторизация