Если что, СериализаторXDTO - не то что от вас будут ожидать в большинстве случаев.
Если с кемт интегрируетесь, лучше действовать через стандартную сериализацию, а для ссылок и сложных объектов там в конструкторе можно указать функцию преобразования в примитивы.
(9) нужна была выгрузка на сайт.
1) Принимающая сторона из всех вариантов выбрала мой. Через получение структуры документов и сериализации каждого реквизита отдельно. Да в 99% случаев такой способ менее подходит чем типовые.
2) В процессе гуглинга и поиске на инфостарте про JSON маловато информации. Хотелось запустить тему, устроить holywar. Что бы новички натыкались на эту тему, и черпали для себя новую полезную информацию, в т. ч. и я.
(10) Следуя вашей логике, я могу замутить любой срач, опубликовав любую хрень, и потом отмазываться полезностью комментов, написанных более квалифицированными специалистами. Не смешно.
Табличную часть структуры по другому лучше формировать, н-р:
ТаблицаЗнач = Объект[ТабличнаяЧасть.Имя].Выгрузить();
МассивТабЧасти = Новый Массив;
Для Каждого СтрТЗ Из ТаблицаЗнач Цикл
СтруктураСтр = Новый Структура;
Для Каждого Колонка Из ТаблицаЗнач.Колонки Цикл
Если ТипЗнч(СтрТЗ[Колонка.Имя]) = тип("Число") ИЛИ ТипЗнч(СтрТЗ[Колонка.Имя]) = тип("Дата") ИЛИ ТипЗнч(СтрТЗ[Колонка.Имя]) = тип("Булево") тогда
СтруктураСтр.Вставить(Колонка.Имя, СтрТЗ[Колонка.Имя]);
Иначе
СтруктураСтр.Вставить(Колонка.Имя, Строка(СтрТЗ[Колонка.Имя]));
КонецЕсли;
Если НЕ СтрТЗ[Колонка.Имя] = Неопределено и Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрТЗ[Колонка.Имя])) тогда
СтруктураСтр.Вставить(Колонка.Имя+"Код", СтрТЗ[Колонка.Имя].Код);
ИначеЕсли НЕ СтрТЗ[Колонка.Имя] = Неопределено и Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(СтрТЗ[Колонка.Имя])) тогда
СтруктураСтр.Вставить(Колонка.Имя+"Номер", СтрТЗ[Колонка.Имя].Номер);
КонецЕсли;
КонецЦикла;
МассивТабЧасти.Добавить(СтруктураСтр);
КонецЦикла;
Структура.Вставить(ТабличнаяЧасть.Имя, МассивТабЧасти);
Если нужно выгрузить не только идентификаторы объектов, а дополнительную информацию:
Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Документ."+СсылкаНаДокумент.Метаданные().Имя+" ГДЕ Ссылка=&Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
JSON=ОбъектВСтрокуJSON(ОбщегоНазначения.ТаблицаЗначенийВМассив(Запрос.Выполнить().Выгрузить()));
Универсальная функция сериализации:
Функция ОбъектВСтрокуJSON(Объект)
Функция ОбъектВСтрокуJSON(Объект) Экспорт
ЗаписьJSON=Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Объект,, "ПреобразоватьJSON", ЭТОТМОДУЛЬ);
Возврат ЗаписьJSON.Закрыть()
КонецФункции
Функция ПреобразоватьJSON(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
ТипЗначения=ТипЗнч(Значение);
Если ТипЗначения=Тип("ТаблицаЗначений") Тогда
//Для таблицы значений нужно обратное преобразование с рекурсией
ЗаписьJSON=Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
МассивСтрок=ОбщегоНазначения.ТаблицаЗначенийВМассив(Значение);
ЗаписатьJSON(ЗаписьJSON, МассивСтрок, , "ПреобразоватьJSON", );
ТекстJSON=ЗаписьJSON.Закрыть();
//Преобразуем его обратно в типы 1С
ЧтениеJSON=Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТекстJSON);
Возврат ПрочитатьJSON(ЧтениеJSON, Ложь);
ИначеЕсли ТипЗначения=Тип("УникальныйИдентификатор") Тогда
Возврат СокрЛП(Значение);
КонецЕсли;
МдОбъекта=Метаданные.НайтиПоТипу(ТипЗначения);
Если МдОбъекта=Неопределено Тогда
//Это объект простого типа, обработка не требуется
Возврат Значение;
КонецЕсли;
Если Метаданные.Справочники.Содержит(МдОбъекта) Тогда
СтрОбъекта=Новый Структура("Идентификатор,ИмяТипа", СокрЛП(Значение.УникальныйИдентификатор()),МдОбъекта.ПолноеИмя());
Если МдОбъекта.ДлинаКода>0 Тогда
СтрОбъекта.Вставить("Код", Значение.Код);
КонецЕсли;
Если МдОбъекта.ДлинаНаименования>0 Тогда
СтрОбъекта.Вставить("Наименование", Значение.Наименование);
КонецЕсли;
Если МдОбъекта.Иерархический>0 Тогда
СтрОбъекта.Вставить("Родитель", СокрЛП(Значение.Родитель.УникальныйИдентификатор()));
КонецЕсли;
Если МдОбъекта.Владельцы.Количество() и ЗначениеЗаполнено(Значение.Владелец) Тогда
СтрОбъекта.Вставить("Владелец", СокрЛП(Значение.Владелец.УникальныйИдентификатор()));
КонецЕсли;
Возврат СтрОбъекта;
ИначеЕсли Метаданные.Документы.Содержит(МдОбъекта) Тогда
Возврат Новый Структура("Идентификатор,ИмяТипа,Представление,Дата,Номер", СокрЛП(Значение.УникальныйИдентификатор()), МдОбъекта.ПолноеИмя(), СокрЛП(Значение), Значение.Дата, Значение.Номер);
ИначеЕсли Метаданные.Перечисления.Содержит(МдОбъекта) Тогда
//Перечисления в виде имён значений
Если Значение.Пустая() Тогда
Возврат "";
Иначе
Возврат ОбщегоНазначения.ИмяЗначенияПеречисления(Значение);
КонецЕсли;
КонецЕсли;
//Строковое представление и всё
Возврат СокрЛП(Значение);
КонецФункции
Если уж делать свой велосипед по выгрузке, то стоит учесть:
1) реквизиты составных типов;
2) реквизиты типа перечисления, бизнес-процессы, задачи и ПВХ.
Ну и код причесать, установку значения в структуре вынести в отдельную процедуру
(19) Обработка делалась для выгрузки на сайт, в вашем случае я должен получать и обрабатывать ссылку 1С. Зачем человеку делавшему загрузку на сайт, этот набор символов
Пупупупу... хотел устроить нетиповой обмен между нетиповой бухой и нетиповой зарплатой на Json, но глянул... по трудоемкости то же самое что пилить свой с нуля, или освоить КД, переработав стандартные правила... Доки содержат ссылочные типы, те, в свою очередь, ТЧ, в которых еще типы, еще ТЧ, вложенность многоуровневейшая... А тащить нужно не как здесь - только названия, а вообще все - все - все и на конце преобразовывать в типы базы приемника, проверять анализировать, есть ли такие объекты уже, не поменялись ли свойства этих объектов, принимать решение о замене объектов или свойств объектов... короче, сэкономить не выйдет)))