Выгрузка таблицы значений в табличную часть документа
Доброго времени суток. Занимаюсь сейчас тем, что работаю с API Бинотел, получил историю исходящих вызовов за определенный период в Соответствии. Условно говоря(контрольный пример) есть 3 звонка которые я хочу выгрузить в табличную часть документа.
Привожу код процедуры(вы же не Ванги):
Сейчас я по каждому звонку получаю отдельную таблицу значений, которую хочу выгружать в табличную часть документа ТаблицаЗвонков отдельной строкой.
Прошу вашей помощи в выгрузке таблицы значений в табличную часть и в целом код ревью. Стараюсь стать лучше как программист, а здесь всегда есть чему поучиться.
Привожу код процедуры(вы же не Ванги):
Процедура |
---|
&НаСервере
Процедура КомандаПолучитьЗвонкиНаСервере()
//:ЛЕ Просто так метод с модуля объекта не вызовешь
ДокументОбъект = РеквизитФормыВЗначение("Объект");
//:ЛЕ Приведём время в unix stamp (хотелка бинотела)
startTime = ДокументОбъект.ПолучитьUnixTS(Объект.startTime);
stopTime = ДокументОбъект.ПолучитьUnixTS(Объект.stopTime);
//:ЛЕ Запросим входящие вызовы от startTime до stopTime
ПолучитьЗвонки = ДокументОбъект.IncomingCallsForPeriod(Объект.key,Объект.secret,startTime,stopTime);
Текст = Новый ЧтениеТекста(ПолучитьЗвонки, КодировкаТекста.UTF8);
СтруктураJSON = ДокументОбъект.ПрочитатьJSON_API(Текст.Прочитать(), Неопределено);
Попытка
СтруктураЗвонков = СтруктураJSON.Получить("callDetails"); //Содержит записи по звонкам отдельно
Для Каждого ТекСтрокаЗвонок Из СтруктураЗвонков Цикл //Обходим каждый звонок отдельно
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
СтрокаТаблицыЗвонков.isNewCall = "ывы";
КонецЦикла;
Исключение
СтруктураЗвонков = Неопределено;
Сообщить("Ошибка чтения:" + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры Показать |
Функция которая выгружает данные по каждому звонку в отдельную таблицу значений |
---|
&НаСервере
Функция ЧтениеДанныхЗвонков(ТекСтрокаЗвонок)
ТаблицаЗвонков = Новый ТаблицаЗначений(); //Создадим табл значений для хранения звонков
ТаблицаЗвонков.Колонки.Добавить("Значение");
ТаблицаЗвонков.Колонки.Добавить("Описание");
Для Каждого ТекСтрокаДанныеЗвонка Из ТекСтрокаЗвонок.Значение Цикл //Обходим данные звонка
СтрокаТаблицыЗвонков = ТаблицаЗвонков.Добавить();
СтрокаТаблицыЗвонков.Значение = ТекСтрокаДанныеЗвонка.Значение;
СтрокаТаблицыЗвонков.Описание = ТекСтрокаДанныеЗвонка.Ключ;
КонецЦикла;
Возврат ТаблицаЗвонков
КонецФункции Показать |
Сейчас я по каждому звонку получаю отдельную таблицу значений, которую хочу выгружать в табличную часть документа ТаблицаЗвонков отдельной строкой.
Прошу вашей помощи в выгрузке таблицы значений в табличную часть и в целом код ревью. Стараюсь стать лучше как программист, а здесь всегда есть чему поучиться.
По теме из базы знаний
- Загрузка из Excel в табличную часть документа прямо из документа (пересчет товаров, заказ на перемещение, перемещение товаров, установка цен номенклатуры)
- Загрузка данных из файла (xls, xlsx, ods) в табличную часть документа
- Универсальное заполнение табличной части документа по его первой строке и буферу обмена
- Заполнение табличной части документа внешней обработкой с открытием формы, загрузкой из excel файла и переносом в документ
- Заполнение табличной части документа из EXCEL универсальная (толстый клиент)
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) а зачем получать отдельные ТЗ по каждому звонку? ИМХО здесь можно объявить ТЗ до вашей попытки, и далее передавать ее в функцию ЧтениеДанныхЗвонков. в результате все звонки будут в одной ТЗ, и ее можно загрузить в ТЧ документа методом Загрузить(). ну соответственно если у них колонки одинаковые по имени и типу
(1) соответствуют ли имена колонок ТЧ именам ключей соответствий входящих данных?
Если соответствуют, то можно так:
Если не соответствует, то необходимо без цикла использовать каждую колонку ТЧ и присваивать нужное значение из соответствия, как пример:
Соответственно в процедуре КомандаПолучитьЗвонкиНаСервере удалить добавление строки ТЧ.
Если соответствуют, то можно так:
&НаСервере
Процедура ЧтениеДанныхЗвонков(ТекСтрокаЗвонок)
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
Для Каждого ТекСтрокаДанныеЗвонка Из ТекСтрокаЗвонок.Значение Цикл //Обходим данные звонка
СтрокаТаблицыЗвонков[ТекСтрокаДанныеЗвонка.Ключ] = ТекСтрокаДанныеЗвонка.Значение;
КонецЦикла;
КонецПроцедуры
Если не соответствует, то необходимо без цикла использовать каждую колонку ТЧ и присваивать нужное значение из соответствия, как пример:
&НаСервере
Процедура ЧтениеДанныхЗвонков(ТекСтрокаЗвонок)
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
СтрокаТаблицыЗвонков["НужноеИмя"] = ТекСтрокаЗвонок["ИмяВходящее"];
// и так для каждой колонки ТЧ
КонецПроцедуры
Соответственно в процедуре КомандаПолучитьЗвонкиНаСервере удалить добавление строки ТЧ.
Можно узнать, что представляет из себя СтруктураЗвонков, полученная из
Кроме того, не понятно следующее, вы записываете сформированную таблицу значений в локальный объект
Хотя конечно это мог бы быть и реквизит формы, но строка в функции ЧтениеДанныхЗвонков() это исключает
В дальнейшем с объектом ТаблицаЗвонков вы ничего не делаете, и в следующей строке листинга добавляете новую строку к совершенно иному объекту, Объект.ТаблицаЗвонков
ТаблицаЗвонков и Объект.ТаблицаЗвонков это две разные сущности, и это ставит меня в тупик, куда вы все таки записываете полученные данные?
Исходя из выше сказанного, повторюсь и попрошу вас еще раз описать формат данных, которые вы получаете в результате выполнения функции ПрочитатьJSON_API(), а также формат вашей целевой табличной части, которую нужно заполнить данными звонков.
P.S. Что значит "ывы" в этой строке?
СтруктураJSON.Получить("callDetails")
Кроме того, не понятно следующее, вы записываете сформированную таблицу значений в локальный объект
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);
Хотя конечно это мог бы быть и реквизит формы, но строка в функции ЧтениеДанныхЗвонков() это исключает
ТаблицаЗвонков = Новый ТаблицаЗначений();
В дальнейшем с объектом ТаблицаЗвонков вы ничего не делаете, и в следующей строке листинга добавляете новую строку к совершенно иному объекту, Объект.ТаблицаЗвонков
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
ТаблицаЗвонков и Объект.ТаблицаЗвонков это две разные сущности, и это ставит меня в тупик, куда вы все таки записываете полученные данные?
Исходя из выше сказанного, повторюсь и попрошу вас еще раз описать формат данных, которые вы получаете в результате выполнения функции ПрочитатьJSON_API(), а также формат вашей целевой табличной части, которую нужно заполнить данными звонков.
P.S. Что значит "ывы" в этой строке?
СтрокаТаблицыЗвонков.isNewCall = "ывы";
(4) представляет собой N соответствий, где N - кол-во звонков. Прикрепил два скриншота обьясняющие что и где.
В ТекСтрокаЗвонок хранится соответствие об одном звонке и записывается в таблицу. Мда. Глупость какая-то, но данные из соответствия в котором хранятся данные одного звонка с помощью ЧтениеДанныхЗвонков я переношу в таблицу значений, а оттуда уже по [0...15] вывожу в колонки табличной части.
Вот примерно такой кусок:
P.S. ничего не значит, просто тестировал заполнение строки табл. части
СтруктураJSON.Получить("callDetails")
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);
В ТекСтрокаЗвонок хранится соответствие об одном звонке и записывается в таблицу. Мда. Глупость какая-то, но данные из соответствия в котором хранятся данные одного звонка с помощью ЧтениеДанныхЗвонков я переношу в таблицу значений, а оттуда уже по [0...15] вывожу в колонки табличной части.
Вот примерно такой кусок:
ТаблицаЗвонков = ЧтениеДанныхЗвонков(ТекСтрокаЗвонок);
СтрокаТаблицыЗвонков = Объект.ТаблицаЗвонков.Добавить();
СтрокаТаблицыЗвонков.isNewCall = ТаблицаЗвонков[3].Значение;
P.S. ничего не значит, просто тестировал заполнение строки табл. части
Прикрепленные файлы:
(6)В таком случае вам не нужна функция ЧтениеДанныхЗвонков(ТекСтрокаЗвонок), вместо её можно использовать встроенную процедуру ЗаполнитьЗначенияСвойств (FillPropertyValues), только убедиться чтобы Ключ структуры записи соответствовал имени колонки табличной части. Например у меня есть Таблица EmailАдреса со столбцами Email и ФИО, Тогда я могу заполнить ее строку таким способом:
P.S. В английском варианте синтаксиса читается лучше, ИМХО))
ЗаполнитьЗначенияСвойств(Объект.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
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот