1C 8.3 + Web38

02.02.2018

+ =

швидкий сайт який працює з 1С в реальному часі

Web38

Програма виконує роль посиредника - викликає в модулі зовнішнього з'єднання 1С функцію та повертає результат виконання.
Обмін у форматі ХМЛ. Підключення до 1С через COM-з'єднання.

Також нагадуєм про ліцензування програм 1С - потрібно мати стільки ліцензій скільки у вас реально працюючих користувачів.
Тобто якщо COM-з'єднання одне а користувачів які працюють через це з'єднання 10 значить потрібно 10 ліцензій.
Детальніше дізнавайтесь у дилерів фірми 1С.

Скачати вихідні коди. Ліцензія GNU General Public License.

Налаштування та запуск для windows

  1. В конфігурації 1С
    1. Cтворити довідник ВебПользователи
        Реквізити:
      • Пароль - Строка
      • Контрагент - СправочникСсылка.Контрагенты
      Cтворити регістр відомостей ВебСесииПользователей
        Виміри:
      • Ключ - Строка(36)
      • Пользователь - СправочникСсылка.ВебПользователи
      • ПоследняяАктивность - Дата і час
      • ІПАдресаКлюча - Строка (16) [255.255.255.255]
    2. Добавити в модуль зовнішнього з'єднання код з файлу 1С.txt
    3. Створити користувача з правами на запуск зовнішнього з'єднання
  2. Web38Form\bin\Debug
    1. Відредагувати в конфігураційному файлі config.xml стрічку підключення до 1С
    2. Запусти Web38Form.exe
  3. Помістити вміст папки wwwroot в C:\inetpub\wwwroot (У вас має бути вже налаштований IIS з ASP.NET 4.5)
  4. Набрати в бразері http://localhost/

Принцип роботи

Модуль зовнішнього з'єднання 1С. Функція ReadAccountInfo

// Функція зчитує дані акаунта
// Ключ - унікальний ключ сесії, отриманий при реєстрації
// ІПАдреса - привязка ключа до IP
Функция ReadAccountInfo(Ключ, ІПАдреса) Экспорт
	
  Попытка
		
    ВебПользовательСсилка = ПолучитьПользователяПоКлючу(Ключ, ІПАдреса);
		
    Если ВебПользовательСсилка = Справочники.ВебПользователи.ПустаяСсылка() Тогда
	    Возврат ХМЛОтвет(400, "Потрібно пройти авторизацію");
    КонецЕсли;
		
    ВебПользователь = ВебПользовательСсилка.ПолучитьОбъект();
		
    КонтрагентСсилка = ВебПользователь.Контрагент;
		
    Если КонтрагентСсилка = Справочники.Контрагенты.ПустаяСсылка() Тогда
	    Возврат ХМЛОтвет(500, "Помилка. Для акаунта не вказаний контрагент", Ключ, ВебПользовательСсилка);
    КонецЕсли;
		
    КонтрагентОбъект = КонтрагентСсилка.ПолучитьОбъект();
    КонтрагентОбъект.Прочитать();
		
    ХМЛДани = "
    |<contragent>
    |	<login>" + ВебПользователь.Код + "</login>
    |	<name>" + КонтрагентОбъект.Наименование + "</name>
    |	<contacty>" + КонтрагентОбъект.Комментарий + "</contacty>
    |</contragent>";
		
    Возврат ХМЛОтвет(200, "OK", Ключ, ВебПользовательСсилка, ХМЛДани);
		
  Исключение
    Возврат ХМЛОтвет(500, ОписаниеОшибки());
  КонецПопытки;
	
КонецФункции
      

account.aspx. Виклик функції ReadAccountInfo

//ReadAccountInfo(Ключ, ІПАдреса)
ProtocolWeb38 Web38 = new ProtocolWeb38("ReadAccountInfo",
    new string[]
    {
        (Session["USER_GUID"] != null ? Session["USER_GUID"].ToString() : ""),
        Request.UserHostAddress
    });

Web38.Send();

switch (Web38.Packet.StateCode)
{
    case "200":
        {
            //ОК
            UserLogin.Text = Web38.Packet.UserInfo.Code;
            UserName.Text = Web38.Packet.UserInfo.Name;

            Contragent сontragent = new Contragent(Web38.XmlDoc);
            ContragentName.Text = сontragent.Name;
            ContragentСontacty.Text = сontragent.Contacty;

            Label labmsg = new Label();
            labmsg.Style.Add("color", "green");

            PlaceHolderMsg.Controls.Add(labmsg);

            break;
        }
    case "400":
        {
            //Потрібно пройти авторизацію
            Session.Abandon();
            Response.Redirect("login.aspx");

            break;
        }
    case "500":
    default:
        {
            //error
            Label labmsg = new Label();
            labmsg.Style.Add("color", "red");
            labmsg.Text = "Error: " + Web38.Packet.StateCode;

            PlaceHolderMsg.Controls.Add(labmsg);

            break;
        }
}
        

Лог Web38

[12:11:08] <-- Поток [0][receive: 193] 
<?xml version="1.0" encoding="utf-8"?>
<root><function>ReadAccountInfo</function>
  <params><item><![CDATA[8430d7d3-46f9-4c4a-a139-86c579b68794]]></item><item><![CDATA[::1]]></item></params>
</root>

[12:11:08] --> Поток [0][send: 365] 
<?xml version="1.0" encoding="windows-1251"?>
<root>
	<state code="200" guid="8430d7d3-46f9-4c4a-a139-86c579b68794">
		<info><![CDATA[OK]]></info>
		<user>
			<code>1</code>
			<name>Іван Васильович</name>
		</user>
	</state>

<contragent>
	<login>1</login>
	<name><![CDATA[Перший Іван Васильович]]></name>
	<contacty><![CDATA[1]]></contacty>
</contragent>	
</root>