Можно ли для записи использовать выход
Содержание статьи
Обработчики событий при записи объектов. Зачем и что за чем?
Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта….
Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов.
Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.
Казалось бы, всё это есть в литературе. Зачем словами переписывать? В этой статье собрана и структурирована информация из разных источников. Однако не всегда и не у всех есть эта литература под рукой. А тут информация в открытом источнике и достаточно структурированная, изложенная простым языком. Тем самым делаем эти знания более понятными и доступными.
Будем рассматривать запись документа, чтобы не загромождать статью и не описывать все типы объектов (у них всё также, за небольшим исключением).
Итак, для чего нам вообще нужны эти обработчики?
Очень часто программисту требуется переопределить стандартное поведение системы во время записи документа, а именно: отменить запись, в случае каких-то условий; запросить дополнительную информацию у пользователя; дозаполнить реквизиты; что-то ещё записать в базу данных на основании этой записи; что-то изменить на форме после записи и т.д. и т.п. Каждый программист рано или поздно сталкивается с подобными задачами, потому знать назначение и последовательность запуска этих событий необходимо.
Последовательность запуска событий (в том порядке, в каком они перечислены) и небольшие подробности:
Во многих обработчиках есть параметр «Отказ». Там, где этот параметр присутствует означает, что в этом обработчике ещё можно отказаться от записи, присвоив параметру «Отказ» значение Истина, и тогда запись произведена не будет. И ещё, отдельно отмечу, что при программной записи события модуля формы не запускаются!
1) Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
Выполняется на клиенте!
Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.
Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои!
Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, можно спросить что-то у пользователя и ответ записать в этот параметр. И уже, например, в ПриЗаписиНаСервере использовать этот параметр для анализа и дальнейших действий.
2) Модуль формы ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
3) Модуль объекта ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)
Сначала вызывается событие формы ОбработкаПроверкиЗаполненияНаСервере На данном этапе есть доступ к данным формы.
После этого в памяти сервера создается прикладной объект, соответствующий типу основного реквизита формы, и его данные заполняются из данных формы.
Затем вызывается событие прикладного объекта ОбработкаПроверкиЗаполнения.
Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения «Выдавать ошибку»). И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.
Эти два обработчика событий предназначены :
- Для включения в проверку заполнения тех реквизитов, у которых в свойствах «ПроверкаЗаполнения» указано «Не проверять». Для этого надо добавить этот реквизит в массив параметр «ПроверяемыеРеквизиты»
- Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить этот реквизит из массива параметра «ПроверяемыеРеквизиты»
Имеется несколько особенностей, которые необходимо учитывать:
- Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
- Вызываются только при интерактивной записи! При программной записи не вызываются. Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
- Для документов, имеющих возможность проведения, эти события проверки заполнения вызываются только при проведении!
Если данные формы не нужны, то используйте обработчик модуля объекта ОбработкаПроверкиЗаполнения
4) Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
В этом обработчике можно дозаполнять реквизиты объекта (через параметр ТекущийОбъект) или провести дополнительные проверки. Есть доступ к данным формы.
Важно понимать, что в предыдущем обработчике (в процессе проверки заполнения) произошло «разделение» формы на форму и прикладной объект (пока только в памяти сервера), данные которого будут записаны в базу данных.
В обработчике модуля формы ПередЗаписьюНаСерверепоявляется возможность доступа как к данным основного реквизита формы Объект, а также и к самому объекту, который будет записан через параметр обработчика ТекущийОбъект.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (в случае записи документа ДокументОбъект). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан.
И тут внимание!!! ТекущийОбъект — объект, который реально будет записан в информационную базу и дозаполнять реквизиты нужно именно через параметр ТекущийОбъект.
Внесение изменений через реквизит формы объекта Объект не даст никакого результата, его можно только анализировать. В информационную базу эти данные записаны не будут. После завершения транзакции записи, данные из ТекущегоОбъекта запишутся в Объект. Таким образом, все изменения, внесенные в Объект, пропадут.
Также нужно понимать, что при программной записи объекта это событие вызываться не будет.
Поэтому если какие-либо алгоритмы должны выполняться при любом способе записи данных объекта, а не только при записи из формы, их следует размещать в обработчике события объекта (ПередЗаписью), а не в обработчике события формы.
Начало транзакции
5) Модуль объекта ПередЗаписью(Отказ)
В этом обработчике можно провести дополнительные проверки и отказаться от записи.
Для документов в параметры данного обработчика добавляются ещё два параметра: РежимЗаписи, РежимПроведения.
Запись
6) Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Возникает в момент, когда выполняется установка номера нового документа, задачи или бизнес-процесса.
Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)
Возникает в момент, когда выполняется установка нового кода элемента справочника, узла плана обмена или кода плана видов характеристик.
Эти событии вызываются для объектов у которых указано свойство «Автонумерация» и только для тех объектов, у которых пустой код на момент записи.
Если установить параметру СтандартнаяОбработка значение Ложь, то новый номер генерироваться не будет и можно программно задать код объекта в данном обработчике.
7) Модуль объекта ОбработкаУдаленияПроведения (Отказ)
Этот обработчик запускается только при отмене проведения документов с целью удаления движений из регистров. При этом неважно как отменяется проведение документа — программно или интерактивно.
8) Модуль объекта ПриЗаписи(Отказ)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.
Назначение этого обработчика — записать в базу данных дополнительную информацию, связанную с данными записываемого объекта.
Ссылка уже есть и можно записать в базу данных дополнительные данные на основании текущего объекта, используя эту ссылку.
Например, при записи создавать другой документ, содержащий реквизит ссылку на записываемый.
Поскольку это событие обрабатывается в транзакции записи основных данных, гарантируется синхронность изменения основных и дополнительных данных. Либо и те и другие будут записаны, либо и те и другие изменения будут отменены при отмене транзакции.
Можно ещё отказаться от записи.
9) Модуль объекта ОбработкаПроведения (Отказ, РежимПроведения)
Этот обработчик запускается только при проведении документов. При этом неважно как проводится документ — программно или интерактивно.
Основное назначение процедуры-обработчика данного события — генерация движений по документу. Именно в данном обработчике прописываются алгоритмы записей в регистры, т.е. программно формируются движения документа.
Параметр РежимПроведения определяет как будет проводиться документ: оперативно или неоперативно.
Если для данного вида документа в конфигурации установлено автоматическое удаление движений, то перед возникновением события все движения по документу будут удалены.
10) Модуль формы ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.. Есть последний шанс отказаться от записи.
Назначение этого обработчика – записать в базу данных дополнительную информацию, связанную с данными записываемого объекта.
Если данные для записи дополнительной информации находятся в самом объекте, то мы использовали обработчик модуля объекта ПриЗаписи(). А вот если данные находятся в форме, то как раз для таких случаев и предназначено это событие, потому как есть доступ к данным формы.
Этот обработчик ещё используется, если нужны данные параметра обработчика ПараметрыЗаписи, которые «приехали» в этом параметре из других обработчиков.
Через параметр ТекущийОбъект доступны данные, которые уже были записаны в информационную базу и имеет тип класса Объект (ДокументОбъект). Можно обратиться к его свойствам и методам, а также использовать для вызова экспортных методов объекта.
Работать следует именно через этот параметр, то есть не путать с основным реквизитом формы Объект, так как там данные, которые были до записи и его изменения бесполезны потому, что после этого обработчика данные из ТекущегоОбъекта запишутся в Объект.
Если это запись нового объекта, то ТекущийОбъект.Ссылка будет содержать уже конкретное значение ссылки на этот элемент в информационной базе. А вот Объект.Ссылка имеет пустое значение на этом этапе.
Итак, по поводу этого обработчика можно сделать следующие выводы:
- Если нужно выполнять какие-то действия, связанные с записанным объектом, и при этом, например, нужна ссылка на этот объект, необходимо использовать ТекущийОбъект.Ссылка.
- Основной реквизит формы Объект можно использовать только для сравнения того, что «было», с тем, что «записалось». Изменять его бессмысленно, т. к. он будет замещен данными из ТекущийОбъект.
- Если нужно изменить записанные данные перед отправкой их на клиент, необходимо использовать ТекущийОбъект
Завершение транзакции
11) Модуль формы ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
После завершения транзакции записи выполняется преобразование данных записанного объекта в данные формы. После этого вызывается данный обработчик. Это последний обработчик, в котором по отдельности доступны данные формы и объект, который был записан.
Этот обработчик используют, когда предполагаются действия над формой. Это те действия, которые должны быть выполнены только в том случае, когда объект 100 % записан (т.е. после транзакции). Например, вывод в форме некоторой дополнительной информации, связанной с данными объекта. Или выполнение каких-либо действий, которые должны быть выполнены только в том случае, когда объект гарантированно записан.
Однако здесь назначение ТекущийОбъект – прямо противоположное тому, что было до этого. В этом обработчике данные записанного объекта уже помещены в форму, т.е.уже загружены в основной реквизит формы Объект и потому ТекущийОбъект изменять бессмысленно: он будет уничтожен при выходе из обработчика.
Но ТекущийОбъект можно использовать, чтобы выполнить какие-то вспомогательные действия, обратившись к его свойствам и методам, а также через вызов экспортных методов объекта. Например, если на данном этапе нужны какие-то данные или методы объекта, нужно использовать ТекущийОбъект, а не пытаться получать их через основной реквизит формы Объект.
Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.
12) Модуль формы ПослеЗаписи(ПараметрыЗаписи)
Выполняется на клиенте!
Можно использовать для того, чтобы визуально что-то отобразить на форме или организовать диалог с пользователем, например выдать предупреждение.
Доступны ПараметрыЗаписи, данные которых «приехали» в этом параметре из других обработчиков.
_____________________________________________________________________________________________________________________________
Дополнение о подписках на события и их месте в этой последовательности вызова обработчиков.
Часто бывает так, что использовать подписку на событие эффективнее, потому что не затрагивает модули, находящиеся на поддержке и очередное обновление конфигурации проходит с куда меньшими затратами труда и времени.
Дополнение 1: подписка на события отрабатывает сразу же после того, как отработало само событие. При этом, перехватывать возможно только обработчики событий модуля объекта (не формы) и выполняются они тоже на сервере.
Обработчики событий объекта на которые можно сделать подписку на события:
— ПриУстановкеНовогоНомера / ПриУстановкеНовогоКода
— ПриКопировании
— ОбработкаЗаполнения
— ПередЗаписью
— ПриЗаписи
— ПередУдалением
— ОбработкаПроведения
— ОбработкаУдаленияПроведения
— ОбработкаПроверкиЗаполнения
Дополнение 2: подписки на события для одинаковых источников и действий выполняются в порядке размещения подписок в конфигураторе сверху вниз (т.е. в таком же порядке, как и в дереве метаданных).
Т.е., если для какого-то документа в конфигурации есть две подписки на событие ПриЗаписи, то в начале выполнится та, которая расположена выше.
Помнится, где-то в обсуждениях на ИС на эту тему предупреждали, что если в типовой конфигурации есть добавленные подписки на события, то после обновления обязательно нужно проверять порядок следования подписок и возвращать добавленные подписки на своё место. Так как,если в конфигурации есть типовая подписка на это же событие с этим же источникомдобавленные подписки могут встать выше типовых при обновлении и нарушится логика работы.
Дополнение 3: подписки с источником общего типа (ДокументОбъект, СправочникОбъект) выполняются позже, чем с источником конкретного типа, даже если он составной.
А что делать, если в типовой конфигурации есть подписка на Источник ДокументОбъект и нужно сделать подписку для документа определенного типа позже типовой подписки?
Как вариант указывать в своей подписке источник ДокументОбъект и ставить ее ниже по списку, а в самом обработчике проверять тип документа:
Если ТипЗнч(Источник) <> Тип(«ДокументОбъект.МойДокумент») Тогда
Возврат;
КонецЕсли;
Если статья оказалась вам интересной и полезной, то сохраняйте, чтоб не потерять и иметь под рукой- просто нажимайте + и получите от меня + в свою карму :))
Источник
ÐапиÑÑ Ð·Ð²Ñка в ÑÑеÑео на мобилÑнÑй ÑелеÑон Android ÑеÑез линейнÑй Ð²Ñ Ð¾Ð´: возможно ли?
Не раз возникала проблема подключения аудиоустройств к телефону на Android через линейный вход — микшерный пульт, микрофонный усилитель: да мало ли еще источников аналогового звука? mp3-плейеры отмирают, как класс, сам давно не использую, полностью перейдя на телефон LG V30+: кроме качественного проигрывания музыки, он великолепно записывает стерео-звук с двух встроенных микрофонов — почему бы ему и дальше не поработать в качестве носимого рекордера и портастудии? Столько рассказывается, что у флагманов мобильного рынка сейчас выделенные аудиочипы высокого качества — так неужели нет функции записи с линейного входа?
Запись звука на линейный вход смартфона на Andoid: именно так я представлял это себе:)
Много гуглил:)
Краткое резюме поста:
У мобильных телефонов на Android нет линейного входа, есть только один микрофонный вход.
В некоторых телефонах Sony есть два микрофонных входа для стереозаписи с внешних микрофонов.
Можно понизить сигнал с линейного выхода до уровня микрофонного входа, но это уже паяльник и не рекомендуется:)
Качественную запись с линейного входа на Android можно получить только используя технологию OTG.
А теперь подробности.
Существует три варианта проводного подключения аудиоустройств к телефону на Android:
Разъем jack 3,5 мм
Type-C
Технология USB OTG
1. Подключение аудиоустройств к телефону на Android через разъем jack 3,5 мм
Отступление для лучшего понимания — немного информации про основной (до недавнего времени) звуковой разъем телефона.
Основным аудиоинтерфейсом мобильных телефонов на Android до недавнего времени был разъем наушников, jack 3,5 мм. Существует несколько вариантов привычного разъема «jack» с различным количеством контактов. У обычных стереонаушников — 3 контакта, у смартфонов — стандартно 4: добавляется микрофон, т.е. гарнитура — наушники с микрофоном. Есть джек и на 2 контакта — моно вариант:
Разъем TS — моно jack
Названия этих разъемов состоят из букв T, S, R — последняя буква появляется, если контактов больше чем 2:
T — Tip: кончик, острие;
R — Ring: кольцо. Промежуточный контакт;
S — Sleev: рукав, муфта, гильза. Основание.
Типы разъемов jack:
TS — моно (2 контакта);
TRS — стерео (3 контакта);
TRRS — стерео+микрофон (4 контакта).
Т.е. с каждым добавленным контактом получаем еще одну букву R в середине наименования. Есть и 5-контактый jack с закономерным названием «TRRRS»:)
Распайка обычных наушников, разъем TRS:
T — левый канал,
R — правый,
S — общий (земля).
А вот распайка 4-контактного разъема TRRS имеет разные варианты: стандарт CTIA, введен после 2012 года:
T — левый канал,
R1 — правый канал,
R2 — общий,
S — микрофон.
Разъемы jack 3,5 мм: распайка контактов для наушников(TRS) и смартфона (TRRS)
До 2012 г. существовал стандарт OMTP, где микрофон и земля были поменяны местами — на мой взгляд, более логичный, ведь последний контакт S служит основанием всего разъема. Есть специальные переходники для использования старых гарнитур на новых устройствах — они универсальны, подходят и для использования новых гарнитур на старых устройствах — фото с Aliexpress:
Переходник TRRS OMP-CTIA
Некоторые телефоны просто определяют тип гарнитуры и автоматически подстраиваются под нее.
Итак, в одном 4-хконтактном разъеме 3,5 мм jack TRRS смартфона совмещается стереоВЫХОД на наушники и вход микрофона. Т.е. у телефонов на Android нет встроенного линейного входа через разъем джек 3,5 мм. Вход исключительно микрофонный, моно.
Было бы логично, конечно, сделать возможным переназначение этого разъема программно, т.е. вместо выхода на наушники включать линейный вход, как в диспетчерах звуковой карты на Windows (Realtek). Но про такие возможности на Android ничего не известно. Основное назначение телефона — слушать и говорить, т.е. необходимо подключение гарнитуры.
Есть рекомендации различными аппаратными путями (при помощи паяльника:) ) понижать уровень звука с линейного выхода внешнего устройства до уровня микрофонного входа телефона, но запись будет моно в любом случае.
Исключением являются телефоны фирмы Sony: Xperia Z2 Z3 Z5 Z5C X XP XZ XC — в этих телефонах возможна стереозапись на микрофон. В них используется 5-контактый разъем TRRRS — дополнительный контакт задействован для еще одного микрофонного входа, к разъему телефона можно подключить внешний стереомикрофон Sony STM10:
Внешний стереомикрофон для смартфона Sony STM10
Но в данном случае вход хотя и является стерео, но не линейным, а микрофонным. Распайка разъема является продолжением стандарта OMTP, на который снизу нарастили еще один контакт для микрофона. Или можно сказать, что это CTIA, в центр которого впихнули микрофон:) Порядок следования каналов микрофонов аналогичен порядку каналов наушников — левый ближе к острию разъема, правый — к основанию:
T — левый канал,
R1 — правый канал,
R2 — микрофон левый,
R3 — общий,
S — микрофон правый
2. Подключение аудиоустройств к телефону на Android через разъем USB type-C
Кроме питания и обмена данными в цифровой форме, на некоторых моделях телефонов, где разъем jack убран, через разъем USB type-C также передаются и принимаются аналоговые сигналы. Они дублируют все, что описано выше: jack 3,5 мм убрали в угоду компактности, но все его функции встроили в разъем Type-C, подключиться к которому можно используя переходник — этот режим называется Direct Audio:.
Переходник Type-C на Jack 3,5 мм
В случае подключения по Type-C по аналоговому сигналу, никакой информации о линейном входе также нет.
Существует режим CDLA — цифровой вариант, наушники должны иметь собственный ЦАП и усилитель звука. Не очень понимаю, чем этот вариант отличается от следующего:
Подключение аудиоустройств к телефону на Android при помощи технологии USB OTG (On-The-Go)
Подключение происходит через тот же основной разъем USB (Type-C или micro USB), но уже по цифровому интерфейсу:
USB OTG адаптер — переходник для подключению к мобильному телефону устройств по полноразмерному стандартному разъему USB: Type-C в Type-A
Для подключения аналогового источника к линейному входу телефона нужен этот самый линейный вход, который есть во внешних звуковых картах, подключаемых по USB.
Обычный «свисток» не подойдет, он предназначен для подключения гарнитуры — такая возможность у нас уже есть, но «свисток» не имеет линейного входа:
Простейшая звуковая карта USB
И стандартные программы для записи звука, устанавливаемые в телефон по умолчанию, тоже не подходят: используется специализированная программа USB Audio Recorder Pro — ее легко найти в Play Market (или на 4PDA). Можно ознакомиться со списком поддерживаемых аудиоустройств и найти что-либо подходящее для записи, с линейным входом.
Например, в этом списке я нашел мою старинную внешнюю звуковую карту Creative SB0270, которая вышла в мае 2003(!) года — подключается через разъем USB Type-B, такой только у принтеров на сегодня остался:
Звуковая карта для записи на Android телефон с линейного входа: Creative SB20270
Линейный вход, оптика, все дела:)
Внешняя звуковая карта Creative SB0270 с линейным входом с подключением по USB к смартфону на Android
Именно при помощи Creative SB0270 мне удалось записать звук на линейный вход на телефон на Android:
Как записать звук, поступающий на линейный вход, при помощи смартфона на Android
Но и тут оказались какие-то грабли: на безотказном LG V30+ все получилось без проблем. И на Ulefone armor 6E — тоже. В обоих случаях использовался 9-й Android. А вот Xiaomi Readme Note 4 с Android 7 нормально вывел звук на наушники, но записывать отказался: уровень записи на экране постепенно рос, доходил до перегруза — и на этом все заканчивалось. Будто бы накапливалась обратная связь.
Из ныне продаваемых приличных аналогов Creative SB0270 — BEHRINGER U-CONTROL UCA222 (UCA202, U-PHONO UFO202): карты тоже не новые, вышедшие не ранее 2009 года, но актуальные по сей день:
Внешняя USB звуковая карта BEHRINGER U-CONTROL UCA222
Behringer U-PHORIA UM2 и UMC22 (2003 г.) — профессиональные карты, со входом XLR — тоже анонсированы среди поддерживаемых, но цена уже исключительно для тех, кому оно нужно. Также, как аудиоинтерфейс Zoom U-22 (2006 г.) — больше, чем звуковая карта, требуется дополнительное питание в виде двух батареек АА:
Zoom U-22 внешняя звуковая карта USB для iPhone
Что интересно: портастудии Zoom, отдельные устройства, способные самостоятельно записывать звук, работают в качестве внешних звуковых карт USB и поддерживаются системой Android.
И последняя карта, о которой стоит рассказать — iRigstream: звуковая карта, изначально ориентированная на использование с Android: «Подключайте инструменты, микшеры к iPhone, iPad, Android-устройству и Mac/ПК»:
iRig Stream внешняя звуковая карта USB для Android
У iRigstream свой отдельный софт под все перечисленные системы. А так — с виду карта обычная, нет XLR входов с внешним питанием 48В для поддержки конденсаторных микрофонов.
Выводы
У телефонов на Android линейного входа нет, запись звука возможна только через линейный вход внешней звуковой карты USB.
Простому пользователю нужны наушники и микрофон, гарнитура, на это рассчитан потребительский сегмент.
Линейный вход — это уже только для музыкантов: так, наверное, думают производители:) Музыкантам нужен качественный звук. А за «теплый ламповый» можно и большую сумму взять, поэтому линейный вход все больше уходит в специализированные устройства. Тенденция так себе. Если вы знаете про дешевую саундкарту-«свисток», вставляемую в разъем USB и имеющую линейный вход — пишите. Я такую не нашел.
Источник