О своем веб-клиенте я на Infostart Event рассказывал уже три раза:
-
Онлайн связь сайтов в базой данных 1С (доклад конференции 2016-го года)
-
3000 пользователей на трехъядерном Атлоне: сверхтонкий клиент для 1С (доклад конференции 2017-го года)
-
Как работают управляемые формы и тонкий клиент 1С – взгляд «из-под капота» (доклад конференции 2019-го года)
Это – четвертый доклад. До этого было больше теории, сегодня будет больше практики. Я постараюсь вам за 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.