Можно Вам задать Вопрос асинхронно? А в 1С?

Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх в функции?

Ответ от телеграмм канала 1С:  «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»…

 

И всем доброго времени суток!

Так почему же простая функция Вопрос в 1С вдруг стала Ждать ВопросАсинх, а до этого вообще непонятная реализация через ОписаниеОповещения(callback)?

1. С самого начала

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

Старая добрая Windows функция обработчик (Пример кода)

А как дело здесь обстоит с обработкой событий в модальных диалоговых окнах (чувствуете связь с терминологией 1С). Ключевым фактором здесь будет то, что при открытии окна диалога у нас возникает своя отдельная функция обработка события. И мы полностью переключаемся с одной функции обработки событий на другую. Когда выбор в диалоге сделан,  обработчик событий переключается назад на основную функцию обработчика. Зачем нам все это знать? Посмотрим пример кода: (Пример кода)

Как все аналогично как с 1С программированием? Модальный вызов функции MessageBox в терминах 1С?  Практически один в один код для 1С

Именно поэтому в терминологии 1С возникают такие понятия как модальные окна, которые скорее переходят в модальные вызовы и далее в не рекомендованные модальные вызовы. Это путь которым шла 1С.

 

2. Современный браузер

Если мы посмотрим на современный браузер, то там модальных диалоговых окон (модальных вызовов)  просто нет. Запрет на использование дополнительных окон. Тенденция изолирования вкладок. Это обосновано с точки зрения безопасности. Но реализовать визуально «модальный» диалог мы  можем через функцию обработчик событий. Делаем затемненным  затемненным всю остальную часть и специально выводим область для окна диалога в центр (Нажми — реализация диалога через callback)

Для каждой кнопки как и всегда описываем свой обработчик событий. Можно сделать общий обработчик для всех кнопок диалога. Вот 1С и предложила нам такой же подход когда ввела специальный объект ОписанияОповещения. Отдельно описываем функцию куда вернется результат выбора (Документаия от 1С). По сути создаем callback и делаем его обработчиком. Как же это совместимо с предыдущим подходом? Никак. Куча возмущений от 1С-ников и инфоповод разобраться.

Количество таких ОписанияОповещения (callback) обработчиков возрастает в приложении неимоверно, что ужасно влияет на читаемость и отладку кода. Это навызается callbackhell или АдОписалокОповещений.

 

3. Найти решение

Так как же нам просто сделать единый код без создания обработчиков событий для «модальных диалоговых окон»?
И тут явно 1С решило использовать новую конструкцию в браузерах :

И мы видим аналогичный код в 1С.

То есть 1С не изобрела ничего нового, но решила использоваться новыми стандартными языка javascript — promise. Шаг в правильную сторону, но вы плане реализации задания интерактивного взаимодействия с пользователем по сути является некоторой надстройкой на надстройкой. И желание некоторых переписать весь код под новую конструкцию с полной точки зрения не является удовлетворительным.

Р.S. Для особо любознательных: Пример реализации для браузера
И для тех кто любит много слов — https://курсы-по-1с.рф/news/async-metods-article/

Возрождение Эратосфена

Доброго времени суток!

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

В предыдущее обсуждение https://blog.sikuda.ru/?p=3188

Мы получили что скорость выполнение кода jvm, .net принципиальна выше скриптовых языков. Это и понятно. Но остался вопрос, почему скорость работы на jvm иногда падает в 10 раз, а иногда нет. И с какими настройками или механизмами это связано?

Углубляемся в документацию:

Виртуальные машины Java/Android выделяют объекты очень быстро. Сборка мусора также идет весьма быстро. Однако при выделении большого количества объектов за короткий промежуток времени можно столкнуться с проблемой под названием «перемешивание памяти» (memory churn). В таком случае виртуальная машина не будет успевать выделять объекты в таком темпе, а сборщик мусора – их утилизировать, и приложение начнет притормаживать, а в экстремальных случаях даже израсходует всю память.

https://habr.com/ru/company/piter/blog/497858/

И если мы попробуем выполнить java/kotlin алгоритм на телефоне:

Получаем на телефоне время выполнения 1-4 сек. Но мы совершенно безобразно используем память, выделяем огромный кусище и никак его не используем в дальнейшем и поэтому неудивительно, что иногода это приводит к нехватке памяти. Мы в телефоне с ограниченными ресурсами для всех, а не на десктопе. Мы конечно в манифесте  поставим параметр — android:largeHeap="true", это спасает на старых телефонах, но он конечно не спасет на совсем слабых телефонах. Но сам факт выполнения на телефоне с ART быстрее , чем на десктопе с oscript, php, python

Р.S. Исходник программы на Котлин — https://github.com/mobilesikuda/eratosfen

 

Милая моя, где ты или геопозиционирование в 1С

Где я? Найти себя!

Настало время позаниматься мобильными приложениям в 1С. Начнет с простейшего — определение координат для приложения из модуля ‘СредстваГеопозиционирования’.

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

Как это стандартно в 1С

В 1С это ‘ОбновитьМестоположение’ при длительном определении — крутим колёсико — подвешиваем интерфейс ввода. Висим мы время зависимое от параметра этой функции. Если не определили за это время не беда возвратим неопределённое. Ну не могло ещё устройство определить координаты. Получается для надёжности многие делают это несколько раз из разных источников — в общем ждать приходится ещё больше.
ITS — https://its.1c.ru/db/v836doc#bookmark:dev:TI000000910

Возможный пример использования:

 

То есть 1С висит, но разве проблема в системе?
А может надо просто посмотреть как работает сама мобильная система? В чем основа мобильных систем и чем они отличаются от десктопных.

Как это стандартно для мобильных приложений

Блокировать основой поток приложения нельзя.

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

Необходимо постоянно экономить электроэнергию.

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

Пример использования:

Список сссылок:
https://its.1c.ru/db/v836doc#bookmark:dev:TI000000910
https://infostart.ru/public/256078/
https://habr.com/ru/post/210162/

Р.S. И под конец лошка дегтя в наш мед. Если мы берем телефон с Android Go то вышеприведенный код может вызывать вылет приложения 1С. Вы такого быть не может? Это просто у Вас мало опыта работы с разными SDK и под разным железом. И обязательно тестируйте приложение на тех телефонах на которых оно должно работать.

В общем пожелаю Вам спокойных ночей!

Импортозамещение с 1С Мобильное приложение.

Доброго времени суток!

Импортозамещение будем делать на примере 1С Мобильное приложение.
Купили тут дешевые телефоны HONOR 9S без Google-сервисов. Хотели использовать для 1С мобильного приложения. Казалось ничто не предвещало проблем. Но проблемы с определением местонахождения обнаружились сразу и очень жестко. В других моделях телефонов проблем не было. Сначала думали, можно будет немного подправить и все заработает.

Разбираем код 1С:

Долго копались, но ответ оказался неожиданным. Необходимо установить Google-сервисов или воспользоваться приложением типа GSpace. Запустить 1С внутри GSpace.
Спасибо https://forum.infostart.ru/forum92/topic261437/#message2645088
Вот такие сложное взаимозависимости оказалось. США накладывает санкции на китайские корпорации, а не работает русская 1С.

Решето или грехопадение Исполнителя 1С

Доброго времени суток!

Ну не мог я пройти мимо тестирования 1С executer и oscript — https://youtu.be/A1CedCgm1eA

Из документации 1С:
Язык «1С:Исполнителя» строго типизирован. У каждой переменной, параметра и метода, возвращающих значения, должны быть заданы типы или перечисление возможных типов через вертикальную черту «|» – нельзя передать переменную непредусмотренного типа.

И что мы имеем в Исполнителе с Массивом?
Новый Массив()
А в java на технологиях которого работает он:
ArrayList<Boolean>

Время работы исполнителя 216 сек, время oscript 97 сек, а jvm меньше 1 сек.

Для сравнения приведем что там реально на Диком Западе в динамической типизации?

Python3 27 сек

PHP7 19 сек

И вне конкурса — статическая типизация
JAVA меньше секунды

P.S. Комментарий от создателя Перфоленты

я уже понял, что достаточно флага «-XX:+UseParallelGC» что бы Джава быстро работала… в моём последнем тесте Джава, Шарп и Перфолента показали почти одинаковые результаты… +/- пару процентов…

Блеск и нищета 1С JSON

Доброго времени суток!

Если вы используете JSON внутри 1C и очень любите из него грузить данные могу Вас порадовать — это делается очень быстро и сразу получаются объекты 1С

СерилиазоторXDTO.ЗаписьJSON(ЗаписьJSON);

Но могу Васи сильно огорчить, если вы попытаетесь загрузить то что нет в вашей конфигурации, скажем нет у нас справочника СекретныйСправочник

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

И прямой вылет программы 😉

Работа с дополнительными полями в Битрикс

Доброго времени суток!

Если Вы в 1С любили использовать дополнительный реквизиты и свойства, мучились с их настройками то использование дополнительных полей в Битрикс Вам понравиться.
Итак преступим.

Для того, чтобы получить в выборе значения дополнительных полей их надо указать UF_INN в параметре SELECT

Источники:
https://dev.1c-bitrix.ru/support/forum/forum6/topic36976/
https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3496&LESSON_PATH=3913.4776.4804.3496

Динамический список в 1С…

Как бы нам дать такой инструмент, чтобы неприятности вылезали самым неожиданным образом. Чтобы простота первоначальных простой настройки выливалось в часы бесплодных поисков решений. Чтобы у тебя все работало, а у ответственного пользователя зависало на полчаса. И так мы немного поговорим о динамических списках в 1С.

Доброе время суток!

Как же легко и просто создать в 1С динамический список, написать понятный запрос и проставить необходимые поля.Но с течением времени количество таблиц в запросе увеличивается в 2-4 раза, количество полей в таблице растет. А количество записей  растет очень быстро и за год может достигать миллиона и более в основной таблице.

И вот тут-то и начинается ОСОБЕННОСТИ работы динамических списков. Первоначальное открытие формы начинает висеть долго, но не у всех и не всегда. Но новые пользователи конечно же должны первоначально прождать минут 20 для получения первичных данных.

И тут приходит время «Доработать» эти списки…

Первое до чего хотят добраться руки — Убрать динамическое считывание данных.

Из its 1C: Динамическое считывание данных включено (рекомендуется) https://its.1c.ru/db/v8std#content:732:hdoc:_top:%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA

Но это позволит убрать долгое зависание при прокрутке списка.

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

Третье уже более существенное это вытащить все дополнительные данные в ПриПолученииДанныхНаСервере(https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/) чтобы разгрузить основной запрос.

Важно понимать, что по этим данным мы не может сортировать или отбирать строки списка.

 

В четвертых —  одно из самых  главных  это вставить отборы сразу в функцию ПриСозданииНаСервере — это уменьшит кардинально количество получаемых данных.

Кнопка выбора периода работает на фильтрацию полученных данных, лучше переопределить ее

И лучше убрать или сделать недоступным строку состояния такого списка, иначе пользователи будут путаться при убирании отбора по этому параметру.


&nbsp
И на некоторых версиях, если у Вас у одно и тот же списка скорость  прокрутки кардинально различается — то возможно Вам поможет очистка всех неиспользуемых отборов 😉

 

Файловая система из 1С, как это работает.

Доброго времени суток!

Долгое время, изучая изменения функций работы с файлами в 1С, я не понимал, что же нам предлагают. Нет, старый дубовый подход со времен 7.7 был прост и понятен. Но новый, «безмодальный», «асинхронный» и еще «Расширения для работы с Файлами» в браузере в принудительном варианте всегда вызывали вопросы. Пришло время разобраться.

Так что же мы имели раньше?

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

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

И вот тут у меня возникает диссонанс. То есть нам хотят сказать, что получение существования файла это длительный процесс запроса к удаленной системе и ожидание ответа от нее? Стоп, но на сервере не нужно никаких НачатьПроверку, там все прекрасно работает Файл.Существует(). То есть если мы переходим на событийную модель, как в nodеjs то это должно работать именно на сервере.

Так как же нам работать (что делать)  и как во всем этом разобраться (кто виноват).

На первый вопрос практика и стальные нервы  принесут нас плоды успеха.

Для циклической проверки существования файлов мы используем зацикливание на себя типа:

Многие скажут, что стоит подождать еще немного и с 8.3.18 можно будет писать в циклах

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

Так что же нам предложили в 2009 году как прикладным программистам? Получается нам предложили callback, завернутый в ОписаниеОповешения(). И даже функции работы с обещаниями в 8.3.18 не меняют этой сути, а просто перепаковывают примерно как программисты javascript свои callback-и в promise. Но в отличие от Web вся остальная схема работы 1С осталась синхронной. Взаимодействие с сервером в 1С само синхронно — последовательно вызываются функции клиента и сервера, ответ у HTTPЗапрос — получаем последовательно. А ОписаниеОповещения повесили на клиента и функции взаимодействия с пользователем. Бардак в головах?

Нет не все функции в 1С будут прикрывать столь срамную реализацию. Есть и правильная тенденция в ПолучитьФайлССервера с несколькими Оповещениями(callback) и в них мы как раз начинаем получать правильное использование технологии. И это радует.

 

В второе важное, будем разбираться.

В Web всегда была важна безопасность. Локальная файловая система отделена от доступа скриптов в браузере. Но 1С здесь решила сделать «все для пользователей» в результате при установке Расширений для работы с файлами, мы получаем доступ к локальной файловой системе. Да с подтверждением разрешения, но пускает и в техническом понимании это вызывает взрыв мозга.

Берем вот так просто и копируем выделенные файлы с сервера на указанную папку пользовательской машины в браузере.

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

 

А функция НачатьЗапускПриложения с доступностью в браузере заставляет сердце йокать и подозревать что-то сильно нехорошее.

 

 

Но главное же быть полезным, а не правдивым ведь правда 😉

И для ИСКЛЮЧИТЕЛЬНО для полезности предлагаю обработку для работы с файловыми системами клиента и сервера в виде всеми любимых двух панелей по типу FAR, Norton Commander. — https://infostart.ru/public/1295065/

Р.S.

Проблема в мобильной приложении это поиск корневых папок, Android это будет типа /storage/emulated/0 или другое специально подобранное и доступ опять такой как у всей платформы 1С. Возможность накосячить большая 😉

Воспроизведение звука в 1С. Доступно и всерьез. 8.3.14

Доброго времени суток!

С момента предыдущей публикации infostart.ru/public/248770/ прошло много времени. И честно говоря, если вы запустите старую обработку на  Windows 10 и новой платформе  8.3.14, то звук уже не будет воспроизводиться. За это время многие уже перебрались на платформу выше 8.3.14, а значит, и html поле теперь всегда новое и это не зависит от режима совместимости 😉 и режима классических форм. Все старое перестало работать! Значит, есть основание сделать мир лучше!

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

Прежде всего скажем, что будем использовать поле html, интернет стандарты это единственное, на чем можно основываться в нашем проприоритетном мире. И конечно если мы доделываем для Web клиента, то других вариантов у нас просто нет.

Итак начнем с самых основ звука в html5 и тега audio (https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_audio_all):

Проблема номер один ссылка на файл в контексте сервера. Где должен быть расположен файл по отношению сервера 1С, локального компьютера ил того подобного.

Ответ 1: полная ссылка на звуковой файл типа — https://blog.sikuda.ru/1c/sound1c.mp3 — ВСЕ ПРЕКРАСНО и для Вэб-клиента это пока единственный вариант.

Ответ 2: Прописывание звука в тело html типа — src=’data:audio/mpeg;base64 НЕ ПРОХОДИТ 1С клиент.

Ответ 3: Указание ссылки Адрес во временном хранилище у меня НЕ ЗАРАБОТАЛО.

Ответ 4: Использовать временные локальные файлы на клиенте file:// вместе с ПолучитьИмяВременногоФайла — РАБОТАЕТ даже в тонком клиенте.

 

И вторая проблема с которой я столкнулся, это однократное воспроизведение звука. Я так понял это проблема кэширования самой 1С html поля с этим сложно бороться. Простое решение работает если перезагружать страницу с кодом:

Ну а тем кто хочет использовать элементы управления звуком и не получить в стандартном 1С черный прямоугольник, рекомендую воспользоваться сторонним плеером (мне понравился https://plyr.io/#audio и вторая обработка)

Ну вот и все. Тестируем, критикуем, комментируем. Если найдете лучший метод не стесняйтесь рассказывайте.

Готовые обработки выложены на Infostart https://infostart.ru/public/1259789/