Имя: Пароль:
1C
1С v8
Преобразование данных в таблицу значений
0 Ксю_100500
 
06.11.18
09:09
Здравствуйте! Я только осваиваю 1с. Новичок - новее некуда. Работаю в 1с 8.3. Передо мной стоит следующая задача. Есть структура полученная из json. Как мне ее записать в таблицу значений.
Я попыталась в общем модуле на сервере создать функцию, которая создает мне таблицу значений из массива, а на клиенте ее вызвать с параметром. но почему то на начальном этапе ТЗ инициализируется как ТЗ,но пустая, а потом по завершению моей процедуры на клиенте в типе пишет неопределено и по прежнему пусто. при этом каких то ошибок не выдает. И мой массив данных тоже заполнен. Подскажите пожалуйста, где копать?

привожу свой код.

&НаСервереБезКонтекста
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) Экспорт
    
    тзДанные = Новый ТаблицаЗначений;
    
    Для Каждого ЭлементМассива Из мсДанные Цикл
        // Рисуем колонки для таблицы
        Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
                тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
            КонецЦикла;
        КонецЕсли;
        
        // Добавляем данные в таблицу
        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;
    
    Возврат тзДанные;    
КонецФункции

Это в модуле формы.
&НаКлиенте
Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
       //1. создаем HTTP-соединение
    HTTP = Новый HTTPСоединение("localhost",8000);
      //2. создаем HTTP-запрос
    HTTPЗапрос = Новый HTTPЗапрос("/path/to/json/new.json");
    //3. отправляем HTTP-запрос
    Ответ = HTTP.Получить(HTTPЗапрос);
    //4. обрабатывает ответ на запрос
    Если Ответ.КодСостояния = 200 Тогда
     Сообщение = Новый СообщениеПользователю;
     Сообщить("Файл получен");
     ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
     Сообщить("Файл прочтен");
     Сотрудники = ПрочитатьJSON(ЧтениеJSON, Ложь);
     //5.получаем массив данных
     Для каждого Сотрудник из Сотрудники Цикл
        Фамилия = Сотрудник.Фамилия;
        Имя = Сотрудник.Имя;
        Отчество = Сотрудник.Отчество;
        Подразделение = Сотрудник.Подразделение;
    КонецЦикла;
    ЧтениеJSON.Закрыть();
    Иначе
     Сообщение = Новый СообщениеПользователю;
     Сообщение.Текст = "Файл не получен. Статус-код " + Ответ.КодСостояния;
     Сообщение.Сообщить();
КонецЕсли;
//ТЗ = Новый ТаблицаЗначений;
ТЗ = ВызовКонвертации(Сотрудники);
ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;

КонецПроцедуры

Процедура ПутьНачалоВыбора(Элемент, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
     Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
     Диалог.Фильтр = "Формат xls (*.xls; *.xlsx)| *.xls, *.xlsx|";
     Если Диалог.Выбрать()
     Тогда
         Путь= Диалог.ПолноеИмяФайла
     Иначе
          Предупреждение("Файл не выбран");
         Возврат;
     КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ВызовКонвертации(Сотрудники)
    ТЗ = ОбщийМодуль.ПреобразоватьМассивВТаблицуЗначений(Сотрудники);
КонецФункции
1 Cyberhawk
 
06.11.18
09:09
Сколько платят?
2 Индиго
 
06.11.18
09:13
(0) Во первых твоя функция ВызовКонвертации(Сотрудники) ничего не возвращает.
А вовторых, даже если бы возврашщала - ТЗ на клиенте не живет.От слова совсем. Только как массив структур
3 Индиго
 
06.11.18
09:17
...ну или как реквизит формы
4 Ксю_100500
 
06.11.18
09:26
(3)Ага Спасибо. Да косяк в возврате. дописала возврат ТЗ. Но  как тогда мне понять, что моя ТЗ заполнилась? Мне нужно по ней сделать запросик небольшой.
5 Индиго
 
06.11.18
09:26
(4)Значит она реквизит формы
6 FIXXXL
 
06.11.18
09:37
(4) НаКлиенте нет запросов и ТЗ, делай все на сервере
7 Ксю_100500
 
06.11.18
09:40
Ну я уже поняла. в самой функции  ВызовКонвертации(Сотрудники).
добавила
ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ;
Возврат ТЗ;

тогда я в отладке могу увидеть что у меня там лежит. значит тут же и сделать запросик который мне нужен. Только теперь остался вопрос как я этот результат отображу на форме. хотя бы для себя. чтобы видеть,  что все отрабатывает и не лезть в отладчик
8 nicxxx
 
06.11.18
09:42
Используй ЗначениеВДанныеФормы(). По-другому никак.
9 Ксю_100500
 
06.11.18
09:49
И еще. ТЗ то выводит, колонки какие надо, а значений почему то нет. тестирую буквально на двух записях, чтобы понять общий принцип. но даже в этих двух записях данные не отображает
10 catena
 
06.11.18
10:04
(9)Нужно освоить отладчик. Вот прям жизненно необходимо.
11 Мимохожий Однако
 
06.11.18
10:05
(10) +100500
12 Ксю_100500
 
06.11.18
13:06
Получилось  вывести мою Таблицу значений. Теперь хочу ее сгруппировать по полю. и использую метод Свернуть, но загвоздка. Говорит метод объекта не обнаружен. и я не понимаю почему .
&НаСервере
Функция ЗаполнитьТаблицуЗначений(Сотрудники)
    ТЗСотрудники = ОбщийМодуль.ПреобразоватьМассивВТаблицуЗначений(Сотрудники);
    ЭлементыФормы.ТабличноеПоле1.Значение = ТЗСотрудники;
    Для каждого ТЗСотрудник из ТЗСотрудники Цикл
        ТЗСотрудник.Свернуть("Фамилия", "Количество");
    КонецЦикла;
    Возврат ТЗСотрудники;
КонецФункции
13 Ксю_100500
 
06.11.18
13:09
Или если не работает этот метод. я могу классически как то обратиться к этой таблице значений. из разряда
Выбрать
Количество(фамилия),
Фамилия
Из Таблица значений
сгруппировать по
Фамилия

Что то типо такого
14 1Сергей
 
06.11.18
13:11
(12) зачем строки перебираешь? Сворачивать нужно всю таблицу
15 Ксю_100500
 
06.11.18
13:14
Даже когда я пробовала всю таблицу сворачивать ошибка та же. это уже эксперименты. вдруг сработает))
16 catena
 
06.11.18
13:19
(15)Показывай, как таблицу сворачиваешь и озвучивай точный текст ошибки.
(13)Можно в запрос через ВТ. "Выбрать * поместить Т из &ТвояТаблица"
17 Ксю_100500
 
06.11.18
13:27
вот так сворачиваю.
&НаСервере
Функция ЗаполнитьТаблицуЗначений(Сотрудники)
    ТЗСотрудники = ОбщийМодуль.ПреобразоватьМассивВТаблицуЗначений(Сотрудники);
    ЭлементыФормы.ТабличноеПоле1.Значение = ТЗСотрудники;
    ТЗСотрудники.Свернуть("Фамилия", "Количество");
    Возврат ТЗСотрудники;
КонецФункции

Ошибка при вызове метода контекста (Свернуть)
    ТЗСотрудники.Свернуть("Фамилия", "Количество");
по причине:
Неверное имя колонки. Возможно ошибка потому что колонки количества у меня нет. но как тогда вывести сколько таких записей. я же должна использовать в группировке агрегатные функции
18 catena
 
06.11.18
13:30
(17)Ну надо добавить эту колонку))) Колонку добавить, заполнить единичками, а потом уже сворачивать.
19 Ксю_100500
 
06.11.18
13:31
Добавила. ничего не поменялось. та же ошибка((
20 catena
 
06.11.18
13:32
(19)Этого не может быть.
21 Ксю_100500
 
06.11.18
13:36
Данные у меня просто тянутся с формата json. добавила туда. Он мне сгруппировал, но при этом вывел только фамилии, ни количество, которое должно получиться дублей по факту ни другие параметры.
22 Ксю_100500
 
06.11.18
13:39
грубо говоря выводило эти данные в виде таблицы
[{
    "Фамилия": "Иванов",
    "Имя": "Иван",
    "Отчество": "Иванович",
    "Подразделение": "ИП Петров: Отдел рекламы",
    "Количество": "1"
    
}
{
    "Фамилия": "Петров",
    "Имя": "Петр",
    "Отчество": "Петрович",
    "Подразделение": "ИП Сидоров: Отдел рекламы",
    "Количество": "1"
}
{
    "Фамилия": "Иванов",
    "Имя": "Иван",
    "Отчество": "Иванович",
    "Подразделение": "ИП Петров: Отдел рекламы",
    "Количество": "1"
    
}
]
, а после группировки только фамилии без дублей стал выводить
23 catena
 
06.11.18
13:43
(21)Во-первых, после сворачивания в ТЗ остаются только те колонки, которые были указаны при сворачивании. Потому что на выходе плоская таблица и он понятия не имеет, что ему делать с остальными, не указанными колонками.
Во вторых, значения в колонке "Количество" какого типа?

Откуда данные тянутся вообще пофиг, если вы уже их преобразовали в ТЗ.
24 Ксю_100500
 
06.11.18
13:47
Количество тип число.
25 catena
 
06.11.18
13:53
(24)Ну, тогда ваша таблица сворачивается.
26 Ксю_100500
 
06.11.18
14:10
Все свернула таблицу. спасибо. Вывела все поля, а не только по какому сворачиваю. Но вот количество так мне по прежнему не считать не хочет.
27 Belomor
 
06.11.18
14:19
(26) ТЗСотрудники.Свернуть("Фамилия", "Количество");
Должно считаться
28 Ксю_100500
 
06.11.18
14:22
Должно но не считается. выводит пустые поля
29 catena
 
06.11.18
14:25
(28)вариантов не много. Либо там не числа. Либо там нули. Всё.
30 ejikbeznojek
 
06.11.18
14:54
"Подразделение": "ИП Петров: Отдел рекламы",
    "Количество": "1"

Может у тебя "1" это строчка?
Попробуй преобразовать к числу.
31 Ксю_100500
 
07.11.18
12:49
Спасибо. с этим удалось. Действительно по умолчанию не делалось преобразование типов. все получилось.
32 catena
 
07.11.18
13:00
(31)Главное, я ведь спрашивала про тип, наугад отвечали?
33 Ксю_100500
 
07.11.18
13:25
У меня в ТЗ на форме которая для этой колонке тип стоит число, но из формата тянулась строк. и нужно было дополнительно ее преобразовывать и записывать. По умолчанию преобразование не работало. вот как то так
34 vladko
 
07.11.18
13:30
(33) необходимо освоить отладчик, чтобы в следующий раз не гадать что там в ТЗ
35 catena
 
07.11.18
13:32
(33) Я спрашивала не про тип колонки, а про тип значения в колонке. И (34)+++, про отладчик тоже говорила. Ветка могла быть на сутки короче :)
36 Ксю_100500
 
07.11.18
13:46
Извиняюсь. Я не волшебник, я только учусь. Пытаюсь освоить не знакомого зверя всего вторую неделю.  И еще кстати вопрос по ТЗ. Как мне проверить на форме заполнено ли поле в таблице значений. Если ТЗ не существует на клиенте, а поле по факту проверять надо на клиенте, заполнено или нет и если нет вывести пользователю "Заполни поле"
Это делать через РеквизитФормыВЗначение?