// MIT License

// Copyright (c) 2023 Anton Tsitavets

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// https://github.com/Bayselonarrend/OpenIntegrations

// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off

// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"

#Область ПрограммныйИнтерфейс

#Область РаботаСоСтраницами

// Создать дочернюю страницу над другой страницей-родителем
// 
// Параметры:
//  Токен - Строка - Токен
//  Родитель - Строка - ID Родителя
//  Заголовок - Строка - Заголовок страницы
// 
// Возвращаемое значение:
//  Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - Ответ сервера Notion
Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);   
    Свойства  = Новый Структура;
    Параметры = Новый Структура;
    
    ДобавитьЗаголовокСтраницы(Заголовок, Свойства);
    ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
    
    Параметры.Вставить("properties", Свойства);
    
    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
    
    Возврат Ответ;
    
КонецФункции

// Создать страницу в базу.
// 
// Параметры:
//  Токен - Строка - Токен
//  Родитель - Строка - ID родительской базы
//  Данные - Соответствие Из КлючИЗначение - Соответствие свойств. Должен соответствовать шаблону свойств базы
// 
// Возвращаемое значение:
//  Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Создать страницу в базу
Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
    
    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
    Параметры  = Новый Структура;
    
    ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);

    Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);    
    Параметры.Вставить("properties", Свойства);
    
    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
    
    Возврат Ответ;
    
КонецФункции

// Получить страницу.
// 
// Параметры:
//  Токен - Строка - Токен
//  Страница - Строка - ID Родителя
// 
// Возвращаемое значение:
//  ДвоичныеДанные, Неопределено, Строка, Произвольный - Ответ сервера Notion
Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    ПреобразоватьИД(Страница);  
    
    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки);
    
    Возврат Ответ;
    
КонецФункции

// Изменить свойства страницы.
// 
// Параметры:
//  Токен - Строка - Токен
//  Страница - Строка - ID изменяемой страницы
//  Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров
//  Иконка - Строка - URL картинки - иконки страницы
//  Обложка - Строка - URL картинки - обложки страницы
//  Архивирована - Булево - Истина - Архивировать страницу
// 
// Возвращаемое значение:
//  Строка, Произвольный, Неопределено, HTTPОтвет, ДвоичныеДанные - Изменить свойства страницы
// @skip-check method-too-many-params
// BSLLS:NumberOfOptionalParams-off
Функция ИзменитьСвойстваСтраницы(Знач Токен
    , Знач Страница
    , Знач Данные = ""
    , Знач Иконка = ""
    , Знач Обложка = ""
    , Знач Архивирована = Ложь) Экспорт
    
    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
    Параметры  = Новый Структура;
    Files      = "files";
    
    Если ЗначениеЗаполнено(Данные) И ТипЗнч(Данные) = Тип("Соответствие") Тогда
        Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); 
    Иначе 
        Свойства = Новый Соответствие;
    КонецЕсли;
        
    Если ЗначениеЗаполнено(Иконка) Тогда
        СоответствиеИконки = Новый Соответствие;
        СоответствиеИконки.Вставить("Icon", Иконка);
        
        ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки);
        ОбъектИконка = ОбъектИконка[Files][0];
        ОбъектИконка.Удалить("name");
        
        Параметры.Вставить("icon", ОбъектИконка);
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Обложка) Тогда
        СоответствиеОбложки = Новый Соответствие;
        СоответствиеОбложки.Вставить("Cover", Обложка);

        ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки);
        ОбъектОбложка = ОбъектОбложка[Files][0];
        ОбъектОбложка.Удалить("name");

        Параметры.Вставить("cover", ОбъектОбложка);
    КонецЕсли;

    Параметры.Вставить("properties", Свойства);
    Параметры.Вставить("archived"  , Архивирована);
    
    ПреобразоватьИД(Страница);

    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
    
    Возврат Ответ;
    
КонецФункции
// BSLLS:NumberOfOptionalParams-on

#КонецОбласти

#Область РаботаСБазамиДанных

// Создать базу данных страниц
// 
// Параметры:
//  Токен - Строка - Токен
//  Родитель - Строка - ID страницы родителя
//  Заголовок - Строка - Заголовок базы данных
//  Свойства - Структура Из Строка - Свойства базы данных
// 
// Возвращаемое значение:
//  Строка, Произвольный, ДвоичныеДанные, Неопределено, HTTPОтвет - Ответ сервера Notion
Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт

    // Пример структуры/соответствия свойств
    
    // Имя        : title
    // Описание   : rich_text
    // В работе   : checkbox 
    // Количество : number
    // Дата       : date
    // Статус     : Соответствие
    //               Активный   : green
    //               Неактивный : red
    //               Архив      : yellow
    
    // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя

    Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда
        Свойства = Новый Структура("Наименование", "title");
    КонецЕсли;

    Заголовки = СоздатьЗаголовкиЗапроса(Токен);     
    Параметры = Новый Структура;
    
    ДобавитьРодителяБазы(Родитель, Ложь, Параметры);
    ДобавитьЗаголовокБазы(Заголовок, Параметры);
    ДобавитьСвойстваБазы(Свойства, Параметры);

    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки);
    
    Возврат Ответ;
    
КонецФункции

// Получить данные о базе данных
// 
// Параметры:
//  Токен - Строка - Токен
//  База - Строка - ID базы данных
// 
// Возвращаемое значение:
//  Строка, Произвольный, ДвоичныеДанные, Неопределено - Ответ сервера Notion
Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт
   
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    ПреобразоватьИД(База);  
    
    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки);
    
    Возврат Ответ; 
    
КонецФункции

// Изменить свойства базы.
// 
// Параметры:
//  Токен - Строка - Токен
//  База - Строка - ID целевой базы
//  Свойства - Соответствие из КлючИЗначение - Соответствие, как при создании новой базы. Если значение - пусто, 
//                                             то свойство будет удалено
//  Заголовок - Строка - Заголовок базы
//  Описание - Строка - Описание базы
// 
// Возвращаемое значение:
//  Строка, Произвольный, Неопределено, HTTPОтвет, ДвоичныеДанные - Ответ сервера Notion
Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт
    
    Параметры = Новый Структура;
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);  
    ПреобразоватьИД(База); 
    
    Если ЗначениеЗаполнено(Заголовок) Тогда
        ДобавитьЗаголовокБазы(Заголовок, Параметры);
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Описание) Тогда
        ДобавитьОписаниеБазы(Описание, Параметры);
    КонецЕсли;
    
    Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда
        ДобавитьСвойстваБазы(Свойства, Параметры);
    КонецЕсли;
    
    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки);
    
    Возврат Ответ;
    
КонецФункции

#КонецОбласти 

#Область РаботаСБлоками

// Создать блок.
// 
// Параметры:
//  Токен - Строка - Токен
//  Родитель - Строка - ID родительского блока или страницы
//  Блок - Строка,Соответствие Из КлючИЗначение - ID блока, копию которого необходимо добавить или сам блок
//  ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый, если родитель уже имеет дочерние блоки
// 
// Возвращаемое значение:
//  Строка, Произвольный, Неопределено, ДвоичныеДанные, HTTPОтвет - Ответ сервера Notion
Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт
  
    Заголовки    = СоздатьЗаголовкиЗапроса(Токен); 
    ПреобразоватьИД(Родитель);
    
    Если ТипЗнч(Блок) = Тип("Строка") Тогда
        ПреобразоватьИД(Блок);
        Блок = ВернутьБлок(Токен, Блок);
    КонецЕсли;
    
    МассивБлоков = Новый Массив;
    МассивБлоков.Добавить(Блок);
    
    Параметры = Новый Соответствие;
    Параметры.Вставить("children", МассивБлоков);
    
    Если ЗначениеЗаполнено(ВставитьПосле) Тогда
        Параметры.Вставить("after", ВставитьПосле);
    КонецЕсли;
    
    Ответ     = OPI_Инструменты.Patch("https://api.notion.com/v1/blocks/" + Родитель + "/children"
                    , Параметры
                    , Заголовки);
    
    Возврат Ответ;
       
КонецФункции

// Вернуть блок.
// 
// Параметры:
//  Токен - Строка - Токен
//  ИДБлока - Строка - ID блока
//  ТолькоОснова - Булево - Истина - служебные поля удаляются, остается только сам блок
// 
// Возвращаемое значение:
//  Неопределено, ДвоичныеДанные, Строка, Произвольный - Ответ сервера Notion
Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт
    
    ПреобразоватьИД(ИДБлока);
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
    
    Если ТолькоОснова Тогда
        УдалитьЛишниеПоляБлока(Ответ);    
    КонецЕсли;
    
    Возврат Ответ;
        
КонецФункции

// Вернуть дочерние блоки.
// 
// Параметры:
//  Токен - Строка - Токен
//  ИДБлока - Строка - ID блока-родителя
// 
// Возвращаемое значение:
//  Неопределено, ДвоичныеДанные, Строка, Произвольный - Ответ сервера Notion
Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт
    
    ПреобразоватьИД(ИДБлока);
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки);
    
    Возврат Ответ;
    
КонецФункции

// Удалить блок.
// 
// Параметры:
//  Токен - Строка - Токен
//  ИДБлока - Строка - ID блока
// 
// Возвращаемое значение:
//  Неопределено, ДвоичныеДанные, Строка, Произвольный - Ответ сервера Notion
Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт
    
    ПреобразоватьИД(ИДБлока);
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    Ответ     = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
    
    Возврат Ответ;
        
КонецФункции
    
#КонецОбласти

#Область Пользователи

// Список пользователей.
// 
// Параметры:
//  Токен - Строка - Токен
// 
// Возвращаемое значение:
//  Неопределено, ДвоичныеДанные, Строка, Произвольный - Ответ сервера Notion
Функция СписокПользователей(Знач Токен) Экспорт

    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки);
    
    Возврат Ответ;
        
КонецФункции

// Получить данные пользователя.
// 
// Параметры:
//  Токен - Строка - Токен
//  ИДПользователя - Строка - ID целевого пользователя
// 
// Возвращаемое значение:
//  Неопределено, ДвоичныеДанные, Строка, Произвольный - Получить данные пользователя
Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт
    
    ПреобразоватьИД(ИДПользователя);
    
    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки);
    
    Возврат Ответ;
    
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция СоздатьЗаголовкиЗапроса(Знач Токен)
    
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Authorization" , "Bearer " + Токен);
    Заголовки.Вставить("Notion-Version", "2022-06-28");
    
    Возврат Заголовки;
        
КонецФункции

Процедура ПреобразоватьИД(Идентификатор)
    
    Идентификатор = СтрЗаменить(Идентификатор, "-", "");
    
КонецПроцедуры

Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
  
    ПреобразоватьИД(Родитель);
  
    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
    СтруктураРодителя  = Новый Структура(ПолеИдентификатора, Родитель);

    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
     
КонецПроцедуры

Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
  
    ПреобразоватьИД(Родитель);
  
    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
    СтруктураРодителя  = Новый Структура();
    СтруктураРодителя.Вставить("type"            , ПолеИдентификатора);
    СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель);

    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
     
КонецПроцедуры

Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) 
    
    ПодчиненнаяСтруктура = Новый Структура;
    СтруктураДанных      = Новый Структура;
    СтруктураТекста      = Новый Структура;
    МассивДанных         = Новый Массив;
    Title                = "title";
    
    СтруктураТекста.Вставить("content", Заголовок);
    СтруктураТекста.Вставить("link"   , Неопределено);
    
    СтруктураДанных.Вставить("text", СтруктураТекста);
    СтруктураДанных.Вставить("type", "text");
    
    МассивДанных.Добавить(СтруктураДанных);
    
    ПодчиненнаяСтруктура.Вставить("id"   , Title);
    ПодчиненнаяСтруктура.Вставить("type" , Title);
    ПодчиненнаяСтруктура.Вставить(Title  , МассивДанных);
    
    ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура);
    
КонецПроцедуры

Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
    
    Заголовок = ПреобразоватьЗаголовок(Заголовок);    
    ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
    
КонецПроцедуры

Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура)
    
    Заголовок = ПреобразоватьЗаголовок(Описание);    
    ОсновнаяСтруктура.Вставить("description", Заголовок["title"]);
    
КонецПроцедуры

Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура)
    
    Если Свойства.Количество() = 0 Тогда
       ОсновнаяСтруктура.Вставить("properties", Новый Структура);
       Возврат;      
    КонецЕсли;
    
    СоответствиеПараметров = Новый Соответствие;
    
    Для Каждого Свойство Из Свойства Цикл
        
        Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
            
           СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура));
           
        ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") 
            Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда
                
            ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение);
            СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения));
            
        Иначе
            
            СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение);
            
        КонецЕсли;
        
    КонецЦикла;
    
    ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров);
    
КонецПроцедуры

Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов)
    
    МассивВариантов = Новый Массив;
    
    Для Каждого Вариант Из СтруктураВариантов Цикл
        
        СоответствиеВарианта = Новый Соответствие;
        СоответствиеВарианта.Вставить("name" , Вариант.Ключ);
        СоответствиеВарианта.Вставить("color", Вариант.Значение);
        
        МассивВариантов.Добавить(СоответствиеВарианта);
                
    КонецЦикла;
    
    Возврат Новый Структура("options", МассивВариантов);
        
КонецФункции

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

    Возврат Свойства;

КонецФункции

Процедура УдалитьЛишниеПоляБлока(Знач Блок)
    
    МассивЛишних = Новый Массив;
    МассивЛишних.Добавить("request_id");
    МассивЛишних.Добавить("archived");
    МассивЛишних.Добавить("created_by");
    МассивЛишних.Добавить("last_edited_time");
    МассивЛишних.Добавить("created_time");
    МассивЛишних.Добавить("has_children");
    МассивЛишних.Добавить("parrent");
    МассивЛишних.Добавить("last_edited_by");
    МассивЛишних.Добавить("id");
    
    Для Каждого Поле Из МассивЛишних Цикл
        
        Если Не Блок.Получить(Поле) = Неопределено Тогда
            Блок.Удалить(Поле);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

#Область ПреобразованиеТипов

Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
    
    Если Тип = "title" Тогда
        Возврат ПреобразоватьЗаголовок(Значение);
    ИначеЕсли Тип = "rich_text" Тогда
        Возврат ПреобразоватьТекст(Значение);
    ИначеЕсли Тип = "number" Тогда
        Возврат ПреобразоватьЧисло(Значение);
    ИначеЕсли Тип = "select" Тогда
        Возврат ПреобразоватьВариантВыбора(Значение);
    ИначеЕсли Тип = "multi_select" Тогда
        Возврат ПреобразоватьМножественныйВыбор(Значение);
    ИначеЕсли Тип = "status" Тогда
        Возврат ПреобразоватьСтатус(Значение);
    ИначеЕсли Тип = "date" Тогда
        Возврат ПреобразоватьДату(Значение);
    ИначеЕсли Тип = "relation" Тогда
        Возврат ПреобразоватьСвязь(Значение);
    ИначеЕсли Тип = "people" Тогда
        Возврат ПреобразоватьПользователей(Значение);
    ИначеЕсли Тип = "files" Тогда
        Возврат ПреобразоватьФайлы(Значение);
    ИначеЕсли Тип = "checkbox" Тогда
        Возврат ПреобразоватьБулево(Значение);
    ИначеЕсли Тип = "url" Тогда
        Возврат ПреобразоватьСсылку(Значение);
    ИначеЕсли Тип = "email" Тогда
        Возврат ПреобразоватьПочту(Значение);
    ИначеЕсли Тип = "phone_number" Тогда
        Возврат ПреобразоватьТелефон(Значение);
    Иначе 
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Функция ПреобразоватьЗаголовок(Знач Заголовок) 
    
    СтруктураДанных      = Новый Структура;
    СтруктураТекста      = Новый Структура;
    МассивДанных         = Новый Массив;
    
    СтруктураТекста.Вставить("content", Заголовок);
    СтруктураТекста.Вставить("link"   , Неопределено);
    
    СтруктураДанных.Вставить("type", "text");
    СтруктураДанных.Вставить("text", СтруктураТекста);
       
    МассивДанных.Добавить(СтруктураДанных);

    Возврат Новый Структура("title", МассивДанных);
    
КонецФункции

Функция ПреобразоватьТекст(Знач Текст)
    
    МассивТекста    = Новый Массив;
    СтруктураТекста = Новый Структура;
    
    СтруктураТекста.Вставить("type", "text");
    СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
    
    МассивТекста.Добавить(СтруктураТекста);
    
    Возврат Новый Структура("rich_text", МассивТекста);
    
КонецФункции

Функция ПреобразоватьЧисло(Знач Число)
    Возврат Новый Структура("number", Число);
КонецФункции

Функция ПреобразоватьВариантВыбора(Знач Вариант)
    
    СтруктураВыбора = Новый Структура;
    СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
    
    Возврат СтруктураВыбора;
    
КонецФункции

Функция ПреобразоватьСтатус(Знач Статус)
    
    СтруктураСтатуса = Новый Структура;
    СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
    
    Возврат СтруктураСтатуса;
    
КонецФункции

Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
    
    МассивВариантовВыбора = Новый Массив;
    
    Для Каждого Вариант Из МассивВариантов Цикл
        МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
    КонецЦикла;
    
    Возврат Новый Структура("multi_select", МассивВариантовВыбора);
    
КонецФункции

Функция ПреобразоватьДату(Знач Дата)
    
    СтруктураДаты = Новый Структура;
    
    Если Дата = НачалоДня(Дата) Тогда
        ФорматДаты = "ДФ=yyyy-MM-dd";
    Иначе
        ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
    КонецЕсли;
    
    Дата = Формат(Дата, ФорматДаты);
    СтруктураДаты.Вставить("start", Дата);
    
    Возврат Новый Структура("date", СтруктураДаты);
    
КонецФункции

Функция ПреобразоватьСвязь(Знач Идентификатор) 
    
    МассивСвязи = Новый Массив;
    МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
    
    Возврат Новый Структура("relation", МассивСвязи);
    
КонецФункции

Функция ПреобразоватьПользователей(Знач МассивИД)
    
    Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
        МассивИД_ = Новый Массив;
        МассивИД_.Добавить(МассивИД);
        МассивИД = МассивИД_;
    КонецЕсли;
    
    МассивПользователей = Новый Массив;
    
    Для Каждого Идентификатор Из МассивИД Цикл
        
        СтруктураПользователя = Новый Структура;
        СтруктураПользователя.Вставить("object", "user");
        СтруктураПользователя.Вставить("id"    , Идентификатор);
        МассивПользователей.Добавить(СтруктураПользователя);
        
    КонецЦикла;
    
    Возврат Новый Структура("people", МассивПользователей);
    
КонецФункции

Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
        
    МассивФайлов = Новый Массив;
    
    Для Каждого Файл Из СоответствиеФайлов Цикл
        
        СтруктураФайла = Новый Структура;
        СтруктураФайла.Вставить("type"    , "external");
        СтруктураФайла.Вставить("name"    , Файл.Ключ);
        СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
        
        МассивФайлов.Добавить(СтруктураФайла);
        
    КонецЦикла;

    Возврат Новый Структура("files", МассивФайлов);
    
КонецФункции

Функция ПреобразоватьБулево(Знач Булево)
    Возврат Новый Структура("checkbox", Булево);
КонецФункции

Функция ПреобразоватьСсылку(Знач URL)
    Возврат Новый Структура("url", URL);
КонецФункции

Функция ПреобразоватьПочту(Знач Почта)
    Возврат Новый Структура("email", Почта);
КонецФункции

Функция ПреобразоватьТелефон(Знач Телефон)
    Возврат Новый Структура("phone_number", Телефон);
КонецФункции

#КонецОбласти

#КонецОбласти