AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.08.2018, 17:19   #1  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Электронные больничные
Никто еще не скрещивал Nav и электронные больничные ? Хоть что-то автоматизации поддается ?
Старый 27.08.2018, 17:59   #2  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Итак, вожусь с веб-сервисом славного ФСС. Из документации только вот это:
http://fz122.fss.ru/doc/API%20%D1%88...%82%D0%B0).pdf
Начал писать функцию с целью получить хоть что-нибудь от их сервиса:

X++:
txtSoapAction  := '"http://asystems.fss/IGatewayService/UploadsGet"';
txtMethod      := 'POST';
txtContentType := 'application/soap+xml; charset=utf-8';
FullXMLText1 := '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">' +
                '<s:Header>' + 
                '<a:To>http://docs.fss.ru/ExtService/GatewayService.svc</a:To>' + 
                '</s:Header>';
FullXMLText2 := '<s:Body>' + 
                '<UploadsGet xnlns="http://asystems.fss">' +
                '<regNum>000000003</regNum>' +
                '<filter>Year</filter>' +
                '</UploadsGet>' +
                '</s:Body>' + 
                '</s:Envelope>';
CLEAR(vBigText);
vBigText.ADDTEXT(FullXMLText1);
vBigText.ADDTEXT(FullXMLText2);
vBigText.GETSUBTEXT(TempString,1);
oXMLDom := oXMLDom.XmlDocument();
oXMLDom.LoadXml(TempString);
SendHttpRequest(oXMLDom,oXMLDom);
FullXMLText1@1000000009 : Text[1024];
FullXMLText2@1000000008 : Text[1024];
FullXMLText3@1000000007 : Text[1024];
FullXMLText4@1000000006 : Text[1024];
vBigText@1000000010 : BigText;
oXMLDom@1000000012 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";


Дальше функция SendHttpRequest:

X++:
LOCAL SendHttpRequest(VAR InXMLDom : DotNet "System.Xml.XmlDocument";VAR OutXMLDom : DotNet "System.Xml.XmlDocument")
oXMLHttp := oXMLHttp.Create(TextURI);
oXMLHttp.Method(txtMethod);
oXMLHttp.ContentType(txtContentType);

streamWritter := streamWritter.StreamWriter(oXMLHttp.GetRequestStream);
streamWritter.Write(TempString);
streamWritter.Close();

XMLHttpResponse := oXMLHttp.GetResponse();
OutXMLDom.Load(XMLHttpResponse.GetResponseStream);
XMLHttpResponse.Close();
oXMLHttp@1000000002 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpWebRequest";
streamWritter@1000000004 : DotNet "'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.StreamWriter";
XMLHttpResponse@1000000008 : DotNet "'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Net.HttpWebResponse";
TextURI@1000000009 : TextConst 'RUS=http://docs.fss.ru/ExtService/GatewayService.svc';

На методе GetResponse получаю ответ 500 Internal Server Error. И на их тестовом сервере, и на боевом. Тестовый у них еще и лежит периодически. Что я делаю не так ? С SOAP знаком только по картинке, не могу понять, где ошибка.
Старый 28.08.2018, 12:40   #3  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Добрый день.
1.Для начала, ставим расширение Chrome
Wizdler
Parses the WSDL files and generates SOAP messages for you.

2.В строку браузера вводим http://docs.fss.ru/ExtService/GatewayService.svc?wsdl
3.Получаем WSDL и нажимаем Brouse WSDL справа от строки в браузере.
4.Выбираем нужный метод и на новой вкладке и получаем строку запроса.
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<UploadsGet xmlns="http://asystems.fss">
<regNum>[string?]</regNum>
<filter>[string?]</filter>
</UploadsGet>
</Body>
</Envelope>

5. Тестируем для получения ответа по контрольным данным
6. Сохраняем ответ как xml файл
7. В VStudio генерируем xsd схему
8. С mibuso.com качаем xmlport генератор и с помощью его создаем xml порт, с помощью которого будем "толкать данные" в Нав.
Остальное, после п.8))
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
За это сообщение автора поблагодарили: apanko (4), Ivanhoe (10), mira (1), BuzCom (1).
Старый 30.08.2018, 16:30   #4  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Цитата:
Сообщение от Captain Посмотреть сообщение
Добрый день.
1.Для начала, ставим расширение Chrome
Wizdler
Parses the WSDL files and generates SOAP messages for you.

2.В строку браузера вводим http://docs.fss.ru/ExtService/GatewayService.svc?wsdl
3.Получаем WSDL и нажимаем Brouse WSDL справа от строки в браузере.
4.Выбираем нужный метод и на новой вкладке и получаем строку запроса.
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<UploadsGet xmlns="http://asystems.fss">
<regNum>[string?]</regNum>
<filter>[string?]</filter>
</UploadsGet>
</Body>
</Envelope>

5. Тестируем для получения ответа по контрольным данным
6. Сохраняем ответ как xml файл
7. В VStudio генерируем xsd схему
8. С mibuso.com качаем xmlport генератор и с помощью его создаем xml порт, с помощью которого будем "толкать данные" в Нав.
Остальное, после п.8))
Продолжение на примере проверки ИНН от ФНС.
Приведенный код и примеры являются компиляцией из открытых источников и свободны для повторения. Все, что связано с версиями 2013 и выше - пишите. Есть много особенностей под дот нет))
9. Создаем 2 XML port для запроса и ответа.
OBJECT XMLport 50090 FNS_IN
{
OBJECT-PROPERTIES
{
Date=02.03.15;
Time=17:06:18;
Modified=Yes;
Version List=FNS;
}
PROPERTIES
{
Format/Evaluate=C/SIDE Format/Evaluate;
OnPreXMLport=BEGIN
NS1:=NSpace1;
NS2:=NSpace2;
GINN:=FORMAT(INN_Data);
GKPP:=FORMAT(KKP_Data);
END;

}
ELEMENTS
{
{ [{4E5AED0B-AAC1-42D7-B8E4-DE6D629CE557}]; ;SOAP-ENV:Envelope ;Element ;Text }

{ [{41F0E8B4-BE37-42BF-BB1A-E80C953C63C0}];1 ;xmlns:SOAP-ENV ;Attribute;Text ;
VariableName=NS1 }

{ [{272C626D-C440-4D50-BE0E-746331EB2F6C}];1 ;xmlns:ns1 ;Attribute;Text ;
VariableName=NS2 }

{ [{A29C2347-2ABB-414D-A77B-DE2ECFFF2D47}];2 ;SOAP-ENV:Body ;Element ;Text }

{ [{E2F37891-73FF-47DE-97E5-E2E16F64C66E}];3 ;ns1:NdsRequest2 ;Element ;Text }

{ [{3E16A058-DD58-4CA9-9A99-D935003B84C6}];4 ;ns1:NP ;Element ;Text }

{ [{8AF4C84C-49A1-46F3-B0F0-938A73AD46EA}];5 ;INN ;Attribute;Text ;
VariableName=GINN;
Occurrence=Required }

{ [{84F74032-6134-4F6F-B948-3990EC1C8769}];5 ;KPP ;Attribute;Text ;
VariableName=GKPP;
Occurrence=Optional }

{ [{CCAEA469-7C24-4808-81CE-7B9B7F6A9D0F}];5 ;DT ;Attribute;Text ;
VariableName=DT;
Occurrence=Optional }

}
EVENTS
{
}
REQUESTPAGE
{
PROPERTIES
{
}
CONTROLS
{
}
}
CODE
{
VAR
NSpace1@1000000000 : TextConst 'RUS=http://schemas.xmlsoap.org/soap/envelope/';
NSpace2@1000000001 : TextConst 'RUS=http://ws.unisoft/FNSNDSCAWS2/Request';
INN_Data@1000000002 : Text[30];
KKP_Data@1000000003 : Text[30];

PROCEDURE SetData@1000000000(iNN@1000000000 : Text[30];kPP@1000000001 : Text[30];Code@1000000002 : Code[20];Type@1000000003 : 'Customer,Vendor');
BEGIN
INN_Data:=iNN;
IF kPP='0' THEN KKP_Data:='' ELSE KKP_Data:=kPP;
END;

BEGIN
END.
}
}

OBJECT XMLport 50091 FNS_OUT
{
OBJECT-PROPERTIES
{
Date=12.03.15;
Time=11:13:56;
Modified=Yes;
Version List=FNS;
}
PROPERTIES
{
}
ELEMENTS
{
{ [{FF0A767F-7900-4629-B884-9BAC08CAB6B6}];0 ;Envelope ;Element ;Text ;
VariableName=Envelope;
MinOccurs=Once;
MaxOccurs=Once }

{ [{5954D8C6-02C6-4443-946B-CECD2D615BC8}];1 ;Body ;Element ;Text ;
VariableName=Body;
MinOccurs=Once;
MaxOccurs=Once }

{ [{464364A2-28F2-4823-AB11-CCA1EB732751}];2 ;NdsResponse2 ;Element ;Text ;
VariableName=NdsResponse2;
MinOccurs=Once;
MaxOccurs=Once }

{ [{7D49C9D3-0B83-4614-A258-1032BFB8C85A}];3 ;DTActFL ;Attribute;Text ;
VariableName=NdsResponse2_DTActFL;
TextType=Text;
Occurrence=Required }

{ [{439B59AC-86EC-4189-8B81-B4559EE87460}];3 ;DTActUL ;Attribute;Text ;
VariableName=NdsResponse2_DTActUL;
TextType=Text;
Occurrence=Required }

{ [{6460C37B-8D02-43A2-9C0E-FEC47B2A05E5}];3 ;NP ;Element ;Text ;
VariableName=NP;
MinOccurs=Once;
MaxOccurs=Once }

{ [{75990FFE-FD72-406F-B9B8-61E478F60104}];4 ;INN ;Attribute;Text ;
VariableName=NP_INN;
TextType=Text;
Occurrence=Required }

{ [{52A39C1E-ACF2-4081-A977-00600A1B4B14}];4 ;KPP ;Attribute;Text ;
VariableName=NP_KPP;
TextType=Text;
Occurrence=Optional }

{ [{7825E896-2A49-4E55-A0CC-64A2830B1633}];4 ;State ;Attribute;Text ;
VariableName=NP_State;
TextType=Text;
Occurrence=Optional;
Import::OnAfterAssignVariable=BEGIN

IF GType=GType::Customer THEN BEGIN
Cust.GET(GCode);
Cust."FNS Status":=NP_State;
Cust."FNS Status Date":=FORMAT(WORKDATE);
Cust.MODIFY(FALSE);
END ELSE BEGIN
Vend.GET(GCode);
Vend."FNS Status":=NP_State;
Vend."FNS Status Date":=FORMAT(WORKDATE);
Vend.MODIFY(FALSE);
END;
END;
}

}
EVENTS
{
}
REQUESTPAGE
{
PROPERTIES
{
}
CONTROLS
{
}
}
CODE
{
VAR
Cust@1000000000 : Record 18;
Vend@1000000001 : Record 23;
GType@1000000002 : 'Customer,Vendor';
GCode@1000000003 : Code[20];

PROCEDURE SetData@1000000000(code@1000000002 : Code[20];type@1000000003 : 'Customer,Vendor');
BEGIN
GType:=type;
GCode:=code;
END;

BEGIN
{
--------------------------------------------------------------------------------
-- XMLport automatically created with Dynamics NAV XMLport Generator 1.3.0.2
-- Copyright © 2007-2012 Carsten Scholling
--------------------------------------------------------------------------------
}
END.
}
}



10. Создаем CU or Report для реализации логики. Функция RemoveNameSpace - необходима для "очистки" входящего потока.

OBJECT Report 50090 FNS
{
OBJECT-PROPERTIES
{
Date=12.03.15;
Time=11:19:00;
Modified=Yes;
Version List=FNS;
}
PROPERTIES
{
}
DATAITEMS
{
{ PROPERTIES
{
DataItemTable=Table18;
OnPreDataItem=BEGIN
Windows.OPEN('#1######',"No.");
END;

OnAfterGetRecord=BEGIN
IF "VAT Registration No."='' THEN CurrReport.SKIP;
CLEAR(XP1);
CLEAR(XP2);
XP1.SetData("VAT Registration No.","KPP Code","No.",0);
XP2.SetData("No.",0);
SendMessage;
Windows.UPDATE;
END;

OnPostDataItem=BEGIN
Windows.CLOSE;
END;

ReqFilterFields=No.;
}
SECTIONS
{
}
}
{ PROPERTIES
{
DataItemTable=Table23;
OnPreDataItem=BEGIN
Windows.OPEN('#1######',"No.");
END;

OnAfterGetRecord=BEGIN
IF "VAT Registration No."='' THEN CurrReport.SKIP;
CLEAR(XP1);
CLEAR(XP2);
XP1.SetData("VAT Registration No.","KPP Code","No.",1);
XP2.SetData("No.",1);
SendMessage;
Windows.UPDATE;
END;

OnPostDataItem=BEGIN
Windows.CLOSE;
END;

ReqFilterFields=No.;
}
SECTIONS
{
}
}
}
REQUESTFORM
{
PROPERTIES
{
Width=9020;
Height=3410;
}
CONTROLS
{
}
}
REQUESTPAGE
{
PROPERTIES
{
}
CONTROLS
{
}
}
CODE
{
VAR
DefType@1000000007 : TextConst 'RUS=„®Єг¬Ґ­вл XML (*.xml)|*.xml|‚ᥠ” ©«л (*.*)|*.*';
XP1@1000000005 : XMLport 50090;
XP2@1000000004 : XMLport 50091;
XMLDoc@1000000003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";
XMLHttpConn@1000000002 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{AFBA6B42-5692-48EA-8141-DC517DCF0EF1}:'Microsoft XML, v6.0'.ServerXMLHTTP";
InStr@1000000001 : InStream;
OutStr@1000000000 : OutStream;
Windows@1000000006 : Dialog;

PROCEDURE SendMessage@1000000002();
VAR
TempTable@1000000000 : TEMPORARY Record 99008535;
BEGIN
//setup the temporary table so that we can handle the XML without saving it to disk first
//create a couple of streams to transfer the data in and out of the BLOB field
CLEAR(TempTable);
TempTable.Blob.CREATEINSTREAM(InStr);
TempTable.Blob.CREATEOUTSTREAM(OutStr);

//the request XMLport fills the BLOB with the XML message
//CLEAR(XP1);
XP1.SETDESTINATION(OutStr);
XP1.EXPORT;

//load the message into the XML automation variable
IF ISCLEAR(XMLDoc) THEN
CREATE(XMLDoc);
XMLDoc.load(InStr);

//this is for diagnostics only, so you can see what the XMLport actually produced
//XMLDoc.save('C:\Temp\XMLRequest.txt');

//create the HTTP connector
IF ISCLEAR(XMLHttpConn) THEN
CREATE(XMLHttpConn);

//tell it where the web service is located
//XMLHttpConn.open('POST','http://fat-aardvark.net/DataService.asmx',FALSE);
XMLHttpConn.open('POST','http://npchk.nalog.ru/FNSNDSCAWS_2',FALSE);

//set some values in the request header depending on what the service requires
//XMLHttpConn.setRequestHeader('Host','fat-aardvark.net');
//XMLHttpConn.setRequestHeader('SOAPAction','http://ws.unisoft/NdsRequest2');
XMLHttpConn.setRequestHeader('Content-Type','text/xml');

//actually send the message
XMLHttpConn.send(XMLDoc);

//get the response
XMLDoc.load(XMLHttpConn.responseXML);

//tell us if we got an error (it is 200 because the response definition said "200 OK")
IF XMLHttpConn.status <> 200 THEN BEGIN
MESSAGE('Status %1 %2',XMLHttpConn.status,XMLHttpConn.statusText);
EXIT;
END;

//this is for diagnostics only, so you can see what you got back
//XMLDoc.save('C:\Temp\XMLResponse1.xml');

//take away the namespaces
RemoveNamespace(XMLDoc,XMLDoc);

//this is for diagnostics only, so you can see what it looks like after the namespaces have gone
//XMLDoc.save('C:\Temp\XMLResponse2.xml');

//fill the BLOB with the response XML
XMLDoc.save(OutStr);

//the response XMLport reads the data from the BLOB and processes it
//CLEAR(XP2);
XP2.SETSOURCE(InStr);
XP2.IMPORT;
END;

PROCEDURE RemoveNamespace@1000000004(VAR Source@1000000000 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";Destination@1000000001 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument");
VAR
TempTable@1000000002 : TEMPORARY Record 99008535;
XMLStyleSheet@1000000003 : Automation "{F5078F18-C551-11D3-89B9-0000F81FE221} 6.0:{F6D90F11-9C73-11D3-B32E-00C04F990BB4}:'Microsoft XML, v6.0'.DOMDocument";
StyleOutStr@1000000004 : OutStream;
StyleInStr@1000000005 : InStream;
BEGIN
//this has been taken from a Microsoft knowledgebase aricle and strips out the
//namespaces from an XML message using a style sheet

TempTable.Blob.CREATEOUTSTREAM(StyleOutStr);
TempTable.Blob.CREATEINSTREAM(StyleInStr);
StyleOutStr.WRITETEXT('<?xml version="1.0" encoding="UTF-8"?>');
StyleOutStr.WRITETEXT('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">');
StyleOutStr.WRITETEXT('<xslutput method="xml" encoding="UTF-8" />');
StyleOutStr.WRITETEXT('<xsl:template match="/">');
StyleOutStr.WRITETEXT('<xsl:copy>');
StyleOutStr.WRITETEXT('<xsl:apply-templates />');
StyleOutStr.WRITETEXT('</xsl:copy>');
StyleOutStr.WRITETEXT('</xsl:template>');
StyleOutStr.WRITETEXT('<xsl:template match="*">');
StyleOutStr.WRITETEXT('<xsl:element name="{local-name()}">');
StyleOutStr.WRITETEXT('<xsl:apply-templates select="@* | node()" />');
StyleOutStr.WRITETEXT('</xsl:element>');
StyleOutStr.WRITETEXT('</xsl:template>');
StyleOutStr.WRITETEXT('<xsl:template match="@*">');
StyleOutStr.WRITETEXT('<xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>');
StyleOutStr.WRITETEXT('</xsl:template>');
StyleOutStr.WRITETEXT('<xsl:template match="text() | processing-instruction() | comment()">');
StyleOutStr.WRITETEXT('<xsl:copy />');
StyleOutStr.WRITETEXT('</xsl:template>');
StyleOutStr.WRITETEXT('</xsl:stylesheet>');
IF ISCLEAR(XMLStyleSheet) THEN
CREATE(XMLStyleSheet);
XMLStyleSheet.load(StyleInStr);
IF ISCLEAR(Destination) THEN
CREATE(Destination);
Source.transformNodeToObject(XMLStyleSheet,Destination);
END;

EVENT XMLDoc@1000000003:ndataavailable@198();
BEGIN
END;

EVENT XMLDoc@1000000003:nreadystatechange@-609();
BEGIN
END;

BEGIN
END.
}
RDLDATA
{
}
}


__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 30.08.2018, 16:32   #5  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Правда многое из знаний пришлось собирать вручную. Я про компиляцию.))Всем удачи и хорошей Пятницы!
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
За это сообщение автора поблагодарили: mira (1).
Старый 30.08.2018, 16:39   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от Captain Посмотреть сообщение
Правда многое из знаний пришлось собирать вручную. Я про компиляцию.))Всем удачи и хорошей Пятницы!
У вас уже пятница?
__________________
Ivanhoe as is..
Старый 30.08.2018, 16:56   #7  
Captain is offline
Captain
Участник
Лучший по профессии 2017
 
300 / 81 (3) ++++
Регистрация: 28.02.2003
Ага, а точнее ... отпуск))
__________________
---------------------------------------------------------------------------------------------
"Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица
Старый 31.08.2018, 12:31   #8  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Ох. С отправкой и приемом еще кое-как понятно, а вот с шифрованием и подписанием у ФСС это какой-то ад....
Старый 24.10.2018, 08:15   #9  
jonny.do is offline
jonny.do
Участник
 
7 / 11 (1) +
Регистрация: 14.02.2018
Как успехи? ничего путного не вышло?
Старый 24.10.2018, 11:21   #10  
BuzCom is offline
BuzCom
Участник
 
59 / 17 (1) ++
Регистрация: 10.08.2017
Пока остановились на том, что принимается больничный в АРМ, выгружается в XML, его импортирую в BLOB в больничный в Нав. Как расчитают ставку, выгружаю опять в XML с цифрами уже и через АРМ его отсылаю.
Правда, пока еще ни одного не делали так. А всякую автоматику и подписи в Наве делать не стал пока, времени потратится много, а выхлопа 0.001 процент.
За это сообщение автора поблагодарили: mira (1).
Старый 25.10.2018, 16:12   #11  
jonny.do is offline
jonny.do
Участник
 
7 / 11 (1) +
Регистрация: 14.02.2018
Моя очередь из путного наткнулся на это
http://www.cyberforum.ru/web-service...ad2078783.html

если чего выйдет выложу здесь..
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Электронные счета-фактуры Васыо NAV: Прочие вопросы 8 31.01.2013 13:45

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:09.