Подкапотное пространство веб-клиента

30.01.23

Разработка - Мобильная разработка

Юрий Лазаренко, ведущий разработчик компании «Цифровой кот», на конференции Infostart Event 2021 Post-Apocalypse рассказал, как устроен самодельный веб-клиент, и какие практические приемы помогут эффективно интегрировать сайт с базой 1С.

О своем веб-клиенте я на Infostart Event рассказывал уже три раза:

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

 

Компромисс. Что общего между Кадиллаком и веб-клиентом для 1С?

 

 

Я автомобилист, вожу машину с 1992 года. Права получил в 1994-м. На слайде представлены 2/3 моего автопарка. Как видите, у меня было очень много всяких разных машин, я долго подбирал себе что-то подходящее – менял машину в среднем каждые два года, потому что обязательно находился какой-то фатальный косяк.

 

 

Последние 7 с лишних лет я катаюсь на таком Кадиллаке. Это уже морально устаревшая модель, на таких давно никто не ездит, но мне он нравится – «зашел», что называется.

 

Мне нравится, что он безопасный, надежный, красивый, быстрый, мощный – честный E-класс за относительно небольшие деньги.

Но у этой машины есть недостаток, который мне не нравится.

И дело не только в том, что запчасти на него стоят в 10 раз дороже, чем на Ладу Весту. И не в том, что он жрет 20 литров – это приемлемо.

Мне очень не нравится то, что некоторые вещи я не могу в нем сделать самостоятельно.

Когда у меня был BMW 84-го года выпуска, и в нем сгорала лампочка в фаре, я останавливался, поднимал капот, откручивал крышку, доставал лампочку, ставил новую (запасная всегда есть), закручивал крышечку, закрывал капот и ехал дальше. Прямо здесь же, на дороге. Две минуты и 200 рублей затрат.

Чтобы сделать это на Кадиллаке, нужно потратить минимум два часа и 11 тысяч рублей, потому что, чтобы заменить лампочку на Кадиллаке, его сначала нужно привести в сервис, там поднять на подъемник, открутить бампер, снять бампер, открутить фару, снять фару. И только тогда можно достать лампочку. Потом то же самое нужно сделать и для второй фары, потому что обычно лампочки выгорают парами – если одну поменял, значит, сразу нужно и вторую менять.

Подбешивает то, что это – простейшая операция, но без специального оборудования ее не выполнить. Хотя вроде и знания есть, и руки откуда нужно выросли.

Я этот Кадиллак называю «Компромисс». Потому что он, конечно, классный, мне нравится. Но с другой стороны, мне хотелось бы купить Бентли, чтобы кататься на чем-то лучшем.

 

 

При этом меня душит жаба, потому что обслуживать Бентли очень дорого.

Когда в 2008 году под окнами нашего офиса сломался Бентли, приехали специальные люди и тыкали в него всякими приборами. Вы когда-нибудь видели автослесарей в одинаковых красивых чистых комбинезонах? Они его диагностировали примерно два часа, потом пытались реанимировать. Когда им это не удалось, приехал специальный автовоз – Бентли погрузили и увезли.

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

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

Я понимаю, что хорошие вещи стоят дорого, и я готов за новую машину заплатить, как за новый Кадиллак. Но мне хотелось бы, чтобы у нее были мощность, комфорт и понты Бентли, а обслуживание – как у Лады Приоры. Чтобы ее можно было, если она на дороге сломалась, тут же починить и поехать дальше.

И если в мире автомобилей это – утопия, то в мире 1С таким компромиссом является собственный веб-клиент на 1С.

 

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

 

 

Например, у вас есть компания, которая продает товары оптовикам – тысяча постоянных клиентов, 10 000 товаров, 15 видов цен, 3 вида скидок, 15 типовых соглашений, у 20% клиентов – индивидуальные соглашения.

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

 

 

А теперь посмотрите, как это делается в собственном веб-клиенте.

Если мы кликнем на ссылку «Рассчитать скидки», то видим, что там вызывается функция JavaScript «РассчитатьСкидки()». Идем в нее – и там, обратите внимание, всего одна строка, которая вызывает функцию «Рассчитать скидки» общего модуля.

 

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

На обычном стандартном варианте обмена WordPress с 1С реализовать такое просто невозможно. Попробуйте, напишите на PHP расчет скидок такой же, как в 1С есть по умолчанию. На это уйдет много дней. Здесь это делается примерно за два часа и обходится дешевле, чем стандартная интеграция 1С и веб-сайта, потому что веб-клиент под 1С пишет только один продвинутый 1С-ник, который знает и 1С, и JavaScript.

 

Реалии стандартной интеграции 1С и веб-сайта

 

 

Но, когда вы хотите запустить WordPress + 1C + Обмен, разработчиков должно быть как минимум двое – 1С-ник и веб-программист.

А чаще всего, над ними нужен еще и третий, потому что эти двое обычно договориться не могут, и нужен третий, который их поставит и скажет: «Любитес!».

И это еще не все – чаще всего, нужен еще и фронтендер.

Это в 1С принято так, что и код, и интерфейс, и обмен делает один человек, а в вебе бэкенд-разработчик не станет рисовать интерфейс, потребуется еще и четвертый специалист.

 

 

Потом они еще долго будут договариваться – спихивать друг на друга ответственность за возникающие проблемы: «Мы вам отправили JSON, а от вас ничего не пришло».

И за все то время, пока они не договорятся друг с другом, им нужно платить.

В итоге эти проекты обходятся реально дороже, чем разработка собственного веб-клиента на 1С.

 

Как безопасно выставить базу в интернет

 

 

Что такое в принципе свой собственный веб-клиент на 1С?

 

Это подсистема, в которой есть HTTP-сервис, принимающий запросы от JavaScript, обрабатывающий их и возвращающий обратно в HTML. В принципе, все довольно просто.

 

Веб-клиент может использоваться в двух режимах:

  • В интрасети – когда мы организуем через веб-клиент доступ к базе для своих сотрудников.

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

Эти режимы работы отличаются.

 

 

Обратите внимание, в режиме интеграции с сайтом у нас используется промежуточный сайт.

 

 

А при работе в интрасети – когда мы не используем промежуточный сайт – оранжевые значки HTML и JS у нас попадают на тот же веб-сервер, где опубликована база 1С.

Это – два основных отличия, но они очень много означают.

 

Авторизация: с помощью 1С или собственный алгоритм – в чем различия

 

 

Вход в базу, естественно, начинается с ввода логина и пароля.

 

 

Когда вы пытаетесь достучаться до HTTP-сервиса 1С – не важно, руками, с помощью JavaScript или чем-то еще – браузер покажет вам окно ввода логина и пароля. Появление этого окна инициирует платформа 1С:Предприятие. Там нужно ввести логин и пароль пользователя 1С:Предприятие, который задан в конфигураторе в списке пользователей.

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

 

 

Если вы хотите работать через промежуточный сайт, там такой вариант, скорее всего, не прокатит, потому что пробросить авторизацию не так просто. Да и в этом нет особого смысла – позже расскажу, почему.

При работе через промежуточные скрипты у нас создается справочник, который называется «Авторизация пользователей». Там есть реквизиты «Логин», «Пароль» и ссылка «Объект информационной базы». Это – ссылка на произвольный справочник базы – на справочник «Контрагенты», «Партнеры». Если у нас это кабинет партнера, логично, что мы здесь сразу укажем партнера, который у нас залогинился.

 

 

У этого алгоритма авторизации есть свои плюсы:

  • Логин может быть привязан к любому справочнику.

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

Минус у него такой:

  • В ПараметрыСеансы.ТекущийПользователь у вас всегда будет какой-то служебный пользователь. Вам же все равно нужно как-то зайти в HTTP-сервис. Нас 1С не пустит туда. Поэтому заводится какой-то служебный пользователь, через которого физически мы заходим в 1С.

 

 

Есть два основных варианта, которые позволяют задать этого пользователя:

  • Первый вариант – указываем логин и пароль в явном виде через default.vrd. Минус этого способа в том, что наша база торчит наружу и любой, кто знает адрес этой базы, туда автоматически залогинится.

  • Можно указать логин и пароль в параметрах curl. В этом случае любой, кто захочет достучаться до вашего HTTP-сервиса, получит окно ввода логина и пароля. Это – более безопасный вариант.

 

Преимущества работы через служебного пользователя

 

 

Чем так хорошо работать через служебного пользователя?

Когда кто-то подключается к базе через HTTP-сервис, на сервере создается сеанс, который называется «Соединение HTTP-сервиса».

Представьте, что это кафе на рисунке – ваш сервер, в котором по умолчанию четыре «кассы», больше он не вмещает. Пока никто не подключился, сеансов нет.

 

 

Может быть, вы замечали, когда через HTTP-сервис первый раз к базе подключаешься, она долго тупит – 3-5 секунд. И только потом появляется результат. Знаете, почему так?

Потому что требуется какое-то время на то, чтобы этот сеанс загрузился. Т.е. клиент пришел, и ему нужно 3-5 секунд подождать для того, чтобы база ему дала ответ.

 

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

 

 

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

 

 

Если вдруг так получилось, что пришло одновременно два запроса – не проблема, поднимается вторая «касса».

 

 

И так далее до тех пор, пока ваш «ресторан» не заполнится полностью.

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

 

 

Получается, что следующие клиенты – следующие HTTP-запросы – становятся в очередь.

С точки зрения 1С это выглядит так, что вы пытаетесь нажать кнопку, открыть форму, там колесико загрузки крутится, но форма не открывается. И пока предыдущие «черные» запросы не отработают, «красные» у нас в очереди не продвинутся.

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

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

А Иванов 1С запустил и ушел – у него автоматически каждые 60 секунд обновляется какая-то форма списка и не дает сеансу заснуть. Получается, что сервер забивается неработающими сеансами («кассирами»), которые место занимают, но ничего не делают.

 

 

Вот так выглядят открытые кассы на сервере 1С:Предприятие. Создаются сеансы, которые называются «Соединение HTTP-сервиса».

Вот этот скрин взят из моего доклада 2017-го года. Здесь сейчас поднято 5 сеансов. Как вы думаете, сколько реально пользователей через браузер работает здесь?

Это скриншот одновременной работы 1000 пользователей. Т.е. мультиплексирование здесь – 200, один кассир обслуживает сразу 200 пользователей. Нагрузка на сервер существенно отличается.

 

Безопасность

 

 

Поговорим немного про безопасность, потому что часто переживают: «Как же мы 1С выставим наружу, на нас же злодеи нападут!»

 

 

Если вы работаете в интрасети, у нас и так все от внешнего мира защищено – выставлять нестрашно.

Если вы работаете через промежуточный сайт, вы можете средствами вашей операционной системы настроить так, что запросы к HTTP-сервису будут приниматься только от того IP, где находится ваш промежуточный сайт. Тогда никакие бармалеи с других IP-шников в вашу 1С не попадут.

К тому же зачем вам публиковать полностью всю базу? Вы публикуете только HTTP-сервис – не публикуете тонкий, веб-клиент, OData и все остальное. А работа через HTTP-сервис подразумевает, что в его модуле еще есть код, вы в коде можете свои проверки добавить.

 

 

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

 

Передача ссылки из 1С в браузер и обратно

 

Давайте посмотрим, что нужно сделать, чтобы заполнить табличную форму документа?

 

 

Если мы в автоподборе выбираем элемент, его наименование помещается в реквизит «Номенклатура», а цена этого товара выводится в поле «Цена».

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

 

 

Как это делается?

В 1С это реализуется очень просто:

  • мы берем ссылку, кладем ее в функцию «ЗначениеВСтрокуВнутр», у нас получается строка, содержащая служебные символы;

  • чтобы избавиться от символов, выполняем функцию КодироватьСтроку();

  • далее – формируем из этого структуру, у которой есть два ключа – «Ссылка» и «Представление»;

  • упаковываем эту структуру в JSON и передаем на сайт – там у нас получается точно такая же структура.

 

 

Значения из этой структуры мы кладем в элемент HTML-формы input.

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

 

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

 

Как выполнить бесконтекстный вызов функции 1С и обработать результат синхронно и асинхронно

 

Как теперь это передать из браузера на запуск в 1С?

 

 

В JavaScript есть объект XMLHttpRequest – это полный аналог 1С-ного HTTP-запроса.

 

У нас есть структура данных строки – она так и называется «ДанныеСтроки». Мы ее упаковываем в JSON и выполняем функцию ПолучитьДанныеИз1С() – код этой функции можно посмотреть на нашем демо-сайте, если вызвать F12 и изучить текст скрипта v-can_site.js. Не передирайте скрипты подчистую для собственного использования, все-таки они у нас под авторскими правами, но посмотреть, как они работают – пожалуйста.

 

Что происходит после того, как мы вызываем эту функцию:

  • сначала в самой верхней строке мы превращаем эту структуру в настоящую ссылку;

  • а дальше у нас выполняется обычный 1С-ный код – мы рассчитываем процент скидки-наценки, саму цену, сумму и т.д.;

  • потом – превращаем все эти значения обратно в структуру и возвращаем ее назад.

15 строк кода, и у нас все работает.

 

Как правильно сгенерировать веб-форму

 

Я сейчас немного упростил и кажется, что мы на сторону сайта передаем только данные через JSON. По-правильному, так и должно быть – мы должны передавать сайту только данные и не передавать сам HTML-код.

Но это в теории. На практике мы передаем HTML-код, и это та самая штука, из-за которой настоящие веберы меня давно хотят убить.

 

 

Я часто представляю, что иду по коридору, и веберы меня с двух сторон зажимают: «Лазаренко, ты что, формы передаешь в виде готового HTML? Это как?»

 

 

Как передать форму из 1С в браузер?

Вариант № 1: Мы в 1С из шаблонов собираем готовый HTML-код. Т.е. у нас в 1С, если мы передаем таблицу, есть шаблон шапки, шаблон строки, шаблон подвала таблицы. Мы это все компонуем в коде 1С и кидаем в виде готового HTML.

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

 

 

Они считают, что правильнее использовать вариант №2 – брать структуру данных, упаковывать в JSON, закидывать на клиент, где есть Vue, React и другие фреймворки, которые все это собирают.

Но когда мы делаем такие веб-интерфейсы, мы их отдаем обычным 1С-никам, и для них слова React, Vue и т.д. – это Бентли, которую нужно отвезти на сервис. А им в случае поломки нужно иметь возможность все починить на месте. Когда у нас код формируется полностью на стороне 1С, 1С-ник понимает, что происходит, и может это сопровождать.

На это веберы начинают мне возражать: «А как вы с помощью такого древнего способа будете обеспечивать 100 тысяч запросов в час?»

Да никак! Потому что мне это не нужно!

  • Представьте, что есть стандартный веб-клиент от 1С, который отлично выполняет свои функции в какой-то своей области.

  • Также есть привычная схема – WordPress, база 1С и обмен между ними. Она тоже прекрасно выполняет свои функции.

  • Но между ними есть еще одна область, в которой нужен наш веб-клиент. Это – та область, когда нужно рассчитать те же самые скидки, обеспечить реальную онлайновость, реальные данные показать из 1С. Это – узкая область, но в ней свой собственный веб-клиент просто вне конкуренции.

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

Мне для выступления нужна была штука для дачи с загогулиной на конце, и я попросил у терминатора привезти мне ее. Он мне на мою просьбу привез шотган, который мне пригодится только в параллельной реальности, если у меня на даче случится зомби-апокалипсис. Точно так же Vue, React и все остальное мне пригодятся только тогда, когда на меня повалится 100 тысяч HTTP-запросов в час, от которых нужно отстреляться.

Но у кого на даче когда-нибудь был зомби-апокалипсис? Для чего вы вообще на дачу ездите? Правильно, чтобы шашлыки жарить. Поэтому я попросил терминатора отправиться в прошлое еще раз и привезти мне другую загогулину – называется кочерга.

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

Точно так же, узкая специализация и у моего веб-клиента. Мне, чтобы построить веб-клиент с такой архитектурой, нужно изучить Vue, React и все это остальное. В результате у меня получится Бентли, с которым 1С-нику в случае поломки придется расстаться – он сам не поймет, как его починить или адаптировать под свою задачу.

Я не критикую тех, кто использует на своих проектах Vue, React и все остальное. Но помните, что мы разрабатываем свой софт в первую очередь для 1С-ников. Почему мы в этой нише в топе? Потому что если что-то сломалось – «открыл капот», поправил и дальше поехал.

 

В общем, реальность такова, что клиенты предпочитают вариант 1. Они говорят: «Не нужно нам этих ваших дополнительных фишек, чтобы наш 1С-ник потом не мог понять, как с ними поступать. Нас устраивает, что вы собираете код на стороне 1С. Потому что, если нужно, мы остановились отладчиком, поняли, откуда взялись данные, куда они положились, как вообще получилось так, что у нас эта ссылка на форме появилась и т.д.»

Тогда они получают прекрасный инструмент, который работает чуть-чуть медленнее, чем нужно для обработки 100 тысяч запросов в час. Просто потому, что нет в 1С таких баз, где нужно обрабатывать 100 тысяч запросов в час. Бывают, но очень редко.

Зачем нам Бентли, если нам нужно на дачу ездить?

 

Применение варианта №2 мне понадобилось только в двух случаях – это:

  • Загрузка таблиц с большим количеством колонок. Однажды мы столкнулись с тем, что при загрузке очень широкой таблицы, она очень долго собиралась в HTML. Поэтому нам было выгоднее JSON закинуть на клиента и там собрать эту табличку средствами JavaScript. Это намного быстрее работало. Но это – один случай из тысячи.

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

 

Формируем отчет с параметрами, отображаем в браузере и скачиваем в xls и pdf

 

 

Расскажу еще один кейс – как мы формируем печатную форму

 

 

Распространенная задача – сделайте так, чтобы можно было в списке кликнуть, сформировать печатную форму, нажать «Скачать», и она у нас в виде PDF-файла скачалась.

 

В табличной части у нас есть строка – элемент tr. У него есть атрибут ref – ссылка.

Когда мы в этой строке нажимаем на иконку печати, вызывается функция Взаиморасчеты_ПечатьНажатие().

 

 

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

  • doctype – это строка «Счет покупателю»;

  • ref – ссылка на конкретный документ.

Компонуем из этого структуру в виде JSON и передаем ее в 1С – мы уже знаем, как это делается.

 

 

На слайде показана вся функция, которая отвечает за формирование печатной формы. Она состоит из двух основных частей.

 

  • В верхней части мы из структуры, которую передали, формируем нормальную ссылку. А потом – прямо из реквизита нашей строки берем вид документа и выбираем нужную внешнюю обработку, которая нам сформирует печатную форму.

 

  • А в нижней части мы вообще используем типовой код формирования печатной формы из БСП. Передали ссылку в массив документов и на выходе у нас – табличный документ.

  •  

Как сделать из табличного документа печатную форму? Элементарно.

Табличный документ записываем в файл с типом HTML5.

При чтении его текстовым документом получаем готовый HTML. Достаточно просто кинуть его на просмотр в браузер, и он нам его нормально отобразит.

 

 

А чтобы скачать, нужно сделать примерно то же самое, только сохранить файл не HTML5, а в PDF, и вернуть его в виде двоичных данных.

Все это в целом – два часа работы.

 

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

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

В чем минус использования служебного пользователя? Текущий пользователь в параметрах сеанса у нас будет всегда один. Это значит, что не будет работать RLS для разных пользователей. Но это только при работе через промежуточный сайт.

В интрасети при авторизации средствами 1С работать будет.

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

 

«Начинаю продолжать заканчивать» – что не так с закачиванием файлов в 1С?

 

 

Еще один момент – тяжелые HTTP-запросы. Мы когда-то столкнулись с этой проблемой, потратили много времени. Надеюсь, сейчас это вам поможет.

 

Под тяжелыми HTTP-запросами я подразумеваю передачу файлов. Например, тяжелым HTTP-запросом может быть запрос длиной больше 4 Кб.

Многие пытаются закинуть данные в 1С через HTTP-сервис методом GET. А у большинства HTTP-серверов стоит ограничение, что длина тела HTTP-запроса, отправленного методом GET, не может быть больше 4Кб, он ее просто обрезает. Поэтому первая фишка – передавайте запрос методом POST.

При этом, если мы методом POST через XMLHttpRequest передаем какой-нибудь небольшой файл (например, размером 100 Кб), у нас данные до HTTP-сервиса 1С доходят примерно через секунду.

 

 

Но, когда мы передаем файлы от 3Мб, файл передается в платформу 1С, но на точке останова у нас ничего нет. Потом проходит 30 секунд, и данные приходят. Т.е. файл загрузился куда-то в платформу 1С, но там есть какое-то непонятное пространство, где большие файлы застревают. Такое ощущение, что на месте этой красной стрелки Суэцкий канал, в котором судно Evergreen перекосило, приезжают 1С-ные фиксики в желтых футболках и желтым экскаватором его раскапывают. Он там 50 секунд висит.

 

 

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

 

 

Решение – простое до элементарности. Оказывается, если один и тот же файл пихать в 1С напрямую, она ответит: «Нет, подожди 50 секунд». Но если ей сказать: «Скачай этот файл», она его идет и качает за одну секунду.

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

Все это занимает примерно 2.2 секунды.

 

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции Infostart Event 2021 Post-Apocalypse.

 

30 мая - 1 июня 2024 года состоится конференция Анализ & Управление в ИТ-проектах, на которой прозвучит 130+ докладов.

Темы конференции:

  • Программная инженерия.
  • Инструментарий аналитика.
  • Решения 1С: архитектура, учет и кейсы автоматизации на 1С.
  • Управление проектом.
  • Управление продуктом.
  • Soft skills, управление командой проекта.

Конференция для аналитиков и руководителей проектов, а также других специалистов из мира 1С, которые занимаются системным и бизнес-анализом, работают с требованиями, управляют проектами и продуктами!

Подробнее о конференции.

 


См. также

"Штрихкод-информер" - мобильный ТСД и прайс-чекер в смартфоне

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн. Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

2880 руб.

03.12.2018    54615    137    102    

161

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    33278    80    157    

174

"Мобильный ТСД" - инвентаризация и сбор штрихкодов для iOS и Android

Сканер штрих-кода Терминал сбора данных Мобильная разработка Монитор заказов Оптовая торговля Розничная торговля Ценообразование, анализ цен Платформа 1С v8.3 Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Простой мобильный терминал сбора данных для смартфонов на iOS и Android, не требующий сложных настроек и установки дополнительных программ. Обмен между Вашей 1С и мобильным приложением осуществляется через облачный сервис и расширение конфигурации. Работает с конфигурациями УТ 11, ERP, КА2, Розница 2, Розница 3, УНФ 1.6, УНФ 3.0. Полнофункциональный демо-доступ для своей конфигурации можно запросить в настройках мобильного приложения - все необходимое придет на почту автоматически.

2000 руб.

22.04.2019    91945    511    186    

293

Магазин 15 - приемка товара по штрихкодам или инвентаризация в торговом зале

Логистика, склад и ТМЦ Мобильная разработка Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

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

12950 руб.

30.05.2023    3388    2    0    

4

Работа с графикой в браузере (SimpleWEB). Векторный редактор

Мобильная разработка WEB-интеграция Мобильная платформа Абонемент ($m)

В SimpleWEB добавились средства для работы с графикой и отслеживание событий мыши, в онлайн редактор https://seditor.ru:1555/ добавился «Векторный редактор» на этом API. Теперь можно нарисовать схемы складов на ПК, сделать карты (*.sug-файлы) для мобильной платформы SimpleUI, выводить данные из 1С в графическом виде. Таким образом, API для работы с векторными файлами теперь есть и в веб- и в мобильной платформе, а также средства для создания и редактирования векторных файлов есть тоже в обеих платформах.

1 стартмани

20.03.2024    1471    0    informa1555    1    

39

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    6856    ROk_dev    56    

37

JavaScript в Simple

Мобильная разработка Бесплатно (free)

В SimpleUI и SimpleWEB, наряду с обработчиками на python и онлайн (1С и т.д.) добавляется интерпретатор JavaScript. В андроид платформе он скорее играет на поле python, т.к. является оффлайновым решением для самостоятельной обработки и расширяет аудиторию разработчиков для разработки самостоятельных решений. Дополнение к основной статье https://infostart.ru/1c/tools/1153616/

12.02.2024    1628    informa1555    0    

25
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Darklight 32 01.02.23 16:36 Сейчас в теме
Хороший доклад. Хоть и в начале, на мой взгляд, слишком много времени выделено общему описанию бизнес-задачи, архитектуры веб взаимодействия и безопасности. Что-то боле менее стоящее начинается только со второй половины доклада.
По изложенному могу лишь поспорить с проблемой применения реактивных фреймворков и сборкой HTML страницы на стороне браузера. На мой взгляд - при правильной реализации всю эту стороннюю фреймворкность вполне можно скрыть с глаз программистов 1С - просто передав им API чёрного ящика, реализованного на 1С (а на случай проблем внутри чёрного ящика - делать его хорошее тестирование, и иметь спеца на горячей линии поддержки, ну а при желании со временем и рядовые 1С смогут ковырять и исправлять этот чёрный ящик). На стороне web-клиента, уж нужно постараться минимизировать технические проблемы.

И ещё "мультиплексирование" сеансов вроде бы запрещено лицензионной политикой компании 1С. Т.е. схема работы через выделенного пользователя вполне может нарушать лицензионное соглашение. Хотя тут много нюансов - ведь при работе через WEB лицензии всегда выделяются на сеанс, а не на пользователя - т.е. один и тот же пользователь-робот но в 5 сеансах всегда займёт минимум 5 лицензий (и больше ему то и не требуется). И никакой параллельной работы свыше заданных 5 слотов обслуживания не будет - остальные пользователи буду стоять в очереди, пока не закончится обслуживание запросов предыдущих. Это классическая web-схема. Вот только она всё-равно вроде бы нарушает лицензионное соглашение 1С - которое в этой части составлено очень жёстко!
4. TitanLuchs 395 01.02.23 22:13 Сейчас в теме
(1) Добрый вечер! Спасибо за оценку. В данном докладе мы решили проверить некоторые новшества, не все они оказались эффективными, как показала обратная связь. Последующие доклады уже были подготовлены с учетом замечаний аудитории.
По сути доклада.

при правильной реализации всю эту стороннюю фреймворкность вполне можно скрыть с глаз программистов 1С - просто передав им API чёрного ящика, реализованного на 1С (а на случай проблем внутри чёрного ящика - делать его хорошее тестирование, и иметь спеца на горячей линии поддержки

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

И ещё "мультиплексирование" сеансов вроде бы запрещено лицензионной политикой компании 1С

Не запрещено. Просто для всех пользователей, которые одновременно работают с порталом, должен быть запас клиентских лицензий.
11. Darklight 32 02.02.23 14:10 Сейчас в теме
(4)Я сейчас хочу пойти другим путём - сделать готовые "компоненты" а-ля 1С (с использованием современных реактивных фреймворков). И генерацию выходной формы по xml форме в формате 1С. А на втором этапе прикрутить конвертер кода 1С клиентского контекста в код целевой платформы и сделать хотя бы основные классы прикладных объектов, доступные в клиентском контексте. На третьем этапе сделать автогегнерцию прокси для клиент-серверного взаимодействия и его автовстраивание. В идеале - форма из 1С сможет перейти на другую целевую платформу в почти неизменном виде. А её разработка может остаться в лоне платформы 1С Предприятие. Но таковы пока только планы (хотя один ключевой компонент я уже почти разработал)... Но раз фирма 1С это делает для WEB клиента и для Мобильного клиента - то это реально сделать и сторонним разработчикам. Пока меня особо смущает только реализация компонента для табличного документа. Для моего эго статической таблицы явно не достаточно! Но до этого пока далеко - там видно будет. Может дело и не дойдёт - это уже моя вторая попытка такого проекта. Первый просто неудачно начал с платформы JavaScript - которую знаю плохо...
13. TitanLuchs 395 05.02.23 20:09 Сейчас в теме
(11) Задача непростая, но если получится - демонстрируйте, посмотрим.

(11)
Пока меня особо смущает только реализация компонента для табличного документа.

Гриды всегда были и всегда будут болью всех разработчиков интерфейсов.
19. Darklight 32 06.02.23 10:13 Сейчас в теме
(13)
Гриды всегда были и всегда будут болью всех разработчиков интерфейсов

Ну коммерческие решения а-ля свой EXCEL я уже видел - выглядит очень круто!
20. TitanLuchs 395 06.02.23 10:19 Сейчас в теме
(19) Мы тоже в 2016 году написали свой аналог Экселя для 1С: с формулами, взаимодействием с СУБД 1С, разграничением прав и прочими фишками. Часов на это дело было положено столько, что сейчас уже и не сосчитать.
2. van_za 243 01.02.23 16:46 Сейчас в теме
Всем привет!


"В ПараметрыСеансы.ТекущийПользователь у вас всегда будет какой-то служебный пользователь" - переопределяем на пользователя которого мы получили собственной авторизацией

"3Мб, файл передается в платформу 1С, но на точке останова у нас ничего нет. Потом проходит 30 секунд, и данные приходят" - попробуйте использовать возможности работы платформы с потоками (прием отдача картинки 1.2 м.б - 0.1 секунды)

" о помните, что мы разрабатываем свой софт в первую очередь для 1С-ников" - мне кажется не нужно так делать, это будут проблемы в первую очередь для конторы который внедрена система не имеющая аналогов, Фреймворк решает и проблемы с наймом и архитектурные проблемы и открывает возможности использования огромного количества библиотек и готовых решений.
5. TitanLuchs 395 01.02.23 22:25 Сейчас в теме
(2) Приветствую!


переопределяем на пользователя которого мы получили собственной авторизацией

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


попробуйте использовать возможности работы платформы с потоками

Каким образом? Мы же не можем в коде 1С задействовать поток - код 1С не начинает выполняться, пока платформа не "переварит" файл где-то у себя внутри. Инициировать поток на стороне javascript? Возможно, это наш Epic fail и решение лежит где-то на поверхности, но мы его не видим. Если подскажете решение - буду признателен.


это будут проблемы в первую очередь для конторы который внедрена система не имеющая аналогов

Количество наших клиентов растет, уже даже начинает формироваться пока небольшое сообщество разработчиков, которые освоили наш конструктор веб-порталов. А библиотеки и заготовке на стороне фронта нам доступны точно так же, как и любому другому фреймворку, мы их активно используем при необходимости. При этом тот факт, что мы в свое время отказались от сторонних фреймворков, позволил нашим клиентам абсолютно безболезненно пережить события последнего года - нигде ничего не упало, не сломалось, не отказалось работать. Поэтому пока будем продолжать использовать данную архитектуру.
21. ONLYTILT 20 10.02.23 14:28 Сейчас в теме
(5)
попробуйте использовать возможности работы платформы с потоками

Я как то делал загрузку больших файлов с веб страницы в 1с, и там использовал загрузку порциями. Было вроде даже не сильно и медленно, но там задача была больше в надежности, загрузка должна была быть возобновляемой в случае например когда сеть прыгнет с 4g на 3g и т.д. На клиенте я нарезал файл на блобы методом slice, отправлял эту часть в 1с и через объект ЗаписьДанных записывал в поток уже существующую часть файла и ту что пришла. На клиент потом возвращалось количество полученных байтов (размер двоичных данных), и клиент соответственно нарезал файл дальше с полученной начальной позиции. Я бы сказал быстрее это чем получать файл целиком или нет, только я изначально задумывал возобновляемую загрузку и по этому даже в голову не пришло замерять что быстрее, возможно время которое платформа переваривает пришедший файл увеличивается нелинейно, тогда с моим подходом можно было бы даже получить выигрыш по времени.
3. alem 48 01.02.23 17:07 Сейчас в теме
(1)
И ещё "мультиплексирование" сеансов вроде бы запрещено лицензионной политикой компании 1С. Т.е. схема работы через выделенного пользователя


Привет,

вот этот момент тоже бы хотел раз и на всегда прояснить, можно так или нельзя? Если читать лицензионную политику - вроде нельзя. Есть ли реальные случаю когда 1с "пожаловалась " на такой сервис.
6. TitanLuchs 395 01.02.23 22:27 Сейчас в теме
(3) У нас есть ответ от компании 1С, где сказано, что владелец нашего веб-портала не нарушает лицензионного соглашения, если в наличии есть запас неиспользуемых в данный момент клиентских лицензий, превышающий или равный количеству одновременно работающих пользователей веб-портала.
7. van_za 243 01.02.23 23:12 Сейчас в теме
(5)
"Не всегда может работать корректно. Необходимо помнить, что на одном сеансе может работать одновременно несколько пользователей."
- не могу представить что каким то образом установленный параметр сеанса может измениться в однопоточной системе, если есть пример просьба привести, не понятно.
8. TitanLuchs 395 01.02.23 23:22 Сейчас в теме
(7) При подключении http-сервиса будет поднят сеанс, у которого в ПараметрыСеанса.ТекущийПользователь будет содержаться пользователь, указанный, например, в default.vrd. Неважно, какой это пользователь, пусть Иванов ИИ. Вы предлагаете переопределить этого пользователя в какой-то момент? Чтобы в ПараметрыСеанса.ТекущийПользователь был Петров ПП? Или я неправильно понял?
9. van_za 243 01.02.23 23:30 Сейчас в теме
(8) в методе авторизации который вы используете поверх 1с ного
устанавливаете Петров ПП и все будет хорошо. по крайней мере я так думаю :)
10. TitanLuchs 395 01.02.23 23:34 Сейчас в теме
(9) Теоретически - да. Необходимо проверять на разных сценариях.
12. пользователь 05.02.23 18:19
Сообщение было скрыто модератором.
...
14. пользователь 05.02.23 20:11
Сообщение было скрыто модератором.
...
15. пользователь 06.02.23 06:22
Сообщение было скрыто модератором.
...
16. пользователь 06.02.23 09:10
Сообщение было скрыто модератором.
...
17. пользователь 06.02.23 09:59
Сообщение было скрыто модератором.
...
18. пользователь 06.02.23 10:11
Сообщение было скрыто модератором.
...
22. TitanLuchs 395 10.02.23 14:34 Сейчас в теме
(21) Мы обнаружили взаимосвязь между размером файла и задержкой, которая предшествует его загрузке. Поэтому ваш метод скорее всего даст существенный выигрыш времени.
Оставьте свое сообщение