Имя: Пароль:
1C
 
1с Функция "ЗначениеВСтрокуВнутр"
,
0 oduvanchikyan
 
04.08.21
16:58
Всем привет, столкнулся с проблемой, при заполнении XML файла через запрос (В запросе, чтобы не было вложенных запросов указываю такие данные Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары), обрабатываю результат запроса через циклы и загружаю в xml. Проблема в том что при такой строке ЗаписьXML.ЗаписатьТекст(Строка.Получить(2)) - пишет ошибку "параметр 1". Хочу уточнить возможно есть решение всего этого, так как с  такой строкой ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуВнутр(Строка.Получить(2))) - все работает но выводит формат значения <T3RXXXXG4S ROWNUM=" 1">{"N",3050}</T3RXXXXG4S>.
Приложил полный код:
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    РеализацияТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
                          |    РеализацияТоваровУслуг.Контрагент.КодПоЕДРПОУ КАК КонтрагентКодПоЕДРПОУ,
                          |    СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество
                          |ИЗ
                          |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                          |        ПО РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка
                          |ГДЕ
                          |    РеализацияТоваровУслуг.Дата >= &Начало
                          |    И РеализацияТоваровУслуг.Дата <= &Конец
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    РеализацияТоваровУслуг.Контрагент.Наименование,
                          |    РеализацияТоваровУслуг.Контрагент.КодПоЕДРПОУ
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    КонтрагентНаименование");
    Запрос.Параметры.Вставить("Начало",ЭтаФорма.Начало);
    Запрос.Параметры.Вставить("Конец",ЭтаФорма.Конец);
    РезультатЗапроса=Запрос.Выполнить().Выгрузить();
    
    
///  
    ЗаписьXML = Новый ЗаписьXML;
    
    ЗаписьXML.ОткрытьФайл(ЭтаФорма.ПутьКФайлу,"windows-1251");
    
    ЗаписьXML.ЗаписатьОбъявлениеXML();    
    ЗаписьXML.ЗаписатьНачалоЭлемента("DECLAR");
    ЗаписьXML.ЗаписатьАтрибут("xsi:noNamespaceSchemaLocation","J0208206.xsd");
    ЗаписьXML.ЗаписатьАтрибут("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
    
        ЗаписьXML.ЗаписатьНачалоЭлемента("DECLARHEAD");
        
           ЗаписьXML.ЗаписатьНачалоЭлемента("TIN");
              ЗаписьXML.ЗаписатьТекст("43807826");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC");
              ЗаписьXML.ЗаписатьТекст("J02");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC_SUB");
              ЗаписьXML.ЗаписатьТекст("082");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC_VER");
              ЗаписьXML.ЗаписатьТекст("6");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC_TYPE");
              ЗаписьXML.ЗаписатьТекст("0");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC_CNT");
              ЗаписьXML.ЗаписатьТекст("6");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_REG");
              ЗаписьXML.ЗаписатьТекст("08");
           ЗаписьXML.ЗаписатьКонецЭлемента();

           ЗаписьXML.ЗаписатьНачалоЭлемента("C_RAJ");
              ЗаписьXML.ЗаписатьТекст("27");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("PERIOD_MONTH");
              ЗаписьXML.ЗаписатьТекст("6");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("PERIOD_TYPE");
              ЗаписьXML.ЗаписатьТекст("1");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("PERIOD_YEAR");
              ЗаписьXML.ЗаписатьТекст("2021");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_STI_ORIG");
              ЗаписьXML.ЗаписатьТекст("827");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("C_DOC_STAN");
              ЗаписьXML.ЗаписатьТекст("1");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
           ЗаписьXML.ЗаписатьНачалоЭлемента("LINKED_DOCS");
              ЗаписьXML.ЗаписатьАтрибут("xsi:nil","true");
           ЗаписьXML.ЗаписатьКонецЭлемента();
              
           ЗаписьXML.ЗаписатьНачалоЭлемента("D_FILL");
              ЗаписьXML.ЗаписатьТекст("17072021");
           ЗаписьXML.ЗаписатьКонецЭлемента();
          
        ЗаписьXML.ЗаписатьКонецЭлемента();

        Счетчик = 0;
        ЗаписьXML.ЗаписатьНачалоЭлемента("DECLARBODY");
        
        
            ЗаписьXML.ЗаписатьНачалоЭлемента("HZM");
                ЗаписьXML.ЗаписатьТекст("6");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HZY");
                ЗаписьXML.ЗаписатьТекст("2021");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HSTI");
                ЗаписьXML.ЗаписатьТекст("ДПI У КОМУНАРСЬКОМУ РАЙОНI М.ЗАПОРIЖЖЯ");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HTIN");
                ЗаписьXML.ЗаписатьТекст("43807826");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HNAME");
                ЗаписьXML.ЗаписатьТекст("ТОВ Пивна та сидрова група");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HLOC");
                ЗаписьXML.ЗаписатьТекст("69063, м. Запор_жжя, проспект Соборний, буд. 20-В");
            ЗаписьXML.ЗаписатьКонецЭлемента();

            //Наименование
            Для каждого Строка Из РезультатЗапроса  Цикл
                ЗаписьXML.ЗаписатьНачалоЭлемента("T3RXXXXG2S");
                Счетчик = Счетчик + 1;

                    ЗаписьXML.ЗаписатьНачалоАтрибута("ROWNUM");
                    
                        ЗаписьXML.ЗаписатьТекст(" "+Счетчик);
                        
                    ЗаписьXML.ЗаписатьКонецАтрибута();
                
                    ЗаписьXML.ЗаписатьТекст(Строка.Получить(0));
                
                 ЗаписьXML.ЗаписатьКонецЭлемента();
                ///            
            КонецЦикла;
            Сообщить(Счетчик);
            
            //Код ДПИ 08
            Для Счет = 1 По Счетчик Цикл
                
                ЗаписьXML.ЗаписатьНачалоЭлемента("T3RXXXXG1");
                
                    ЗаписьXML.ЗаписатьНачалоАтрибута("ROWNUM");
                    
                        ЗаписьXML.ЗаписатьТекст(" "+Счет);
                        
                    ЗаписьXML.ЗаписатьКонецАтрибута();
                    
                    ЗаписьXML.ЗаписатьТекст("08");
                    
                ЗаписьXML.ЗаписатьКонецЭлемента();
                
                //Счет = Счет+1;
                Сообщить("Счетчик =" + Счетчик);
                Сообщить("Счет =" +Счет);
                
            КонецЦикла;
            Сообщить(Счет);
            
            Счет = 0;
            //Код ДПИ 08
            Для Счет = 1 По Счетчик Цикл
                
                ЗаписьXML.ЗаписатьНачалоЭлемента("T3RXXXXG4");
                
                    ЗаписьXML.ЗаписатьНачалоАтрибута("ROWNUM");
                    
                        ЗаписьXML.ЗаписатьТекст(" "+Счет);
                        
                    ЗаписьXML.ЗаписатьКонецАтрибута();
                    
                    ЗаписьXML.ЗаписатьТекст("57");
                    
                ЗаписьXML.ЗаписатьКонецЭлемента();
                
                //Счет = Счет+1;
                Сообщить("Счетчик =" + Счетчик);
                Сообщить("Счет =" +Счет);
                
            КонецЦикла;
            
            //Код ЕДРПОУ
            
            Счетчик = 0;
            Для каждого Строка Из РезультатЗапроса  Цикл
                ЗаписьXML.ЗаписатьНачалоЭлемента("T3RXXXXG3S");
                Счетчик = Счетчик + 1;

                    ЗаписьXML.ЗаписатьНачалоАтрибута("ROWNUM");
                    
                        ЗаписьXML.ЗаписатьТекст(" "+Счетчик);
                    
                    ЗаписьXML.ЗаписатьКонецАтрибута();
                
                        ЗаписьXML.ЗаписатьТекст(Строка.Получить(1));
                
                 ЗаписьXML.ЗаписатьКонецЭлемента();
            КонецЦикла;
            
            
            //   Количество
            Сообщить(Счетчик);
            Счетчик = 0;
            Для каждого Строка Из РезультатЗапроса  Цикл
                ЗаписьXML.ЗаписатьНачалоЭлемента("T3RXXXXG5");
                Счетчик = Счетчик + 1;
                    Сообщить(Строка.Владелец());
                    
                    //Строка.Установить();
                    
                    
                    ЗаписьXML.ЗаписатьНачалоАтрибута("ROWNUM");
                    
                        ЗаписьXML.ЗаписатьТекст(" "+Счетчик);
                    
                    ЗаписьXML.ЗаписатьКонецАтрибута();
                
                        //ЗаписьXML.ЗаписатьТекст(ЗначениеВСтрокуВнутр(Строка.Получить(2)));
                        ЗаписьXML.ЗаписатьТекст(Строка.Получить(0));
                        
                        
                 ЗаписьXML.ЗаписатьКонецЭлемента();
            КонецЦикла;
            
            Сообщить(Счетчик);
            ЗаписьXML.ЗаписатьНачалоЭлемента("HBOS");
                ЗаписьXML.ЗаписатьТекст("Чертоляс Сергій Вадимович");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
            ЗаписьXML.ЗаписатьНачалоЭлемента("HBUH");
                ЗаписьXML.ЗаписатьАтрибут("xsi:nil","true");
            ЗаписьXML.ЗаписатьКонецЭлемента();
            
        ЗаписьXML.ЗаписатьКонецЭлемента();
            
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.Закрыть();  
Пожалуйста, помогите уже не знаю, что и делать в таком случае!?
1 polosov
 
04.08.21
17:03
Зачем "Получить"?
Обращайся к имени поля "Строка.КонтрагентНаименование"
2 Kassern
 
04.08.21
17:05
(0) мои глаза...
Зачем вы по 100500 раз один и тот же цикл мучаете?
Сделайте 1 цикл и в нем
Через структуру передайте все данные в ЗаписатьXML()
Так же есть метод XMLСтрока(Значение); почитайте в СП про него.
3 oduvanchikyan
 
04.08.21
17:07
Простите, я только начинаю изучать все и делаю так сказать по корявому. А  как работать со структурой, можете кинуть литературу или просто пример кода?
4 Kassern
 
04.08.21
17:28
(3) по поводу структуры это я конечно грубанул, это ЗаписатьJSON нормально из структуры заполняется. Вот простой пример ЗаписатьXML

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("products");
Для Каждого ТекСтрока Из ТЗ Цикл //не надо результатом запроса называть ТЗ, результат запроса это Запрос.Выполнить();
        ЗаписьXML.ЗаписатьНачалоЭлемента("product");
    ЗаписатьXML(ЗаписьXML,XmlСтрока(ТекСтрока.Ссылка),"UID");
    ЗаписатьXML(ЗаписьXML,ТекСтрока.Наименование,"name");
    ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
СтрXML = ЗаписьXML.Закрыть();
Сообщить(СтрXML);
5 Ёпрст
 
04.08.21
21:05
(0)

Строка.Получить(0) заменить на Строка.КонтрагентНаименование
Строка.Получить(1) заменить на Строка.КонтрагентКодПоЕДРПОУ
и т.д..

занимайся
6 oduvanchikyan
 
05.08.21
11:37
(5)

Спасибо, но только не работает с полем Количество, это проблема, что это как другая таблица ? Или как в таком случае ?
7 oduvanchikyan
 
05.08.21
11:39
(4)
То есть вы предлагаете сделать через Табличное значение? А разве будет в таком случае доступ к полям запроса ?
8 Kassern
 
05.08.21
11:43
(7) вот вы написали табличное значение, что вы под этим понимаете? Есть Таблица значений (ТЗ) у вас она хранится в переменной РезультатЗапроса. Я всего лишь вам указал, что результат это:
Результат=Запрос.Выполнить();
ТЗ=Результат.Выгрузить();
9 Kassern
 
05.08.21
11:48
(6) у вас полная каша в голове, у вас есть запрос, результатом запроса можете получить выборку или ТЗ, и там и там вы можете обойти в цикле и обращаться через точку к полям таблицы/выборки. Цикл в вашем случае достаточно 1 раз пройти.
10 oduvanchikyan
 
05.08.21
11:55
(6)
Понял вас. Спасибо большое за помощь! А можно ещё уточнить ЗначениеВСтрокуВнутр - эта функция ведь формирует поле типа текст ? а в представленном вами варианте тип поля будет формироваться в зависимости от данных внутри ?
11 oduvanchikyan
 
05.08.21
11:56
(9) .
12 Garykom
 
гуру
05.08.21
11:58
(10) не используй "ЗначениеВСтрокуВнутр" никогда!
это служебная функция оставленная в 8-ке для "совместимости" с 1С 77
на практике она не нужна, кроме очень редких случаев и только для применения опытными прогами
13 Kassern
 
05.08.21
11:59
(10) я же вам писал, используйте XMLСтрока()
14 Garykom
 
гуру
05.08.21
12:00
и перепиши свой говнокод

1. Запросом(ами) получают данные
2. Закидывают данные в некие структуры (ТЗ, Массив и т.д.) в готовом виде, где уже простые типы
3. Один цикл по структуре/ТЗ и пишем в XML (если JSON то еще проще)
15 Garykom
 
гуру
05.08.21
12:08
(13) +1
Для записи в XML и JSON значений с непечатными (не разрешенными) символами по стандартам XML|JSON есть специальная функция в 1С: XMLСтрока()
16 oduvanchikyan
 
05.08.21
12:12
(14) Я вывожу данные в табличный документ, данные то берутся с СКД отчета. Но вот была загвоздка, как получать поля табличного документа, не нашел информации( Спасибо за информацию, буду принимать в работу, а есть ли литература по JSON, я так понимаю, с ним более проще выводить информацию и работать в принципе.
17 Garykom
 
гуру
05.08.21
12:19
(16) муахаха
18 Garykom
 
гуру
05.08.21
12:23
смотри какой у тебя возможен изврат

допустим у тебя очень много данных и выгрузка в xml занимает минуты времени
ты в ТЗ получил запросом данные - Ссылки на объекты в базе
все прекрасно кроме того что в с момента получения до момента когда по ссылке будет через "." получены простые данные (число, строка, дата) запросто может быть что объект в базе будет удален
и твоя ссылка при попытке получить даст что? краш!

поэтому минимизируй время от получения запросом до вытаскивания простых типов данных
19 Garykom
 
гуру
05.08.21
12:24
(18)+ идеально когда сам запрос возвращает уже готовые простые данные, без ссылок
но это не всегда можно/удобно, поэтому сразу обработка в простые быстро
и уже затем долгая выгрузка в XML готовых простых
20 oduvanchikyan
 
05.08.21
12:29
(19) Блин, как же сложно!!! Хорошо, буду думать, спасибо большое за помощь!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс