Что такое синхронные и асинхронные вызовы

Асинхронные API и объект Deferred в деталях

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

В статье будет рассказано о базовых подходах к возврату асинхронных результатов, функциях обратного вызова, объектах deferred и их возможностях. Будут приведены примеры на языке JavaScript, а также произведён разбор типового объекта deferred. Статья будет полезна программистам, начинающим постигать асинхронное программирование, а также знакомым с ним, но не владеющим объектом deferred.

Синхронный и асинхронный вызовы

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

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

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

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

Из примера видно, что функция теперь имеет сигнатуру: calc(callback) , а callback принимает в качестве первого параметра результат.

Так как calc выполняется асинхронно, функция no_cares_about_result не сможет обратиться к её результату, и, вообще говоря, может быть выполнена раньше чем коллбек (если говорить конкретно о JavaScript — в случае если вызываемая функция истинно асинхронная, а не берёт данные из кеша, например — гарантируется, что она всегда будет выполнена после выполнения вызвавшего кода, то есть оставшийся код всегда будет выполняться раньше коллбека; об этом будет рассказано чуть ниже).

Согласитесь, такой код уже стал несколько сложнее для восприятия, при той же смысловой нагрузке, что и его «прямолиненый» синхронный аналог. В чём же выгода от использования асинхронного подхода? Прежде всего — в разумном использовании ресурсов системы. Например, если calc является трудоёмким вычислением, которое может затратить много времени, или использует какой-то внешний ресурс, на использование которого накладывается определённая задержка, то при синхронном подходе весь последующий код будет вынужден ожидать результата и не будет выполняться, пока не выполнится calc . Используя асинхронный подход можно явно указать какой участок кода зависит от некоторого результата, а какой к результату индифферентен. В примере, no_cares_about_result явно не использует результат, и, следовательно, ему не требуется его ожидать. Участок кода внутри коллбека же будет выполнен только после получения результата.

Вообще говоря, большинство API, по своей природе, являются асинхронными, но могут мимикрировать под синхронные: доступ к удалённым ресурсам, запросы к БД, даже файловое API ­— асинхронные. Если API «притворяется» синхронным, то успех такого «притворства» связан с задержками результата: чем меньше задержка, тем лучше. То же файловое API, работая с локальной машиной, показывает небольшие задержки и зачастую реализуется как синхронное. Работа с удалёнными ресурсами и доступ к БД всё чаще реализуется асинхронно.

Многоуровневые вызовы

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

Код приобретёт следующий вид:

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

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

Асинхронный результат

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

По сути от объекта-результата требуется три вещи: реализовывать возможность подписки на результат, возможность указывать приход результата (это будет использоваться самой асинхронной функцией, а не клиентом API) и хранение этого результата.

Важной отличительной особенностью такого объекта также является специфика его состояний. Такой объект может быть в двух состояниях: 1) нет результата и 2) есть результат. Причём переход возможен только из первого состояния во второе. Когда результат будет получен, то уже невозможно перейти в состояние его отсутствия или в состояние с другим результатом.

Рассмотрим следующий простой интерфейс для данного объекта:

Метод on принимает коллбек. Коллбек будет вызван как только будет доступен результат и он будет передан в качестве параметра. Здесь полная аналогия с обычным коллбеком, передаваемым в качестве параметра. На момент регистрации коллбека объект может находиться в состоянии с результатом и без. В случае, если результата ещё нет, коллбек будет вызван по его приходу. В случае, если результат уже есть, коллбек будет вызван немедленно. В обоих случаях коллбек вызывается однократно и получает результат.

Метод resolve позволяет перевести (разрезолвить) объект в состояние с результатом и указать этот результат. Этот метод является идемпотентным, то есть повторные вызовы resolve не будут изменять объект. При переходе в состояние с результатом будут вызваны все зарегистрированные коллбеки, а все коллбеки, которые будут зарегистрованы после вызова resolve станут вызываться мгновенно. В обоих случаях (регистрация до и после вызова resolve ) коллбэки будут получать результат, в силу того, что объект хранит его.

Объект с таким поведением называется deferred (а также известен под именами promise и future). Перед простыми коллбеками он имеет ряд преимуществ:

1. Абстрагирование асинхронной функции от результата: теперь каждой асинхронной функции не требуется предоставлять параметры-коллбеки. Подписка на результат остаётся за клиентом кода. Например, можно вообще не подписываться на результат, если он нам не нужен (аналогичен передачи noop-функции в качестве коллбека). Интерфейс асинхронной функции становится чище: он имеет только значимые входные параметры, становится возможным более уверенно использовать функции с неопределённым числом параметров, параметром опций ит.д.
2. Абстрагирование от состояния результата: клиенту кода не нужно проверять текущее состояние результата, он просто подписывает обработчик и не задумывается, пришёл результат или ещё нет.
3. Возможность множественной подписки: можно подписать более одного обработчика и все они будут вызваны по приходу результата. В схеме с коллбеками пришлось бы создавать функцию, которая вызывает группу функций, например.
4. Ряд дополнительных удобств, в числе которых, например, «алгебра» объектов deferred, которая позволяет определять отношения между ними, запускать их в цепочке или после успешного завершения группы таких объектов.

Рассмотрим следующий пример. Пусть имеется асинхронная функция getData(id, onSuccess) , которая принимает два параметра: id некоторого элемента, который мы хотим получить и коллбек для получения результата. Типичный код её использования будет выглядеть так:

Перепишем это с использованием Deferred . Функция теперь имеет сигнатуру getData(id) и используется следующим образом:

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

Обработка ошибок

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

Такой результат, также как и успешный, реализуется в виде коллбека (который иногда называется errback, игра слов от error и back).

Давайте усилим наш учебный объект Deferred так, чтобы он мог предоставлять подписку отдельно на успех и на неудачу, а именно переработаем методы on и resolve .

В качестве первого параметра можно передавать значение перечислимого типа с двумя значениями, например E_SUCCESS , E_ERROR . Для читаемости, будем использовать в примерах простые строковые значения: ‘success’, ‘error’. Также, усилим данный метод, обязав его возвращать сам объект Deferred . Это позволит использовать цепочки подписок (приём весьма характерный конкретно для JavaScript).

Соответственно изменяется и метод resolve :

В качестве первого параметра передаётся состояние, в которое должен перейти объект Deferred (error, success), а в качестве второго — результат. На такой модифицированный объект по-прежнему распространяется правило состояний: после перехода в состояние с результатом, объект не может изменить своё состояние на иное. Это означает, что если объект перешёл, например, в состояние success, то все обработчики, зарегистрированные на ошибку не сработают никогда, и наоборот.

Итак, пусть наша функция getData может завершиться с некоторой ошибкой (нет данных, неправильные входные данные, сбой и т.п.).
Код примет следующий вид:

Рассмотрим более реалистичный пример, а именно, возьмём типовой метод fs.readFile из стандартной библиотеки Node.js. Этот метод служит для чтения файла. В начале статьи упоминалось, что практически любую функцию можно написать либо в синхронном, либо в асинхронном стиле. В стандартной библиотеке Node.js файловое API определено в обоих стилях, у каждой функции есть свой синхронный аналог.

Для примера мы используем асинхронный вариант readFile и адаптируем его под использование Deferred.

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

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

Расширенные возможности объектов Deferred

1. Неограниченное количество вариантов результата. В примере был использован объект Deferred с двумя возможными результатами: success и error. Ничто не мешает использовать любые другие (кастомные) варианты. Благо, мы использовали строковое значение в качестве state, это позволяет определять любой набор результатов, не изменяя никакой перечислимый тип.
2. Возможность подписки на все варианты результата. Это может быть использовано для разного рода обобщённых обработчиков (наибольший смысл это имеет вкупе с пунктом 1.).
3. Создание суб-объекта promise. Из интерфейса объекта Deferred видно, что клиентский код имеет доступ к методу resolve , хотя, по сути, ему требуется только возможность подписки. Суть данного улучшения состоит во введении метода promise , который возвращает «подмножество» объекта Deferred , из которого доступна только подписка, но не установка результата.
4. Передача состояния от одного deferred к другому, опционально, подвергая результат преобразованию. Это бывает очень полезным при многоуровневых вызовах.
5. Создание deferred, который зависит от результата набора других deferred. Суть данного улучшения в том, чтобы подписываться на результат группы асинхронных операций.
Пусть нам нужно зачитать два файла и сделать с обоими что-нибудь интересное. Используем нашу функцию readFileDeferred для этого:

Deferred.all создаёт новый объект Deferred , который перейдёт в состояние success, если все переданные аргументы перейдут в это состояние. При этом он также получит результаты всех deferred в качестве аргументов. Если хотя бы один аргумент перейдёт в состояние error, то и результат Deferred.all также перейдёт в это состояние, и получит в качестве результата результат аргумента, перешедшего в состояние error.

Особенности deferred в JavaScript

Стоит отметить тот момент, что в JavaScript отсутствует многопоточность. Если коллбек был установлен по setInterval / setTimeout или по событиям, он не может прервать выполнение текущего кода, или выполняться параллельно с ним. Это означает, что даже если результат асинхронной функции придёт мгновенно, он всё равно будет получен лишь после завершения выполнения текущего кода.

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

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

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

Синхронные и асинхронные вызовы в 1С

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

Общая информация

Зачем это нужно?

Изначально расширения для работы с файлами и криптографией в веб-клиенте были реализованы по технологии NPAPI и работа с методами расширений была синхронной. Затем браузер Google Chrome отказался от поддержки этой технологии (полностью удалена в версии 45 от сентября 2015). Решением проблемы стал перевод расширений для работы с файлами и криптографией на асинхронные рельсы.

У конфигураций появилось новое свойство в разделе «Совместимость»:

Свойство конфигурации

Свойство конфигурации

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

Использование синхронных методов запрещено

Использование синхронных методов запрещено

В чем разница?

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

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

Названия асинхронных методов обычно начинаются со слов «Начать» (например, «ЭтоФайл» и «НачатьПроверкуЭтоФайл») или «Показать» (например, «Вопрос» и «ПоказатьВопрос»), это знание может помочь в поиске асинхронного аналога синхронного метода.

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

  • блокирующими окнами;
  • файлами;
  • расширением криптографии;
  • внешними компонентами.

Нужно отметить, что все асинхронные методы доступны только на стороне клиентского приложения. На сервере же по-прежнему доступны только синхронные методы (за исключением блокирующих окон — они на сервере вообще отсутствуют).

Соответствие синхронных методов асинхронным аналогам (на момент написания статьи) можно посмотреть тут.

Практические примеры

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

Асинхронные методы

Рассмотрим на примере асинхронного метода глобального контекста — НачатьПоискФайлов.

Синхронный и асинхронный вызов в новых версиях платформы

1) Ранее синхронный вызов выглядел так:

Данный вызов имеет ограничение на модальность — какой режим стоит в конфигурации по использованию модальности.

Выполнение данного кода выглядит так:

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

2) Ранее Асинхсинхронный вызов выглядел так:

Выполнение данного кода выглядит так:

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

3) Новый Асинхронный вызов:

Функция — ВопросАсинх возвращает ответ нового типа — Обещание:

Сама процедура имеет признак — Асинх.

Выполнение данного кода выглядит так:

При таком варианте, мы олучаем асинхронный вариант с возвратом к ожидаем в точке — Ждать.

ВопросАсинх возвращает тип — Обещание.

4) Новый асинхронный(синхронный) вызов:

Добавим в пункт 3 команду — Ждать.

Код будет выглядеть следующем образом:

При такой конструкции код отработает следующем образом:

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

Вывод для себя сделал такой:

Если нужен синхронный вызов вопроса, то можно использовать 1 вариант (но тут нужно учитывать режим — модальности) или 4-й вариант (новый), а чтобы выполнить асинхронный вызов вопроса нужно использовать 3-й вариант или 2-й вариант (менее предпочтительный).

Тестирования проводились на платформе 8.3.18.1208.

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

Electronic Software Distribution

Маркировка 488-ФЗ

Интеграция 1С с системой Меркурий

Готовые переносы данных

Алкогольная декларация

54-ФЗ

Инструментарий разработчика

Маркетплейсы и 1С

Траектория обучения 1С-разработчика

СБП. Оплата по QR-коду

Управление проектом на Инфостарте

ГОСОБОРОНЗАКАЗ

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

как использовать п.3 — я особо не нашел ему применения?

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

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

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

  • Скопировать ссылку
  • Перейти

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

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

я возможно не разобрался, но как сделать вызов на подобия п.2 в п.4.

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

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Я б поворчал на тему того, что есть модальность и что есть блокировка интерфейса. А равно и на тему того, чем асинхронность от многопоточности отличается. И что всё это «не муж и жена, а 4 разных человека». Но толку-то.

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

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Просмотры 4675

Загрузки 0

Рейтинг 33

Создание 31.01.22 14:00

Обновление 31.01.22 14:00

№ Публикации 1595214

Тип файла Нет файла

Конфигурация Конфигурации 1cv8

Операционная система Не имеет значения

Вид учета Не имеет значения

Доступ к файлу Бесплатно (free)

Код открыт Да

См. также

Использование классов .Net в 1С для новичков Промо

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016 89700 Serginio 116

О цикле обратном замолвите слово.

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

08.09.2022 2689 DrAku1a 65

1С и Unicode

Разбираемся, как 1С работает с текстом и отдельными символами в контексте Unicode.

05.09.2022 1806 Irwin 30

Почему нельзя использовать ТекущаяДата()

ИТС и ИС не ответили исчерпывающе, поэтому написал данную заметку.

23.08.2022 6300 Патриот 56

Использование программных перечислений, ч.1: строковые константы Промо

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016 42322 unichkin 74

Шпаргалка по функциям АСИНХ

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

29.07.2022 5237 zeltyr 15

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

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

11.07.2022 4341 it-expertise 27

Состав индексов с дополнительным упорядочиванием на уровне СУБД (MS SQL) при индексации реквизитов

В момент обсуждения с коллегами работы индексов в 1С был затронут один из вопросов, который касался темы — каким образом происходит построение индексов при индексации реквизитов у объектов 1С (конкретнее, когда свойство реквизита "Индексировать" устанавливается в "Индексировать с доп. упорядочиванием"). Ранее я всегда опирался на знания, полученные в процессе чтения официальной документации от компании 1С, опубликованной на ITS. Наши мнения в этом вопросе разошлись и, как оказалось позже, мои знания не были актуальными, в итоге было проведено некоторое исследование по данному вопросу, чтобы выяснить истину.

15.06.2022 1691 sinichenko_alex 8

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

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

15.10.2018 38886 tormozit 107

Динамическое обновление — это зло?

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022 12523 Infostart 77

Об одной неочевидной проблеме перехода на версию платформы 8.3.20

При переходе на платформу 8.3.20 мы столкнулись с ошибкой "Повторяющийся псевдоним "Ссылка" Ссылка AS Ссылка,Presentation AS Presentation,Ссылка AS Ссылка" в ряде типовых конфигураций. Причём, эта проблема оказались неизвестна ни Яндексу, ни Гуглу. Путём мучительных экспериментов нам удалось найти решение. Пока я ещё не уверен, действительно это решение или обходной костыль, а настоящая проблема — в чём-то другом, но это решение работает в ситуации, когда всё сломалось, а проблему надо решать срочно. Предположительная причина: платформа 8.3.20 более строго относится к типизации данных в запросах, чем предыдущие версии, вываливая в случае несоблюдения новшеств малопонятные ошибки.

08.04.2022 4800 Kernelbug 25

Отборы динамического списка

Динамический список предоставляет несколько объектов "Отбор". В статье разбирается, какой для чего нужен и как их использовать на форме. Рассматриваются только возможности платформы (без БСП).

28.03.2022 9807 Gladkov_Anton 4

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

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

16.04.2019 24411 m-rv 18

Фишки платформы 1С 8.3 для начинающего разработчика

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

11.03.2022 8836 Dimbayyyy 96

Экспертный кейс. Расследование деградации производительности системы. Проведение документа “Поступление товаров и услуг” (1С:ERP 2)

В ходе проведения нагрузочного тестирования одним из наших клиентов была выявлена сильная деградация производительности системы в целом и, в частности, выполнения ключевой операции “Проведение документа поступление товаров и услуг” в течение выполнения теста. Согласно данным подсистемы БСП “Оценка производительности”, время выполнения ключевой операции “Проведение документа поступление товаров и услуг” возрастало в процессе тестирования с 15-20 секунд в начале тестирования до 150-200 секунд в его финале.

02.03.2022 3392 it-expertise 47

Модульная архитектура или пара слов о расширениях. Часть I (мысли, рассуждения)

Статья-размышление о том, какое может быть применение технологии расширений 1С и зачем нам, разработчикам/программистам на 1С, знать общепринятые паттерны проектирования приложений. Итак, а что если я вам скажу, что технология расширений 1С — это одно из прекрасных новшеств компании 1С? Пусть эта статья будет хвалебной одой расширениям 1С.

14.02.2022 5316 amon_ra 67

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

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

05.12.2017 31636 itriot11 34

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

Простая и удобная среда разработки 1С:Предприятия позволяет практически любому человеку начать работать под капотом 1С — в конфигураторе. Время идет, новички становятся программистами, специалистами, а об удобных приемах работы узнают годами, по ходу своего карьерного пути. А здорово было бы, если бы все знали удобные приемы в начале своего пути? Эти несколько приемов будут полезны новичкам, так как они затрагивают ту область работы, с которой приходится сталкиваться в начале карьеры.

12.11.2021 10363 acces969 95

Как спроектировать структуру регистра сведений

«Что может быть проще?» — это первое, что приходит в голову. Но что, если это не так? В этой статье мы попробуем затронуть некоторые вопросы, которые могут возникнуть при проектировании больших регистров.

08.11.2021 7473 Neti 60

О вложенных попытках, исключениях и о представлении ошибок

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

07.11.2021 6828 Nicholas 17

Ускоряем 1С: модули с повторным использованием возвращаемых значений Промо

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

04.09.2017 62282 m-rv 63

Обработчик ожидания. Нюансы

ПодключитьОбработчикОжидания: некоторые подробности и особенности работы

24.08.2021 17017 Yashazz 25

Прогресс-бар в поле динамического списка

Изображаем прогресс-бары в колонке динамического списка

23.08.2021 3861 Yashazz 13

ПриПолученииДанныхНаСервере + Контекст формы. Лайфхак

Передать свои произвольные данные в событие, которое "без контекста"? Легко!

13.08.2021 5633 Yashazz 16

Регулярные выражения без внешних компонент? Легко! Промо

Сложный способ организовать проверку строки с помощью регулярного выражения в 1С. При этом ни одна внешняя компонента не пострадала. Ну и от платформы (Linux, MustDie) — не зависит.

04.03.2016 77054 starik-2005 111

Новичок новичку: как добавить программно кнопку на форму путем расширения

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

13.05.2021 26407 user1312100 25

Программное создание расширения

Создание нового расширения "на лету", только штатными средствами 1С.

06.04.2021 5824 Yashazz 15

Неочевидные нюансы записи управляемой формы

Разберем несколько нюансов записи управляемой формы.

02.04.2021 22554 SeiOkami 56

Методика переопределения и вызова обработчиков событий обычной формы Промо

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

24.06.2007 91134 tormozit 31

Советы из Желтой тетради 📒 #1

В этой публикации я собрал в одном месте часть советов и лайфхаков, которые открыл для себя в последнее время. Регулярно я публикую их в своём телеграм-блоге "Жёлтая тетрадь 📒 Блог программиста 1С", здесь же — дайджест этих публикаций.

15.03.2021 5856 builin 120

Флаг "Использовать ПОЧТИ всегда", или Нюанс динамических списков

Небольшая пятничная история по программной работе со строкой динамического списка.

11.02.2021 7839 SeiOkami 36

Расширенный автоподбор при вводе по строке в поле ввода в управляемых формах

Началось все с того, что штатный автоподбор при вводе по строке в поле ввода для некоторых больших справочников устраивать перестал. Вообще, для способа поиска строки "Любая часть" он работает на первый взгляд очень хорошо: работает как полнотекстовый (т.е. по нескольким словам) даже без активации полнотекстового поиска, красиво подсвечивает слова поиска в результатах. Казалось бы, все отлично. Но есть неприятное ограничение — всего лишь 10 значений в результирующем списке (у вас может быть несколько больше, так как платформа неявно добавляет результаты поиска по истории ввода). Для небольших справочников или справочников с разнородным ассортиментом все хорошо. Но не в моей ситуации. А простых путей увеличить количество выдаваемых строк на момент написания статьи мне обнаружить не удалось. Пришлось полностью переопределять автоподбор. Ниже речь пойдет именно об этом. И, к слову, в типовых конфигурациях для некоторых справочников используются похожие приемы для увеличения количества строк результата автоподбора.

Sync vs Async

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

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

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

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

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

То есть синхронное взаимодействие на основе REST API можно представить следующей схемой:

1_4_1-1801-51da29.png

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

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

REST API: возможный вариант асинхронного взаимодействия:

2_2_1-1801-ef3420.png

Как устранить недостатки обеих схем? Как раз для этого и нужны очереди сообщений (Message Queues). Но о них мы поговорим в следующий раз, следите за обновлениями блога!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *