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

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 
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот