// OneScript: ./OInt/core/Modules/OPI_VK.os
// Lib: VK
// CLI: vk

// 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:NumberOfOptionalParams-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:UnusedLocalVariable-off

//@skip-check method-too-many-params
//@skip-check wrong-string-literal-content
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content

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

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

#Область ПолучениеТокена

// Создать ссылку получения токена
// Получение ссылки для интерактивного получения токена (access_token), который необходим
// для дальнейших действий
// 
// Параметры:
//  app_id - Строка,Число - app_id из настроек приложения - app
// 
// Возвращаемое значение:
//  Строка - URL, по которому необходимо перейти в браузере 
Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id);
    
    // access_token нужно будет забрать из параметра в строке адреса браузера
    Возврат "https://oauth.vk.com/authorize?client_id=" + App_id
        + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video"
        + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
        
КонецФункции
 
#КонецОбласти

#Область РаботаСГруппой

// Создать пост
// Создает пост с картинками
// 
// Параметры:
//  Текст              - Строка                          - Текст поста                           - text
//  МассивКартинок     - Массив из Строка,ДвоичныеДанные - Массив картинок                       - pictures  
//  Реклама            - Булево                          - Признак ""Это реклама""               - ad
//  СсылкаПодЗаписью   - Строка                          - Ссылка (URL) под записью              - url
//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьПост(Знач Текст
    , Знач МассивКартинок
    , Знач Реклама = Ложь
    , Знач СсылкаПодЗаписью = ""
    , Знач Параметры = "") Экспорт
        
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок);
 
    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
    МассивВложений  = Новый Массив;    
        
    Для Каждого КартинкаПоста Из МассивКартинок Цикл
        
        Параметры_        = ПолучитьСтандартныеПараметры(Параметры);
        ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
        
        OwnerId  = ОтветСоответствие.Получить("owner_id");
        ObjectId = ОтветСоответствие.Получить("id");
        
        Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
        	Возврат ОтветСоответствие;
        КонецЕсли;
        
        OwnerId  = OPI_Инструменты.ЧислоВСтроку(OwnerId);
        ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId);
        
        ФотоID = "photo" + OwnerId + "_" + ObjectId; 

        МассивВложений.Добавить(ФотоID);
        
    КонецЦикла;

    Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Создать составной пост
// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.)
// 
// Параметры:
//  Текст            - Строка           - Текст поста                              - text
//  Объекты          - Массив из Строка - Массив идентификаторов вида photo123_123 - objects  
//  Реклама          - Булево           - Признак ""Это реклама""                  - ad
//  СсылкаПодЗаписью - Строка           - Ссылка (URL) под записью                 - url
//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьСоставнойПост(Знач Текст
    , Знач Объекты
    , Знач Реклама = Ложь
    , Знач СсылкаПодЗаписью = ""
    , Знач Параметры = "") Экспорт
   
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью);   
    OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама);
    
    Параметры      = ПолучитьСтандартныеПараметры(Параметры);
    СтрокаВложений = СтрСоединить(Объекты, ",");   
    СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
    
    Параметры.Вставить("message"            , Текст);
    Параметры.Вставить("attachments"        , СтрокаВложений);
    Параметры.Вставить("mark_as_ads"        , ?(Реклама, 1, 0));
    Параметры.Вставить("close_comments"     , ?(Реклама, 1, 0));

    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры);
    
    Возврат Ответ;
     
КонецФункции

// Удалить пост
// Удаляет пост по id
//
// Параметры:
//  IDПоста    - Строка,Число - ID поста - post
//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
    Параметры_.Вставить("post_id", IDПоста);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Создать опрос
// Создает опрос с вариантами ответа
//
// Параметры:
//  Вопрос        - Строка                - Вопрос опроса              - question
//  МассивОтветов - Массив из Строка      - Массив вариантов ответа    - options
//  Картинка      - Строка,ДвоичныеДанные - Картинка опроса            - picture
//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
    
    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
    Response_     = "response";

    Если ЗначениеЗаполнено(Картинка) Тогда
        
        Ответ  = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос");
        
        Фото   = Ответ.Получить(Response_);
        
        Если ЗначениеЗаполнено(Фото) Тогда
        	
        	IDФото = Фото["id"];
        	
        	Если Не ЗначениеЗаполнено(IDФото) Тогда
            	Возврат Ответ;
        	КонецЕсли;
        	
        Иначе
            Возврат Ответ;
        КонецЕсли;
    
    КонецЕсли;
    
    Параметры_.Вставить("is_anonymous", 1);
    Параметры_.Вставить("is_multiple" , 0);
        
    Ответы = СтрСоединить(МассивОтветов, """,""");
    Ответы = "[""" + Ответы + """]";    
        
    Параметры_.Вставить("add_answers", Ответы);
    Параметры_.Вставить("photo_id"   , OPI_Инструменты.ЧислоВСтроку(IDФото));
    Параметры_.Вставить("question"   , Вопрос);
    
    Опрос             = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
    ОпросСоответствие = Опрос.Получить(Response_);
    
    Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
    	Возврат Опрос;
    КонецЕсли;
    
    OwnerId  = ОпросСоответствие.Получить("owner_id");
    ObjectId = ОпросСоответствие.Получить("id");
    
    Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
        Возврат Опрос;
    КонецЕсли;
    
    ОпросID = "poll"
    + OPI_Инструменты.ЧислоВСтроку(OwnerId)
    + "_" 
    + OPI_Инструменты.ЧислоВСтроку(ObjectId);
 
    Параметры_.Вставить("attachments", ОпросID);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Создать альбом
// Создает альбом для хранения картинок
//
// Параметры:
//  Наименование - Строка - Наименование альбома - title
//  Описание     - Строка - Описание альбома     - description
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    
    Параметры_.Вставить("title"                , Наименование);
    Параметры_.Вставить("description"          , Описание);
    Параметры_.Вставить("upload_by_admins_only", 1);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Удалить альбом
// Удаляет ранее созданный альбом
//
// Параметры:
//  IDАльбома - Строка,Число        - ID альбома - album
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
    Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома));
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Создать историю
// Создает историю из картинки
//
// Параметры:
//  Картинка     - Строка,ДвоичныеДанные - Фон истории                           - picture
//  URL          - Строка                - URL для кнопки под историей           - url
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("link_text"  , "more");
    Параметры_.Вставить("link_url"   , URL);
    Параметры_.Вставить("add_to_news", "1");
    
    Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");    
    Возврат Ответ;
    
КонецФункции

// Сохранить картинку в альбом
// Сохраняет картинку в альбом сообщества
//
// Параметры:
//  IDАльбома - Строка,Число          - ID альбома        - album                           
//  Картинка  - ДвоичныеДанные,Строка - Файл картинки     - picture
//  Описание  - Строка                - Описание картинки - description
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
    
    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
    
    Параметры_.Вставить("album_id", IDАльбома);
    Параметры_.Вставить("caption" , Описание);
          
    Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
    
КонецФункции

// Удалить картинку
// Удалить картинку из альбома
//
// Параметры:
//  IDКартинки - Строка,Число       - ID картинки - pictureid 
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("photo_id", IDКартинки);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Загрузить видео на сервер
// Загружает видео в группу с возможностью его дальнейшего использования
// 
// Параметры:
//  Видео        - Строка, ДвоичныеДанные - Файл видео                  - file
//  Наименование - Строка                 - Наименование видео          - title
//  Описание     - Строка                 - Описание видео              - description
//  Альбом       - Строка                 - ID альбома, если необходимо - album
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция ЗагрузитьВидеоНаСервер(Знач Видео
    , Знач Наименование
    , Знач Описание = ""
    , Знач Альбом = ""
    , Знач Параметры = "") Экспорт
	
	Строка_   = "Строка";
	Параметры = ПолучитьСтандартныеПараметры(Параметры);
	
	OPI_Инструменты.ДобавитьПоле("name"       , Наименование, Строка_, Параметры);
	OPI_Инструменты.ДобавитьПоле("description", Описание    , Строка_, Параметры);
	OPI_Инструменты.ДобавитьПоле("album_id"   , Альбом      , Строка_, Параметры);
	
	Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры);
    
    Результат = Ответ["response"];
    
    Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат Ответ;
    КонецЕсли;
    
	URL = Результат["upload_url"];
	
	Если Не ЗначениеЗаполнено(URL) Тогда
		Возврат Ответ;
	КонецЕсли;
    
    СоответствиеФайлов = Новый Соответствие;
    OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов);
    
    РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер();
    РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных);
    
    Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4");
    
    Возврат Ответ;
    
КонецФункции

// Загрузить фото на сервер
// Загружает фото на сервер для его дальнейшего использования
// 
// Параметры:
//  Картинка  - Строка, ДвоичныеДанные - Файл картинки                   - file
//  Параметры - Структура из Строка    - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
//  Вид       - Строка                 - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт
       
    Параметры  = ПолучитьСтандартныеПараметры(Параметры);
    Метод      = ОпределитьМетодЗагрузкиИзображений(Вид);
    Файлы      = Новый Соответствие;
    
    Response_  = "response";
    URL        = "api.vk.com/method/";
    Загрузка   = URL + Метод["Загрузка"];
    Сохранение = URL + Метод["Сохранение"];
    
    Если ТипЗнч(Картинка) = Тип("Строка") Тогда
        КлючКартинка        = СтрЗаменить(Картинка, ".", "___");
        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
    Иначе
        КлючКартинка        = "image___jpeg";
    КонецЕсли;
    
    Файлы.Вставить(КлючКартинка, Картинка);
    
    Для Н = 1 По 5 Цикл
        
        Ответ     = OPI_Инструменты.Get(Загрузка, Параметры);  
        Результат = Ответ[Response_];
        
        Если ЗначениеЗаполнено(Результат) Тогда
            
            URL = Результат["upload_url"];
            
            Если Не ЗначениеЗаполнено(URL) Тогда
                Возврат Ответ;
            КонецЕсли;
            
        Иначе
            Возврат Ответ;
        КонецЕсли;
        
        Параметры.Вставить("upload_url", URL);
        Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
        
        Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
        Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ);
    КонецЕсли;

    ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
        
    Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
          
    Возврат Ответ;
    
КонецФункции

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

#Область РаботаСОбсуждениями

// Создать обсуждение
// Создает новое обсуждение
//
// Параметры:
//  Наименование          - Строка  - Наименование обсуждения - title
//  ТекстПервогоСообщения - Строка  - Текст первого сообщения - text
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("title", Наименование);
    Параметры_.Вставить("text" , ТекстПервогоСообщения);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Закрыть обсуждение
// Закрывает или удаляет обсуждение
//
// Параметры:
//  IDОбсуждения     - Строка,Число - ID обсуждения                                          - topic
//  УдалитьПолностью - Булево       -  Удалить полностью (Истина) или закрыть                - remove
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
    OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("topic_id", IDОбсуждения);
    
    Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");   
    Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
    
    Возврат Ответ;

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

// Открыть обсуждение
// Открывает ранее закрытое обсуждение
//
// Параметры:
//  IDОбсуждения - Строка,Число - ID обсуждения - topic
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("topic_id", IDОбсуждения);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
    
    Возврат Ответ;

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

// Написать в обсуждение
// Добавляет сообщение в обсуждение от имени группы
//
// Параметры:
//  IDОбсуждения - Строка,Число - ID обсуждения   - topic
//  Текст        - Строка       - Текст сообщения - text
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("topic_id", IDОбсуждения);
    Параметры_.Вставить("message" , Текст);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
    
    Возврат Ответ;

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

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

#Область ИнтерактивныеДействия

// Поставить лайк
// Ставит лайк на пост
//
// Параметры:
//  IDПоста   - Строка,Число - ID поста                    - post
//  IDСтены   - Строка,Число - ID стены расположения поста - wall
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
    
    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
    IDСтены         = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
    ОбъектВК        = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
    
    Параметры_.Вставить("type"        , "post");
    Параметры_.Вставить("object"      , ОбъектВК);
    Параметры_.Вставить("item_id"     , OPI_Инструменты.ЧислоВСтроку(IDПоста));
    Параметры_.Вставить("owner_id"    , OPI_Инструменты.ЧислоВСтроку(IDСтены));
    Параметры_.Вставить("from_group"  , 0);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
    
    Возврат Ответ;

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

// Сделать репост
// Делает репост записи
//
// Параметры:
//  IDПоста      - Строка,Число - ID поста                      - post
//  IDСтены      - Строка,Число -  ID стены расположения поста  - from
//  ЦелеваяСтена - Строка,Число -  ID целевой стены или группы  - to
//  Рекламный    - Булево -  Признак рекламного поста           - ad
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СделатьРепост(Знач IDПоста
    , Знач IDСтены = ""
    , Знач ЦелеваяСтена = ""
    , Знач Рекламный = Ложь
    , Знач Параметры = "") Экспорт
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    GroupId    = Параметры_["group_id"];
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена);
    OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный);
       
    Источник    = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId);       
    Приемник    = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId);

    Параметры_.Вставить("object"          , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
    Параметры_.Вставить("group_id"        , СтрЗаменить(Приемник, "-", ""));
    Параметры_.Вставить("mark_as_ads"     , ?(Рекламный, 1, 0));
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
    
    Возврат Ответ;

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

// Написать сообщение
// Написать сообщение пользователю в диалоге сообщества
//
// Параметры:
//  Текст          - Строка - Текст сообщения                                                 - text
//  IDПользователя - Строка - ID пользователя адресата                                        - user
//  Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках  - ct
//  Клавиатура     - Строка - JSON клавиатуры. См.СформироватьКлавиатуру                      - keyboard
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция НаписатьСообщение(Знач Текст
    , Знач IDПользователя
    , Знач Communitytoken
    , Знач Клавиатура = ""
    , Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("access_token", Communitytoken);
    
    Параметры_.Вставить("user_id"     , IDПользователя);
    Параметры_.Вставить("peer_id"     , IDПользователя);
    Параметры_.Вставить("parse_mode"  , "Markdown"); 
    Параметры_.Вставить("random_id"   , 0);
    Параметры_.Вставить("message"     , Текст);
    
    Если ЗначениеЗаполнено(Клавиатура) Тогда
        Параметры_.Вставить("keyboard", Клавиатура);
    КонецЕсли;
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
    
    Возврат Ответ;

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

// Написать комментарий
// Создает комментарий под выбранной записью
//
// Параметры:
//  IDПоста   - Строка,Число - ID целевого поста            - post
//  IDСтены   - Строка,Число -  ID стены расположения поста - wall
//  Текст     - Строка       - Текст комментария            - text
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт

    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    GroupId    = Параметры_["group_id"];
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
       
    Параметры_.Вставить("owner_id"   , IDСтены); 
    Параметры_.Вставить("from_group" , GroupId);
    Параметры_.Вставить("post_id"    , IDПоста);
    Параметры_.Вставить("message"    , Текст);
    
    Параметры_.Удалить("group_id");
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
    
    Возврат Ответ;

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

// Сократить ссылку
// Создает сокращенный URL из обычного
//
// Параметры:
//  URL       - Строка - URL для сокращения - url
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
// Строка - Сокращенный URL 
Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
    
    Response_  = "response";
    Параметры_ = Новый Структура;
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);    
    Параметры_.Вставить("url", URL);
    
    Ответ     = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
    Результат = Ответ[Response_];
    
    Если ЗначениеЗаполнено(Результат) Тогда
    	
    	URL = Результат["short_url"];
    	
    	Если ЗначениеЗаполнено(URL) Тогда
    		Возврат URL;
    	Иначе
    		Возврат Ответ;
    	КонецЕсли;
    	
    Иначе
    	Возврат Ответ;
    КонецЕсли;
      
КонецФункции

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

#Область Статистика

// Получить статистику
// Получает общую статистику сообщества за период
//
// Параметры:
//  ДатаНачала    - Дата - Дата начала периода    - datefrom
//  ДатаОкончания - Дата - Дата окончания периода - dateto
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала);
    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания);
    
    Параметры_         = ПолучитьСтандартныеПараметры(Параметры);
    
    ДатаНачала         = OPI_Инструменты.UNIXTime(ДатаНачала);
    ДатаОкончания      = OPI_Инструменты.UNIXTime(ДатаОкончания);
    
    Параметры_.Вставить("timestamp_from", ДатаНачала);
    Параметры_.Вставить("timestamp_to"  , ДатаОкончания);
    Параметры_.Вставить("stats_groups"  , "visitors, reach, activity");
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Получить статистику по постам
// Получает статистику в разрезе постов
//
// Параметры:
//  МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Массив из Произвольный -  Массив данных статистики по постам
Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов);
    
    Параметры_       = ПолучитьСтандартныеПараметры(Параметры);
    МассивОтветов    = Новый Массив;
    МассивНабора     = Новый Массив;
    МаксимумПостов   = 30;
    Response_        = "response";
    
    Для Каждого Пост Из МассивИДПостов Цикл
        
        МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
        
        Если МассивНабора.Количество() = МаксимумПостов Тогда
            
            СтрокаНомеров = СтрСоединить(МассивНабора, ",");
            Параметры_.Вставить("post_ids", СтрокаНомеров);
            
            Статистика             = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
            МассивСтатистики       = Статистика[Response_];
            
            Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
                МассивОтветов.Добавить(ЭлементСтатистики);
            КонецЦикла;
            
            МассивНабора = Новый Массив;
            
        КонецЕсли;
        
    КонецЦикла;
    
    СтрокаНомеров = СтрСоединить(МассивНабора, ",");
    Параметры_.Вставить("post_ids", СтрокаНомеров);
    
    Статистика       = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
    МассивСтатистики = Статистика[Response_];
    
    Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
        Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
            МассивОтветов.Добавить(ЭлементСтатистики);
        КонецЦикла;
    КонецЕсли;

    Возврат МассивОтветов;
    
КонецФункции
        
#КонецОбласти

#Область РаботаСРекламнымКабинетом

// Создать рекламную кампанию
// Создает кампанию в выбранном рекламном кабинете
//
// Параметры:
//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
//  Наименование - Строка       - Наименование кампании - title
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
    
    ТекущаяДата  = OPI_Инструменты.ПолучитьТекущуюДату();
    КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24);
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
    Параметры_.Вставить("account_id", IDКабинета);
    
    МассивСтруктур = Новый Массив;
    ДатаСтарт      = OPI_Инструменты.UNIXTime(ТекущаяДата);
    ДатаСтоп       = OPI_Инструменты.UNIXTime(КонечнаяДата);
    
    СтруктураКампании = Новый Структура;
    СтруктураКампании.Вставить("type"            , "promoted_posts");
    СтруктураКампании.Вставить("name"            , Наименование);
    СтруктураКампании.Вставить("day_limit"       , 0);
    СтруктураКампании.Вставить("all_limit"       , 0);
    СтруктураКампании.Вставить("start_time"      , ДатаСтарт);
    СтруктураКампании.Вставить("stop_time"       , ДатаСтоп);
    СтруктураКампании.Вставить("status"          , 1);
    
    МассивСтруктур.Добавить(СтруктураКампании);
    
    JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
    
    Параметры_.Вставить("data", JSONДата);
    
    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Создать рекламное объявление
// Создает рекламное объявление на основе поста
//
// Параметры:
//  НомерКампании  - Строка,Число - ID рекламной кампании                         - campaign
//  ДневнойЛимит   - Строка,Число - Дневной лимит в рублях                        - limit
//  НомерКатегории - Строка,Число - Номер рекламной категории                     - category
//  IDПоста        - Строка,Число - ID поста, используемого в качетсве рекламы    - post
//  IDКабинета     - Строка,Число - ID рекламного кабинета                        - cabinet
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьРекламноеОбъявление(Знач НомерКампании
    , Знач ДневнойЛимит
    , Знач НомерКатегории
    , Знач IDПоста
    , Знач IDКабинета
    , Знач Параметры = "") Экспорт
    
    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);   
    GroupId     = Параметры_["group_id"];
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
    
    Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста;
    
    МассивСтруктур        = Новый Массив;    
    СтруктураКампании     = Новый Структура;
    СтруктураКампании.Вставить("campaign_id"                , НомерКампании);
    СтруктураКампании.Вставить("ad_format"                  , 9);
    СтруктураКампании.Вставить("conversion_event_id"        , 1);
    СтруктураКампании.Вставить("autobidding"                , 1);
    СтруктураКампании.Вставить("cost_type"                  , 3);
    СтруктураКампании.Вставить("goal_type"                  , 2);
    СтруктураКампании.Вставить("ad_platform"                , "all");
    СтруктураКампании.Вставить("publisher_platforms"        , "vk");
    СтруктураКампании.Вставить("publisher_platforms_auto"   , "1");
    СтруктураКампании.Вставить("day_limit"                  , ДневнойЛимит);
    СтруктураКампании.Вставить("all_limit"                  , "0");
    СтруктураКампании.Вставить("category1_id"               , НомерКатегории);
    СтруктураКампании.Вставить("age_restriction"            , 0);
    СтруктураКампании.Вставить("status"                     , 1);
    СтруктураКампании.Вставить("name"                       , "Объявление");
    СтруктураКампании.Вставить("link_url"                   , Линк);
    
    МассивСтруктур.Добавить(СтруктураКампании);
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
    
    Параметры_.Вставить("data"        , МассивСтруктур);
    Параметры_.Вставить("account_id"  , IDКабинета);
    
    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Приостановить рекламное объявление
// Приостанавливает показ рекламного объявления
//
// Параметры:
//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
//  IDОбъявления - Строка,Число - ID объявления          - adv 
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);

    Параметры_.Вставить("account_id", IDКабинета);
    
    МассивСтруктур    = Новый Массив;    
    СтруктураКампании = Новый Структура;
    
    СтруктураКампании.Вставить("ad_id"  , IDОбъявления);
    СтруктураКампании.Вставить("status" , 0);
    
    МассивСтруктур.Добавить(СтруктураКампании);
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
    
    Параметры_.Вставить("data", МассивСтруктур);
        
    Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Получить список рекламных категорий
// Получает список id рекламных категорий для создания рекламного объявления
//
// Параметры:
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Ответ      = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
    
    Возврат Ответ;

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

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

#Область РаботаСТоварами

// Получить список категорий товаров
// Получает список ID товарных категорий для указания при создании товара
//
// Параметры:
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из Строка - Ключ - ID, Значение - Имя
Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
    
    Response_  = "response";
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
    Результат  = Ответ[Response_];
    
    Если ЗначениеЗаполнено(Результат) Тогда
    	
    	Количество = Результат["count"];
    	
    	Если Не ЗначениеЗаполнено(Количество) Тогда
    		Возврат Ответ;
    	КонецЕсли;
    	
    Иначе
    	Возврат Ответ;
    КонецЕсли;
    
    Параметры_.Вставить("count", Количество);
    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);   
    Результат  = Ответ[Response_]; 
    
    Если ЗначениеЗаполнено(Результат) Тогда
    	
    	Категории  = Результат["items"];
    	
    	Если Не ЗначениеЗаполнено(Категории) Тогда
    		Возврат Ответ;
    	КонецЕсли;
    	
    Иначе
    	Возврат Ответ;
    КонецЕсли;
       
    СоответствиеКатегорий = Новый Соответствие;
    
    Для Каждого Категория Из Категории Цикл      
        СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
    КонецЦикла;
       
    Возврат СоответствиеКатегорий;
    
КонецФункции

// Получить список товаров
// Получает список товаров сообщества
//
// Параметры:
//  Подборка  - Строка,Число        - ID подборки, если нужен отбор - sel
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - Массив соответствий товаров
Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("count"        , 200);
    Параметры_.Вставить("extended"     , 1);
    Параметры_.Вставить("with_disabled", 1);
    
    Если ЗначениеЗаполнено(Подборка) Тогда
        Параметры_.Вставить("album_id", Подборка);  
    КонецЕсли;
    
    МассивТоваров = Новый Массив;
    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_);
    
    Возврат МассивТоваров;
    
КонецФункции

// Получить товары по ID
// Получает информацию о товарах по массиву ID
//
// Параметры:
//  Товары    - Строка, Массив Из Строка - Массив ID товаров - items 
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары);
    
    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
    СтрокаТоваров = "";
    Owner         = "owner_id";
    
    Для Каждого Товар Из Товары Цикл       
        ТекущийТовар  = Параметры_[Owner] + "_" + Товар;
        ТекущийТовар  = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар);
        СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ",";
    КонецЦикла;
    
    СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1);
    Параметры_.Вставить("item_ids", СтрокаТоваров);
    Параметры_.Вставить("extended", 1);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_);
    
    Возврат Ответ;
     
КонецФункции

// Добавить товар
// Добавляет новый товар в каталог сообщества
//
// Параметры:
//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
//  Подборка       - Строка - ID подборка для помещения товара, если необходимо - sel
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт  
	      
    Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры);  
      
КонецФункции

// Изменить товар
// Изменяет ранее созданный товар
//
// Параметры:
//  Товар - Число,Строка - Идентификатор изменяемого товара - item
//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
//  Подборка - Строка - Идентификатор новой подборки, если необходимо - sel 
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
	
    Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры);    
    
КонецФункции

// Удалить товар
// Удаляет ранее созданный товар
//
// Параметры:
//  Товар - Строка,Число - ID товара - item
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("item_id", Товар);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Сгруппировать товары
// Группирует товары на основе одинаковых наборов свойств
//
// Параметры:
//  МассивТоваров      - Массив Из Строка - Массив ID товаров                       - items
//  СуществующаяГруппа - Строка           - ID существующей группы, если необходимо - sellgroup
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
    
    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
    МассивТоваров_ = Новый Массив;
    
    Для Каждого Товар Из МассивТоваров Цикл
        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
    КонецЦикла;
    
    Товары = СтрСоединить(МассивТоваров_, ",");
    
    Параметры_.Вставить("item_ids", Товары);
    
    Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда
        Параметры_.Вставить("item_group_id", СуществующаяГруппа);
    КонецЕсли;
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_);
    
    Возврат Ответ;

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

// Получить описание товара. !NOCLI
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - Пустое описание товара:
//  *Имя - Строка - Имя товара
//  *Описание - Строка - Описание товара
//  *Категория - Строка - См. ПолучитьСписокКатегорийТоваров
//  *Цена - Число - Цена товара
//  *СтараяЦена - Число - Для отображения скидки/изменения цены
//  *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото
//  *URL - Строка - Ссылка на страницу сайта магазина
//  *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото
//  *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара
//  *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе
//  *Ширина - Число - Ширина товара в мм.
//  *Высота - Число - Высота товара в мм.
//  *Глубина - Число - Глубина товара в мм.
//  *Вес - Число - Вес в гр.
//  *SKU - Строка - SKU
//  *ДоступныйОстаток - Число - Остаток. -1 - не ограничено
Функция ПолучитьОписаниеТовара() Экспорт
     
    Товар = Новый Соответствие();
    Товар.Вставить("Имя"                , "Новый товар");     // Имя товара
    Товар.Вставить("Описание"           , "Описание товара"); // Описание товара
    Товар.Вставить("Категория"          , "20173");           // См ПолучитьСписокКатегорийТоваров()
    Товар.Вставить("Цена"               , 1);                 // Цена.
    Товар.Вставить("СтараяЦена"         , Неопределено);      // Для отражения изменения цены 
    Товар.Вставить("ОсновноеФото"       , Неопределено);      // ДД или путь к осн. фото
    Товар.Вставить("URL"                , Неопределено);      // Ссылка на страницу магазина
    Товар.Вставить("ДополнительныеФото" , Новый Массив);      // Массив путей или ДД для доп. фото
    Товар.Вставить("ЗначенияСвойств"    , Новый Массив);      // Значения свойств (варианты). Максимум 2
    Товар.Вставить("ГлавныйВГруппе"     , Ложь);              // Сделать главным в своей группе  
    Товар.Вставить("Ширина"             , Неопределено);      // В миллиметрах
    Товар.Вставить("Высота"             , Неопределено);      // В миллиметрах
    Товар.Вставить("Глубина"            , Неопределено);      // В миллиметрах
    Товар.Вставить("Вес"                , Неопределено);      // В граммах
    Товар.Вставить("SKU"                , Неопределено);      // Артикул
    Товар.Вставить("ДоступныйОстаток"   , 1);
    
    Возврат Товар;
     
КонецФункции

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

#Область РаботаСПодборкамиТоваров

// Получить список подборок
// Получает список подборок товаров
//
// Параметры:
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - Массив соответствий подборок
Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("count", 100);
    
    МассивАльбомов = Новый Массив;
    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_);
    
    Возврат МассивАльбомов;
    
КонецФункции

// Получить подборки по ID
// Получить список подборок по массиву ID
//
// Параметры:
//  Подборки  - Строка, Массив Из Строка - ID подборок - sels
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки);
    
    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);    
    Подборки_      = Новый Массив;
    СтрокаПодборок = "";
      
    Для Каждого Подборка Из Подборки Цикл
        Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка));    
    КонецЦикла;    
    
    СтрокаПодборок = СтрСоединить(Подборки_, ",");
        
    Параметры_.Вставить("album_ids", СтрокаПодборок);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_);
    
    Возврат Ответ;
     
КонецФункции

// Создать подборку товаров
// Создает пустую подборку товаров
//
// Параметры:
//  Название  - Строка                - Название подборки - title
//  Картинка  - Строка,ДвоичныеДанные - Файл картинки     - picture
//  Основная  - Булево                - Основная          - main
//  Скрытая   - Булево                - Скрытая           - hidden
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция СоздатьПодборкуТоваров(Знач Название
    , Знач Картинка
    , Знач Основная = Ложь
    , Знач Скрытая = Ложь
    , Знач Параметры = "") Экспорт
    
    Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры);
    
КонецФункции

// Изменить подборку товаров
// Изменяет свойства подборки товаров
//
// Параметры:
//  Название - Строка                - Новое название подборки         - title
//  Подборка - Строка                - ID подборки					   - sel
//  Картинка - Строка,ДвоичныеДанные - Новая картинка подборки         - picture
//  Основная - Булево                - Основная                        - main
//  Скрытая  - Булево                - Скрытая                         - hidden
//  Параметры - Структура из Строка  - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ИзменитьПодборкуТоваров(Знач Название
    , Знач Подборка
    , Знач Картинка = ""
    , Знач Основная = Ложь
    , Знач Скрытая = Ложь
    , Знач Параметры = "") Экспорт
    
    Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры);
    
КонецФункции

// Добавить товар в подборку
// Добавляет товар в подборку
//
// Параметры:
//  МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items
//  Подборка      - Строка                  - ID подборки              - sel
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
    
    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
    МассивТоваров_ = Новый Массив;
      
    Для Каждого Товар Из МассивТоваров Цикл
        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));    
    КонецЦикла;    
    
    СписокТоваров = СтрСоединить(МассивТоваров_, ",");
    
    Параметры_.Вставить("item_ids" , СписокТоваров);
    Параметры_.Вставить("album_ids", Подборка);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Удалить товар из подборки
// Удаляет ранее добавленный товар из подборки
// 
// Параметры:
//  Товар     - Строка - ID товара   - item
//  Подборка  - Строка - ID подборки - sel
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);

    Параметры_   = ПолучитьСтандартныеПараметры(Параметры);
    
    Параметры_.Вставить("item_id"  , Товар);
    Параметры_.Вставить("album_ids", Подборка);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Удалить подборку
// Удаляет подборку по ID
//
// Параметры:
//  Подборка  - Строка              - ID подборки - sel
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("album_id", Подборка);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

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

#Область РаботаСоСвойствамиТоваров

// Получить список свойств
// Получает список свойств товаров группы
// 
// Параметры:
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт
    
    Response_  = "response";
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    
    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_);
    Свойства   = Ответ[Response_]["items"];
    
    Возврат Свойства;
    
КонецФункции

// Создать свойство товара
// Создает новое свойство для использования в товарах
// 
// Параметры:
//  Название  - Строка              - Название свойства               - title
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("title", Название);
        
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_);   
    
    Возврат Ответ;

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

// Изменить свойство товара
// Изменяет существующее свойство товара
// 
// Параметры:
//  Название  - Строка              - Новое название                  - title
//  Свойство  - Строка,Число        - ID свойства                     - prop
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("title"      , Название);
    Параметры_.Вставить("property_id", Свойство);
    Параметры_.Вставить("type"       , "text");
        
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_);   
    
    Возврат Ответ;

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

// Удалить свойство товара
// Удаляет существующее свойство товара
// 
// Параметры:
//  Свойство  - Строка,Число        - ID свойства                     - prop
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("property_id", Свойство);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Добавить вариант свойства товара
// Добавляет вариант для существующего свойства
// 
// Параметры:
//  Значение  - Строка              - Значение свойства                      - value
//  Свойство  - Строка,Число        - ID свойства, куда добавляется вариант  - prop
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK    
Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("property_id", Свойство);
    Параметры_.Вставить("title"      , Значение);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Изменить вариант свойства товара
// Изменяет значение варианта существующего свойства товара
// 
// Параметры:
//  Значение  - Строка              - Новое значение свойства         - value
//  Свойство  - Строка,Число        - ID свойства                     - prop
//  Вариант   - Строка,Число        - ID варианта                     - option
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK      
Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("property_id", Свойство);
    Параметры_.Вставить("variant_id" , Вариант);
    Параметры_.Вставить("title"      , Значение);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

// Удалить вариант свойства товара
// Удаляет ранее созданный вариант свойства
// 
// Параметры:
//  Вариант   - Строка,Число        - ID варианта - option
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK     
Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("variant_id", Вариант);
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_);
    
    Возврат Ответ;
    
КонецФункции

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

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

// Получить список заказов
// Возвращает список заказов сообщества
// 
// Параметры:
//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт
    
    Параметры = ПолучитьСтандартныеПараметры(Параметры);
    Параметры.Вставить("count", 50);
    
    МассивЗаказов = Новый Массив;
    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры);
    
    Возврат МассивЗаказов;
    
КонецФункции

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

#Область Прочие

// Сформировать клавиатуру
// Формирует клавиатуру по массиву кнопок
// 
// Параметры:
//  МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons
// 
// Возвращаемое значение:
//  Строка -  JSON клавиатуры
Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
      
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);  
    
    Клавиатура          = Новый Структура;
    МассивКлавиатуры    = Новый Массив;
    МассивБлока         = Новый Массив;
    
    Для Каждого Действие Из МассивКнопок Цикл
        
        Кнопка      = Новый Структура;
        Выражение   = Новый Структура;                        
        
        Выражение.Вставить("type" , "text");
        Выражение.Вставить("label", Действие);
        
        Кнопка.Вставить("action", Выражение);
        МассивБлока.Добавить(Кнопка);
        
    КонецЦикла;
    
    МассивКлавиатуры.Добавить(МассивБлока);
    
    Клавиатура.Вставить("buttons" , МассивКлавиатуры);   
    Клавиатура.Вставить("one_time", Ложь);
    
    Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
    
КонецФункции

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

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

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

Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
    
    // Здесь собрано определение данных для работы с VK API
    // Вы можете переопределять их, передавая в качестве параметра
    // Совпадающие поля будут перезаписаны с приоритетом параметра функции
    
    Параметры_ = Новый Структура;
    
    // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
    // from_group   - действия будут выполняться от лица группы
    // owner_id     - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
    //               установлен свой
    // app_id       - id приложения, которое необходимо создать в профиле на странице для разработчиков
    // group_id     - owner_id, но без "-"
    
    Параметры_.Вставить("access_token"  , "");
    Параметры_.Вставить("from_group"    , "1");
    Параметры_.Вставить("owner_id"      , "");
    Параметры_.Вставить("v"             , "5.131");
    Параметры_.Вставить("app_id"        , "");
    Параметры_.Вставить("group_id"      , "");
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
    
    Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
        Для Каждого ПереданныйПараметр Из Параметры Цикл
            Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
        КонецЦикла;
    КонецЕсли;

    Возврат Параметры_;

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

Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид)
	
	Response_ = "response";
    Ответ     = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
    Результат = Ответ[Response_];

    Если ЗначениеЗаполнено(Результат) Тогда
    	ИДФото = Результат["photo_id"];
    	
    	Если Не ЗначениеЗаполнено(ИДФото) Тогда
    		Возврат Ответ;	
    	КонецЕсли;
    	
    Иначе
    	Возврат Ответ;
    КонецЕсли;
    
    ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
    Возврат ИДФото;
    
КонецФункции

Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
	
	Ответ       = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);   
    ОтветМассив = Ответ.Получить("response");
    
    Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
    	Возврат Ответ;
    Иначе
    	Если ОтветМассив.Количество() = 0 Тогда
    		Возврат Ответ;
    	Иначе
    		ОтветСоответствие = ОтветМассив[0];
    	КонецЕсли;
    КонецЕсли;
     
    Возврат ОтветСоответствие;
       
КонецФункции

Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "")
	
	Response_  = "response";
	Подборки   = ПолучитьПодборкиПоИД(Подборки, Параметры);
    Результат  = Подборки[Response_];
    
    Если ЗначениеЗаполнено(Результат) Тогда
    	
    	МассивПодборок = Результат["items"];
    	
    	Если Не ЗначениеЗаполнено(МассивПодборок) Тогда
    		Возврат Подборки;	
    	КонецЕсли;
    	
	Иначе
		Возврат Подборки;
    КонецЕсли;
    
    Возврат МассивПодборок;
            
КонецФункции

Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
    
    СоответствиеМетодов = Новый Соответствие;
    Загрузка            = "Загрузка";
    Сохранение          = "Сохранение";
    Способ              = "Способ";
    Фото                = "Фото";
    
    Если Вид = "Пост" Тогда
       
        СоответствиеМетодов.Вставить(Загрузка  , "photos.getWallUploadServer");
        СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto");
        СоответствиеМетодов.Вставить(Фото      , "photo");
        СоответствиеМетодов.Вставить(Способ    , 1);
        
    ИначеЕсли Вид = "Товар" Тогда
        
        СоответствиеМетодов.Вставить(Загрузка  , "market.getProductPhotoUploadServer");
        СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto");
        СоответствиеМетодов.Вставить(Способ    , 2);
        
    ИначеЕсли Вид = "История" Тогда
        
        СоответствиеМетодов.Вставить(Загрузка  , "stories.getPhotoUploadServer");
        СоответствиеМетодов.Вставить(Сохранение, "stories.save");
        СоответствиеМетодов.Вставить(Способ    , 3);
    
    ИначеЕсли Вид = "Опрос" Тогда
        
        СоответствиеМетодов.Вставить(Загрузка  , "polls.getPhotoUploadServer");
        СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto");
        СоответствиеМетодов.Вставить(Фото      , "photo");
        СоответствиеМетодов.Вставить(Способ    , 1);
        
    Иначе
        
        СоответствиеМетодов.Вставить(Загрузка  , "photos.getUploadServer");
        СоответствиеМетодов.Вставить(Сохранение, "photos.save");
        СоответствиеМетодов.Вставить(Фото      , "photos_list");
        СоответствиеМетодов.Вставить(Способ    , 1);
        
    КонецЕсли;
    
    Возврат СоответствиеМетодов;
    
КонецФункции

Функция ПолучитьСоответствиеПараметровТовара()
    
    Поля = Новый Соответствие();
    Поля.Вставить("Имя"                , "name");     
    Поля.Вставить("Описание"           , "description"); 
    Поля.Вставить("Категория"          , "category_id");                 
    Поля.Вставить("Цена"               , "price");                 
    Поля.Вставить("СтараяЦена"         , "old_price");  
    Поля.Вставить("URL"                , "url");
    Поля.Вставить("ГлавныйВГруппе"     , "is_main_variant"); 
    Поля.Вставить("Ширина"             , "dimension_width");      
    Поля.Вставить("Высота"             , "dimension_height");      
    Поля.Вставить("Глубина"            , "dimension_length");      
    Поля.Вставить("Вес"                , "weight");      
    Поля.Вставить("SKU"                , "sku"); 
    Поля.Вставить("ДоступныйОстаток"   , "stock_amount");
       
    Возврат Поля;

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

Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "")
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
    Параметры_.Вставить("v", "5.199");
    
    Response_ = "response";
    
    ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_);
    
    Если ЗначениеЗаполнено(ИДТовара) Тогда       
        Параметры_.Вставить("item_id", ИДТовара);
        Метод = "edit";    
    Иначе       
        Метод = "add";
    КонецЕсли;
       
    Ответ     = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
    Результат = Ответ[Response_];
    
    Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда 
    	
        ИДТовара = Результат["market_item_id"];
        
        Если Не ЗначениеЗаполнено(ИДТовара) Тогда
        	Возврат Ответ;	
        КонецЕсли;
        
    Иначе
    	Возврат Ответ;
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда
        ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_);
    КонецЕсли;
    
    Возврат Ответ;

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

Функция УправлениеПодборкой(Знач Название
    , Знач Картинка   = ""
    , Знач ИДПодборки = ""
    , Знач Основная   = Ложь
    , Знач Скрытая    = Ложь
    , Знач Параметры  = "")
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки);
    OPI_ПреобразованиеТипов.ПолучитьБулево(Основная);
    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая);
    
    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);   
    Ответ      = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_);
    
    Если ЗначениеЗаполнено(Ответ) Тогда
        Возврат Ответ;
    КонецЕсли;
      
    Параметры_.Вставить("title"        , Название);
    Параметры_.Вставить("main_album"   , ?(Основная, 1, 0));
    Параметры_.Вставить("is_hidden"    , ?(Скрытая, 1, 0));
    
    Если ЗначениеЗаполнено(ИДПодборки) Тогда       
        Параметры_.Вставить("album_id", ИДПодборки);
        Метод = "editAlbum";    
    Иначе       
        Метод = "addAlbum";
    КонецЕсли;
    
    Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
    
    Возврат Ответ;

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

Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры)
    
    PhotoID_ = "photo_id";
    
    Если ЗначениеЗаполнено(Картинка) Тогда
        
        ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар");
        
        Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
            Возврат ИДФото; 
        КонецЕсли;
      
        Параметры.Вставить(PhotoID_, ИДФото);
        
    Иначе
        
        Если ЗначениеЗаполнено(ИДПодборки) Тогда
            
            Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры);
            
            Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда
                Возврат Подборки;   
            КонецЕсли;
                                
            Если Не Подборки.Количество() = 0 Тогда              
                ИДФото = Подборки[0]["photo"]["id"];
                OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото);
                Параметры.Вставить(PhotoID_, ИДФото);
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат "";
    
КонецФункции

Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
    
    Response_           = "response";
    Способ              = Метод["Способ"];
    СтандартныйСпособ   = 1;
    НовыйСпособ         = 2;

    Если Способ = СтандартныйСпособ Тогда
        
        Hash       = "hash";
        Serv       = "server";
        Aid        = "aid";
        Фото       = Метод["Фото"];
        
        Параметры.Вставить(Hash, Ответ[Hash]);
        Параметры.Вставить(Фото, Ответ[Фото]);
        
        СерверФото = Ответ.Получить(Serv);
               
        Если ЗначениеЗаполнено(СерверФото) Тогда
            СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото);
            Параметры.Вставить(Serv, СерверФото);      
        КонецЕсли;
        
        Идентификатор = Ответ.Получить(Aid);
               
        Если ЗначениеЗаполнено(Идентификатор) Тогда
            Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
            Параметры.Вставить(Aid , Идентификатор);      
        КонецЕсли;
        
    ИначеЕсли Способ = НовыйСпособ Тогда
        
        ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
        Параметры.Вставить("upload_response", ОтветСтрокой);
        
    Иначе
        
        Параметры.Вставить("upload_results", Ответ[Response_]["upload_result"]);
        
    КонецЕсли;

КонецПроцедуры

Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры)
    
    Response_    = "response";
    ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
    ДопФото      = ОписаниеТовара["ДополнительныеФото"];
    Свойства     = ОписаниеТовара["ЗначенияСвойств"];
    
    Если ЗначениеЗаполнено(ОсновноеФото) Тогда
    	
        Ответ     = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар");
        Результат = Ответ[Response_];
        
        Если ЗначениеЗаполнено(Результат) Тогда
        	ИДФото = Результат["photo_id"];
        	
        	Если Не ЗначениеЗаполнено(ИДФото) Тогда
        		Возврат;	
        	КонецЕсли;
        	
        Иначе
        	Возврат;
        КонецЕсли;
        
        ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
        Параметры.Вставить("main_photo_id", ИДФото); 
         
    КонецЕсли;
    
    Если ТипЗнч(Свойства) = Тип("Массив") Тогда  
        
        Свойства_ = Новый Массив;
        
        Для Каждого Свойство Из Свойства Цикл
            Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство));   
        КонецЦикла;
        
        Свойства = СтрСоединить(Свойства_, ","); 
        
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Свойства) Тогда
        Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства));    
    КонецЕсли;
    
    ДобавитьДополнительныеФотоТовара(ДопФото, Параметры);
    
    Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
        
        Значение = ОписаниеТовара[Поле.Ключ];
        
        Если Значение <> Неопределено Тогда
            Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

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

                СтрокаФотографий = СтрокаФотографий + ИДФото + ","; 
                
            КонецЦикла;
            
            СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1);
            Параметры.Вставить("photo_ids", СтрокаФотографий);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0)
    
    Response_        = "response";
    МаксимумВЗапросе = 200;
    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры);
    Товары           = Ответ[Response_]["items"];
    
    Если Товары.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;      
    
    Для Каждого Товар Из Товары Цикл
        МассивТоваров.Добавить(Товар);
    КонецЦикла;
       
    Сдвиг = Сдвиг + МаксимумВЗапросе;
    Параметры.Вставить("offset", Сдвиг);
    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг);
    
КонецПроцедуры

Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0)
    
    Response_        = "response";
    МаксимумВЗапросе = 100;
    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры);
    Альбомы          = Ответ[Response_]["items"];
    
    Если Альбомы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;      
    
    Для Каждого Альбом Из Альбомы Цикл
        МассивАльбомов.Добавить(Альбом);
    КонецЦикла;
       
    Сдвиг = Сдвиг + МаксимумВЗапросе;
    Параметры.Вставить("offset", Сдвиг);
    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг);
    
КонецПроцедуры

Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0)
    
    Response_        = "response";
    МаксимумВЗапросе = 50;
    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры);
    Заказы           = Ответ[Response_]["items"];
    
    Если Заказы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;      
    
    Для Каждого Заказ Из Заказы Цикл
        МассивЗаказов.Добавить(Заказ);
    КонецЦикла;
       
    Сдвиг = Сдвиг + МаксимумВЗапросе;
    Параметры.Вставить("offset", Сдвиг);
    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
    
КонецПроцедуры

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