Выгрузка таблицы значений в табличную часть документа

1. user1148505 18.09.21 20:10 Сейчас в теме
Доброго времени суток. Занимаюсь сейчас тем, что работаю с API Бинотел, получил историю исходящих вызовов за определенный период в Соответствии. Условно говоря(контрольный пример) есть 3 звонка которые я хочу выгрузить в табличную часть документа.
Привожу код процедуры(вы же не Ванги):
Процедура


Функция которая выгружает данные по каждому звонку в отдельную таблицу значений


Сейчас я по каждому звонку получаю отдельную таблицу значений, которую хочу выгружать в табличную часть документа ТаблицаЗвонков отдельной строкой.

Прошу вашей помощи в выгрузке таблицы значений в табличную часть и в целом код ревью. Стараюсь стать лучше как программист, а здесь всегда есть чему поучиться.
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. DJ_Codebase 18.09.21 20:57 Сейчас в теме
(1) а зачем получать отдельные ТЗ по каждому звонку? ИМХО здесь можно объявить ТЗ до вашей попытки, и далее передавать ее в функцию ЧтениеДанныхЗвонков. в результате все звонки будут в одной ТЗ, и ее можно загрузить в ТЧ документа методом Загрузить(). ну соответственно если у них колонки одинаковые по имени и типу
3. user1148505 18.09.21 21:22 Сейчас в теме
(2) а как я разделю их на отдельные строки? в том и мысль что отдельные звонки - отдельные строки в табличной части
5. DJ_Codebase 18.09.21 23:06 Сейчас в теме
(3) для начала архитектуру продумай, а то сумбур какой то получается. я нифига не понял из этого кода
8. spacecraft 19.09.21 12:04 Сейчас в теме
(1) соответствуют ли имена колонок ТЧ именам ключей соответствий входящих данных?
Если соответствуют, то можно так:
&НаСервере
Процедура ЧтениеДанныхЗвонков(ТекСтрокаЗвонок)
    СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
    Для Каждого ТекСтрокаДанныеЗвонка Из ТекСтрокаЗвонок.Значение Цикл //Обходим данные звонка    
        СтрокаТаблицыЗвонков[ТекСтрокаДанныеЗвонка.Ключ] = ТекСтрокаДанныеЗвонка.Значение;
    КонецЦикла;
КонецПроцедуры

Если не соответствует, то необходимо без цикла использовать каждую колонку ТЧ и присваивать нужное значение из соответствия, как пример:
&НаСервере
Процедура ЧтениеДанныхЗвонков(ТекСтрокаЗвонок)
    СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
    СтрокаТаблицыЗвонков["НужноеИмя"] = ТекСтрокаЗвонок["ИмяВходящее"];
    // и так для каждой колонки ТЧ
КонецПроцедуры


Соответственно в процедуре КомандаПолучитьЗвонкиНаСервере удалить добавление строки ТЧ.
9. user1148505 19.09.21 13:38 Сейчас в теме
(8) Соответствуют. Сейчас как работает по второму варианту, попробуй 1.
4. harchenko_pavel 41 18.09.21 22:40 Сейчас в теме
Можно узнать, что представляет из себя СтруктураЗвонков, полученная из
СтруктураJSON.Получить("callDetails")


Кроме того, не понятно следующее, вы записываете сформированную таблицу значений в локальный объект
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);


Хотя конечно это мог бы быть и реквизит формы, но строка в функции ЧтениеДанныхЗвонков() это исключает
ТаблицаЗвонков = Новый ТаблицаЗначений();


В дальнейшем с объектом ТаблицаЗвонков вы ничего не делаете, и в следующей строке листинга добавляете новую строку к совершенно иному объекту, Объект.ТаблицаЗвонков
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();

ТаблицаЗвонков и Объект.ТаблицаЗвонков это две разные сущности, и это ставит меня в тупик, куда вы все таки записываете полученные данные?

Исходя из выше сказанного, повторюсь и попрошу вас еще раз описать формат данных, которые вы получаете в результате выполнения функции ПрочитатьJSON_API(), а также формат вашей целевой табличной части, которую нужно заполнить данными звонков.

P.S. Что значит "ывы" в этой строке?
СтрокаТаблицыЗвонков.isNewCall = "ывы";
6. user1148505 19.09.21 10:53 Сейчас в теме
(4)
СтруктураJSON.Получить("callDetails")
представляет собой N соответствий, где N - кол-во звонков. Прикрепил два скриншота обьясняющие что и где.

ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);


В ТекСтрокаЗвонок хранится соответствие об одном звонке и записывается в таблицу. Мда. Глупость какая-то, но данные из соответствия в котором хранятся данные одного звонка с помощью ЧтениеДанныхЗвонков я переношу в таблицу значений, а оттуда уже по [0...15] вывожу в колонки табличной части.

Вот примерно такой кусок:
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
СтрокаТаблицыЗвонков.isNewCall = ТаблицаЗвонков[3].Значение;


P.S. ничего не значит, просто тестировал заполнение строки табл. части
Прикрепленные файлы:
7. harchenko_pavel 41 19.09.21 11:13 Сейчас в теме
(6)В таком случае вам не нужна функция ЧтениеДанныхЗвонков(ТекСтрокаЗвонок), вместо её можно использовать встроенную процедуру ЗаполнитьЗначенияСвойств (FillPropertyValues), только убедиться чтобы Ключ структуры записи соответствовал имени колонки табличной части. Например у меня есть Таблица EmailАдреса со столбцами Email и ФИО, Тогда я могу заполнить ее строку таким способом:
 ЗаполнитьЗначенияСвойств(Объект.EmailАдреса.Добавить(), New Структура("Email,ФИО", "root@unix.com", "Рут Линукс Юниксович")); 

Синтаксис:
ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Параметры:
<Приемник> (обязательный)
Тип: Произвольный. 
Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.
<Источник> (обязательный)
Тип: Произвольный. 
Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.
Показать


&НаСервере
Процедура КомандаПолучитьЗвонкиНаСервере()
    //:ЛЕ Просто так метод с модуля объекта не вызовешь
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    //:ЛЕ Приведём время в unix stamp (хотелка бинотела)
    startTime = ДокументОбъект.ПолучитьUnixTS(Объект.startTime);
    stopTime = ДокументОбъект.ПолучитьUnixTS(Объект.stopTime);
    //:ЛЕ Запросим входящие вызовы от startTime до stopTime 
    ПолучитьЗвонки = ДокументОбъект.IncomingCallsForPeriod(Объект.key,Объект.secret,startTime,stopTime);  
    Текст = Новый ЧтениеТекста(ПолучитьЗвонки, КодировкаТекста.UTF8);
    СтруктураJSON = ДокументОбъект.ПрочитатьJSON_API(Текст.Прочитать(), Неопределено);
    Попытка
        СтруктураЗвонков = СтруктураJSON.Получить("callDetails"); //Содержит записи по звонкам отдельно
        Для Каждого Запись Из СтруктураЗвонков Цикл  //Обходим каждый звонок отдельно
            СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить(); 
            ЗаполнитьЗначенияСвойств(СтрокаТаблицыЗвонков, Запись);
            СтрокаТаблицыЗвонков.isNewCall = "ывы";
        КонецЦикла;
    Исключение
        СтруктураЗвонков = Неопределено;
        Сообщить("Ошибка чтения:" + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры
Показать


P.S. В английском варианте синтаксиса читается лучше, ИМХО))
&НаСервере
Procedure КомандаПолучитьЗвонкиНаСервере()
    //:ЛЕ Просто так метод с модуля объекта не вызовешь
    ДокументОбъект = РеквизитФормыВЗначение("Объект");
    //:ЛЕ Приведём время в unix stamp (хотелка бинотела)
    startTime = ДокументОбъект.ПолучитьUnixTS(Объект.startTime);
    stopTime = ДокументОбъект.ПолучитьUnixTS(Объект.stopTime);
    //:ЛЕ Запросим входящие вызовы от startTime до stopTime 
    ПолучитьЗвонки = ДокументОбъект.IncomingCallsForPeriod(Объект.key,Объект.secret,startTime,stopTime);  
    Текст = New ЧтениеТекста(ПолучитьЗвонки, КодировкаТекста.UTF8);
    СтруктураJSON = ДокументОбъект.ПрочитатьJSON_API(Текст.Прочитать(), Undefined);
    Try
	    //Содержит записи по звонкам отдельно
        СтруктураЗвонков = СтруктураJSON.Получить("callDetails"); 
		//Обходим каждый звонок отдельно
        For Each Запись In СтруктураЗвонков Do  
            СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить(); 
            ЗаполнитьЗначенияСвойств(СтрокаТаблицыЗвонков, Запись);
            СтрокаТаблицыЗвонков.isNewCall = "ывы";
        EndDo;
    Except
        СтруктураЗвонков = Undefined;
        Сообщить("Ошибка чтения:" + Символы.ПС + ОписаниеОшибки());
    EndTry;
EndProcedure 
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)