Для примера взял составную структуру данных:
Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(4);
Структура = Новый Структура;
Структура.Вставить("STR1", 1);
Структура.Вставить("STR2", 1);
Структура.Вставить("STR3", 3);
Значение=Новый Структура;
Значение.Вставить("Массив",Массив);
Значение.Вставить("Структура",Структура);
Такая структура данных в 1С77 представляется в ввиде:
Массив = СоздатьОбъект("СписокЗначений");
Массив.ДобавитьЗначение(1);
Массив.ДобавитьЗначение(2);
Массив.ДобавитьЗначение(3);
Массив.ДобавитьЗначение(4);
Структура = СоздатьОбъект("СписокЗначений");
Структура.ДобавитьЗначение(1,"STR1");
Структура.ДобавитьЗначение(1,"STR2");
Структура.ДобавитьЗначение(3,"STR3");
Параметр=СоздатьОбъект("СписокЗначений");
Параметр.Установить("Массив", Массив);
Параметр.Установить("Структура",Структура);
Через призму функции ЗначениеВФайл
{"VL",{
{{"VL",{
{{"N","0","0","0","0","0","1"},""},
{{"N","0","0","0","0","0","2"},""},
{{"N","0","0","0","0","0","3"},""},
{{"N","0","0","0","0","0","4"},""}}},"Массив"},
{{"VL",{
{{"N","0","0","0","0","0","1"},"STR1"},
{{"N","0","0","0","0","0","1"},"STR2"},
{{"N","0","0","0","0","0","3"},"STR3"}}
},"Структура"}
}
}
1) Определил с какими типами данных и как с ними работать (Строка, Число, Булево).
Функция ЗначениеВСтроку(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Строка") Тогда
Возврат СтрокаВСтроку(Значение);
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
Возврат ЧислоВСтроку(Значение);
ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
Возврат ДатаВСтроку(Значение);
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
Возврат ?(Значение, ЧислоВСтроку(1), ЧислоВСтроку(0));
// этот участок кода сделан для ссылок где реализовал реквизит 'СсылкаНаОбъект'
// в которой содержится значение конкретного элемента справочника (Пример: {"O","0","0","196","0","0"," 1089488M "})
// в данном примере не реализовано
ИначеЕсли ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Значение)) Тогда
ОбъектМетаданных = Значение.Метаданные();
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Или Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
Возврат СсылкаВСтроку(Значение, ОбъектМетаданных);
Иначе
Возврат СтрокаВСтроку(Значение);
КонецЕсли;
Иначе
Возврат СоставноеЗначениеВСтроку(Значение);
КонецЕсли;
КонецФункции
2) Конвертирую значение в простую строку (формат 1С77)
Функция Блок(Знач ТипСтрокой,
Знач Ячейка1 = Неопределено,
Знач Ячейка2 = Неопределено,
Знач Ячейка3 = Неопределено,
Знач Ячейка4 = Неопределено,
Знач Ячейка5 = Неопределено,
Знач Ячейка6 = Неопределено,
// составной тип ввиду {x,x,x,x,x,x} не должен заключатся в кавычки
// пример {"VL", {{x,x,x,x,x,x}, "x"}} - правильно
// {"VL", {"{x,x,x,x,x,x}", "x"}} - не правильно
БлокДанных = Ложь)
МассивДанных = Новый Массив;
Если ТипСтрокой <> Неопределено Тогда
МассивДанных.Добавить(Ячейка(ТипСтрокой));
КонецЕсли;
// на первом неопределено нужно зарубить иструкцию
Если Ячейка1 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка1, Ячейка(Ячейка1)));
Если Ячейка2 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка2, Ячейка(Ячейка2)));
Если Ячейка3 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка3, Ячейка(Ячейка3)));
Если Ячейка4 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка4, Ячейка(Ячейка4)));
Если Ячейка5 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка5, Ячейка(Ячейка5)));
Если Ячейка6 <> Неопределено Тогда
МассивДанных.Добавить(?(БлокДанных, Ячейка6, Ячейка(Ячейка6)));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат "{" + СтрСоединить(МассивДанных, ",") + "}";
КонецФункции
3) Особенность каждого значение в блоке возвести все данные в кавычки (даже пустые)
Функция Ячейка(Значение)
Если Значение = Неопределено Тогда
Возврат Неопределено;
ИначеЕсли Значение = "" Тогда
Возврат """""";
Иначе
Возврат """" + Строка(Значение) + """";
КонецЕсли;
КонецФункции
4) Описываю конвертацию простых типов
Функция СтрокаВСтроку(Значение)
Возврат Блок("S", "0", "0", "0", "0", "0", Значение);
КонецФункции
Функция ЧислоВСтроку(Значение)
Возврат Блок("N", "0", "0", "0", "0", "0", Значение);
КонецФункции
Функция ДатаВСтроку(Значение)
Возврат Блок("D", "0", "0", "0", "0", "0", Формат(Значение, "ДФ=yyyyMMdd"));
КонецФункции
5) Описываю составные значения (СписокЗначений в строковом представлении 1C77 имеет следующий вид: {"VL", {#Значение}})
Функция СоставноеЗначениеВСтроку(Значение)
ПредставлениеЗначения = Новый Массив;
ПредставлениеЗначения.Добавить(Ячейка("VL"));
ПредставлениеДанных = Новый Массив;
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Для Индекс = 0 по Значение.Количество() - 1 Цикл
ПредставлениеДанных.Добавить(Блок(Неопределено, ЗначениеВСтроку(Значение.Получить(Индекс)), Ячейка(""),,,,,Истина));
КонецЦикла
ИначеЕсли ТипЗнч(Значение) = Тип("Структура") Тогда
Для каждого КлючЗначение Из Значение Цикл
ПредставлениеДанных.Добавить(Блок(Неопределено, ЗначениеВСтроку(КлючЗначение.Значение), Ячейка(КлючЗначение.Ключ),,,,,Истина));
КонецЦикла
ИначеЕсли ТипЗнч(Значение) = Тип("Соответствие") Тогда
КонецЕсли;
ПредставлениеЗначения.Добавить("{" + СтрСоединить(ПредставлениеДанных, ",") + "}");
Возврат "{" + СтрСоединить(ПредставлениеЗначения, ",") + "}";
КонецФункции
При выполнении функции:
ЗначениеВСтроку(Значение)
где значение - это описание составной коллекции (см. выше) должен дать результат следующего ввида:
{"VL",{
{{"VL",{
{{"N","0","0","0","0","0","1"},""},
{{"N","0","0","0","0","0","2"},""},
{{"N","0","0","0","0","0","3"},""},
{{"N","0","0","0","0","0","4"},""}}},"Массив"},
{{"VL",{
{{"N","0","0","0","0","0","1"},"STR1"},
{{"N","0","0","0","0","0","1"},"STR2"},
{{"N","0","0","0","0","0","3"},"STR3"}}},"Структура"}}
}
Что соответствует представлению в 1С77. Вызов функции ЗначениеИзФайла(<ИмяФайла>,<Объект>,<Формат>) возвратить исходное представление значения.
P.S. Пример структуры которую я передаю с помощью этих процедур в 1С77 для вызова УниверсальногоОбмена (Конвертация данных):
Формирую в 1С8.3
ТекстОписаниеОбмена = ТиССервер.ЗначениеВСтроку(Ответ);
Где ответ это составная структура с описанием процесса выгрузки
{"VL",{
{{"S","0","0","0","0","0","316b3e20_a8fd_4c94_8ecf_a67a92a5abd6"},"Идентификатор"},
{{"S","0","0","0","0","0","\\...\resource1C\v7_316b3e20_a8fd_4c94_8ecf_a67a92a5abd6_proc.ert"},"ОбработчикОбмена"},
{{"S","0","0","0","0","0","\\...\resource1C\v7_316b3e20_a8fd_4c94_8ecf_a67a92a5abd6_rules.xml"},"ПравилаОбмена"},
{{"S","0","0","0","0","0","\\...\resource1C\"},"КаталогФайлов"},
{{"D","0","0","0","0","0",""},"НачалоПериода"},
{{"D","0","0","0","0","0","20210419"},"КонецПериода"},
{{"S","0","0","0","0","0","export_data"},"Команда"},
{{"S","0","0","0","0","0","refБанковскиеСчета,ref"},"ИспользуемыеПравила"},
{{"N","0","0","0","0","0","0"},"КоличествоЭлементов"},
{{"N","0","0","0","0","0","0"},"РежимРазработчика"},
{{"VL",{
{{"VL",{
{{"N","0","0","0","0","0","0"},"Использовать"},
{{"S","0","0","0","0","0","ТекущийЭлемент"},"ПолеОтбора"},
{{"S","0","0","0","0","0","="},"Условие"},
{{"B","0","0","1414","0","0"," 70M "},"Значение"},
{{"S","0","0","0","0","0","Справочник"},"ТипОбъекта"},
{{"S","0","0","0","0","0","БанковскиеСчета"},"Объект"},
{{"N","0","0","0","0","0","0"},"Длина"},
{{"N","0","0","0","0","0","0"},"Точность"}}},""}}},"ТаблицаНастройкиОтбора"}}}
Конвертация данного значения в СписокЗначение 1С77 происходит простым способом
если winhttprequest.Status = 200 тогда
значениеизфайла(winhttprequest.responsetext,результат);
если результат = мпустоезначение тогда
сообщить("ошибка обработки параметров get запроса");
конецесли;
конецесли;
Получение информации об обмене описываю функцией след содержания:
...
записать_лог("RN(export_data)");
результатобмена = "";
обработчикобмена = параметры.получить("ОбработчикОбмена");
Если существует_файл(обработчикобмена) = 0 Тогда
Возврат результатобмена;
КонецЕсли;
правилаобмена = параметры.получить("ПравилаОбмена");
Если существует_файл(правилаобмена) = 0 Тогда
Возврат результатобмена;
КонецЕсли;
каталогфайлов = параметры.Получить("КаталогФайлов");
результатобмена = каталогфайлов + "v7_" + идентификатор + "_data.xml";
параметрыформы = СоздатьОбъект("СписокЗначений");
параметрыформы.Установить("ИмяФайлаПравил", правилаобмена);
параметрыформы.Установить("ИмяФайлаДанных", результатобмена);
датаначала = параметры.Получить("НачалоПериода");
параметрыформы.Установить("ДатаНачала", датаначала);
датаконец = параметры.Получить("КонецПериода");
параметрыформы.Установить("ДатаОкончания", датаконец);
параметрыформы.Установить("ИмяКоманды", "Выгрузить");
ТаблицаНастройкиПараметров = СоздатьОбъект("СписокЗначений");
ТаблицаНастройкиПараметров.ДобавитьЗначение(параметры.Получить("КоличествоЭлементов"),"КоличествоОбъектов");
ТаблицаНастройкиПараметров.ДобавитьЗначение(параметры.Получить("РежимРазработчика"),"РежимРазработчика");
параметрыформы.Установить("ТаблицаНастройкиПараметров", ТаблицаНастройкиПараметров);
// Конвертировать в ТЗ
МассивСтрок = параметры.Получить("ТаблицаНастройкиОтбора");
параметрыформы.Установить("КомментироватьВыгрузкуОбъектов", 0);
параметрыформы.Установить("ИспользуемыеПравилаВыгрузки", параметры.получить("ИспользуемыеПравила"));
параметрыформы.Установить("ИмяАлгоритма");
Сообщить("Начал <" + идентификатор + ">");
ОткрытьФорму("Обработка", параметрыформы, обработчикобмена);
Сообщить("Окончил <" + идентификатор + ">");
описаниеошибок = параметрыформы.получить("СписокОшибок");
Если описаниеошибок = ПолучитьПустоеЗначение() Тогда
записать_лог("DSCR(Данные выгружены)");
Иначе
записать_лог("DSCR(" + описаниеошибок + ")");
КонецЕсли;
...