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

Публикация № 1501249 20.08.21

Разработка - Системная интеграция - Интеграция с WEB

При разработке сайтов, интегрированных с 1С через HTTP-сервисы, приходится бороться с кодировками, искать производительные интерфейсные решения и задумываться над безопасностью. В ходе онлайн-митапа «Web-клиенты для 1С» Юрий Лазаренко показал на практике, как работает магия самодельного веб-клиента и как решать проблемы, возникающие при интеграции.

Основой этого доклада стало мое выступление на Infostart Event 2019 «Как работают управляемые формы и тонкий клиент 1С, взгляд из-под капота» – именно поэтому в названии темы опять упоминается «подкапотное пространство».

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

 

Принципы работы самописного веб-клиента

 

 

Самописный веб-клиент – это чаще всего подсистема для конфигурации 1С на платформе 8.3 и выше, потому что ему для работы требуется наличие HTTP-сервисов, которые появились в платформе 8.3.6. Еще лучше, чтобы конфигурация работала на платформе от 8.3.9.1919, потому что с этой версии произошли серьезные улучшения в работе платформы с с веб-сервисами и HTTP-сервисами: появилось переиспользование сеансов, улучшилась скорость работы HTTP-сервисов. Если запустить свой веб-интерфейс на версии 8.3.9.1919 и более старой версии – вы заметите разницу.

Запросы от браузера принимаются HTTP-сервисом и передаются на исполнение общим модулям 1С. В процессе выполнения запроса производятся необходимые действия с объектами ИБ 1С – мы можем вызвать некий произвольный HTTP-сервис, передать ему название функции, которую мы хотим выполнить, и при необходимости передать ей параметры. Например, если мы напишем HTTP-сервису «Клиент, выполни функцию ТекущаяДата() и верни результат», он нам вернет обратно текущую дату. Но если мы ему напишем «Очисти информационную базу», он очистит информационную базу, поэтому к вопросу безопасности мы обязательно вернемся.

После того, как HTTP-сервис выполнил свои действия, он преобразует результат в формат HTML и возвращает его браузеру пользователя, который отображает информацию на странице сайта.

 

Два варианта интеграции с сайтом

 

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

  • интегрированный в сайт (чтобы запускать туда внешних пользователей);

  • как автономное веб-приложение в интрасети (для доступа сотрудников компании).

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

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

 

Архитектура в режиме интеграции с сайтом

 

 

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

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

В первую очередь, промежуточный сайт необходим с точки зрения безопасности, чтобы не выставлять базу данных наружу. Мы создаем промежуточный сайт и доступ к HTTP-сервису 1С открываем только для IP-адреса, которому соответствует промежуточный сайт. Если кто-то со стороны попробует задолбить базу 1С запросами, у него ничего не получится. Конечно, можно и сам сайт задолбить запросами, но в этом случае база 1С не “ляжет”.

 

 

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

 

 

Веб-сервер выполняет авторизацию с помощью указанного в default.vrd логина и пароля. Также можно указывать логин и пароль пользователя 1С в PHP – сохранить их в неком скрипте на стороне промежуточного сайта.

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

 

 

Когда пользователь авторизуется на сайте, он указывает не логин и пароль пользователя 1С, который указан в конфигураторе, а логин и пароль из отдельного справочника «Посетители сайта». Этот логин и пароль обрабатывается с помощью HTTP-сервиса.

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

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

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

 

 

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

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

Время от времени мы регламентным заданием чистим неактивные устаревшие сессии.

 

 

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

Например, мы говорим коннектору: «Выполни функцию ТекущееВремя()», после чего HTTP-сервис через стандартный 1С-ный метод Выполнить() или Вычислить() просто запускает эту функцию (в данном случае, ТекущееВремя()) и получает результат.

 

 

В зависимости от статуса выполнения запроса этот результат формируется в виде HTML-кода.

И с помощью HTTP-сервиса этот код HTML-страницы возвращается обратно пользователю.

 

 

Далее все повторяется по циклу: выполняется HTTP-запрос, соответствующий следующему действию пользователя.

 

Архитектура в режиме веб-приложения в интрасети

 

 

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

Скрипты запускаются из браузера прямо с этого сервера.

 

 

Разница в том, что авторизация выполняется в данном случае платформой 1С.

 

 

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

 

Схема работы веб-клиента. Плюсы и минусы выбранных подходов

 

 

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

Работа собственного веб-клиента состоит в том, чтобы показать пользователю некую страницу инициализации – мы ее называем «Главной страницей». На главной странице может быть все, что угодно – например, список документов.

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

 

 

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

Плюсы

  • Ускоряется разработка кода. Если у вас появилась задача вызвать функцию, которую вы раньше не вызывали, вам не нужно дорабатывать HTTP-сервис, добавлять ему методы – вы вызываете функцию, указывая ее название на стороне клиента в JavaScript.

  • Если вы не доработали код, нет необходимости переопубликовывать базу, все будет работать.

Из минусов:

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

 

 

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

  • база у нас доступна только для IP сайта – кто угодно не достучится до HTTP-сервиса;

  • вы защищены от DDOS средствами сайта.

Часто задают вопрос: что мы будем делать, если нас начнуть «ддосить»? Есть очень много инструментов, которые позволяют отловить DDOS для обычного сайта. Наши промежуточные PHP-скрипты – это и есть промежуточный сайт, для них действуют абсолютно те же правила, те же инструменты, как и для любого другого сайта. Поэтому отловить DDOS, определить его начало, легко и мы просто в определенный момент в нашем PHP-скрипте перестаем перенаправлять запросы в 1С. Наш веб-клиент при этом «ложится», но база 1С продолжает работать. На случай, если базу начинают долбить запросами, повиснет только промежуточная база – на работу основной базы это не повлияет. Но даже этот вопрос решается.

Из минусов:

  • незначительно увеличивается время HTTP-запросов.

 

Состав и интерфейс решения

 

Давайте покажу, как это выглядит на стороне 1С.

 

 

На стороне 1С веб-клиент – это набор объектов, общих модулей, справочников. Это все встраивается в родительскую конфигурацию, которая должна стать CMS-системой, СУБД для веб-клиента.

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

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

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

 

 

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

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

 

 

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

Для перенаправления запросов используется любимый всеми curl.

 

 

Вот так выглядит js-скрипт, который отвечает за фронт. Здесь строк намного больше – 5722. Это все написано за более чем 10 лет. Эта версия уже пятая, первую версию мы начали писать в 2008 году. Мы ей даже сами не смогли пользоваться. Вторую было стыдно показать людям. Только третью можно было использовать так, чтобы было не стыдно.

Итак, у нас есть скрипты сайта и подсистема в 1С – что мы получаем на выходе?

 

 

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

На экране – один из примеров нашего интерфейса, который называется «Заказ товаров».

 

 

При входе в личный кабинет пользователь видит свой список заказов.

 

 

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

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

 

Авторизация пользователей

 

 

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

  • логин;

  • пароль пользователя;

  • его имя;

  • и объект ИБ – ссылка на элемент какого-либо справочника, которому соответствует посетитель сайта.

Кому соответствует посетитель сайта, зависит от конкретной конфигурации, например:

  • если речь идет о демонстрационной конфигурации «Заказы», то это будет контрагент (партнер);

  • если речь о конфигурации «1С:ITIL», посетитель будет пользователем.

 

 

Мы используем свой алгоритм авторизации. Его плюсы:

  • логин может быть привязан к справочнику любого типа – Пользователи, Контрагенты;

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

Минус:

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

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

При поступлении HTTP-запроса в 1С вместе с его заголовками передается идентификатор сеанса, взятый из cookies. По этому идентификатору сеанса в регистре сведений мы находим посетителя сайта и подставляем его в документ.

 

 

Пароль служебного пользователя можно задать в файле default.vrd, но такой способ может вызывать ситуацию, когда после перехода на новую платформу веб-клиенты перестают работать. Это вызвано тем, что при перепубликации новой платформы пользователи на веб-сервере затираются.

Поэтому мы доработали свой скрипт init.php, добавили в инициализацию curl несколько строк:

  • Первой строкой для параметра CURLOPT_HTTPAUTH указываем, что у нас используется basic-аутентификация.

  • И второй строкой для параметра CURLOPT_USERPWD через двоеточие указываем имя и пароль пользователя.

Проблема уходит моментально. Вот два способа, чтобы запустить пользователя в 1С, не спрашивая у него логин и пароль.

 

 

В интрасети мы можем использовать стандартную авторизацию пользователей средствами 1С:

  • Это не требует доработки кода для определения параметра сеанса ТекущийПользователь – существенный плюс.

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

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

А для пользователей в интрасети, когда используется авторизация средствами 1С – RLS отработает нормально.

 

 

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

Здесь происходит вызов функции НайтиПосетителяСайтаПоИдентификаторуСеанса(ПараметрыЗапроса), который в переменную ПосетительСайта возвращает нам ссылку на элемент справочника «ПосетителиСайта».

Если сайт используется в интрасети, тогда:

ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;

В этом случае у нас RLS нормально отработает.

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

ТекущийПользователь = ПосетительСайта.ОбъектИБ;

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

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

 

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

 

 

Как в браузере выполнить функцию 1С, получить результат и отобразить его на странице?

Точно так же, как вы делаете при попытке достучаться из одной 1С-ки к HTTP-сервису другой 1С-ки – у вас для этого есть объект «Новый HTTPЗапрос()».

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

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

 

 

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

 

 

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

ГлобальныйКонтекст.Формы.ТЧ_Товары.ТекущиеДанные()

Отладчик веб-страницы выводит нам абсолютно то же самое, что и отладчик 1С, когда мы пытаемся получить ТекущиеДанные() для динамического списка.

 

 

У нас есть структура, которая содержит данные колонок этой строки. Здесь выводится цена, номенклатура, характеристика, количество и т.д.

Чтобы получить актуальную стоимость товара, мы из текущих данных должны взять идентификатор ссылки (я чуть позже объясню, почему он здесь в таком непривычном виде) и передать его в 1С.

 

 

Как в 1С есть структура, точно так же в JavaScript есть ассоциативные массивы, у которых есть связка «Ключ/Значение».

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

Соответственно, мы в ассоциативный массив «Параметры» передаем JSON-структуру с данными всей строки.

Далее мы выполняем функцию НоменклатураПриИзменении() общего модуля ЗаказТоваров и передаем в нее сериализованное значение ассоциативного массива Параметры.

Функция «ВыполнитьФункцию1С» достаточно простая, у нее есть четыре параметра:

  • ИмяФункции,

  • Параметры,

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

 

 

Вот так выглядит функция «НоменклатураПриИзменении» в 1С – все данные из браузера передаются сюда в переменной «ПараметрыЗапроса» с типом Соответствие.

Через соответствие удобно получать параметры запроса в коде – например, получить вид цен через вызов ПараметрыЗапроса[“ВидЦен”]

Если параметр «ВидЦен» не будет передан в параметрах запроса, код не упадет, в значении ПараметрыЗапроса[“ВидЦен”] будет просто «Неопределено».

Обратите внимание, когда мы получили вид цен и данные текущей строки, мы получаем цену, помещаем ее структуру «ТекущиеДанные» и точно так же в виде структуры, конвертированной в JSON, возвращаем обратно в браузер.

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

 

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

 

 

Я только что показал пример – чтобы получить цену номенклатуры, нам нужно передать ее (номенклатуру) в 1С.

У нас для этого есть две маленькие однострочные функции – ПредставлениеСсылкиДляСайта и ПредставлениеСсылкиОбъекта.

  • «ПредставлениеСсылкиДляСайта» возвращает структуру, куда упакована ссылка и ее представление.

  • ссылка упаковывается с помощью функции «ПредставлениеСсылкиОбъекта», где для нее сначала выполняется функция ЗначениеВСтрокуВнутр(), а потом КодироватьСтроку с параметром СпособКодированияСтроки.КодировкаURL..

Вот так мы получаем представление ссылочного объекта в 1С и передаем его в браузер, а потом из ссылочного представления получаем объект обратно.

Как видите, мы для этого используем функцию ЗначениеВСтрокуВнутр().

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

А в случае использования функции ЗначениеВСтрокуВнутр() нам достаточно всего одного значения, выполняется функция довольно быстро, не тормозит. Если вдруг в каких-то будущих релизах платформы 1С эта функция перестанет работать, мы легко переделаем функцию ПредставлениеСсылкиОбъекта() – просто поменяем сериализацию на использование XMLЗначение(). Конечно, после этого в браузере представление ссылки будет выглядеть каким-то другим образом, но мы к этому тоже без проблем приспособимся.

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

Обратите внимание, здесь есть символы %22 и т.д. – это результат работы функции КодироватьСтроку(). Потому что результат функции ЗначениеВСтрокуВнутр() содержит фигурные скобки, а фигурные скобки по умолчанию в HTTP-запрос не пройдут – HTTP-запросы на таких служебных символах ломаются. Плюс JSON такое значение нормально не обработает, а мы любим JSON – в коде 1С мы все возвращаем через JSON, и в коде JS мы тоже сначала все данные кладем в ассоциативный массив, а затем при необходимости сериализуем в JSON.

Способ передачи данных между 1С и браузером – ассоциативный массив на стороне браузера и структура на стороне 1С. И наш любимый JSON.

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

Любые другие строки, если вдруг в них будут знаки амперсанда, проценты, фигурные скобки и т.д., мы тоже обрабатываем функцией КодироватьСтроку(). А цифры и значения типа «Булево» передаются в JSON без изменений – этого достаточно, чтобы 1С и браузер могли обмениваться друг с другом информацией.

 

В итоге у вас на стороне клиента в конкретном поле input лежит ссылка на определенную номенклатуру – вы можете увидеть ее значение в атрибуте ref этого поля. А представление будет лежать в атрибуте value.

 

 

С точки зрения JS все сложнее – тут суть в том, что метод ГлобальныйКонтекст.Формы.ТЧ_Товары.ТекущиеДанные() возвращает массив со значениями полей текущей строки:

  • Ссылки «Номенклатура», «ЕдиницаИзмерения» и «Характеристика» у нас превращаются в ассоциативные массивы с полями «Ссылка» и «Представление».

  • «Количество» как было цифрой, так и осталось цифрой.

  • А служебный реквизит «Использовать характеристики» – это false, ложь.

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

 

Решение проблемы с кодировкой

 

 

Когда вы разрабатываете под веб, у вас есть две боли.

  • Первая боль – гриды, таблицы.

  • Вторая боль – кодировка.

 

 

Когда в 2016 году мы разрабатывали подсистемы отправки файлов для нашего веб-клиента, нормально отправить файл в 1С нам удалось с 99 попытки.

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

Но когда вы передаете данные из браузера в 1С, вы с этим намучаетесь.

 

 

Чтобы у вас было меньше проблем с кодировкой:

  1. Кодировка вашего сайта должна быть только UTF-8. Если вам подсовывают другой сайт, у которого кодировка Windows-1251 и просят туда что-то интегрировать из 1С, всеми способами постарайтесь переделать в UTF-8. Вы потратите не один день, чтобы у вас в 1С приходили не кракозябры, а нормальная кириллица.

  2. Чтобы из браузера информация приходила красиво, используется функция encodeURIComponent – она преобразует служебные символы в трехсимвольные конструкции вида %22 и т.д.

  3. А в 1С вы просто эту закодированную строку пропускаете через функцию РаскодироватьСтроку. А если хотите передать это в браузер – используйте КодироватьСтроку.

  4. Файлы передавайте в виде двоичных данных.

Запомните эти четыре основных принципа, они сэкономят вам часы и дни.

 

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

 

 

Перейдем к вопросу безопасности.

Изначально у нас был один HTTP-сервис, которому можно написать что угодно, например: «Покажи зарплату директора», и он показывал.

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

 

 

Какие есть способы обезопасить информацию.

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

 

 

 

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

Зато если мы на промежуточных скриптах отловим этого нехорошего человека, мы заблокируем его DDOS и избежим атаки на базу данных 1С.

 

 

При этом систему безопасности локальной сети можно настроить так, чтобы запросы принимались только с IP промежуточного сайта.

 

 

Доступ к конфигурации 1С осуществляется через объект конфигурации HTTP-сервис через служебного пользователя.

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

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

 

 

В нашу конфигурацию, отвечающую за генерацию веб-форм, встроены дополнительные меры безопасности:

  • Каждые 5 минут мы меняем идентификатор пользователя – пользователь не сможет перенести идентификатор на другую машину, чтобы зайти под другим пользователем, потому что пока он будет это делать, идентификатор «протухнет». Можно настроить так, чтобы делать это каждую минуту – проблем не возникнет.

  • Мы не используем OData, используем HTTP-сервисы – поэтому когда запрос приходит, то он отрабатывается в функцией модуля HTTP-сервиса, где мы можем проверить легитимность запроса программно.

 

 

Например, если мы хотим отобразить форму личного кабинета, то мы сначала проверяем посетителя сайта – найден он или нет. Если он не залогинен – мы возвращаем текст формы «ИнициаторНеАвторизован».

 

 

Текст формы личного кабинета мы вернем только если пользователь авторизован – иначе мы ему вернем сообщение, что не знаем его.

Но да, это нужно будет делать практически в каждой функции.

 

 

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

Результат HTTP-запроса формирует функция ExecuteСформироватьРезультат() – в ней много разных проверок.

 

 

Запрос будет выполнен только если функция НетВнедренияКода() вернет «Истина».

 

 

Функция НетВнедренияКода() разбирает имя функции, которую просят выполнить – по точкам, по скобкам и т. д. И далее, путем парсинга мы определяем, является ли эта функция достойной выполнения.

 

 

Функции, достойные выполнения, сохранены в настройках сайта.

Например, сейчас мы можем выполнить только функции, которые лежат в общих модулях ЛичныйКабинетИнициатораСайт и ЛичныйКабинетИнициатораСайтPython.

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

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

Это один из способов – таким образом мы запрещаем к выполнению даже функцию «ТекущаяДата», нам ее ни в коем случае не покажут.

 

 

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

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

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

 

Формирование отчета с параметрами

 

 

Одна из самых распространенных задач – запустить в базу своих сотрудников, чтобы они могли получить расчетные листки за определенный период, или внешних поставщиков, которые могли бы увидеть остатки в своих взаиморасчетах.

 

 

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

  • Дать пользователю возможность авторизоваться – я рассказал, как это делается.

  • Обеспечить возможность выбора элементов ссылочных типов. Чтобы иметь возможность формировать отчеты, вам нужно решить, как вы будете выбирать ссылочные типы, чтобы потом эту ссылку передать запросом. Это основная проблема, потому что не так просто сделать так, чтобы при нажатии на кнопку выбора организаций появился список объектов. Нам для реализации этой функциональности пришлось потратить очень много времени. Если у вас небольшой набор элементов, самое простое – реализовать обычный выпадающий список,. Но если у вас 200-300 элементов или иерархия – выпадающий список не подойдет, здесь нужен обычный грид, а это вторая боль, про которую я говорил. В разработке веб-клиентов для 1С есть две проблемы: кодировки и гриды.

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

 

 

Мы для ввода дат используем элемент управления типа text, к которому прикреплена библиотека xCal, отображающая календарь, и добавлены скрипты, которые обрабатывают нажатия клавиш, определяющие, какие символы мы можем сюда ввести. Только таким образом вы добьетесь нормального ввода дат и текста.

 

 

При формировании отчета вам нужно:

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

  • Проверить корректное заполнение параметров – это важно, потому что на сторону 1С можно передать все, что угодно

  • Сформировать отчет с помощью СКД.

  • Сохранить результат как табличный документ в формате HTML.

  • Прочитать этот HTML-файл и вернуть браузеру его содержимое.

Если посмотреть, не так уж много действий. Сделать свой веб-клиент сможет любой 1С-ник среднего уровня.

 

 

Но с передачей результата отчета в браузер тоже достаточно много проблем

  • Мы столкнулись с тем, что у диаграмм собственные стили – диаграммы в СКД очень красивые, выводятся в SVG-формате, но перед передачей результата стили у них нужно удалить.

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

  • Нам это вернется в виде HTML-документа с тегом body – получится один body внутри другого. Поэтому меняем корневой тег body на div.

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

 

 

Вот функция, которая отвечает за адаптацию HTML-документа в нормальный HTML-код – как видите, чтобы сделать HTML-документ нормально читаемым, потребовалось 200 строк кода.

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

Но если вы делаете простой вариант – просто страничку, куда ваш сотрудник может залогиниться и указать период, за который он хочет получить отчет – вы можете использовать для выбора периода стандартные нативные поля с типом date и ничего не конвертировать. Просто возвращаете текст вашего документа, и в 99% случаях он будет нормально работать. Свой веб-клиент – это несложно.

 

 

Очень важное замечание – бывало, что мы формируем отчет, но он нам не показывает ничего, потому что мы его сформировали с помощью СКД.

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

Казалось бы, если мы прочитали данные запросом, вывели результат в HTML-код и вернули пользователю – мы должны увидеть таблицу. Но с отчетом это не прокатит – чтобы СКД сформировала данные и дала их отобразить, вам нужны права на просмотр объекта, а не только на чтение.

 

Интерфейс веб-приложения

 

 

Если вы научитесь формировать отчеты, у вас, чаще всего, будут покрываться 80% запросов ваших заказчиков, которые хотят выставить 1С-ку наружу.

 

 

На слайде перечислены элементы страниц, которых достаточно для формирования интерфейса. Динамический список – это обычная таблица table в терминах html, в данном случае у нее фиксированная шапка.

 

 

Для формирования страниц у нас используется два варианта.

В первом случае мы берем HTML, разбиваем на шаблоны, храним их в 1С, на стороне 1С полностью все собираем, возвращаем в виде HTML-кода.

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

 

 

Во втором случае мы передаем на клиент только данные и при сборке страницы завязываемся на готовые фреймворки – такие как Vue, React, Angular.

В этом случае у нас появляются дополнительные места, которые могут сломаться. Поэтому сопровождение усложняется.

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

  • больше действий при разворачивании веб-приложения,

  • разработка занимает больше времени,

  • сопровождение для обычного 1С-ника становится более сложным.

 

 

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

На слайде приведена статистика – использование второго варианта за последние пять лет понадобилось только один раз из тысячи. Это 1% от общего числа выполненных проектов. И только на одной таблице из 10.

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

 

Тяжелые HTTP-запросы

 

 

Давайте обсудим вопрос – какого размера строку мы можем передать?

 

 

Дело в том, что 1С довольно интересно работает с запросами больших размеров. Большие размеры начинаются примерно с 1 МБ. 3 МБ – это много для нее, 10 – очень много.

Например, мы из интерфейса нашего хелп-деска хотим передать в 1С файл.

Нам нужно из браузера, в котором есть JavaScript, в котором есть объект, XMLHttpRequest (по сути, HTTP-запрос в терминах 1С), сказать – вот двоичные данные, ты прими их платформой, передай HTTP-сервису – он знает, что с ними делать. Преврати эти двоичные данные в файл и передай в 1С.

 

 

Когда файлы у нас были размером 53 килобайта, все было окей. Но когда файлы стали размером 10 МБ, они стали загружаться за 51 секунду. При этом:

  • Сначала файл из браузера за секунду загружался на промежуточный сайт или напрямую в 1С. Отправляю файл, и счетчик загрузки за секунду доходит до 100%.

  • Но HTTP-сервис в отладчике запускался только через 50 секунд.

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

И мы никак не можем повлиять на то, что файл так долго где-то висит. У нас были проблемы с тем, что пользователь пытался прикрепить файл, ему сайт не выводил никакой реакции о том, что файл прикрепился – пользователь повторял процедуру несколько раз, а мы потом получали сразу 10 файлов.

 

 

Даже если мы работали через промежуточной сайт, который превращал файл в двоичные данные в ОЗУ – в HTTP-сервис он все равно попадал только через 50 секунд.

 

 

Оказалось, 1С плохо принимает большие файлы, но легко их сама скачивает.

В чем преимущество промежуточного сайта на сервере:

  • Мы этот файл за 1 секунду закачиваем на промежуточный сайт и сохраняем как временный файл на диске.

  • Дальше перенаправляем HTTP-запрос в 1C, но не включаем в него данные файла, а просто говорим HTTP-запросу, что пришел файл – он лежит на PHP-сервере с таким-то названием.

  • 1С направляет HTTP-запрос на PHP-сервер, он забирает файл и загружает его за секунду.

В итоге вместо 51 секунды у нас получается 2,2 секунды.

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

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

 

Вопросы

 

Какое у вас установлено время жизни сеанса и HTTP-соединения?

У нас используется стандартное время жизни сеанса – 20 секунд. Мы его никогда не меняли. В каких случаях есть смысл его менять? 1С долго запускается при первичном запуске. Если у нас кто-то зашел через HTTP-сервис и запустил 1С, в первый раз она загружается долго. При повторном запуске она будет загружаться быстро – это значит, что есть разогретый сеанс, который висит на сервере и через него все быстро выполняется. Есть смысл выставлять длительность жизни сеанса, чтобы хотя бы один сеанс висел разогретый и ждал, когда придет пользователь и захочет зайти в веб-интерфейс. Потому что на базах большого размера это заметно. Базы иногда могут подключаться по несколько секунд.

Как решается вопрос, если одновременно редактируется один и тот же документ?

Это, конечно же, необходимо блокировать на стороне сервера. Если честно, у нас пока такой необходимости не возникало. Если редактируется документ, он редактируется либо одним пользователем извне. Вопрос важный, для этого чаще всего нужно ставить программную блокировку. Либо сделать какой-то регистр сведений «Заблокированные объекты». Когда пользователь здесь открывает форму на просмотр, мы можем сразу создать соответствующую запись в регистре сведений и сказать, что этот документ менять нельзя.

Возможно ли заменить HTTP-сервис на SOAP веб-сервис? Если да, то какие различия в использовании будут при построении архитектуры?

Возможно, но зачем? HTTP-сервисы работают быстрее, они более оптимизированы для больших нагрузок. Если у вас нет HTTP-сервисов, потому что вы используете старую версию платформы – тогда да, возможно. Работать будет, но медленнее. У нас в промежуточном скрипте сейчас используется curl для HTTP-запросов, а здесь нужно будет поменять вызов curl на вызов веб-сервиса. И все будет работать.

В чем преимущество перед metadata.js – нагрузка на сервер ниже?

Про metadata.js ничего не скажу, это не наша разработка, у нас аналог. Но нагрузка на сервер у нас низкая – причем не в разы, а на порядки. В моем докладе 2017 года об этом подробно рассказано. Разница в экономии доходила до 50 раз – нам удавалось на одном сеансе веб-сервера запускать 50 пользователей.

А какой стандарт JSON используете? JSON-RPC?

Стандартный JSON, который отдает 1С или JS. Если нам нужно передать данные из браузера в 1С, я не собираю JSON руками. Я беру массив или ассоциативный массив и потом делаю JSON.stringify() и получают JSON. Аналогично и в 1С – я использую для этого ЧтениеJSON и ЗаписьJSON.

Получилось ли у вас реализовать постраничный вывод?

Да, он у нас не совсем постраничный. Это подгрузка строк. У нас есть справочник, в котором около 10 тысяч записей. Если бы мы их выводили сюда сразу все, то открытие этой формы заняло бы около 30 секунд. А сейчас у нас реализована порционная подгрузка – по сути, это тот же самый постраничный вывод, но здесь оно работает так же, как динамический список 1С. По умолчанию показываем 50 строк и потом подгружаем еще по 50. Обычный постраничный вывод тоже работает, но там есть особенности – для его отображения нужен индекс, по которому мы будем сортировать, получать эти порции. Пришлось помучиться. Но это реально, работать будет.

Доступно ли что-то из показанного вами в опенсорсе?

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

Как выводится всплывающая форма?

Мы взяли здесь за основу Bootstrap. У нас не используется никаких глобальных библиотек, все свое, за исключением каких-то мелких компонент вроде xCal, который нам позволяет отображать календари. Мы взяли за основу окно Bootstrap, просто сделали для него собственный обработчик отображения. В данном случае, это div с классом modalwin. Только мы для него стиль display: block устанавливаем программно своим кодом. Плюс у него есть подложка. То есть реализовано совсем просто – это div с абсолютным положением на странице.

Как реализован ввод по строке – при каждом keyup происходит обращение к HTTP-сервису?

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

 

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

Данная статья написана по итогам доклада (видео), прочитанного на онлайн-митапе "Web-клиенты для 1С". Больше статей можно прочитать здесь.

Приглашаем всех 11-12 ноября принять участие в INFOSTART EVENT 2021 в Москве: //infostart.ru/events/1451228/

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Snitkovski 88 21.08.21 11:21 Сейчас в теме
Давно внимательно наблюдаем за развитием Проекта - Юрию респект! 8-)
maksa2005; TitanLuchs; +2 Ответить
2. wacko 249 21.08.21 17:23 Сейчас в теме
3. krylovim 23.08.21 10:58 Сейчас в теме
Хорошая подробная статья, спасибо автору.

Самого всегда интересовали вопрос лицензирования в таком подходе.
Все собираюсь подробный вопрос отправить в 1С, но Ваша статья опередила, задам Вам :)

- считается ли такой подход мультиплексированием? (судя по ответам на типовые вопросы лицензирования - должен бы)

- есть ли различия в трактовке мультиплексирования при использовании промежуточных звеньев (бекенд, отдельные СУБД для сайта, обмен данными вместо прямого обращения)?
По сути это вопрос про грань между фронтенд на JS <-> 1C и, например, БУС <-> 1C

Прорабатывали ли Вы эти вопросы и как ориентируете пользователей продукта?
4. Pawlick 10 24.08.21 00:17 Сейчас в теме
(3) Присоединяюсь. Поскольку вызов 1С происходит под одной учётной, а по факту базу потенциально используют хреналион пользователей, то как на это смотрит отдел лицензирования 1С?
axelerleo; +1 Ответить
5. axelerleo 315 25.08.21 11:03 Сейчас в теме
Очень познавательная и информативная статья!
Пришел к похожим подходам для использования в корпоративной сети - скрипты и вспомогательные файлы - на веб-сервере. Но вместо возврата готового html сделал возврат json-а, а отрисовку, пагинацию и прочее реализовал уже средствами браузера.
За идею переиспользования одного служебного пользователя - спасибо, любопытный подход! Но тоже возник вопрос по лицензированию. Зная 1С, что-то мне подсказывает, что такая стратегия может выйти боком в случае проверки.

Хотя на самом деле это очень странная политика лицензирования.
Вот могу я например, подключить результаты http запроса в excel в качестве источника данных. Нужно ли мне на это дело отдельную лицензию?
Или допустим, интегрирована 1С и sharepoint portal. На портал могут заходить порядка 700 человек. Сам портал данные дергает из 1С ЗУП - кто в отпуске, у кого ДР, кто в командировке, и т.п. Нужно ли при этом 700 лицензий 1С? технически - не нужно, т.к. актуализация выполняется регламентировано раз в сутки по ночам... в общем, не совсем понятно.
А если так подходить к мультиплексированию, то давайте посмотрим на интернет-магазины: на сайте 10 000 человек, они видят остатки и номенклатуру, загруженную из 1С. Период обновления остатков, допустим, 30 минут. Нужно ли нам 10 000 лицензий? :)
6. AntonProgma 31 25.08.21 12:37 Сейчас в теме
Для выполнения лицензионной политики можно рассмотреть вариант базы данных на php-сервере. Минибитрикс. Таким образом это уже не прокси для работы с 1с, а отдельная система, с которой у 1с настроен обмен. Обмен может быть частым.
7. Pawlick 10 25.08.21 15:42 Сейчас в теме
Коллеги, тут в каком то обсуждении много копий на эту тему поломали. И в общем вердикт такой: нельзя так делать. Там где то в лицензионном соглашении есть формулировка со смыслом: один пользователь, получающих информацию из бд - одна лицензия.
Тут конечно можно долго спорить про формулировки, но применять такой подход в тиражом решении - крайне опасно. Потому как в случае чего суд однозначно станет на сторону 1С. И расходны, который понесёт изобратеталь будут несопоставимы с расходами на создание сервера баз данных с нуля, под управлением чего тот не пропиоритарного.
8. TitanLuchs 292 25.08.21 15:52 Сейчас в теме
Про лицензии. Есть официальный ответ от 1С, где сказано, что:

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

Поэтому мы каждому своему клиенту говорим то же самое.
Даже если между 1Ской и браузером пользователя есть прокладка в виде скриптов, даже если авторизация идет под одним сеансом - неважно: если в итоге на стороне первоначального отправителя запроса сидит живой человек, то это пользователь, и для него нужна лицензия. То есть, ботами, обменами и прочими роботами стучитесь сколько угодно. Человеками - только с лицензией. Фактически она не съедается, поэтому можно держать в шкафу нераспечатанной.

По поводу "а нафига тогда вообще весь этот сарафан, если сэкономить не получается". На самом деле очень даже получается хотя бы на железе. Подключение через http и переиспользование сеансов значительно экономит оперативку и прочие ресурсы сервера. Проводили расчеты для системы, к которой должны были подключаться несколько тысяч пользователей, экономия больше миллиона. Плюс на http-сервисах можно нарисовать любой интерфейс, и дело не только в раскраске, а в возможности запуститься на чем угодно, где есть браузер. Я могу написать веб-морду, которая без проблем заработает на древнем андроиде 4-й версии с экраном 4 дюйма, причем оно будет работать комфортно. Да, я в курсе, что сейчас таких нет, но это означает, что написанный сегодня интерфейс будет и через 10 лет работать так же хорошо, как и в день подписания актов и оплаты работ по его созданию.
9. Octopus 337 25.08.21 15:54 Сейчас в теме
(8) А что если у меня в условном вебе сидит пять человек, рисуют свои запросы, а я их потом одним сеансом отправляю в 1С?
10. TitanLuchs 292 25.08.21 15:56 Сейчас в теме
(9) Неважно, сколько сеансов. Важно, сколько человек (и на скольки девайсах, конечно же) рисуют.
Вопрос, конечно, как если что доказать, что вот тут у вас где-то 5 человек сидит, а не 1, не 50, не 500.
11. AntonProgma 31 26.08.21 11:17 Сейчас в теме
(10) а если добавить базу данных, к которой 1с будет обращаться, обмениваясь данными, а не наоборот, то все норм) Даже если обмен раз в секунду происходит.
TitanLuchs; +1 Ответить
12. TitanLuchs 292 26.08.21 15:05 Сейчас в теме
(11) Верно, но это будет уже не совсем онлайн со всеми его минусами. Самый главный минус - обмен может отвалиться, а пользователь об этом не узнает и будет работать с устаревшими данными, как с актуальными. Это в некоторых ситуациях и не минус вовсе, но в наших проектах чаще всего именно недостаток, а не преимущество. Ну и "холостые" обмены без активности пользователей тоже излишни. Да и любое дополнительное звено - потенциальная причина сбоя.
В общем, схема вполне работоспособная, жизнеспособная и возможно востребованная рынком, но не пересекается с нашей разработкой и поэтому нами мало изученная.
13. AntonProgma 31 26.08.21 15:32 Сейчас в теме
(12) база данных веб-сервиса может быть в оперативной памяти. А http запрос в локальной сети даже средствами 1с можно делать часто и не накладно. Наверное. Само собой всю схему придётся менять)
14. TitanLuchs 292 26.08.21 17:52 Сейчас в теме
(13) Я ж не утверждаю, что это не будет работать или будет работать плохо. При хорошем исполнении получится вполне достойный функционал.
15. AntonProgma 31 26.08.21 18:13 Сейчас в теме
16. Altez 256 30.08.21 06:14 Сейчас в теме
(15)
функциональность


Кто-нибудь объяснит преимущество длинного слова перед коротким?
Прикрепленные файлы:
17. AntonProgma 31 30.08.21 09:58 Сейчас в теме
(16) счит-ся, что эт корот. форма - жаргон и, как термин, обоз-ет нечто друг-е, чем набор функций
18. Altez 256 30.08.21 11:46 Сейчас в теме
(17) АИФ пишет, с короткой формы снято клеймо "спец., компм.жарг. " (https://aif.ru/society/education/funkcional_ili_funkcionalnost_kak_pravi­lno)

По личной статистике чаще от продаванов звучит длинная форма, от техников - короткая.
вот такая

А статья-огонь, хотелось бы и про metadata.js столь же доходчиво. Из коробки не стартануло у многих.
19. AntonProgma 31 30.08.21 11:56 Сейчас в теме
(18) должна написать Российская газета, чтобы это официально вступило в силу.
Оставьте свое сообщение

См. также

.Net в 1С. На примере использования HTTPClient, AngleSharp. Удобный парсинг сайтов с помощью библиотеки AngleSharp, в том числе с авторизацией аля JQuery с использованием CSS селекторов. Динамическая компиляция Промо

Практика программирования WEB v7.7 v8 Бесплатно (free)

Часто приходится парсить сайты, в том числе с авторизацией, перескакивая со страницы на страницу по ссылкам. Тот, кто занимался вэб программированием, знает, как удобно использовать JQuery и CSS селекторы. На .Net написана очень удобная библиотека AngleSharp. Я покажу, как с её помощью можно значительно облегчить себе труд.

10.03.2016    58183    Serginio    33    

Интеграция 1С с Битрикс24 через вебхуки

WEB v8 1cv8.cf Россия Бесплатно (free)

Пример получения токена и http запрос к API битрикса.

15.09.2021    866    TyurinArt    3    

Обмен с HTTP сервисом файлами по формату multipart/form-data

WEB v8 1cv8.cf Россия Бесплатно (free)

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

07.09.2021    1824    ix5s    20    

Разработка гибридного web-приложения на 1С, возможности и ограничения

WEB v8 Бесплатно (free)

Все чаще разработчики склоняются к использованию 1C в качестве бэкенда при разработке веб-приложений. Но благодаря встраиванию веб-клиента 1С в сайт можно получить еще больше готовой функциональности. О том, как реализовать гибридное приложение за счет связки 1С с другими веб-технологиями, рассказал разработчик компании Neti Эльдар Мингалиев.

06.09.2021    2029    Бэнни    11    

Online телефонный справочник из 1С: Зарплата и управление персоналом Промо

WEB Управление персоналом (HRM) Управление персоналом (HRM) v8 ЗУП3.x Россия Бесплатно (free)

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

10.03.2017    27166    ruha    21    

Работа с WEB-сервисами под HTTPS на примере прямого обмена между базами (1С – 1С) 

Обмен данными 1С WEB v8 Россия Бесплатно (free)

Использование веб-сервисов 1С при обмене 1С – 1С позволяет быстро передавать достаточно большие объемы данных из базы-источника в базу-приемник в объектах языка 1С. Данный метод обмена может применяться при бесшовной интеграции между двумя базами 1С, но требует определенной серверной инфраструктуры (установленного и настроенного WEB-сервера).

03.09.2021    5223    UltraUnion2005    8    

Глава 2. Как я написал (собрал с инфостарта) свой парсер сайта 1С Releases

Практика программирования WEB v8 1cv8.cf 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

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

31.08.2021    638    ldmonster    4    

Взаимодействие с api Честный знак (Молочная продукция)

WEB Практика программирования Универсальные функции v8 1cv8.cf Бесплатно (free)

Обзор основных примеров взаимодействия с Честным знаком по api для нетиповых конфигураций.

30.08.2021    1071    user5300    38    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    42951    YPermitin    41    

Умная маршрутизация: о сложностях интеграции с 1С (часть 2)

WEB v8 УТ11 Бесплатно (free)

В статье будет много примеров кода с комментариями работы расширения для обмена данными УТ11.4 с Яндекс.Маршрутизацией через выгрузку/загрузку EXCEL файла.

27.08.2021    1698    greencactus    6    

Встраивание форм 1С на страницы сайта

WEB v8 1cv8.cf Бесплатно (free)

В платформе 8.3.16 появилась возможность выводить на страницах сайта информацию из веб-клиента 1С так, что пользователь даже не заметит, что работает с платформой. Руководитель компании Айтон Михаил Пинягин на онлайн-митапе «Web-клиенты для 1С» рассказал о том, какие особенности нужно учесть при настройке встраиваемого веб-клиента, и какие возможности он дает.

27.08.2021    2070    mikepin    5    

Умная маршрутизация: кейс интеграции с 1С (часть 1)

WEB v8 Бесплатно (free)

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

18.08.2021    3873    greencactus    36    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    31202    anig99    6    

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика (Украина)

WEB v8 Украина Бесплатно (free)

Примеры вызова в 1С методов API до реестров открытой части Электронного кабинета налогоплательщика, Украина. Тестирование проводил на 1С:Предприятие 8.3 (8.3.10.2561).

28.07.2021    638    Pervuy    2    

Телеграм-бот как инструмент

WEB v8 1cv8.cf Бесплатно (free)

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

21.07.2021    3632    M_A_D    19    

Доработка в расширении Яндекс маркета (скачать все этикетки)

Практика программирования WEB v8 УТ11 КА2 Бесплатно (free)

Доработка кнопки "Скачать все этикетки" - выбрали каталог и сохранили все за один раз, а не 100500 раз нажимаем кнопку сохранить.

08.07.2021    951    rst_filippov    0    

Интеграция 1С 8 и HostCMS

WEB v8 1cv8.cf Бесплатно (free)

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

04.07.2021    777    Koder_Line    0    

API ОФД-Я разбор документации с примерами

WEB v8 1cv8.cf Россия Бесплатно (free)

Примеры запросов 1С для получения данных с ОФД-Ярус через API.

20.04.2021    786    www76    0    

Работа через сервис 1С-Отчетность нескольких пользователей

Регламентированная отчетность Зарплата WEB v8 v8::СПР ЗУП3.x Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Организации, в которых количество сотрудников превышает установленное значение, обязаны отправлять отчетность по телекоммуникационным каналам связи. Это может быть Контур-Экстерн, Такском или любой другой провайдер. Все чаще пользователи 1С используют сервис 1С-отчетность. И все чаще сертификат оформляется на сотрудника отдела кадров или бухгалтерии. В случае, если нужно оформить несколько сертификатов, возникают трудности в версии ЗУП 3.1.14 и более поздних. О том, как с ними справиться, пойдет речь в данной публикации.

05.04.2021    1820    keat24    1    

Правила обмена больше не нужны

Внешние источники данных Обмен через XML Перенос данных из 1C8 в 1C8 Распределенная БД (УРИБ, УРБД) WEB v8 Бесплатно (free)

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    11417    Nikola23    39    

Как отправить сообщение Telegram в группу?

WEB v8 Россия Бесплатно (free)

Отправка сообщения в группу Telegram.

01.03.2021    2401    kite2    2    

Альфа-Авто 5.0 и современные HTTP сервисы

WEB v8 1cv8.cf Автомобили, автосервисы УУ Бесплатно (free)

Решение, позволяющее программным продуктам, работающим на устаревших версиях платформы 1С (8.2), интегрироваться с современными HTTP сервисами. Решение, интегрированное с HTTP-сервисом программы по расчету компонентов для изготовления ЛКМ, описанное в настоящей статье, успешно работает в одном из автосервисов, работающем на устаревшей платформе и конфигурации Альфа-Авто 5.0.

01.03.2021    1069    osivv    1    

Доступ из базы 1С к стандартному интерфейсу Odata базы 1С, в которой заведен пользователь

WEB v8 Россия Бесплатно (free)

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

24.02.2021    926    user823999    6    

Интеграция с API WB (Wildberries). Создание карточки товара (спецификации)

WEB v8 1cv8.cf ИТ-компания Россия Бесплатно (free)

Опыт интеграции с API WB (Wildberries), опыт создания карточки товара, получение токенов API WB.

18.01.2021    25748    jenyavp    56    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

WEB Интеграция v8 v8::УФ 1cv8.cf Бесплатно (free)

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    3732    SizovE    25    

Выгрузка HTML описаний с картинками (Base64) товаров на сайт/интернет-магазин/B2B, разберем регулярное выражение получения тега body, ПолучитьHTML, ФорматированныйДокумент

Практика программирования WEB Универсальные функции v8 v8::УФ 1cv8.cf Бесплатно (free)

Редактор HTML платформы 1С простой и очень удобный для небольших задач, однако ПолучитьHTML возвращает отдельно картинки и отдельно целиком HTML страницу со ссылкой на имена этих картинок, что неудобно для отправки в базу данных сайта/интернет-магазина/веб-приложения/B2B. Разберем на открытом коде, как решить эту проблему, напишем универсальную функцию получения значения любого тега HTML на регулярных выражениях. Бонусом - возможность редактировать теги HTML в текстовом режиме.

24.11.2020    1161    SizovE    4    

Как сделать интеграцию (обмен) с интернет-магазином? Пошаговый план действий (Часть 1)

WEB v8 1cv8.cf УУ Бесплатно (free)

C 2011 года я занимаюсь интеграцией с интернет-магазинами и за это время, наверное, повидал все. Делал интеграцию как «культурными», так и «экзотическими» способами. Количество магазинов исчисляется сотнями. В этой серии статей я буду делиться своим опытом, а также выкладывать какие-то полезные наработки.

19.11.2020    8251    markbraer    12    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    2148    SizovE    2    

Web Dashboard (мобильная и десктопная версия): оптимальная схема организации взаимодействия с зоопарком систем

WEB v8 Бесплатно (free)

Задача: из множества систем (1С:ERP, 1C:CRM, Кронос:WMS, 1С:Розница, 1С:УПП...) оперативно и онлайн осуществлять мониторинг на телефоне/десктопе/планшете/телевизоре бизнес-аналитику в дашборде для директора. Рассмотрим в статье, как правильно интегрировать между собой все базы, какие для этого инструменты использовать.

10.11.2020    12170    SizovE    2    

Отладка модуля ДиадокПро

WEB v8 1cv8.cf Бесплатно (free)

В обработке ДиадокПро все дополнительные модули встроены во внешние обработки, которые хранятся в макетах. Это усложняет процесс самостоятельной интеграции, так как теряется возможность попасть в них в режиме отладки. Но не всё так страшно, поэтому ниже инструкция)

30.10.2020    4150    Максим-777    18    

JSON примеры меню B2B web-приложения "Личный кабинет" на движке EDIbot для телефона/десктопа

WEB v8 Бесплатно (free)

Рассмотрим на примерах работу движка EDIbot при организации меню B2B "Личного кабинета" (мобильная версия, версия десктоп) грузовладельца WMS-системы.

29.10.2020    1305    SizovE    0    

Обмен с сайтом посредством Post-запроса, json

WEB v8 1cv8.cf Бесплатно (free)

Задача - передавать на сайт объекты с наименованием и уникальным идентификатором (УИ), которые изменяются в 1С. Также нужно сохранять историю отправленных пакетов.

29.10.2020    5687    John_d    26    

Организация HTTP публикации каталога товаров используя PostgREST

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу порядок установки настройки и использования PostgREST на примере организации каталога товаров.

05.10.2020    1594    malikov_pro    2    

Интеграционная прослойка(middleware) на Golang. Часть 5 - Обмен с 1С через HTTP-сервисы платформы

WEB v8 Бесплатно (free)

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

28.09.2020    2584    dmitry-irk38    4    

Отладка http сервиса

WEB v8 Бесплатно (free)

При разработке http сервиса возникает ситуация, а как протестировать http сервис? Создали мы сервис, настроили шаблоны, передали, если нужно параметры, открываем браузер заполняем строку подключения и БАХ, ошибка. Что делать?

23.09.2020    4980    hpi    12    

Учимся создавать http сервисы (часть вторая). Передача параметра в http сервис

WEB v8 1cv8.cf Бесплатно (free)

Пошаговое руководство по созданию http-сервиса (часть вторая). Передача параметра в http сервис.

22.09.2020    8313    hpi    7    

Организация данных и вариант обработки для организации обмена с сайтом

WEB v8 1cv8.cf Бесплатно (free)

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

22.09.2020    1807    malikov_pro    4    

Формирование списка документов и скачивание печатной формы документа через веб-сайт с использованием HTTP-сервиса, плюс особенности авторизации

Практика программирования Обмен данными 1С WEB v8 1cv8.cf Бесплатно (free)

В статье показан пример, как реализовать формирование списка документов клиента/пользователя по коду, а затем скачать его (документа) печатную форму по ссылке

18.09.2020    1537    R_o_n_n_y    5    

Формирование HTTP запроса формата multipart/form-data с двоичными данными, используя ПотокВПамяти

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу вариант формирования запроса

11.09.2020    5262    malikov_pro    13    

Ферма приложений на Kubernetes

WEB v8 Бесплатно (free)

При эксплуатации большого количества информационных систем 1С, предоставляющих интернет-сервисы, возникают проблемы, связанные с зависимостью от производительности и стабильности веб-сервера. Как объединить отдельно стоящие веб-сервера с помощью платформы Kubernetes для централизованного мониторинга всех опубликованных интернет-сервисов на конференции Infostart Event 2019 Inception рассказал программист компании BIA Technologies Владимир Кирбаба.

24.08.2020    2528    ComboBoy    1    

Использование шаблонного процессора для формирования HTML страниц

WEB v8 1cv8.cf Бесплатно (free)

В статье опишу использование шаблонного процессора Handlebars запущенного на Node.js

24.08.2020    2000    malikov_pro    26    

Загрузка или обновление файла на яндекс диске через rest-api

Практика программирования Файловые протоколы обмена, FTP WEB v8 Бесплатно (free)

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

12.08.2020    3748    pavelpribytkin96    11    

Самый простой парсинг и обработка веб-страниц в 1С

WEB Универсальные функции v8 1cv8.cf Бесплатно (free)

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

07.08.2020    12197    YPermitin    22    

Загрузка или обновление файла на гугл диске

Практика программирования Файловые протоколы обмена, FTP WEB v8 1cv8.cf Бесплатно (free)

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

06.08.2020    2873    pavelpribytkin96    6