1С: Предприятие 8.2/8.3 в качестве Web-сервера

1. DWZ2 14.05.18 11:06 Сейчас в теме
Дано: на сервере есть каталог с кучей файлов с именами вида 00000.dat, 00001.dat, 00002.dat и т.д. размером от 2 до 5 мегабайт каждый.

Требуется, чтобы при обращении к данному (или можно к другому компьютеру) по URL вида

ip-компьютера\bin\get_file.php?kusok=число из имени файла см. выше&id=13 любых цифр

происходило бы следующее:

1. При первом обращении отправлялся бы файл с номером указанным после kusok=, то есть если выдан URL

ip-компьютера\bin\get_file.php?kusok=1000&id=1234567890123

то надо отправить файл 01000.dat

2. При последующих обращениях с тем же URL номера файлов должны увеличиваться на 1, то есть по URL

ip-компьютера\bin\get_file.php?kusok=1000&id=1234567890123

надо последовательно отправлять файлы

01001.dat, 01002.dat, 01003.dat и т.д.

3. Если в этот момент влезет кто-то с другим &id=, то для него последовательность начинается заново, а для других продолжается, будто бы этого новичка и не было.

Например, первый аппарат продолжает повторять URL см. выше

и ему выдают файлы 01065.dat, 01066.dat и т.д., хотя после ?kusok= у него стоИт 1000. В этот момент влезает другой аппарат и выдаёт тот же ?kusok=1000, но со своим id.

ip-компьютера\bin\get_file.php?kusok=1000&id=9876543210123

В результате для второго аппарата (с id=9876543210123) последовательность начинается с 1000 - грузятся файлы 01000.dat, 01001.dat, 01002.dat, 01003.dat и т.д.

а для первого (с id=1234567890123) его последовательность продолжается 01067.dat, 01068.dat и т.д.

4. Если какой-то аппарат вдруг изменит ?kusok= в своём URL, то нужно выдать файл с номером после ?kusok=, а затем опять через 1 по возрастающей

Например, когда второй аппарат начнёт повторять URL

ip-компьютера\bin\get_file.php?kusok=2000&id=9876543210123

мы должны отправлять ему файлы 02000.dat, 02001.dat, 02002.dat и т.д.

5. (Опционально) URL должен "протухать" через 1,5 мин, то есть если мы повторяя URL

ip-компьютера\bin\get_file.php?kusok=1000&id=9876543210123

дошли до 01065.dat и через минуту повторили его снова, то должны получить 01066.dat. А вот если задумаемся на 1,5 мин и больше, то счётчик должен сброситься и мы должны получить 01000.dat "с чистого листа".

P.S. То, что до get_file.php настраивается, само get_file.php и после - нет.

Можно ли сделать ТАКОЕ средствами 1С? Если 8.2 не потянет, можно и 8.3 задействовать. Или всё, finita - надо специальные языки использовать?

Есть ли у 1С какие ограничения на число параллельных сеансов, то есть сколько последовательностей с разными id могут максимально поддерживаться?

Граждане! *ВЫРУЧАЙТЕ!!!* В пятницу утром всё уже должно работать, а у меня ещё конь не валялся :((((((
По теме из базы знаний
Найденные решения
24. dnkon 23 14.05.18 22:40 Сейчас в теме
На досуге написал такой сервис - в прикрепленных dt с базой примером.
Платформа 1С:Предприятие 8.3 (8.3.10.2561)
В базе присутствует константа в которую устанавливается каталог файлов которые будут отправляться клиенту (каталог должен заканчиваться на символ \ ) и к нему должен быть доступ, а так же регистр сведений для хранения данных сеансов.
Как публиковать базу можно почитать здесь. Параметры публикации базы оставлял по умолчанию.
По результатам публикации тестировал получение файлов на следующем URL http://localhost/get_file_base/hs/GetFileService/get_file.php?kusok=1000&id=1234567890123

За 100 процентную правильность реализации не ручаюсь - но думаю подкрутить что то Вам проблемы не составит.
Прикрепленные файлы:
СервисПолученияФайлов.dt
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. mad375 14.05.18 11:44 Сейчас в теме
(1) А к чему такая зацикленность на 1с? Не уверен что можно выдать произвольный файл через веб-сервис. На Bottle+Mysql такой проект построить быстрее и проще, например, учитывая что логика минимальная.
4. DWZ2 14.05.18 12:09 Сейчас в теме
(3)
Просто надо очень срочно, и я не уверен, что смогу быстро выдать результат на новой для меня технологии
2. FIGOR 14.05.18 11:39 Сейчас в теме
Ограничения сеансов в 1С это количество лицензий 1С. Вроде так.
Однако задача может быть решена на 1С даже на 8.2 путем применения веб-сервисов 1С.

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

Да даже можно связать просто технологию MS ASP + connection к 1С. Работать будет дольше.
5. DWZ2 14.05.18 12:11 Сейчас в теме
(2)

[quote]Однако задача может быть решена на 1С даже на 8.2 путем применения веб-сервисов 1С.[/quote]

А можно по-подробнее?
6. Sapiens_bru 4 14.05.18 12:47 Сейчас в теме
Какие проблемы то?
Если пишем свою конфу с нуля, обработка запроса очень простая
Время жизни сессии и параллельность запросов оставьте нормальным средствам разработки, а у нас тут 1С !

Пишем http сервис с методом get (Платформу берём 8.3.10)
Этот сервис получает 2 параметра - ID файла и ID запроса.
Регистр сведений "Сессии" делаем периодический по секундам, измерение - ID запроса
Регистр сведений "ТекущиеЗаписи" делаем не периодический . Измерение ID запроса, ресурс ID файла.

Из "Сессии" читаем дату последнего запроса, если она отстала от текущей более чем на 90 секунд - последовательность пора сбрасывать.

Пишем в "Сессии" текущий ID

Если последовательность сбрасывается - Пишем в "ТекущиеЗаписи" ID файла и отдаём нужный файл в ответ http сервиса.
Если последовательность не сбрасывается - Читаем из "ТекущиеЗаписи" ID файла и отдаём нужный файл в ответ сервису

Увеличиваем счётчик в "ТекущиеЗаписи"

Всё
7. Sapiens_bru 4 14.05.18 12:50 Сейчас в теме
(6)
Можно регламентное задание настроить на ежедневную очистку регистров от вчерашней информации
8. DWZ2 14.05.18 13:08 Сейчас в теме
(6)

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

2. Что я должен сделать, чтобы эта обработка получила параметры из URL? Или хотя бы сам URL?

3. Как отправить файл через Web вызывающей стороне? И как дать ей ошибки 402/403/404 ?

4. Нужно ли публиковать конфигурацию, которая отправляет файлы?

5. Нужен ли Web-сервер? Какой? Как его настроить для связи с 1С?
18. Sapiens_bru 4 14.05.18 18:21 Сейчас в теме
(8)
1. Нет. Экземпляр 1С сам запустится при получении входящего запроса (запускается упрощённый вариант платформы без графики). Стартует быстро, но, конечно, в сотни раз медленнее специализированного скрипта. Секунды против милисекунд

2. Прочитать статью https://infostart.ru/public/516810/ . Сделать как написано

3. Считать его в XMLСтрока или аналогичное и записать это в тело ответа. Коды ошибок 500+ платформа нарисует сама, коды меньшие можно задать в ответе.

4. Нужно публиковать сервисы базы, которая отправляет файлы. Конфигурацию или саму базу целиком можно не публиковать

5. Прочитать статью https://infostart.ru/public/516810/ . Сделать как написано
22. DWZ2 14.05.18 22:19 Сейчас в теме
(18)

Спасибо, посмотрю, отпишусь.
9. FIGOR 14.05.18 13:37 Сейчас в теме
(5) Если,к примеру, написать веб-сервис чтобы отдавать файл (возвращать из вызова функции) его вызывать из клиента, то ведь веб-сервисы еще в 1С 8.1 работают.

Второй вариант, я так решал частную проблемку: создал скрипт на MS ASP, где клиент вызывал веб-сервер MS, а скрипт ASP (обрабатывая должным образом URL) вызывал веб-сервис 1С 8.1 на веб-сервере и возвращал клиенту ответ. В скрипте использовался объект MSXML2.XMLHTTP для вызова веб-сервиса 1С.
10. FIGOR 14.05.18 13:45 Сейчас в теме
А можно вопрос спросить?
Почему руководство решило поставить задачу обработать веб-запросы, не относящиеся в принципе к 1С программисту 1С, а не веб-программисту ? Я думаю, что если просто даже на форумах веб-программистов поспрашивать, то там ответ бы уже был дан в виде файла-скрипта решения в связке с какой-нибудь базой SQL Lite :))
11. DWZ2 14.05.18 13:58 Сейчас в теме
(10)

Почему руководство решило поставить задачу обработать веб-запросы,


Начальство не ставило задачу "обработать веб-запросы", оно и слов таких не знает. Ему надо, чтобы всё работало ™ и в заданный срок.

не относящиеся в принципе к 1С


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

Я ещё боюсь, чтобы про работу с мобильными телефонами не вспомнили, тьфу-тьфу-тьфу.

программисту 1С, а не веб-программисту ?


Веб-программист отсутствует, как класс. С админа спрос небольшой - "мне не надо бежать быстрее медведя, мне надо лишь бежать быстрее тебя" (с). Об электрониках и говорить нечего. Правда, ТУТ свою часть работы они выполнили.

ответ бы уже был дан в виде файла-скрипта решения в связке с какой-нибудь базой SQL Lite


Я не люблю использовать код, как обезьяна, не понимая, как он работает. К тому же начальству хотелось бы увидеть 1С в работе, чтобы не было мучительно больно за бесцельно потраченные деньги. (Ну, не совсем, бесцельно, конечно. Но раз заплачено в том числе и за Web, значит, должен быть и Web)

К тому же это ещё за собой, как пить дать, и Linux потянет. И утону я во всём этом. А мне надо срочно.
19. Sapiens_bru 4 14.05.18 18:27 Сейчас в теме
(11)
Срочно это отдать на аутсорс. К примеру я такое напишу/настрою часа за 3. Но когда в этом только разбирался, ушло много дней на понимание и на гугление не туда и не того.
(11)
Я не люблю использовать код, как обезьяна, не понимая, как он работает

Судя по задаваемым вопросам, именно так и придётся решать эту задачу. Наугад тыкая в чужой код в надежде получить свой результат. Знания не сверхсложные, но их много. Слишком много для нескольких дней на осмысленное решение
23. DWZ2 14.05.18 22:22 Сейчас в теме
(19)


Срочно это отдать на аутсорс. К примеру я такое напишу/настрою часа за 3.


А сколько это будет стоить?
12. FIGOR 14.05.18 14:08 Сейчас в теме
Тогда следует для начала поднять веб-сервер с использованием 1С возможностей для начала. А потом посмотреть примеры работы с html. (для начала вернуть клиенту через броузер "Здравствуй мир!"). Можно и на других системах, типа PHP. Ведь принципы работы http одинаковы для всех систем: формируется запрос, формируется на сервере ответ, отправляется на клиента.

Я так полагаю, что клиентскую часть, вызов из броузера тоже придется писать. тогда еще и Java учить значит надо и html.
13. DWZ2 14.05.18 14:26 Сейчас в теме
(12)
Я так полагаю, что клиентскую часть, вызов из броузера тоже придется писать


Да нет, это уже написано до нас. По крайней мере, так считается. И я должен быть 100%-но чист, чтобы, если, не дай Бог, возникнет проблема с передачей данных, аргументировано доказать, что проблема не на моей стороне.
15. DWZ2 14.05.18 14:32 Сейчас в теме
(12)
Вот это уже теплее!

Тогда следует для начала поднять веб-сервер с использованием 1С возможностей для начала.


Как?


А потом посмотреть примеры работы с html.


Где?

Можно и на других системах, типа PHP.


Другие системы - это буэээ. Это надо искать, скачивать, настраивать, выбирать - и всё это во время цейтнота. Изучать язык, всё будет сбоить, ты будешь думать: "Где у меня ошибка?" - а окажется, что всё нормально, а всё дело в том, что какая-нибудь переменная окружения не установлена или права какие-нибудь не прописаны или какого-нибудь htt-файла где-то нет или в нём написано что-то не то. А времечко-то идёт.
20. Sapiens_bru 4 14.05.18 18:30 Сейчас в теме
(15)
Это надо искать, скачивать, настраивать, выбирать - и всё это во время цейтнота. Изучать язык, всё будет сбоить

Не переживай, в 1С всё ровно также. Кусок относящийся к веб отличается от куска выдающего цифры в СКД как два разных ферймворка для разных платформ и языков.
21. DWZ2 14.05.18 22:17 Сейчас в теме
(20)
Да я заметил. Восьмёрка, действительно, лоскутный продукт, как будто её community создавало, а не коммерческая фирма. Плюс к тому же разные вещи называются похожими словами, а похожие - разными.
14. FIGOR 14.05.18 14:31 Сейчас в теме
Вот качестве простого примера скрипт на ASP (позаимствован на stackoverflow.com) для MS веб-сервера возвращается файл по запросу из URL код всего ничего. Осталось только прикрепить 1С для проведения анализа действий пользователей :) Для этого можно использовать в ASP просто объект 1С ComConnection.

Так можно быстро отчитаться перед руководством. Ну а потом уже дорабатывать тему функционала веб-сервера 1С. :)))

<%
Dim objConn, strFile
Dim intCampaignRecipientID

strFile = Request.QueryString("file")

If strFile <> "" Then

Response.Buffer = False
Dim objStream
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1 'adTypeBinary
objStream.Open
objStream.LoadFromFile("F:\karthik\" & strFile)
Response.ContentType = "application/x-unknown"
Response.Addheader "Content-Disposition", "attachment; filename=" & strFile
Response.BinaryWrite objStream.Read
objStream.Close
Set objStream = Nothing

End If
%>
16. DWZ2 14.05.18 14:41 Сейчас в теме
(14)

Вот качестве простого примера скрипт на ASP для MS веб-сервера возвращается файл по запросу из URL код всего ничего.


И куда это надо написать?

Осталось только прикрепить 1С для проведения анализа действий пользователей :) Для этого можно использовать в ASP просто объект 1С ComConnection.


А можно поподробнее?

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


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

<%
Dim objConn, strFile
Dim intCampaignRecipientID
...
%> 


Я так понимаю, что тут отдаётся в бинарном виде картинка из каталога "F:\karthik\"? А имя файла через URL передаётся?
17. FIGOR 14.05.18 15:17 Сейчас в теме
ASP это текстовый файл с расширением asp, который выполняется на веб-сервере MS, включается расширением

с документацией по ASP можно много где ознакомиться в интернете и на сайте микрософта.


strFile = Request.QueryString("file")
в строке url запроса параметр "file" и будет названием файла

objStream.Type = 1 'adTypeBinary

Возвращается любой файл в виде бинарника.
о чем и говорит тип контента возвращаемого браузеру
заголовка Response.ContentType = "application/x-unknown"

подключаем в ASP 1С

Dim V8
Dim Conn

ConnSTR = "Srvr=""TEST_1C"";Ref=""Test_83"";Usr=""test"";Pwd=""test"";"

Set V8 = CreateObject("V83.COMConnector")
Set Conn = V8.Connect(ConnSTR)

' res - объект, поскольку возвращается - объектниый тип Организация
Set res= Conn.[Константы].[ОсновнаяОрганизация].[Получить]()

' присваивание строковой переменной наименования организации
NameOrg = "" & res.[Наименование]


' получение из URL параметров

kusok = Request.QueryString("kusok")
id= Request.QueryString("id")


' выполнение функции общего модуля в 1С с передачей в нее параметров
' возвращаемое значение строкового типа
res = Conn.ExternalUsage.GetCurrenNemaOfFile( kusok, id )


'
'обрабатываем далее данные
'и завершаем скрипт обнулением переменных


V8 = ""
24. dnkon 23 14.05.18 22:40 Сейчас в теме
На досуге написал такой сервис - в прикрепленных dt с базой примером.
Платформа 1С:Предприятие 8.3 (8.3.10.2561)
В базе присутствует константа в которую устанавливается каталог файлов которые будут отправляться клиенту (каталог должен заканчиваться на символ \ ) и к нему должен быть доступ, а так же регистр сведений для хранения данных сеансов.
Как публиковать базу можно почитать здесь. Параметры публикации базы оставлял по умолчанию.
По результатам публикации тестировал получение файлов на следующем URL http://localhost/get_file_base/hs/GetFileService/get_file.php?kusok=1000&id=1234567890123

За 100 процентную правильность реализации не ручаюсь - но думаю подкрутить что то Вам проблемы не составит.
Прикрепленные файлы:
СервисПолученияФайлов.dt
25. DWZ2 14.05.18 22:43 Сейчас в теме
(24)

Спасибо!!! Посмотрю, отпишусь.
26. DWZ2 03.10.18 11:57 Сейчас в теме
(24) И полгода не прошло, отписываюсь.

БОЛЬШОЕ СПАСИБО! ВСЁ РАБОТАЕТ!

Однако есть вопрос - зачем надо делать запрос к константе?

Функция ПолучитьПутьКаталогаДанных()
	
	ЗапросПутиКаталогаДанных = Новый Запрос("ВЫБРАТЬ
	|	ПутьКаталогаДанных.Значение КАК ПутьКаталогаДанных
	|ИЗ
	|	Константа.ПутьКаталогаДанных КАК ПутьКаталогаДанных");
	
	ВыборкаПутиКаталогаДанных=ЗапросПутиКаталогаДанных.Выполнить().Выбрать();
	ВыборкаПутиКаталогаДанных.Следующий();
	
	Возврат ВыборкаПутиКаталогаДанных.ПутьКаталогаДанных;
КонецФункции
Показать


Когда можно просто написать

Константы.ПутьКаталогаДанных.Получить()


и всё работает. Здесь какая-то хитрость?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот