|
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) Блин, как же сложно!!! Хорошо, буду думать, спасибо большое за помощь!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |