This commit is contained in:
artem 2025-10-07 13:11:18 +05:00
parent e93304ed06
commit 6bf00d3da5
8 changed files with 482 additions and 68 deletions

View File

@ -4,47 +4,11 @@ slug: общие-обмен-данными/сериализация-json
--- ---
# Сериализация # Сериализация
## Описание
```bsl
// Преобразует значение в строку JSON при помощи метода глобального контекста ЗаписатьJSON.
// Допускаются не все типы значений, подробности см. в синтакс-помощнике.
// Даты преобразуются в формат ISO (YYYY-MM-DDThh:mm:ssZ).
//
// Параметры:
// Значение - Произвольный
//
// Возвращаемое значение:
// Строка
//
Функция ЗначениеВJSON(Знач Значение) Экспорт
```
## Пример вызова
```bsl ```bsl
Результат = ОбщегоНазначения.ЗначениеВJSON(Значение); Результат = ОбщегоНазначения.ЗначениеВJSON(Значение);
``` ```
# Десериализация # Десериализация
## Описание
```bsl
// Преобразует строку в формате JSON в значение при помощи метода глобального контекста ПрочитатьJSON.
// См. ограничения в синтакс-помощнике.
// Объекты JSON по умолчанию преобразует в значения типа Соответствие.
// Имена свойств со значением типа Дата необходимо явно указывать, чтобы было выполнено преобразование.
// Ожидаемый формат дат - ISO (YYYY-MM-DDThh:mm:ssZ).
//
// Параметры:
// Строка - Строка - значение в формате JSON.
// ИменаСвойствСоЗначениямиДата - Строка - имя свойства, содержащее значение типа Дата. Допустимо указывать несколько
// свойств через запятую.
// - Массив из Строка
// ПрочитатьВСоответствие - Булево - если Ложь, то объекты JSON будут преобразованы в значение типа Структура.
//
// Возвращаемое значение:
// Произвольный
//
Функция JSONВЗначение(Знач Строка, Знач ИменаСвойствСоЗначениямиДата = Неопределено, Знач ПрочитатьВСоответствие = Истина) Экспорт
```
## Пример вызова
```bsl ```bsl
Результат = ОбщегоНазначения.JSONВЗначение(Строка, ИменаСвойствСоЗначениямиДата, ПрочитатьВСоответствие); Результат = ОбщегоНазначения.JSONВЗначение(Строка, ИменаСвойствСоЗначениямиДата, ПрочитатьВСоответствие);
``` ```

View File

@ -3,42 +3,66 @@ title: Сериализация XML
slug: общие-обмен-данными/сериализация-xml slug: общие-обмен-данными/сериализация-xml
--- ---
# Библиотека стандартных подсистем
## Сериализация (БСП)
# Сериализация
## Описание
```bsl
// Преобразует (сериализует) любое значение в XML-строку.
// Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются.
// См. также ЗначениеИзСтрокиXML.
//
// Параметры:
// Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.
//
// Возвращаемое значение:
// Строка - XML-строка.
//
Функция ЗначениеВСтрокуXML(Значение) Экспорт
```
## Пример вызова
```bsl ```bsl
Результат = ОбщегоНазначения.ЗначениеВСтрокуXML(Значение) Результат = ОбщегоНазначения.ЗначениеВСтрокуXML(Значение)
``` ```
# Десериализация ## Десериализация (БСП)
## Описание
```bsl
// Выполняет преобразование (десериализацию) XML-строки в значение.
// См. также ЗначениеВСтрокуXML.
//
// Параметры:
// СтрокаXML - Строка - XML-строка, с сериализованным объектом.
//
// Возвращаемое значение:
// Произвольный - значение, полученное из переданной XML-строки.
//
Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт
```
## Пример вызова
```bsl ```bsl
Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML) Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML)
``` ```
# Без библиотеки стандартных подсистем
## Сериализация (XDTO)
```bsl
&НаСервере
Процедура СериализоватьНаСервере()
Таблица = ТаблицаДанных.Выгрузить(); // Какой-то объект
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Преобразование: ТаблицаЗначений - ОбъектXDTO
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(Таблица);
// Преобразование: ОбъектXDTO - XML
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
ДанныеXML = ЗаписьXML.Закрыть();
КонецПроцедуры
```
## Десериализация (XDTO)
```bsl
&НаСервере
Процедура ДесериализоватьНаСервере()
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
// Преобразование: XML - ОбъектXDTO
ТипОбъекта = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "ValueTable");
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипОбъекта);
// Преобразование: ОбъектXDTO - ТаблицаЗначений
Таблица = СериализаторXDTO.ПрочитатьXDTO(ОбъектXDTO);
ТаблицаДанных.Загрузить(Таблица);
ЧтениеXML.Закрыть();
КонецПроцедуры
```

View File

@ -1,6 +1,6 @@
--- ---
title: Табличный документ в ТЗ и обратно title: Табличный документ в ТЗ и обратно
slug: общие-работа-с-коллекциями-таблицы-значений/табличный-документ-в-тз-и-обратно slug: общие-обмен-данными/табличный-документ-в-тз-и-обратно
--- ---
# Табличный документ в таблицу значений (табдок в ТЗ) # Табличный документ в таблицу значений (табдок в ТЗ)

View File

@ -0,0 +1,72 @@
---
title: Чтение DBF
slug: общие-обмен-данными-чтение-файлов-примеры/чтение-dbf
---
> Длина имени файла DBF без расширения не должна быть больше **8 символов**
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "dbf";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
//Длина имени файла DBF без расширения не должна быть больше **8 символов**
Файл = Новый Файл(ПутьКФайлу);
ИмяБезРасширения = Файл.ИмяБезРасширения;
Если СтрДлина(ИмяБезРасширения) > 8 Тогда
ИмяБезРасширения = Лев(ИмяБезРасширения, 8);
КонецЕсли;
ПутьКФайлу = СтрЗаменить(ПутьКФайлу, Файл.ИмяБезРасширения, ИмяБезРасширения);
ДанныеФайла = ПолучитьИзВременногоХранилища(Объект.АдресДанных);
ДанныеФайла.Записать(ПутьКФайлу);
ФайлДБФ = Новый XBase;
ФайлДБФ.ОткрытьФайл(ПутьКФайлу);
Если НЕ ФайлДБФ.Первая() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Файл пустой";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Пока НЕ ФайлДБФ.ВКонце() Цикл
СтрокаТаблицы = Объект.ДанныеФайла.Добавить();
СтрокаТаблицы.Наименование = ФайлДБФ.NAME;
// обработка
ФайлДБФ.Следующая();
КонецЦикла;
ФайлДБФ.ЗакрытьФайл();
КонецПроцедуры
```

View File

@ -0,0 +1,111 @@
---
title: Чтение Excel
slug: общие-обмен-данными-чтение-файлов-примеры/чтение-excel
---
## Обычное чтение
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "xlsx";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДанных);
ДанныеФайла.Записать(ПутьКФайлу);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
// Обработка
УдалитьФайлы(ПутьКФайлу);
КонецПроцедуры
```
## Построитель запроса
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "xlsx";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДанных);
ДанныеФайла.Записать(ПутьКФайлу);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу);
КоличествоСтрок = ТабДок.ВысотаТаблицы;
КоличествоКолонок = ТабДок.ШиринаТаблицы;
// Вариант 1, Произвольная область
ОбластьЯчеек = ТабДок.Область(1, 1, КоличествоСтрок, КоличествоКолонок);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
Построитель.Выполнить();
ТаблицаДанных = Построитель.Результат.Выгрузить();
// Вариант 2, Область = вся таблица
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
ТаблицаДанных = Построитель.Результат.Выгрузить();
// Обработка
УдалитьФайлы(ПутьКФайлу);
КонецПроцедуры
```

View File

@ -0,0 +1,62 @@
---
title: Чтение JSON
slug: общие-обмен-данными-чтение-файлов-примеры/чтение-json
---
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "json";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДанных);
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДанныеФайла.Записать(ПутьКФайлу);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ПутьКФайлу);
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
// Получаем массив структур
Если ТипЗнч(ДанныеJSON) = Тип("Структура") Тогда
МассивДанных = Новый Массив;
МассивДанных.Добавить(ДанныеJSON);
ИначеЕсли ТипЗнч(ДанныеJSON) = Тип("Массив") Тогда
МассивДанных = ДанныеJSON;
КонецЕсли;
Для каждого ДанныеКонтрагента Из МассивДанных Цикл
// обрабатываем
КонецЦикла;
ЧтениеJSON.Закрыть();
УдалитьФайлы(ПутьКФайлу);
КонецПроцедуры
```

View File

@ -0,0 +1,89 @@
---
title: Чтение TXT, CSV
slug: общие-обмен-данными-чтение-файлов-примеры/чтение-txt-csv
---
## Вариант с ЧтениеТекста
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "txt";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДанных);
ДанныеФайла.Записать(ПутьКФайлу);
Текст = Новый ЧтениеТекста;
Текст.Открыть(ПутьКФайлу, КодировкаТекста.UTF8);
ТекСтрока = Текст.ПрочитатьСтроку();
НомерСтроки = 1;
Пока ТекСтрока <> Неопределено Цикл
// обработка
ТекСтрока = Текст.ПрочитатьСтроку();
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Текст.Закрыть();
УдалитьФайлы(ПутьКФайлу);
КонецПроцедуры
```
## Вариант с ТекстовыйДокумент
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Текст = Новый ТекстовыйДокумент;
Оповещение = Новый ОписаниеОповещения("ПрочитатьФайлЗавершение", ЭтотОбъект, Текст);
Текст.НачатьЧтение(Оповещение, Объект.ПутьКФайлу, КодировкаТекста.UTF8);
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьФайлЗавершение(Текст) Экспорт
КоличествоСтрок = Текст.КоличествоСтрок();
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ТекСтрока = Текст.ПолучитьСтроку(НомерСтроки);
// Обработка
КонецЦикла;
КонецПроцедуры
```

View File

@ -0,0 +1,92 @@
---
title: Чтение XML
slug: общие-обмен-данными-чтение-файлов-примеры/чтение-xml
---
## С помощью XDTO
```bsl
&НаКлиенте
Асинх Процедура ПрочитатьФайл(Команда)
Расширение = "xml";
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл";
ПараметрыДиалога.Фильтр = ФильтрПоРасширению(Расширение);
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,,ПараметрыДиалога);
Если ОписаниеФайла = Неопределено Тогда
Возврат;
КонецЕсли;
АдресДанных = ОписаниеФайла.Адрес;
Расширение = ОписаниеФайла.СсылкаНаФайл.Файл.Расширение;
ПрочитатьФайлНаСервере(АдресДанных, Расширение);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(АдресДанных, Расширение)
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресДанных);
ПутьКФайлу = ПолучитьИмяВременногоФайла(Расширение);
ДанныеФайла.Записать(ПутьКФайлу);
СоответствиеПолей = Новый Соответствие;
СоответствиеПолей.Вставить("name", "Наименование");
СоответствиеПолей.Вставить("fullname", "НаименованиеПолное");
СоответствиеПолей.Вставить("partner_type", "ВидКонтрагента");
СоответствиеПолей.Вставить("inn", "ИНН");
СоответствиеПолей.Вставить("kpp", "КПП");
СоответствиеПолей.Вставить("phone", "Телефон");
СоответствиеПолей.Вставить("email", "ЭлектроннаяПочта");
СоответствиеПолей.Вставить("is_customer", "Покупатель");
СоответствиеПолей.Вставить("is_supplier", "Поставщик");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ДанныеXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
// Если элемент в коллекции один, то тип будет "ОбъектXDTO", который в цикле не обойти
// Создаем в таком случае принудительно массив
Если ТипЗнч(ДанныеXDTO.Partner) = Тип("ОбъектXDTO") Тогда
МассивКонтрагентовXDTO = Новый Массив;
МассивКонтрагентовXDTO.Добавить(ДанныеXDTO.Partner);
Иначе
МассивКонтрагентовXDTO = ДанныеXDTO.Partner;
КонецЕсли;
Для каждого ОбъектXDTO Из МассивКонтрагентовXDTO Цикл
НоваяСтрока = Объект.ДанныеФайла.Добавить();
СвойстваXDTO = ОбъектXDTO.Свойства();
Для каждого СвойствоXDTO Из СвойстваXDTO Цикл
ИмяСвойства = СвойствоXDTO.Имя;
Если ТипЗнч(ОбъектXDTO[ИмяСвойства]) = Тип("ОбъектXDTO") Тогда
Продолжить;
КонецЕсли;
ИмяРеквизита = СоответствиеПолей.Получить(ИмяСвойства);
Если ИмяРеквизита <> Неопределено Тогда
НоваяСтрока[ИмяРеквизита] = ОбъектXDTO[ИмяСвойства];
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЧтениеXML.Закрыть();
УдалитьФайлы(ПутьКФайлу);
КонецПроцедуры
```