Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 4

Не могу отправить данные к серверу

18.09.2009, 09:50. Показов 2813. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день..
Есть протокол MMP mail agent http://agent.mail.ru/ru/developers/licence.html- вот его описание
Создаю сокет ,устанавливаю соединение , разобрался как формировать заголовок, далее отправляю пакет HELLO , приходит правильный ответ ASK со всеми параметрами , далее необходимо авторизоваться ...вот тут у меня проблемка... не знаю как правильно отправлять текстовые и числовые данные после заголовка...

" Все числовые данные передаются как четырехбайтные целые НЕ в сетевом формате, т. е. первым идет старший байт, последним младший. Четырехбайтовые беззнаковые целые обозначаются UL.
Текстовые данные передаются с префексированной длиной, т. е. сначала UL, а потом строка (в кодировке windows-1251) длины UL без завершающего нуля. Обозначение в дальнейшем - LPS."

Скажем , указав длину пакета в заголовке , я начинаю отправлять данные через функцию send
int send (s, buf, len, flags)
int s;
char *buf;
int len;
int flags;
Сначала надо отправить UL с длиной следующей строки... я не совсем понимаю как это сделать.. ведь данные будут отправляться в UL и как они будут преобразовываться к const char* -C++ ругается... я также пробовал отправлять в виде структуры этот тип также не получается....
Если кто не поленился заглянуть в описание протокола , подскажите что делать..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2009, 09:50
Ответы с готовыми решениями:

Не могу отправить запрос GET к серверу
procedure TForm1.Button2Click(Sender: TObject); var s: String; begin IdTCPClient1.Host := '127.0.0.1'; IdTCPClient1.Port :=...

Не могу отправить данные с МК на РС по USARTu(Atmega8535)
Здравствуйте! Помогите пож-та отправить данные от МК к РС. Динные - "HELLO, WORLD!". Проверка осуществляется с помощью программы COM Port...

Не могу отправить данные POST -ом в приложение
Кто работал с Internet Control не могу отправить данные POST -ом в приложение, Inet1.Execute (txtURL), 'POST', 'submit=login' ...

12
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.09.2009, 10:58
сначала всё формируешь, потом отправляешь поток байт

C
1
2
3
4
typedef struct {
    char msg[MAXBUF];
    unsigned short length;
} MsgBuf;
C
1
2
3
4
5
6
7
8
9
    MsgBuf b1, b2, b3;
 
    /* дальше заполняешь их в нужном порядке и байты и размеры */
 
    /* потом просто пишешь в сокет каждый буфер */
 
    MsgBuf answer;
 
    /* сюда читаешь ответ тоже в виде байтов */
сначала без функций, потом автоматизируешь сборку буфера и разбор ответа

буферы можно и по переменным разбирать и на экран выводить
0
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 4
18.09.2009, 12:11  [ТС]
Я делаю так


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
typedef struct mrim_packet_d
{ 
    u_long   dlen;  
    char* msg;
   }
mrim_packet_d;
//Потом создаю данные 
mrim_packet_d login,pass,agent,status;
login.dlen = sizeof(MAIL) -1 ;
login.msg =MAIL;
 
pass.dlen = sizeof(PASS)-1;
pass.msg = PASS;
 
status.dlen=STATUS_ONLINE;
 
agent.dlen = sizeof(PLUGIN)-1;
agent.msg = PLUGIN;
 
// Далее формирую заголовок и отправляю данные
 
int data=sizeof(login)+sizeof(pass)+sizeof(status)+sizeof(agent);
 
cout<<data;
mrim_packet_header_t packLogin2;//формирование пакета
packLogin2.magic=CS_MAGIC;      
packLogin2.proto=PROTO_VERSION;
packLogin2.seq=23;
packLogin2.msg=MRIM_CS_LOGIN2;
packLogin2.dlen=data;
packLogin2.from=0;
packLogin2.fromport = 2041;
 
send(servsocket,(char*)&packLogin2,sizeof(packLogin2),0);
send(servsocket,(char*)&login,sizeof(login),0);
send(servsocket,(char*)&pass,sizeof(pass),0);
send(servsocket,(char*)&status,sizeof(status),0);
send(servsocket,(char*)&agent,sizeof(agent),0);
 
////Принимаю ответ
mrim_packet_header_t answer2;
int len2 = recv (servsocket, (char*)&answer2, sizeof(answer), 0);
cout<<"SERVER RESPONSE="<<answer2.msg<<" "<<len2<<endl;
выдает что answer2.msg это 3435973836 , что никак не может быть ни
MRIM_CS_LOGIN_ACK 0х1004
MRIM_CS_LOGIN_REJ 0x1005

Добавлено через 6 минут
Да вообще при обращениях к любым свойствам answer2.dlen и т.д выдает этот ответ

Добавлено через 42 секунды
А длина полученных данных len2 = 0

Добавлено через 29 минут
Да и почему если я делаю так
C++
1
2
3
4
typedef struct {
    char msg[MAXBUF];
    unsigned short length;
} MsgBuf;
то при msguf.msg=MAIL

ругается что cannot convert from 'char [x]' to 'char [y]'
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.09.2009, 10:58
ты посылаешь структуры, а посылать надо массивы байтов

C++
1
2
3
4
5
send(servsocket,(char*)&packLogin2,sizeof(packLogin2),0);
send(servsocket,(char*)&login,sizeof(login),0);
send(servsocket,(char*)&pass,sizeof(pass),0);
send(servsocket,(char*)&status,sizeof(status),0);
send(servsocket,(char*)&agent,sizeof(agent),0);
то есть ты не сформировал ещё всё целиком, а уже посылаешь, сначала нужно сформировать все байты, касающиеся одной передачи отправить-принять, потом записать эти байты в буфер MsgBuf, проставить длину их (если у тебя буфер длиной тысяча, то надо для пяти байт, поставить длину пять)

и уже потом посылать эти данные из буфера
ты не посылаешь структуры, send всё равно в сокет пишет байты

Цитата Сообщение от gosha_kap
то при msguf.msg=MAIL
не знаю, что за MAIL, да и неважно, буфер заполняется функцией вроде memcpy
0
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 4
19.09.2009, 12:27  [ТС]
Т.е надо , грубо говоря , надо создать одну структуру , в потом заполнить её , а потом отправлять ...в один присест функцией send?

Добавлено через 1 час 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct packlogin
{
    struct mrim_packet_header_t head;
    u_long UL_l;
    char login[18];
    u_long UL_p;
    char* pass;
    u_long UL_s;
    u_long UL_a;
    char* agent;
}packlogin;
 
packlogin.head.magic=CS_MAGIC;
packlogin.head.proto=PROTO_VERSION;
packlogin.head.seq=3;
packlogin.head.msg=MRIM_CS_LOGIN2;
packlogin.head.dlen=28;
packlogin.head.from=0;
packlogin.head.fromport=2041;
packlogin.UL_l=sizeof(MAIL)-1;
packlogin.login=*MAIL;
packlogin.UL_p=sizeof(PASS)-1;
packlogin.pass=PASS;
packlogin.UL_s=STATUS_ONLINE;
packlogin.UL_a=sizeof(PLUGIN)-1;
packlogin.agent=PLUGIN;
 
//Где MAIL PASS PLUGIN -соответственно логин пароль название
буду дальше читать
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.09.2009, 09:06
серверу всё равно по частям приходит или всё сразу

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* WriteSocket:  выводит сообщение из pBuffer в sockd */
int WriteSocket(void *pBuffer, int sockd)
{
    MsgBuf *bp;
    int n;
    
    if ((bp = pBuffer) == NULL)
        return EOF;
    if ((n = write(
                sockd,
                bp->msg,
                bp->msgSize
            )) != bp->msgSize)
        return EOF;
    return bp->msgSize;
}
это функция на основе write, а send тоже
C
1
int send(int s, const void *msg, size_t len, int flags);
не парится насчёт структур - значит подойдёт

можно вообще сделать сперва
C
1
2
3
4
5
6
7
8
9
10
11
12
    MsgBuf t = {
        {
            0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF
        },
        20
    };
 
    WriteSocket(&t, sockd);
понимаешь да, в чём прикол ? то есть ты формируешь сначала вообще вручную, что у тебя должно получиться для отправки, потом это отправляешь, читаешь ответ тоже в буфер, потом ответ разбираешь

тут собственный пример, как всё работает, когда все интерфейсы уже построены

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include "connection.h"
#include "buffer.h"
 
main()
{
    CONN *pConn;
    MsgBuf rb;
    
    const char addr[] = "station";
    const int port = 80;
    const char request[] =
        "GET / HTTP/1.1"
        "\n"
        "host: station"
        "\n"        
        "\n";
    
    if ((pConn = CreateConnection(addr, port)) == NULL)
        return 1;
    
    printf(
        "Connected..."
        "\n"
    );
    
    TransactFileConnection(NULL, request, pConn);
    
    DestroyConnection(pConn);
    return 0;
}

запрашивает страницу и ответ выводит на NULL (это значит на stdout)
это построено на MsgBuf'ах, они спрятаны внутрях
это почищенная (типы приведены к единой форме, лишние буферы убраны)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include "connect.h"
#include "buffer.h"
 
/* подключается к узлу, посылает сообщение и выводит ответ */
main()
{
    HostConn *pCon;
    
    if ((pCon = CreateConnect("station", 25)) == NULL)
        return 1;
    
    printf(
        "Connected..."
        "\n"
    );
    
    TransFileConnect(
        stdout,
        "EHLO x"
        "\n"
        "quit"
        "\n",
        pCon
    );
    
    DestroyConnect(pCon);
    return 0;
}

и ответ к ней

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[guest@station client]$ ./client
Connected...
220 station.domain ESMTP Sendmail 8.14.1/8.14.1; Sun, 20 Sep 2009 16:04:39 GMT
250-station.domain Hello station.domain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
221 2.0.0 station.domain closing connection
[guest@station client]$
0
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 4
20.09.2009, 14:39  [ТС]
Ух...авторизовался....
Сейчас буду пробовать отправить сообщение =)
0
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 8
02.12.2009, 22:27
Здравствуйте! Я столкнулась почти с такой же проблемой, как в заголовке темы.
Описываю суть: есть две части одной программы (они разделены в потоках), 1-я половина читает данные с сетевой карты (пользуюсь сырыми сокетами), а вторая должна отправлять данные. Вот с этим-то и проблема! Функция connect проходит на "ура" (коннектиться получается), а данные не отправляются (send возвращает -1).
1) Почему это может происходить?
2) Я читала два разных мнения:
-что нельзя отправить данные, пользуясь сырыми сокетами (это по-просту не получится)
-и наоборот, что данные должны отправляться.
В сети полно примеров с использованием потоковых сокетов, но при использовании их данные даже не читались.
Надеюсь на вашу поддержку! Буду благодарна за любую помощь. Код отправки данных на всякий случай прилагаю (ОС WinXP, компилятор С++ Builder 6.0)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
 
#include "Sniff.h"
#include "Spuf.h"
#include "Unit1.h"
 
 
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Spuf::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall Spuf::Spuf(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Spuf::Execute()
{
        //---- Place thread code here ----
 
WSADATA        WSAData;
SOCKET         write;
char           PCname[128]; // Имя хоста (компьютера).
HOSTENT        *host;       // Информация о хосте.
SOCKADDR_IN    saddr;       // Адрес хоста
//IN_ADDR        sa1; //
//unsigned long  flag = 1;    // Флаг PROMISC Вкл/выкл.
tcp_hdr        tcp;
udp_hdr        udp;
ip_hdr         ip;
protoent       *pe;
servent        *se;
char           srt[10];
char           dest2[10];
char           ds[15];
unsigned short lowbyte;
unsigned short hibyte;
int            SendFiles;
AnsiString     filename;
FILE           *fp;
pe = new protoent;
se = new servent;
 
 
BYTE *buf;
IPHeader *buf_ip = new IPHeader;
buf= (BYTE*)buf_ip;
 
int len=sizeof(IPHeader)+10;
// пакет, который мы будем посылать
buf_ip->iph_verlen=5;
buf_ip->iph_ver=4; //5
buf_ip->iph_tos=0;
buf_ip->iph_length=htons(sizeof(IPHeader));
buf_ip->iph_id=htons(0x666);
buf_ip->iph_ttl=65; //255
buf_ip->iph_offset=0;
buf_ip->iph_protocol=255; //IPPROTO_TCP
buf_ip->iph_src=inet_addr("192.168.2.71"); //получаетел
buf_ip->iph_dest=inet_addr("192.168.2.55");//отправитель
buf_ip->iph_xsum=0;
 
// 1) Инициализация WS2_32
        int result=WSAStartup(MAKEWORD(2,2), &WSAData);
        if (result!=NO_ERROR) Form1->Memo1->Lines->Add("Error WSAStartup");
        Form1->Label4->Caption="1) WSAStartip...OK";
 
//2) сокет
        write = socket( AF_INET, SOCK_RAW, IPPROTO_IP);
        if (write==INVALID_SOCKET)
    {
        ShowMessage("Error socket");
                Form1->Memo1->Lines->Add(WSAGetLastError());
        WSACleanup();
    }
        Form1->Label5->Caption="2) soket()...OK";
 
//3) ПК
gethostname(PCname, sizeof(PCname));      //получаем имя ПК
host = gethostbyname(PCname);          //узнаем IP адрес ПК
ZeroMemory( &saddr, sizeof(saddr) );
 
//запрещаем создавать IP заголовки
DWORD optval = 1;
if ( setsockopt(write, IPPROTO_IP, IP_HDRINCL,(char*)&optval, sizeof(optval)) == SOCKET_ERROR )
{
    Form1->Memo2->Lines->Add("ERROR:setsockopt(IP_HDRINCL) error");
}
 
//4) создание порта для сокета
        saddr.sin_family=AF_INET;
        //saddr.sin_addr.s_addr = ((struct in_addr *)host->h_addr_list[0])->s_addr;
        saddr.sin_addr.S_un.S_addr=((struct in_addr *)host->h_addr_list[0])->s_addr;
        saddr.sin_port=htons(80);
 
 
 
//5) устанавливаем соединение
        if (connect(write, (SOCKADDR*)&saddr, sizeof(saddr))==SOCKET_ERROR)
        {
                Form1->Memo2->Lines->Add("Error connect");
                WSACleanup();
        }
        else Form1->Memo2->Lines->Add("connect... ok");
 
//Бесконечный цикл отправки IP пакетов
        while (true)
        {
                for(int i=1; i<=Form1->StringGrid2->RowCount; i++) //кол-во файлов=кол-ву строк
                {
                        Form1->StringGrid2->Cells[0][i]=IntToStr(i);
                        //filename=(Form1->StringGrid2->Cells[0][i]+".txt");
                        //fp = fopen(filename.c_str(),"r");
 
                        filename=("!.txt");
                        fp = fopen("!.txt","r");
                        char ch;// = getc(fp);   //чтение одного символа
 
                        while (ch!=EOF)
                        {
                                
                                ch = getc(fp);
                                Form1->Memo2->Lines->Add(ch);
                                Form1->Buffer2[i]=ch;
                        }
                        fclose(fp);
                        Form1->Memo2->Lines->Add(Form1->Buffer2);
                        if (Terminated) break;
                        if (SendFiles = send(write,Form1->Buffer2,sizeof(Form1->Buffer2),0)==SOCKET_ERROR) //а в буфере-то нет ничего!!!
                                Form1->Memo2->Lines->Add("Error send");
 
                        if (Terminated) break;
//дальше разбор отправляемого пакета                        
                        if (SendFiles>=sizeof(ip_hdr))
                        {
 
                        }
                fclose(fp);
                }//end for
        }//end while
 
        closesocket(write);
        WSACleanup();
   
}
//---------------------------------------------------------------------------
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.12.2009, 02:34
C++
1
if (SendFiles = send(write,Form1->Buffer2,sizeof(Form1->Buffer2),0)==SOCKET_ERROR)
операция == даёт ноль или один и это присваивается SendFiles

C++
1
2
//дальше разбор отправляемого пакета                        
                        if (SendFiles>=sizeof(ip_hdr))
судя по всему, проверяется, сколько байт отправилось, а при успешной отправке там будет ноль
и, похоже, она даже не дойдёт до туда

C++
1
    send(write,Form1->Buffer2,sizeof(Form1->Buffer2),0)
C++
1
2
3
4
5
    int n;
 
    n = send(write, "something", 9, 0);
 
    cout << n;
если после скобок не попрёт, проверишь, закомментировав
0
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 8
05.12.2009, 23:19
Не заработало
Может быть, сырые сокеты не позволяют выполнить отправку данных?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.12.2009, 08:49
не, они позволяют, только там надо, вроде, пакет вручную собирать
у меня по udp отправилось (без сборки), но за bind ить и принять не получилось
хотя в нете пишут, что за bind ить можно
0
0 / 0 / 0
Регистрация: 02.12.2009
Сообщений: 8
21.12.2009, 10:16
все заработало! данные передаются!
хочу попробовать сделать то же самое с использованием winpсap. столкнулась с такой ошибкой в файле types.h: error Make sure bool, true and false are defined even when using the C compiler. Почему она может возникать? Драйвер скачан, все программы поставлены.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.12.2009, 11:59
в C подключить stdbool.h
лучше, конечно, писать в одном языке

C++
1
IPHeader *buf_ip = new IPHeader;
строчка для C++

C
1
fp = fopen("!.txt","r");
строчка для C

там и правила написания различаются
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2009, 11:59
Помогаю со студенческими работами здесь

Не могу отправить данные при нажатии на кнопку
Всех приветствую! Только начал освоение HTML и возникла следующая проблема: никак не могу отправить данные на сервер(некий промышленный...

В массив выводить данные-id клиента, данные серверу и данные, отправленные сервером
Здравствуйте. Имеется клиент-серверное приложение, вопрос по стороне сервера. Имеется backgroundworker-bw_clientReceining: ...

Отправить команды серверу
Надо кодом(PHP) отправить серверу на исполнение несколько команд. Делаю так: $output = popen(&quot;killall Xvnc&quot;,...

Отправить команды серверу
Надо кодом(PHP) отправить серверу на исполнение несколько команд. Делаю так: $output = popen(&quot;killall Xvnc&quot;,...

Отправить серверу строчку
Нужно отправить серверу строчку - 12 00 d4 02 38 36 38 32 30 34 30 30 31 37 38 32 36 30 35 0e 43 b6 Попытался сделать так: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru