// 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 // BSLLS:NumberOfOptionalParams-off // BSLLS:UsingServiceTag-off // @skip-check method-too-many-params // Раскомментировать, если выполняется 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Ответ, ДвоичныеДанные - Изменить свойства страницы Функция ИзменитьСвойстваСтраницы(Знач Токен , Знач Страница , Знач Данные = "" , Знач Иконка = "" , Знач Обложка = "" , Знач Архивирована = Ложь) Экспорт Заголовки = СоздатьЗаголовкиЗапроса(Токен); Параметры = Новый Структура; Files = "files"; Если ЗначениеЗаполнено(Данные) И ТипЗнч(Данные) = Тип("Соответствие") Тогда Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); Иначе Свойства = Новый Соответствие; КонецЕсли; Если ЗначениеЗаполнено(Иконка) Тогда СоответствиеИконки = Новый Соответствие; СоответствиеИконки.Вставить("Icon", Иконка); ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки); ОбъектИконка = ОбъектИконка[Files][0]; ОбъектИконка.Удалить("name"); Параметры.Вставить("icon", ОбъектИконка); КонецЕсли; Если ЗначениеЗаполнено(Обложка) Тогда СоответствиеОбложки = Новый Соответствие; СоответствиеОбложки.Вставить("Cover", Обложка); ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки); ОбъектОбложка = ОбъектОбложка[Files][0]; ОбъектОбложка.Удалить("name"); Параметры.Вставить("cover", ОбъектОбложка); КонецЕсли; Параметры.Вставить("properties", Свойства); Параметры.Вставить("archived" , Архивирована); ПреобразоватьИД(Страница); Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки); Возврат Ответ; КонецФункции #КонецОбласти #Область РаботаСБазамиДанных // Создать базу данных страниц // // Параметры: // Токен - Строка - Токен // Родитель - Строка - 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", ВставитьПосле); КонецЕсли; URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children"; Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); Возврат Ответ; КонецФункции // Вернуть блок. // // Параметры: // Токен - Строка - Токен // ИДБлока - Строка - 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", Телефон); КонецФункции #КонецОбласти #КонецОбласти