Как нарисовать граф на 1С Промо
Описывается реализация на языке запросов 1С метода расположения вершин графа на плоскости, основанного на использовании электромеханической аналогии. При этом вершины графа представляются одноименными электрическими зарядами, дуги — пружинками. Силы взаимодействия вершин в этой системе переводят их из случайного начального в нужное конечное положение. Приведена обработка рисования графов «ГрафОграф», реализующая данный подход, показывающая также динамику процесса. Граф можно задать списком ребер вручную, выбрать из нескольких предопределенных примеров или сформировать по данным информационной базы.
1 стартмани
Чем комментарии могут помочь программисту
Комментарии, в зависимости от ситуации, делают сразу несколько полезных вещей:
Помогают быстрее разобраться в коде — если появилась ошибка или нужно что-то изменить d программе
Это важно и разработчику, и тем, кто будет заниматься кодом после него.
Не дают запутаться в логике — при создании новых библиотек, процедур, функций и системных переменных.
Объясняют результаты работы — при отладке или проверке программы. Это понимание необходимо тестировщикам из отдела QA.
Описывают сложные алгоритмы и формулы — в математических, физических или экономических расчётах и других сложных вычислениях
Это позволяет разобраться в готовом коде тем, у кого нет глубоких знаний в какой-то предметной области.
Параметры или аргументы
expression
Символьное выражение такие как столбец или поле. Это могут быть следующие типы данных: VARCHAR2, CHAR, NVARCHAR2, NCHAR, CLOB или NCLOB.
pattern
Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
^ | Соответствует началу строки. При использовании match_parameter с ‘m’, соответствует началу строки в любом месте в пределах выражения. |
$ | Соответствует концу строки. При использовании match_parameter с ‘m’, соответствует концу строки в любом месте в пределах выражения. |
* | Соответствует нолю или более вхождений. |
+ | Соответствует одному или более вхождений. |
? | Соответствует нолю или одному вхождению. |
. | Соответствует любому символу, кроме NULL. |
| | Используется как «OR», чтобы указать более одной альтернативы. |
Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке. | |
Используется для указания списока nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке. | |
( ) | Используется для групповых выражений в качестве подвыражений. |
{m} | Соответствует m раз. |
{m,} | Соответствие как минимум m раз. |
{m,n} | Соответствие как минимум m раз, но не более n раз. |
\n | n представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n. |
Соответствует одному сопоставлению элемента, который может быть более одного символа. | |
Соответствует классу символов. | |
Соответствует классу эквивалентности | |
\d | Соответствует цифровому символу. |
\D | Соответствует не цифровому символу. |
\w | Соответствует текстовому символу. |
\W | Соответствует не текстовому символу. |
\s | Соответствует символу пробел. |
\S | Соответствует не символу пробел. |
\A | Соответствует началу строки или соответствует концу строки перед символом новой строки. |
\Z | Соответствует концу строки. |
*? | Соответствует предыдущему шаблону ноль или более вхождений. |
+? | Соответствует предыдущему шаблону один или более вхождений. |
?? | Соответствует предыдущему шаблону ноль или одному вхождению. |
{n}? | Соответствует предыдущему шаблону n раз. |
{n,}? | Соответствует предыдущему шаблону, по меньшей мере n раз. |
{n,m}? | Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз. |
match_parameter
Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_LIKE. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
‘c’ | Выполняет чувствительное к регистру согласование. |
‘i’ | Выполняет не чувствительное к регистру согласование. |
‘n’ | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
‘m’ | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
‘x’ | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
Неожиданные результаты применения методики оптимизации запросов
Итак, методика оптимизации запросов у нас имеется, вы можете ее использовать, все замечательно. Однако ее практическое применение может оказаться с неожиданными результатами. Я о таких неожиданных результатах знал давно, поэтому специально для доклада подготовил несколько примеров.
Итак, в первом примере вы видите, что идет обращение к виртуальной таблице остатков. При этом в первом случае для отбора по товарам документа используется вложенный запрос, а во втором случае – вложенный запрос с использованием временной таблицы, что, по идее, должно предоставить нам возможности для более эффективной работы с данными. Однако этого не происходит.
Справа показаны замеры скорости исполнения, сделанные с помощью всем известной обработки с диска ИТС «Консоль запросов для управляемого приложения 8.3», позволяющей видеть затраты на исполнение запроса для сервера MSSQL. Как вы видите, в данном случае использование временной таблицы не привело к более быстрому результату, поскольку затраты на ее создание оказались более существенными, чем работа с вложенным запросом. Такое очень часто встречается на практике.
Другой случай, который также может привести к неожиданному результату, – это затраты на индексирование временных таблиц. Нередко при индексации временной таблицы, в которую помещается небольшое количество записей, мы не получаем прироста производительности, а наоборот, затрачиваем время на то, чтобы проиндексировать временную таблицу (несем накладные расходы и не получаем при этом никакого ускорения).
Получается, что результирующее быстродействие запроса во многом будет зависеть от реальных данных, для которых он будет использоваться.
Другая ситуация: я нередко вижу, что разработчики, используя правила составления запросов, описанные на ИТС или где-то еще, искаженно воспринимают информацию в части, например, работы с вложенными свойствами полей составного типа.
Например, на слайде показан текст запроса, демонстрирующий обращение к полю составного типа «Регистратор» (а именно к его вложенному свойству «Контроль цен»). Здесь видно, что запрос, в конечном счете, не производит обращения к документу «Реализация товаров и услуг», поскольку свойства «Контроль цен» у этого вида документов нет, и, соответственно,сама платформа не генерирует никаких дополнительных левых соединений. А на практике я встречаю чрезмерные усилия разработчиков (не всех, конечно), направленные на то, чтобы исключить лишние источники данных, хотя они в этом случае и так не будут подключены. И это тоже нередко встречающаяся ситуация.
Получение данных через точку от полей составного типа
Рекомендации
Если в запросе используется получение значения через точку от поля составного ссылочного типа, то при выполнении этого запроса будет выполняться соединение со всеми таблицами объектов, входящими в этот составной тип. В результате SQL текст запроса чрезвычайно усложняется, и при его выполнении оптимизатор СУБД может выбрать неоптимальный план. Это может привести к серьезным проблемам производительности и даже к неработоспособности запроса в отдельных случаях.
В частности, не рекомендуется обращаться к реквизитам регистратора регистра (например, «ТоварыНаСкладах.Регистратор.Дата») и т.п
При этом не важно в какой части запроса вы используете реквизит, полученный через точку от поля составного типа — в списке возвращаемых полей, в условии и т.п. Во всех случаях такое обращение может привести к проблемам производительности
Общая рекомендация заключается в том, чтобы по возможности ограничить количество соединений в таких запросах. Для этого можно использовать следующие приемы:
- Избегайте избыточности при создании полей составных ссылочных типов. Указывайте ровно столько возможных типов для данного поля, сколько необходимо. Не следует без необходимости использовать типы «любая ссылка» или «ссылка на любой документ» и т.п. Вместо этого следует более тщательно проанализировать прикладную логику и назначить для поля ровно те возможные типы ссылок, которые необходимы для решения задачи.
- При необходимости жертвуйте компактностью хранения данных ради производительности. Если в запросе вам понадобилось значение, полученное через ссылку, то, возможно, это значение можно хранить непосредственно в данном объекте. Например, если при работе с регистром вам требуется информация о дате регистратора, вы можете завести в регистре соответствующий реквизит и назначать ему значение при проведении документов. Это приведет к дублированию информации и некоторому (незначительному) увеличению ее объема, но может существенно повысить производительность и стабильность работы запроса.
- При необходимости жертвуйте компактностью и универсальностью кода ради производительности. Как правило, для выполнения конкретного запроса в данных условиях не нужны все возможные типы данной ссылки. В этом случае, следует ограничить количество возможных типов при помощи функции ВЫРАЗИТЬ. Если данный запрос является универсальным и используется в нескольких разных ситуациях (где типы ссылки могут быть разными), то можно формировать запрос динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при данных условиях. Это увеличит объем исходного кода и, возможно, сделает его менее универсальным, но может существенно повысить производительность и стабильность работы запроса.
Пример
В данном запросе используется обращение к реквизитам регистратора. Регистратор является полем составного типа, которое может принимать значения ссылки на один из 56 видов документов.
ЗапросТекст
SQL-текст этого запроса будет включать 56 левых соединений с таблицами документов. Это может привести к серьезным проблемам производительности при выполнении запроса. Однако, для решения данной конкретной задачи нет необходимости соединяться со всеми 56 видами документов. Условия запроса таковы, что при его выполнении будут выбраны только движения документов «РеализацияТоваровУслуг» и «ЗаказыПокупателя». В этом случае мы можем значительно ускорить работу запроса, ограничив количество соединений при помощи функции ВЫРАЗИТЬ().
ЗапросТекст
Этот запрос является более громоздким и, возможно, менее универсальным (он не будет правильно работать для других ситуаций — когда возможны другие значения типов регистратора). Однако, при его выполнении будет сформирован SQL запрос, который будет содержать всего два соединения с таблицами документов. Такой запрос будет работать значительно быстрее и стабильнее, чем запрос в его первоначальном виде.
Просмотр заблокированных строк в 1С
Ввиду своей деятельности, мне часто приходится рассказывать про различные аспекты оптимизации и в том числе про блокировки.
Очень часто слушатели задают следующие вопросы:
Как посмотреть в реальном времени, какие именно данные сейчас заблокированы?
Как понять, что сейчас заблокировано в терминах 1С?
Если гранулярность блокировки страница, как увидеть, какие данные в ней находятся?
Раньше приходилось отвечать, что инструмента, который показывает все вышеописанное, сейчас просто нет. Но потом мне это надоело, и я решил сделать собственный инструмент, который позволяет ответить на все вышеописанные вопросы.
1 стартмани
Комментарии в сложном коде и рефакторинг
В сложной и запутанной программе не обойтись без поясняющих комментариев. Но иногда лучше упростить сам код: разбить на отдельные функции, уменьшить размеры элементов, упростить циклы и так далее. А самим функциям, константам и переменным дать «говорящие» имена, объясняющие их назначение.
Например, есть метод, который сравнивает числа a и b. Если a > b, он возвращает true, a если a < b — false:
Весь этот громоздкий кусок кода можно значительно упростить, просто убрав блок if-else:
Теперь метод выглядит намного проще и элегантнее, хотя его суть не изменилась. Подобные преобразования называются рефакторингом.
Популярные инструменты
Вот некоторые популярные инструменты:
- Postman;
- Paw для MacOS;
- Advanced REST Client расширение Google Chrome;
- REST Console
Из всех графических инструментов, пожалуй Postman является самым лучшим, т.к. он позволяет сохранять как запросы, так и ответы, работает как на MacOS, так и на Windows, обладает гибкой конфигурацией и бесплатный.
Note: Часто теоретические знания не имеют смысла, пока вы не сможете связать их с действием. В этом курсе автор больше следует методологии «сначала опыт». После выполнения практического занятия подробно рассматривается теория. Так что, если кажется, что сейчас автор зацикливается на понятиях, таких как метод GET или конечная точка, держитесь. Когда мы окунемся в разделы Документирование конечных точек, все станет намного понятнее.
Не все так однозначно
Если посмотреть на актуальный рейтинг Tiobe более внимательно, то можно заметить, что ряд языков всего за год сумели существенно подняться в нем. Что примечательно, подобных результатов добились, в большинстве своем, классические и даже по-настоящему древние языки.
Как проверить ЭЦП?
Интеграция
Например, язык ассемблера за год поднялся с 12 на восьмую строчку, а классический Visual Basic – с 23 на 13. Однако самый большой скачок совершил 64-летний Fortran, вышедший в 1957 г. В декабре 2020 г. он находился на 32 строчке, а год спустя перепрыгнул на 17.
Классические языки в скором будущем могут затмить более современные
Эксперты Tiobe пока никак не объясняют рост популярности этих языков. Между тем, в мире действительно наметилась тенденция возрождения древних языков, что видно на примере COBOL. Хотя, в его случае это вынужденная мера.
В рейтинге Tiobe за декабрь 2021 г. COBOL (сокращение от COmmon Business Oriented Language) находится на 23 месте. Язык был представлен в 1959 г., и к концу XX века был почти забыт. Его второе рождение, как сообщал CNews, спровоцировала пандемия коронавируса COVID-19. В начале апреля 2020 г. властям американского штата Нью-Джерси срочно потребовалось обновить программное обеспечение на мейнфреймах 40-летней давности, используемых в системе занятости. Все ПО для этой системы было написано на COBOL, а разбирающихся в нем специалистов почти не осталось. Система не справлялась с наплывом посетителей центров занятости, вызванным массовыми сокращениями на фоне пандемии.
К продвижению COBOL в массы несколькими днями позже присоединилась компания IBM
Она заявила о подготовке к проведению бесплатных, что немаловажно, обучающих курсов для программистов, желающих выучить (или вспомнить) этот язык. Инициативу IBM поддержал проект Open Mainframe Project, предназначенный для создания ПО с открытым исходным кодом для запуска на мейнфреймах и курируемый организацией Linux Foundation
Обзор операторов сопоставления с образцом
-
() прост и быстр, но ограничен в своих возможностях. () вариант без учета регистра. pg_trgm расширяет поддержку индекса для обоих.
-
(сопоставление с регулярным выражением) является мощным, но более сложным и может быть медленным для чего-то большего, чем базовые выражения.
-
просто бессмысленно. Своеобразный полупород и регулярных выражений. Я никогда не использую это. См. ниже.
-
% — это оператор «сходства», предоставляемый дополнительным модулем . См. ниже.
-
— это оператор текстового поиска. См. ниже.
pg_trgm — сопоставление триграмм
Начиная с PostgreSQL 9.1 вы можете облегчить расширение , чтобы обеспечить поддержку индекса для any Шаблон / (и простые шаблоны регулярных выражений с ) с использованием индекса GIN или Gist.
Подробности, пример и ссылки:
Как реализуется LIKE?
также предоставляет :
- — оператор «сходства»
- (коммутатор: ) — оператор «Word_s Similarity» в Postgres 9.6 или новее
- (коммутатор: ) — оператор «strict_Word_s Similarity» в Postgres 11 или новее
Поиск текста
Это специальный тип сопоставления с шаблоном с отдельными типами инфраструктуры и индекса. Он использует словари и основы и является отличным инструментом для поиска слов в документах, особенно для естественных языков.
Соответствие префикса также поддерживается:
Получить частичное совпадение из GV-индексации столбца TSVECTOR
А также поиск фразы начиная с Postgres 9.6:
Как искать дефисные слова в полнотекстовом поиске PostgreSQL?
Рассмотрим введение в руководство и обзор операторов и функций .
Дополнительные инструменты для нечеткого соответствия строк
Дополнительный модуль fuzzystrmatch предлагает еще несколько опций, но производительность, как правило, уступает всем вышеперечисленным.
В частности, могут быть полезны различные реализации функции .
Почему регулярные выражения () всегда быстрее, чем ?
Ответ прост. Выражения переписываются внутри регулярных выражений. Таким образом, для каждого выражения существует по крайней мере одно более быстрое регулярное выражение (которое позволяет сэкономить на переписывании выражения). При использовании прирост производительности отсутствует .
А простые выражения, которые можно сделать с помощью (), в любом случае быстрее с .
поддерживается только в PostgreSQL, потому что он оказался в ранних версиях стандарта SQL. Они до сих пор не избавились от этого. Но есть планы удалить его и включить вместо него совпадения регулярных выражений — или я так слышал.
показывает это. Попробуйте сами с любым столом!
Раскрывает:
был переписан с помощью регулярного выражения ().
Максимальная производительность в данном конкретном случае
Но показывает больше. Попробуйте с указанным выше индексом:
Раскрывает:
Внутренне, с индексом, который не поддерживает локали ( или использует локаль ), простые левые привязанные выражения переписываются с помощью следующих операторов текстового шаблона: , , , . Это относится и к , или .
То же самое верно для индексов типов с или с .
Итак, применительно к исходному вопросу это самый быстрый способ :
Конечно, если вам придется искать смежные инициалы , вы можете упростить дальнейшее:
Выигрыш по сравнению с простым использованием или крошечный. Если производительность не является вашим главным требованием, вам следует просто придерживаться стандартных операторов — прийти к тому, что у вас уже есть в вопросе.
Модель запроса
Работа с текстом запроса напрямую не позволяет просто обратиться к определенному полю, таблице или условию. Однако, работая со схемой, можно добавить к существующему условию новое или вообще включить его в состав другой группы. Как ни странно, в типовых решениях часто можно встретить код работы с текстом запроса наряду с использование схемы. Возможно появление удобной библиотеки или нового объектного подхода позволит отказаться от работы с текстом совсем, а код построения запроса будет аутентичен исходному запросу, но без избыточности и доступный для простой модификации.
1 стартмани
Документные операторы
Яндекс позволяет Вам искать как в отдельных элементах внутри страницы, так и в относящейся к ней служебной информации (внутри заданного домена, типа документа и т. п.) или в связанной с ней информации. Поиск можно вести как по самим хостам, так и по словам, находящимся на заданных страницах. Во втором случае достаточно указать искомый хост или URL после слов запроса через пробел.
Синтаксис оператора |
Что означает оператор и примеры запроса |
title:запрос |
Поиск текста в заголовке страниц (title) Если текст состоит из нескольких слов, возьмите их в скобки. |
url:www.url.ru/cat/* |
Поиск ограничивается группой страниц с заданным URL. Если в конце адреса стоит *, то учитываются страницы, адрес которых начинается с заданного URL. |
inurl:url |
Поиск ограничивается группой страниц, URL которых содержит заданный фрагмент. |
host:www.host.ru |
Оператор аналогичен url с именем хоста. |
rhost:ru.url.* или rhost:ru.url.www |
Оператор аналогичен host, но имя хоста записывается в обратном порядке — вначале домен верхнего уровня, затем второго и т.д. Если в конце указано .*, то поиск идет по всем поддоменам заданного домена (но не включая домен ru.url). |
mime:тип_файла |
Поиск ограничивается определенным типом файла:
|
lang:язык |
Поиск ограничивается страницами на определенном языке:
|
domain:домен |
Поиск по страницам, которые расположены в заданном домене. |
date:ГГГГ{*|ММ{*|ДД}} |
Поиск только по страницам, дата которых удовлетворяет заданному условию. |
date:ГГГГ{* | ММ{* | ДД}}..date:ГГГГ{* | ММ{* | ДД}} |
Поиск только по страницам, дата изменения которых находится в заданном интервале. |
date:< |
Поиск только по страницам, измененным раньше указанной даты. Допустимы также операторы :>, :<=, :>=. |
cat:ID региона или cat:ID темы |
Поиск только страниц сайтов, зарегистрированных в Яндекс.Каталоге, тематическая рубрика или регион которых совпадают с заданным. Идентификатор региона можно получить, прибавив к коду региона смещение 11000000. Идентификатор тематической рубрики получается прибавлением к коду темы смещения 9000000. |
Обратите внимание, что при использовании операторов, где в качестве параметра задается имя хоста (таких как url, host и rhost), в качестве имени должно указываться главное зеркало сайта, иначе ничего не будет найдено. Например, нужно писать host:www.vashmaster.ru, а не host:vashmaster.ru
Как узнать главное зеркало сайта? Попробуйте добавить хост в базу Яндекса. Если он не является главным зеркалом, вы получите сообщение: «Добавленный вами сайт не индексируется, так как является «зеркалом» http://www.domain.ru/.»
Фильтрация внутри виртуальных таблиц
Еще одна интересная ситуация – это фильтрация внутри виртуальных таблиц.
Как вы понимаете, использование параметра «Отбор по периоду» при получении актуальных данных не требуется. И если произвести получение остатков на актуальную отметку времени без использования этого параметра, мы получим данные с использованием одного источника – физической таблицы итогов. А при указании в этом значении любого подходящего периода (например, будущего времени сегодняшнего дня, который тоже будет указывать на необходимость получения актуальных остатков), у нас уже произойдет получение данных из двух источников – таблицы итогов и таблицы движений. И в результате мы получим значительное снижение производительности запроса. Такая ситуация тоже очень часто встречается.
2 ответа
Лучший ответ
Примечания
-
Я добавил ко всем параметрам и переменным знак подчеркивания (), чтобы избежать конфликтов имен столбцов таблицы. Просто полезное соглашение.
-
должно быть , поскольку это то, что возвращает агрегатная функция .
-
Тип данных динамически наследуется от родительского столбца: . См. Главу .
-
Вы уверены, что вам нужны только таблицы, перечисленные в ? Имеет смысл, но помните о последствиях. Видеть:
Как проверить если таблица существует в данной схеме
-
a_horse уже и Энди предоставил пример кода. Вот как вы присваиваете одну строку или значение, возвращаемое из динамического запроса с , переменной (строка). одиночный столбец (например, в примере) раскладывается по типу строки автоматически, поэтому мы можем напрямую присвоить скалярную переменную точно так же, как если бы назначить целую строку записи или переменной строки. Связанный:
Как получить значение имени динамически сгенерированного поля в PL / pgSQL
-
Уточнение схемы имени таблицы в динамическом запросе. В текущем могут быть другие таблицы с тем же именем, что приведет к совершенно неправильным (и очень запутанным!) Результатам без уточнения схемы. Подлый баг! Или этой схемы вообще нет в , в результате чего функция немедленно вызовет исключение.
Как влияет ли search_path на разрешение идентификатора и «текущую схему»
-
Всегда указывать идентификаторы должным образом для защиты от внедрения SQL и случайных ошибок. Схема и таблица должны цитироваться отдельно ! Видеть:
- Имя таблицы как параметр функции PostgreSQL
- Усечение всех таблиц в базе данных Postgres
-
Я использую оператор регулярного выражения в вместо , это проще. В любом случае будьте осторожны со специальными символами в параметре шаблона! Видеть:
- PostgreSQL, обратный LIKE
- Функция escape для регулярного выражения или шаблонов LIKE
- сопоставление шаблонов с LIKE, SIMILAR TO или регулярными выражениями в PostgreSQL
-
Я установил значение по умолчанию для имени схемы в вызове функции: . Просто для удобства вы можете этого захотеть, а можете и не захотеть. Видеть:
Назначение значения по умолчанию для типа
Обращаясь к вашему комментарию: передать values используйте предложение , например:
Связанный:
INSERT с динамическим именем таблицы в функции триггера
6
Erwin Brandstetter
29 Мар 2019 в 21:55
Похоже, вам нужен заполнитель для , чтобы он рассматривал вашу переменную как идентификатор . Кроме того, предложение должно выходить за пределы подготовленного оператора.
1
Andy Carlson
2 Сен 2017 в 01:19
Неправильное использование критерия отбора
Однако при использовании критерия отбора для выборки определенных номенклатурных позиций из документов различных видов мы не получим той эффективности, которую можем получить, используя аналогичное по функциональности, но более объемное по написанию объединение запросов. Это связано с тем, что в первом случае физически на стороне СУБД будет сформирован гораздо более сложный запрос, чем во втором случае. Как вы здесь видите, запрос с объединением работает более эффективно, чем использование критерия отбора.
Соответственно, прямое использование критерия отбора для извлечения данных в запросе является неэффективным способом, но сам критерий при этом не является бесполезным, его главная роль в том, чтобы организовать соответствующий некластеризованный индекс на стороне СУБД. В частности, на данном слайде хорошо видно, что удаление критерия отбора приводит к значительному замедлению запроса.
Это – те основные моменты, которые мы можем отметить в процессе оптимизации тех или иных запросов. И эта методика, как я уже говорил, описана в открытом источнике на ИТС. В частности, там есть информация о том, как можно, используя критерии отбора, получить нужный индекс, не меняя типовую конфигурацию.
Чем «портят» запросы программисты?
Как это выглядит? Я вам из Барнаула привез самолетик, к которому спроектировал довольно большое крыло в надежде на то, что он так лучше полетит. Но происходит примерно так: самолетик падает плашмя вниз. То же самое с запросами. Разработчик, предполагая использование в запросе каких-то навороченных решений, может воспроизвести такой текст запроса, который «не полетит», поскольку его результат становится тяжелым, как и в случае с этим самолетиком.
Итак, сконцентрируемся на тексте запросов
Что может «утяжелить» запрос? Здесь перечислены основные причины такого «утяжеления», про все это подробно написано на всем известном сервисе http://its.1c.ru/, очень доступном, открытом – вы можете принимать это во внимание
Безусловно, самым часто встречающимся случаем является неиспользование отборов внутри виртуальных таблиц. Я думаю, что нет ни одного разработчика 1С, кто не знает этого правила, однако в реальных решениях такие ошибки все-таки встречаются довольно часто. Причем их могут совершать даже разработчики с многолетним стажем
Вторая ситуация, на мой взгляд, уже является более сложной для выявления – это обращение к полям составного типа без типизации, которая бы сократила число используемых источников.
В данном примере вы видите, что без указанного здесь условия фильтрации, при обращении к регистру накопления на стороне СУБД без необходимости были бы выбраны данные документа «Возврат товаров». Такая ситуация тоже встречается достаточно часто.
Чуть реже, но тоже в значительной мере встречаются моменты, когда нет подходящего индекса.
Почему-то иногда прикладные разработчики говорят: «подготовка подходящего покрывающего индекса – это не наша обязанность, мы же просто прикладные разработчики». Соответственно, когда нужно получить данные с отбором по полю A и C, они, не имея подходящего индекса, довольствуются тем, что происходит сканирование кластерного индекса или же таблицы.
Как комментируют функции и библиотеки
В комментариях к файлам и библиотекам указывают информацию о проекте, назначении модуля, заносят в них имя разработчика, номер версии продукта и лицензию на программное обеспечение.
Например, документирующий комментарий из заголовка библиотеки Lodash для JavaScript выглядит так:
Кроме этого, в заголовочных комментариях к функциям указывают стандартный набор сведений:
- описание того, что и как делает функция/процедура;
- условия, при которых она работает или не работает;
- описание входные параметров, если есть;
- описание возвращаемого значения.
Пример из той же библиотеки Lodash:
Главное здесь — избегать бессмысленных комментариев. Вот пример плохого описания процедуры на языке 1С:
Поиск с учётом стоп-слов
В любом языке есть слова, которые встречаются намного чаще других. Слова, которые встречаются слишком часто, чтобы быть значимыми для поиска, называются стоп-словами. Как правило, это местоимения, предлоги и частицы. Поисковые машины игнорируют стоп-слова, даже если они встречаются в тексте запроса.
Например, если задать запрос , Яндекс найдёт документы без учёта предлога «на». Предлог «на» является стоп-словом, и по умолчанию не ищется.
Чтобы вести поиск с учётом стоп-слов, достаточно перед стоп-словом поставить знак плюса (без пробела между словом и плюсом). Например, .
Если Вы в запросе используете словосочетание из нескольких слов, то оператор «плюс» следует использовать правильно.
Корректное написание — перед плюсом должен идти пробел, но само слово с плюсом должно писаться слитно. Например по запросу, найдутся документы, где слова «Петр» и «Барабашкин» расположены не очень далеко, причем слово «Барабашкин» должно присутствовать во чтобы то ни стало, а слово «Петр» — по возможности.
Если вы хотите, чтобы в найденных документах обязательно встречались оба слова запроса, задайте .
Как автоматизировать создание комментариев
В различных IDE есть возможность автоматизировать создание комментариев. Это делается с использованием тегов — дескрипторов, которые начинаются с символа @. Вот самые популярные:
- @author — идентифицирует автора исходного кода;
- @param — определяет параметр метода;
- @see — ссылка;
- @since — версия программного обеспечения;
- @return — тип возвращаемых процедурой или функцией данных.
Из таких комментариев автоматически формируется документация программы. Для этого используют генераторы документации, например, javadoc для языка Java, phpDocumentor для PHP, doxygen для C и C++, Epydoc для Pithon и другие.
Принцип работы прост. Генератор обрабатывает файл с исходным текстом, находит там имена классов, их членов, свойств, методов, процедур и функций, а затем связывает их с данными из наших комментариев с тегами. Из этой информации формируется документация в формате HTML, PDF, RTF или других.
При разработке библиотек и фреймворков обычно создается документация для API. Со временем она устаревает — в неё не успевают или просто забывают вносить изменения.
Git + 1С. Часть 1. Как подключиться к команде разработки и начать использовать Git
Первая статья из цикла инструкций по работе с Git в 1С-разработке. Рассмотрим, как настроить рабочее место, как получить свою «копию» проекта для разработки и приступить к полезным действиям. Все примеры будут изложены в рамках трёх практических кейсов: 1. Моя команда дорабатывает типовую конфигурацию, использует приватный репозиторий на BitBucket, в котором версионируются внешние отчеты/обработки, расширения конфигураций и правила обмена; 2. Я участвую в стартап-команде, которая разрабатывает свою конфигурацию с использованием Git и GitLab; 3. Я принимаю участие в развитии OpenSource-продукта на GitHub как заинтересованный разработчик (контрибьютор).