├── src ├── DT-INF │ └── PROJECT.PMF ├── .settings │ ├── RuntimePropertyLaunch.prefs │ ├── com.e1c.v8codestyle.autosort.prefs │ ├── org.eclipse.core.resources.prefs │ ├── com.e1c.v8codestyle.prefs │ ├── com.e1c.v8codestyle.bsl.prefs │ └── ManagedEnvironments.prefs ├── src │ ├── Configuration │ │ ├── CommandInterface.cmi │ │ ├── MainSectionCommandInterface.cmi │ │ ├── ExternalConnectionModule.bsl │ │ ├── SessionModule.bsl │ │ ├── ManagedApplicationModule.bsl │ │ └── Configuration.mdo │ ├── Subsystems │ │ └── ХТТП │ │ │ ├── CommandInterface.cmi │ │ │ ├── Subsystems │ │ │ └── ПроцессорыКоллекций │ │ │ │ └── ПроцессорыКоллекций.mdo │ │ │ └── ХТТП.mdo │ ├── Roles │ │ └── ПолныеПрава │ │ │ ├── ПолныеПрава.mdo │ │ │ └── Rights.rights │ ├── XDTOPackages │ │ └── ОбщегоНазначенияХТТП │ │ │ ├── Package.xdto │ │ │ └── ОбщегоНазначенияХТТП.mdo │ ├── CommonModules │ │ ├── Кеширование │ │ │ ├── Кеширование.mdo │ │ │ └── Module.bsl │ │ ├── СервисыОбщее │ │ │ ├── СервисыОбщее.mdo │ │ │ └── Module.bsl │ │ ├── ВосстановлениеXDTO │ │ │ ├── ВосстановлениеXDTO.mdo │ │ │ └── Module.bsl │ │ ├── ПроцессорыКоллекций │ │ │ ├── ПроцессорыКоллекций.mdo │ │ │ └── Module.bsl │ │ ├── ОбщегоНазначенияХТТП │ │ │ ├── ОбщегоНазначенияХТТП.mdo │ │ │ └── Module.bsl │ │ ├── КоннекторХТТПСлужебный │ │ │ └── КоннекторХТТПСлужебный.mdo │ │ ├── ОбработкаHTTPЗапросов │ │ │ ├── ОбработкаHTTPЗапросов.mdo │ │ │ └── Module.bsl │ │ ├── ПроцессорыКоллекцийСлужебный │ │ │ ├── ПроцессорыКоллекцийСлужебный.mdo │ │ │ └── Module.bsl │ │ ├── ВосстановлениеXDTOПереопределяемый │ │ │ ├── ВосстановлениеXDTOПереопределяемый.mdo │ │ │ └── Module.bsl │ │ ├── ОбработкаЗапросовПереопределяемый │ │ │ ├── ОбработкаЗапросовПереопределяемый.mdo │ │ │ └── Module.bsl │ │ └── ОбработкаЗапросовПовтИсп │ │ │ ├── ОбработкаЗапросовПовтИсп.mdo │ │ │ └── Module.bsl │ └── DataProcessors │ │ └── ПроцессорКоллекций │ │ ├── ПроцессорКоллекций.mdo │ │ └── ObjectModule.bsl └── .project ├── example ├── .settings │ ├── com.e1c.v8codestyle.autosort.prefs │ ├── org.eclipse.core.resources.prefs │ ├── com.e1c.v8codestyle.prefs │ ├── com.e1c.v8codestyle.bsl.prefs │ └── Default.cset ├── DT-INF │ └── PROJECT.PMF ├── src │ ├── Configuration │ │ ├── CommandInterface.cmi │ │ ├── MainSectionCommandInterface.cmi │ │ ├── ExternalConnectionModule.bsl │ │ ├── SessionModule.bsl │ │ ├── ManagedApplicationModule.bsl │ │ └── Configuration.mdo │ ├── CommonModules │ │ ├── Демо_Заявки │ │ │ ├── Демо_Заявки.mdo │ │ │ └── Module.bsl │ │ ├── Демо_КонтроллерСервиса │ │ │ ├── Демо_КонтроллерСервиса.mdo │ │ │ └── Module.bsl │ │ └── Демо_ФункцииВосстановления │ │ │ ├── Демо_ФункцииВосстановления.mdo │ │ │ └── Module.bsl │ ├── Roles │ │ └── ФреймворкХТТП_Тесты_ПолныеПрава │ │ │ ├── ФреймворкХТТП_Тесты_ПолныеПрава.mdo │ │ │ └── Rights.rights │ ├── XDTOPackages │ │ └── common_1_0 │ │ │ ├── common_1_0.mdo │ │ │ └── Package.xdto │ ├── Documents │ │ ├── Демо_Заявка │ │ │ ├── ObjectModule.bsl │ │ │ ├── Демо_Заявка.mdo │ │ │ └── ManagerModule.bsl │ │ └── Демо_Сообщение │ │ │ ├── ObjectModule.bsl │ │ │ ├── ManagerModule.bsl │ │ │ └── Демо_Сообщение.mdo │ ├── Catalogs │ │ └── Демо_Проекты │ │ │ ├── ObjectModule.bsl │ │ │ ├── ManagerModule.bsl │ │ │ └── Демо_Проекты.mdo │ └── HTTPServices │ │ └── Демо_ │ │ ├── Module.bsl │ │ └── Демо_.mdo └── .project ├── README.md └── LICENSE /src/DT-INF/PROJECT.PMF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Runtime-Version: 8.3.20 3 | -------------------------------------------------------------------------------- /src/.settings/RuntimePropertyLaunch.prefs: -------------------------------------------------------------------------------- 1 | ClientServer=true 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /src/.settings/com.e1c.v8codestyle.autosort.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | topObjects=true 3 | -------------------------------------------------------------------------------- /example/.settings/com.e1c.v8codestyle.autosort.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | topObjects=true 3 | -------------------------------------------------------------------------------- /example/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding/=UTF-8 3 | -------------------------------------------------------------------------------- /example/DT-INF/PROJECT.PMF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Runtime-Version: 8.3.20 3 | Base-Project: ФреймворкХТТП 4 | -------------------------------------------------------------------------------- /src/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding/=UTF-8 3 | -------------------------------------------------------------------------------- /src/.settings/com.e1c.v8codestyle.prefs: -------------------------------------------------------------------------------- 1 | commonChecks=true 2 | eclipse.preferences.version=1 3 | standardChecks=true 4 | -------------------------------------------------------------------------------- /example/.settings/com.e1c.v8codestyle.prefs: -------------------------------------------------------------------------------- 1 | commonChecks=true 2 | eclipse.preferences.version=1 3 | standardChecks=false 4 | -------------------------------------------------------------------------------- /src/.settings/com.e1c.v8codestyle.bsl.prefs: -------------------------------------------------------------------------------- 1 | addModuleStrictTypesAnnotation=true 2 | createModuleStructure=true 3 | eclipse.preferences.version=1 4 | -------------------------------------------------------------------------------- /example/.settings/com.e1c.v8codestyle.bsl.prefs: -------------------------------------------------------------------------------- 1 | addModuleStrictTypesAnnotation=true 2 | createModuleStructure=true 3 | eclipse.preferences.version=1 4 | -------------------------------------------------------------------------------- /src/src/Configuration/CommandInterface.cmi: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/src/Subsystems/ХТТП/CommandInterface.cmi: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /example/src/Configuration/CommandInterface.cmi: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/src/Configuration/MainSectionCommandInterface.cmi: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /example/src/Configuration/MainSectionCommandInterface.cmi: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/src/Configuration/ExternalConnectionModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Область ОбработчикиСобытий 5 | 6 | // Код процедур и функций 7 | 8 | #КонецОбласти 9 | 10 | #Область СлужебныеПроцедурыИФункции 11 | 12 | // Код процедур и функций 13 | 14 | #КонецОбласти 15 | -------------------------------------------------------------------------------- /src/.settings/ManagedEnvironments.prefs: -------------------------------------------------------------------------------- 1 | CLIENT=false 2 | EXTERNAL_CONN=false 3 | MNG_CLIENT=false 4 | MOBILE_AUTONOMOUS_SERVER=false 5 | MOBILE_CLIENT=false 6 | MOBILE_SERVER=false 7 | MOBILE_THIN_CLIENT=false 8 | SERVER=true 9 | THIN_CLIENT=false 10 | WEB_CLIENT=false 11 | eclipse.preferences.version=1 12 | -------------------------------------------------------------------------------- /src/src/Roles/ПолныеПрава/ПолныеПрава.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПолныеПрава 4 | 5 | ru 6 | Полные права 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/src/Configuration/SessionModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 5 | 6 | #Область ОбработчикиСобытий 7 | 8 | // Код процедур и функций 9 | 10 | #КонецОбласти 11 | 12 | #Область СлужебныеПроцедурыИФункции 13 | 14 | // Код процедур и функций 15 | 16 | #КонецОбласти 17 | 18 | #КонецЕсли 19 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_Заявки/Демо_Заявки.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Демо_Заявки 4 | 5 | ru 6 | Заявки 7 | 8 | true 9 | 10 | -------------------------------------------------------------------------------- /example/src/Roles/ФреймворкХТТП_Тесты_ПолныеПрава/ФреймворкХТТП_Тесты_ПолныеПрава.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ФреймворкХТТП_Тесты_ПолныеПрава 4 | 5 | ru 6 | Полные права 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/src/Configuration/ManagedApplicationModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Область ОписаниеПеременных 5 | 6 | #КонецОбласти 7 | 8 | #Область ОбработчикиСобытий 9 | 10 | // Код процедур и функций 11 | 12 | #КонецОбласти 13 | 14 | #Область СлужебныеПроцедурыИФункции 15 | 16 | // Код процедур и функций 17 | 18 | #КонецОбласти 19 | 20 | #Область Инициализация 21 | 22 | #КонецОбласти 23 | -------------------------------------------------------------------------------- /example/src/XDTOPackages/common_1_0/common_1_0.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | common_1_0 4 | 5 | ru 6 | Common 7 | 8 | http://www.example.com/api/common/1.0 9 | 10 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_КонтроллерСервиса/Демо_КонтроллерСервиса.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Демо_КонтроллерСервиса 4 | 5 | ru 6 | Контроллер сервиса 7 | 8 | true 9 | 10 | -------------------------------------------------------------------------------- /src/src/XDTOPackages/ОбщегоНазначенияХТТП/Package.xdto: -------------------------------------------------------------------------------- 1 | 2 | 3 | [0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12} 4 | 5 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_ФункцииВосстановления/Демо_ФункцииВосстановления.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Демо_ФункцииВосстановления 4 | 5 | ru 6 | Демо функции восстановления 7 | 8 | true 9 | 10 | -------------------------------------------------------------------------------- /src/src/XDTOPackages/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбщегоНазначенияХТТП 4 | 5 | ru 6 | Common 7 | 8 | https://github.com/Daabramov/1c-http-framework 9 | 10 | -------------------------------------------------------------------------------- /example/src/Configuration/ExternalConnectionModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Область ОбработчикиСобытий 5 | 6 | // Код процедур и функций 7 | 8 | #КонецОбласти 9 | 10 | #Область СлужебныеПроцедурыИФункции 11 | 12 | // Код процедур и функций 13 | 14 | #КонецОбласти 15 | 16 | #Область ОбработчикиСобытий 17 | 18 | // Код процедур и функций 19 | 20 | #КонецОбласти 21 | 22 | #Область СлужебныеПроцедурыИФункции 23 | 24 | // Код процедур и функций 25 | 26 | #КонецОбласти 27 | -------------------------------------------------------------------------------- /src/src/CommonModules/Кеширование/Кеширование.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Кеширование 4 | 5 | ru 6 | Кеширование 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/СервисыОбщее/СервисыОбщее.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | СервисыОбщее 4 | 5 | ru 6 | Сервисы общее 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ВНИМАНИЕ 2 | Проект переехал как часть Bellerage SSL - https://github.com/Bellerage-IT/bellerage-ssl 3 | Данный репозиторий не развивается 4 | 5 | # 1c-http-framework 6 | Реализация фреймворка для HTTP сервисов на 1С 7 | 8 | Проект находится в альфе версии (примеры использования смотреть в расширении в папке example) 9 | 10 | Решаемые проблемы 11 | - Общий подход к реализации сервисов 12 | - Авто проверки на основании XDTO схем 13 | - Общие функции восстановления и конвертации сообщений 14 | - Логирование и обработка ошибок 15 | -------------------------------------------------------------------------------- /src/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | ФреймворкХТТП 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.xtext.ui.shared.xtextBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.xtext.ui.shared.xtextNature 16 | com._1c.g5.v8.dt.core.V8ConfigurationNature 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/src/CommonModules/ВосстановлениеXDTO/ВосстановлениеXDTO.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ВосстановлениеXDTO 4 | 5 | ru 6 | Восстановление XDTO 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПроцессорыКоллекций 4 | 5 | ru 6 | Процессоры коллекций 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /example/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | ФреймворкХТТП.Тесты 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.xtext.ui.shared.xtextBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.xtext.ui.shared.xtextNature 16 | com._1c.g5.v8.dt.core.V8ExtensionNature 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбщегоНазначенияХТТП/ОбщегоНазначенияХТТП.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбщегоНазначенияХТТП 4 | 5 | ru 6 | Общего назначения ХТТП 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/КоннекторХТТПСлужебный/КоннекторХТТПСлужебный.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | КоннекторХТТПСлужебный 4 | 5 | ru 6 | Коннектор ХТТПСлужебный 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаHTTPЗапросов/ОбработкаHTTPЗапросов.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбработкаHTTPЗапросов 4 | 5 | ru 6 | Обработка HTTPЗапросов (Bellerage) 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/ПроцессорыКоллекцийСлужебный/ПроцессорыКоллекцийСлужебный.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПроцессорыКоллекцийСлужебный 4 | 5 | ru 6 | Процессоры коллекций служебный 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /example/src/Documents/Демо_Заявка/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 5 | 6 | #Область ОбработчикиСобытий 7 | 8 | Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) 9 | //TODO: Вставить содержимое обработчика 10 | КонецПроцедуры 11 | 12 | Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) 13 | Если ЭтоНовый() Тогда 14 | ДатаСоздания = ТекущаяДатаСеанса(); 15 | КонецЕсли; 16 | КонецПроцедуры 17 | 18 | #КонецОбласти 19 | 20 | #КонецЕсли 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/src/CommonModules/ВосстановлениеXDTOПереопределяемый/ВосстановлениеXDTOПереопределяемый.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ВосстановлениеXDTOПереопределяемый 4 | 5 | ru 6 | Восстановление XDTOПереопределяемый 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаЗапросовПереопределяемый/ОбработкаЗапросовПереопределяемый.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбработкаЗапросовПереопределяемый 4 | 5 | ru 6 | Обработка запросов переопределяемый 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаЗапросовПовтИсп/ОбработкаЗапросовПовтИсп.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбработкаЗапросовПовтИсп 4 | 5 | ru 6 | Обработка запросов повт исп 7 | 8 | true 9 | true 10 | true 11 | DuringSession 12 | 13 | -------------------------------------------------------------------------------- /example/src/Configuration/SessionModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 5 | 6 | #Область ОбработчикиСобытий 7 | 8 | // Код процедур и функций 9 | 10 | #КонецОбласти 11 | 12 | #Область СлужебныеПроцедурыИФункции 13 | 14 | // Код процедур и функций 15 | 16 | #КонецОбласти 17 | 18 | #КонецЕсли 19 | 20 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 21 | 22 | #Область ОбработчикиСобытий 23 | 24 | // Код процедур и функций 25 | 26 | #КонецОбласти 27 | 28 | #Область СлужебныеПроцедурыИФункции 29 | 30 | // Код процедур и функций 31 | 32 | #КонецОбласти 33 | 34 | #КонецЕсли 35 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаЗапросовПереопределяемый/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | //@skip-check module-empty-method 6 | // Выводить подробное описание ошибок. 7 | // 8 | // Параметры: 9 | // Результат - Булево - Переопределяемый флаг 10 | Процедура ВыводитьПодробноеОписаниеОшибок(Результат) Экспорт 11 | Результат = Истина; 12 | КонецПроцедуры 13 | 14 | //@skip-check module-empty-method 15 | // Максимальный размер тела для логирования 16 | // 17 | // Параметры: 18 | // Результат - Число - Переопределяемый размер 19 | Процедура МаксимальныйРазмерТелаДляЛогирования(Результат) Экспорт 20 | 21 | КонецПроцедуры 22 | 23 | #КонецОбласти 24 | 25 | -------------------------------------------------------------------------------- /src/src/Subsystems/ХТТП/Subsystems/ПроцессорыКоллекций/ПроцессорыКоллекций.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПроцессорыКоллекций 4 | 5 | ru 6 | Процессоры коллекций 7 | 8 | true 9 | DataProcessor.ПроцессорКоллекций 10 | CommonModule.ПроцессорыКоллекций 11 | CommonModule.ПроцессорыКоллекцийСлужебный 12 | Subsystem.ХТТП 13 | 14 | -------------------------------------------------------------------------------- /example/src/Catalogs/Демо_Проекты/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 5 | 6 | #Область ОписаниеПеременных 7 | 8 | #КонецОбласти 9 | 10 | #Область ПрограммныйИнтерфейс 11 | 12 | // Код процедур и функций 13 | 14 | #КонецОбласти 15 | 16 | #Область ОбработчикиСобытий 17 | 18 | // Код процедур и функций 19 | 20 | #КонецОбласти 21 | 22 | #Область СлужебныйПрограммныйИнтерфейс 23 | 24 | // Код процедур и функций 25 | 26 | #КонецОбласти 27 | 28 | #Область СлужебныеПроцедурыИФункции 29 | 30 | // Код процедур и функций 31 | 32 | #КонецОбласти 33 | 34 | #Область Инициализация 35 | 36 | #КонецОбласти 37 | 38 | #КонецЕсли 39 | -------------------------------------------------------------------------------- /example/src/Documents/Демо_Сообщение/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 5 | 6 | #Область ОписаниеПеременных 7 | 8 | #КонецОбласти 9 | 10 | #Область ПрограммныйИнтерфейс 11 | 12 | // Код процедур и функций 13 | 14 | #КонецОбласти 15 | 16 | #Область ОбработчикиСобытий 17 | 18 | // Код процедур и функций 19 | 20 | #КонецОбласти 21 | 22 | #Область СлужебныйПрограммныйИнтерфейс 23 | 24 | // Код процедур и функций 25 | 26 | #КонецОбласти 27 | 28 | #Область СлужебныеПроцедурыИФункции 29 | 30 | // Код процедур и функций 31 | 32 | #КонецОбласти 33 | 34 | #Область Инициализация 35 | 36 | #КонецОбласти 37 | 38 | #КонецЕсли 39 | -------------------------------------------------------------------------------- /example/src/Configuration/ManagedApplicationModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Область ОписаниеПеременных 5 | 6 | #КонецОбласти 7 | 8 | #Область ОбработчикиСобытий 9 | 10 | // Код процедур и функций 11 | 12 | #КонецОбласти 13 | 14 | #Область СлужебныеПроцедурыИФункции 15 | 16 | // Код процедур и функций 17 | 18 | #КонецОбласти 19 | 20 | #Область Инициализация 21 | 22 | #КонецОбласти 23 | 24 | #Область ОписаниеПеременных 25 | 26 | #КонецОбласти 27 | 28 | #Область ОбработчикиСобытий 29 | 30 | // Код процедур и функций 31 | 32 | #КонецОбласти 33 | 34 | #Область СлужебныеПроцедурыИФункции 35 | 36 | // Код процедур и функций 37 | 38 | #КонецОбласти 39 | 40 | #Область Инициализация 41 | 42 | #КонецОбласти 43 | -------------------------------------------------------------------------------- /src/src/DataProcessors/ПроцессорКоллекций/ПроцессорКоллекций.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ПроцессорКоллекций 8 | 9 | ru 10 | Процессор коллекций 11 | 12 | true 13 | 14 | -------------------------------------------------------------------------------- /example/src/Documents/Демо_Сообщение/ManagerModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 4 | 5 | #Область ПрограммныйИнтерфейс 6 | 7 | #Область АПИ 8 | 9 | // см. ВосстановлениеXDTO.НовыеПараметрыВосстановления 10 | Функция ФункцииВосстановления() Экспорт 11 | 12 | ПараметрыВосстановления = ВосстановлениеXDTO.НовыеПараметрыВосстановления(); 13 | Строка = ПараметрыВосстановления.Добавить(); 14 | Строка.СвойствоИсходное = "reply_message"; 15 | Строка.ИмяСвойства = "СообщениеОтвета"; 16 | Строка.ФункцияВосстановленияЗначения = "Демо_ФункцииВосстановления.ВосстановитьСообщение"; 17 | 18 | Строка = ПараметрыВосстановления.Добавить(); 19 | Строка.СвойствоИсходное = "body"; 20 | Строка.ИмяСвойства = "ТелоСообщения"; 21 | 22 | Возврат ПараметрыВосстановления; 23 | 24 | КонецФункции 25 | 26 | 27 | #КонецОбласти 28 | 29 | #КонецОбласти 30 | 31 | #КонецЕсли -------------------------------------------------------------------------------- /example/src/HTTPServices/Демо_/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция CreatePOST(Запрос) 2 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.СоздатьЗаявку"); 3 | КонецФункции 4 | 5 | Функция projectsCreatePOST(Запрос) 6 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.СоздатьПроект"); 7 | КонецФункции 8 | 9 | Функция requestsGET(Запрос) 10 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.ПолучитьЗаявки"); 11 | КонецФункции 12 | 13 | Функция projectsGET(Запрос) 14 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.ПолучитьПроекты"); 15 | КонецФункции 16 | 17 | Функция projects_signleGET(Запрос) 18 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.ПолучитьПроект"); 19 | КонецФункции 20 | 21 | Функция projects_signle_file_POST(Запрос) 22 | Возврат Ответ(Запрос, "Демо_КонтроллерСервиса.ПоместитьФайлыПроекта") 23 | КонецФункции 24 | 25 | Функция Ответ(Запрос, ИмяОбработчика) 26 | Возврат ОбработкаHTTPЗапросов.ОбработатьЗапрос( 27 | Запрос, 28 | ИмяОбработчика, 29 | Метаданные.HTTPСервисы.Демо_ 30 | ); 31 | КонецФункции 32 | 33 | -------------------------------------------------------------------------------- /example/src/Roles/ФреймворкХТТП_Тесты_ПолныеПрава/Rights.rights: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | false 6 | 7 | Configuration.ФреймворкХТТП_Демо 8 | 9 | MainWindowModeNormal 10 | true 11 | 12 | 13 | MainWindowModeWorkplace 14 | true 15 | 16 | 17 | MainWindowModeEmbeddedWorkplace 18 | true 19 | 20 | 21 | MainWindowModeFullscreenWorkplace 22 | true 23 | 24 | 25 | MainWindowModeKiosk 26 | true 27 | 28 | 29 | AnalyticsSystemClient 30 | true 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Abramov Dmitry 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/src/Subsystems/ХТТП/ХТТП.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ХТТП 4 | 5 | ru 6 | ХТТП 7 | 8 | true 9 | DataProcessor.ПроцессорКоллекций 10 | CommonModule.ОбработкаHTTPЗапросов 11 | CommonModule.ПроцессорыКоллекций 12 | CommonModule.ПроцессорыКоллекцийСлужебный 13 | CommonModule.ВосстановлениеXDTO 14 | CommonModule.ВосстановлениеXDTOПереопределяемый 15 | CommonModule.Кеширование 16 | CommonModule.ОбработкаЗапросовПереопределяемый 17 | CommonModule.КоннекторХТТПСлужебный 18 | CommonModule.ОбработкаЗапросовПовтИсп 19 | CommonModule.ОбщегоНазначенияХТТП 20 | CommonModule.СервисыОбщее 21 | XDTOPackage.ОбщегоНазначенияХТТП 22 | Role.ПолныеПрава 23 | ПроцессорыКоллекций 24 | 25 | -------------------------------------------------------------------------------- /src/src/CommonModules/ВосстановлениеXDTOПереопределяемый/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | //@skip-check module-empty-method 6 | // Восстановить значение XDTO. 7 | // 8 | // Параметры: 9 | // Результат - Произвольный - Данные для возврата 10 | // Свойство - Строка - Имя свойства 11 | // Тип - ТипОбъектаXDTO,ТипЗначенияXDTO - Тип XDTO 12 | // Значение - Произвольный - Исходное значение 13 | // ДопПараметры - Неопределено,Структура - Доп параметры 14 | // 15 | // Произвольный 16 | Процедура ВосстановитьЗначениеXDTO(Результат, Свойство, Тип, Значение, ДопПараметры) Экспорт 17 | 18 | КонецПроцедуры 19 | 20 | //@skip-check module-empty-method 21 | // Конвертировать из формата. 22 | // 23 | // Параметры: 24 | // Результат - Произвольный - Вычисленные ранее результат 25 | // ОбъектXDTO - ОбъектXDTO,СписокXDTO - Прочитанные данные в объект или список XDTO 26 | // ФункцииВосстановления - см. ВосстановлениеXDTO.НовыеПараметрыВосстановления 27 | // ДопПараметры - Неопределено, Структура - Доп параметры 28 | // ИмяСвойстваСписка - Строка - Имя свойства для поиска функции восстановления элементов списка 29 | // 30 | Процедура КонвертироватьИзФормата(Результат, ОбъектXDTO, ФункцииВосстановления, ДопПараметры, ИмяСвойстваСписка) Экспорт 31 | 32 | КонецПроцедуры 33 | 34 | #КонецОбласти 35 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаЗапросовПовтИсп/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | // Базовый код ошибки проверки. 6 | // 7 | // Возвращаемое значение: 8 | // Строка - Базовый код ошибки проверки 9 | Функция БазовыйКодОшибкиПроверки() Экспорт 10 | 11 | Возврат "[CheckFailed]"; 12 | 13 | КонецФункции 14 | 15 | // Базовый код журнала регистрации 16 | // 17 | // Возвращаемое значение: 18 | // Строка - Базовый код ошибки проверки 19 | Функция БазовыйКодЖурналаРегистрации() Экспорт 20 | 21 | Возврат "ОшибкаХТТПСервиса"; 22 | 23 | КонецФункции 24 | 25 | // Флаг подробного вывода ошибок клиенту 26 | // 27 | // Возвращаемое значение: 28 | // Булево - Выводить подробное описание ошибок 29 | Функция ВыводитьПодробноеОписаниеОшибок() Экспорт 30 | Результат = Ложь; 31 | ОбработкаЗапросовПереопределяемый.ВыводитьПодробноеОписаниеОшибок(Результат); 32 | Возврат Результат; 33 | КонецФункции 34 | 35 | // Максимальный размер тела для логирования. 36 | // 37 | // Возвращаемое значение: 38 | // Число - Максимальный размер тела для логирования 39 | Функция МаксимальныйРазмерТелаДляЛогирования() Экспорт 40 | Результат = 5 * 1024 * 1024; 41 | ОбработкаЗапросовПереопределяемый.МаксимальныйРазмерТелаДляЛогирования(Результат); 42 | Возврат Результат; 43 | КонецФункции 44 | 45 | #КонецОбласти 46 | -------------------------------------------------------------------------------- /example/src/XDTOPackages/common_1_0/Package.xdto: -------------------------------------------------------------------------------- 1 | 2 | 3 | [0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_Заявки/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | 4 | #Область ПрограммныйИнтерфейс 5 | 6 | // Параметры создания заявки. 7 | // 8 | // Параметры: 9 | // Параметры - см. Документы.Демо_Заявка.НовыеДанные 10 | // 11 | // Возвращаемое значение: 12 | // ДокументСсылка.Демо_Заявка 13 | Функция СоздатьЗаявку(Параметры) Экспорт 14 | НачатьТранзакцию(); 15 | Попытка 16 | Заявка = Документы.Демо_Заявка.СоздатьДокумент(); 17 | Заявка.Заполнить(Параметры); 18 | 19 | Если Не Заявка.ПроверитьЗаполнение() Тогда 20 | ВызватьИсключение "Документ не прошел проверку заполнения"; 21 | КонецЕсли; 22 | 23 | Заявка.Записать(); 24 | ЗаявкаСсылка = Заявка.Ссылка; 25 | ТекстСообщения = Параметры.Сообщение; // Строка 26 | СоздатьСообщение(ЗаявкаСсылка, ТекстСообщения); 27 | 28 | ЗафиксироватьТранзакцию(); 29 | Исключение 30 | ОтменитьТранзакцию(); 31 | ВызватьИсключение; 32 | КонецПопытки; 33 | 34 | Возврат ЗаявкаСсылка; 35 | КонецФункции 36 | 37 | // Создать сообщение. 38 | // 39 | // Параметры: 40 | // Заявка - ДокументСсылка.Демо_Заявка 41 | // ТекстСообщения - Строка 42 | // СообщениеОтвета - ДокументСсылка.Демо_Сообщение 43 | // 44 | // Возвращаемое значение: 45 | // ДокументСсылка.Демо_Сообщение 46 | Функция СоздатьСообщение(Заявка, ТекстСообщения, СообщениеОтвета = Неопределено) Экспорт 47 | 48 | СообщениеОбъект = Документы.Демо_Сообщение.СоздатьДокумент(); 49 | СообщениеОбъект.Заполнить(Неопределено); 50 | СообщениеОбъект.Запрос = Заявка; 51 | СообщениеОбъект.ТелоСообщения = ТекстСообщения; 52 | СообщениеОбъект.СообщениеОтвета = СообщениеОтвета; 53 | СообщениеОбъект.Записать(); 54 | 55 | Возврат СообщениеОбъект.Ссылка; 56 | 57 | КонецФункции 58 | 59 | #КонецОбласти 60 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_ФункцииВосстановления/Module.bsl: -------------------------------------------------------------------------------- 1 | 2 | #Область ПрограммныйИнтерфейс 3 | 4 | // Для целей мемоизации можно использовать и модули с повторным использованием значений 5 | // Конкретно в этом примере хотелось показать, что ДопПараметры прокидываются во все функции восстановления, 6 | // соответственно результат одной функции можно использовать в другой, но в общем случае порядок выполнения не гарантирован 7 | Функция ВосстановитьПроект(Значение, ДопПараметры = Неопределено) Экспорт 8 | 9 | ЛокальныйКеш = Кеширование.ЛокальныйКеш(ДопПараметры, "Кеш_ПроектыПоУУИД"); 10 | 11 | ЗначениеИзКеша = Кеширование.ЗначениеИзКеша(Значение, ЛокальныйКеш); 12 | 13 | Если ЗначениеИзКеша <> Неопределено Тогда 14 | Возврат ЗначениеИзКеша; 15 | КонецЕсли; 16 | 17 | Ссылка = XMLЗначение(Тип("СправочникСсылка.Демо_Проекты"), Значение); 18 | Если Не ОбщегоНазначенияХТТП.СсылкаСуществует(Ссылка) Тогда 19 | СервисыОбщее.ВызватьИсключениеПроверки( 20 | СтрШаблон("Project with id = %1 does not exist", Значение) 21 | ); 22 | КонецЕсли; 23 | 24 | Кеширование.ПоместитьЗначениеВКеш(Ссылка, Значение, ЛокальныйКеш); 25 | 26 | Возврат Ссылка; 27 | 28 | 29 | КонецФункции 30 | 31 | Функция ВосстановитьСообщение(Значение, ДопПараметры = Неопределено) Экспорт 32 | 33 | ЛокальныйКеш = Кеширование.ЛокальныйКеш(ДопПараметры, "Кеш_СообщенияПоУУИД"); 34 | 35 | ЗначениеИзКеша = Кеширование.ЗначениеИзКеша(Значение, ЛокальныйКеш); 36 | 37 | Если ЗначениеИзКеша <> Неопределено Тогда 38 | Возврат ЗначениеИзКеша; 39 | КонецЕсли; 40 | 41 | Ссылка = XMLЗначение(Тип("ДокументСсылка.Демо_Сообщение"), Значение); 42 | Если Не ОбщегоНазначенияХТТП.СсылкаСуществует(Ссылка) Тогда 43 | СервисыОбщее.ВызватьИсключениеПроверки( 44 | СтрШаблон("message with id = %1 does not exist", Значение) 45 | ); 46 | КонецЕсли; 47 | 48 | Кеширование.ПоместитьЗначениеВКеш(Ссылка, Значение, ЛокальныйКеш); 49 | 50 | Возврат Ссылка; 51 | 52 | КонецФункции 53 | 54 | #КонецОбласти 55 | -------------------------------------------------------------------------------- /example/src/HTTPServices/Демо_/Демо_.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Демо_ 4 | 5 | ru 6 | HTTPСервис 7 | 8 | demo 9 | AutoUse 10 | 2 11 | 12 | projects 13 | 14 | ru 15 | Projects 16 | 17 | 18 | 19 | POST 20 | 21 | ru 22 | POST 23 | 24 | POST 25 | projectsCreatePOST 26 | 27 | 28 | GET 29 | 30 | ru 31 | GET 32 | 33 | projectsGET 34 | 35 | 36 | 37 | requests 38 | 39 | ru 40 | Requests 41 | 42 | 43 | 44 | POST 45 | 46 | ru 47 | POST 48 | 49 | POST 50 | CreatePOST 51 | 52 | 53 | GET 54 | 55 | ru 56 | GET 57 | 58 | requestsGET 59 | 60 | 61 | 62 | projects_single 63 | 64 | ru 65 | Projects single 66 | 67 | 68 | 69 | GET 70 | 71 | ru 72 | GET 73 | 74 | projects_signleGET 75 | 76 | 77 | 78 | projects_single_files 79 | 80 | ru 81 | Projects single files 82 | 83 | 84 | 85 | GET 86 | 87 | ru 88 | GET 89 | 90 | POST 91 | projects_signle_file_POST 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/src/CommonModules/Кеширование/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | // Описание 5 | // Возвращает значение из кеша по ключу 6 | // Параметры: 7 | // НаборКлючей - Произвольный 8 | // - Массив из Произвольный 9 | // ЛокальныйКеш - см. ЛокальныйКеш 10 | // Возвращаемое значение: 11 | // Произвольный - Значение из кеша 12 | Функция ЗначениеИзКеша(Знач НаборКлючей, ЛокальныйКеш) Экспорт 13 | 14 | Если ЛокальныйКеш = Неопределено Тогда 15 | Возврат Неопределено; 16 | КонецЕсли; 17 | 18 | Если ТипЗнч(НаборКлючей) <> Тип("Массив") Тогда 19 | НаборКлючей = ОбщегоНазначенияХТТП.ЗначениеВМассиве(НаборКлючей); 20 | КонецЕсли; 21 | 22 | Значение = ЛокальныйКеш.Получить(НаборКлючей[0]); 23 | Если Значение = Неопределено Тогда 24 | Возврат Неопределено; 25 | ИначеЕсли ТипЗнч(Значение) <> Тип("Соответствие") Тогда 26 | Возврат Значение; 27 | Иначе 28 | // Рекурсивно копируем массив и передаем в функцию дальше 29 | // Не используем функцию ОбщегоНазначения, т.к. она достаточно долгая, здесь ситуация проще и вложенное копирование не требуется 30 | НовыйНабор = Новый Массив(Новый ФиксированныйМассив(НаборКлючей)); 31 | НовыйНабор.Удалить(0); 32 | Возврат ЗначениеИзКеша(НовыйНабор, Значение); 33 | КонецЕсли; 34 | 35 | КонецФункции 36 | 37 | // Описание 38 | // Возвращает первичное соответствие по ключу показателя 39 | // Параметры: 40 | // КешПараметров - Структура - Общий кеш 41 | // ИмяСвойства - Строка - Имя свойства локального кеша 42 | // Возвращаемое значение: 43 | // Соответствие из КлючИЗначение 44 | Функция ЛокальныйКеш(КешПараметров, ИмяСвойства) Экспорт 45 | 46 | Если КешПараметров = Неопределено Тогда 47 | Возврат Неопределено; 48 | КонецЕсли; 49 | 50 | Если Не КешПараметров.Свойство(ИмяСвойства) Тогда 51 | КешПараметров.Вставить(ИмяСвойства, Новый Соответствие()); 52 | КонецЕсли; 53 | Возврат КешПараметров[ИмяСвойства]; 54 | КонецФункции 55 | 56 | // Описание 57 | // Помещает значени в кеш по набору ключей рекурсивно 58 | // Порядок ключей определяется порядком в наборе 59 | // ВНИМАНИЕ 1! Значение не должно быть типом Соответствие, используйте ФиксированноеСоответствие 60 | // ВНИМАНИЕ 2! Значение Неопределено не поддерживается для кеширования 61 | // Параметры: 62 | // Значение - Произвольный 63 | // НаборКлючей - Массив из Произвольный 64 | // - Произвольный 65 | // ЛокальныйКеш - см. ЛокальныйКеш 66 | Процедура ПоместитьЗначениеВКеш(Значение, Знач НаборКлючей, ЛокальныйКеш) Экспорт 67 | 68 | Если ЛокальныйКеш = Неопределено Тогда 69 | Возврат; 70 | КонецЕсли; 71 | 72 | Если ТипЗнч(НаборКлючей) <> Тип("Массив") Тогда 73 | НаборКлючей = ОбщегоНазначенияХТТП.ЗначениеВМассиве(НаборКлючей); 74 | КонецЕсли; 75 | 76 | ТекСоответствие = ЛокальныйКеш.Получить(НаборКлючей[0]); 77 | Если ТекСоответствие = Неопределено Тогда 78 | Если НаборКлючей.Количество() = 1 Тогда 79 | ЛокальныйКеш.Вставить(НаборКлючей[0], Значение); 80 | Возврат; 81 | Иначе 82 | ЛокальныйКеш.Вставить(НаборКлючей[0], Новый Соответствие); 83 | КонецЕсли; 84 | КонецЕсли; 85 | 86 | НовыйНабор = ОбщегоНазначенияХТТП.СкопироватьРекурсивно(НаборКлючей); 87 | НовыйНабор.Удалить(0); 88 | ПоместитьЗначениеВКеш(Значение, НовыйНабор, ЛокальныйКеш.Получить(НаборКлючей[0])); 89 | 90 | КонецПроцедуры 91 | 92 | #КонецОбласти -------------------------------------------------------------------------------- /example/src/Documents/Демо_Сообщение/Демо_Сообщение.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Демо_Сообщение 11 | 12 | ru 13 | Сообщение 14 | 15 | true 16 | Document.Демо_Сообщение.StandardAttribute.Number 17 | DontUse 18 | Use 19 | Use 20 | String 21 | 9 22 | Variable 23 | true 24 | true 25 | true 26 | true 27 | 28 | Запрос 29 | 30 | ru 31 | Запрос 32 | 33 | 34 | DocumentRef.Демо_Заявка 35 | 36 | 37 | 38 | ShowError 39 | 40 | Use 41 | Use 42 | 43 | 44 | ТелоСообщения 45 | 46 | ru 47 | Тело сообщения 48 | 49 | 50 | String 51 | 52 | 53 | 54 | 55 | 56 | Use 57 | Use 58 | 59 | 60 | СообщениеОтвета 61 | 62 | ru 63 | Сообщение ответа 64 | 65 | 66 | DocumentRef.Демо_Сообщение 67 | 68 | 69 | 70 | 71 | Use 72 | Use 73 | 74 | 75 | -------------------------------------------------------------------------------- /src/src/Configuration/Configuration.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ФреймворкХТТП 4 | 5 | ru 6 | Фреймворк ХТТП 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 8.3.20 16 | ManagedApplication 17 | PersonalComputer 18 | Russian 19 | 20 | 21 | true 22 | 23 | 24 | OSBackup 25 | true 26 | 27 | 28 | Language.Русский 29 | Managed 30 | NotAutoFree 31 | DontUse 32 | DontUse 33 | 8.3.16 34 | 35 | Русский 36 | 37 | ru 38 | Русский 39 | 40 | ru 41 | 42 | Subsystem.ХТТП 43 | Role.ПолныеПрава 44 | CommonModule.ВосстановлениеXDTO 45 | CommonModule.ВосстановлениеXDTOПереопределяемый 46 | CommonModule.Кеширование 47 | CommonModule.КоннекторХТТПСлужебный 48 | CommonModule.ОбработкаHTTPЗапросов 49 | CommonModule.ОбработкаЗапросовПереопределяемый 50 | CommonModule.ОбработкаЗапросовПовтИсп 51 | CommonModule.ОбщегоНазначенияХТТП 52 | CommonModule.ПроцессорыКоллекций 53 | CommonModule.ПроцессорыКоллекцийСлужебный 54 | CommonModule.СервисыОбщее 55 | XDTOPackage.ОбщегоНазначенияХТТП 56 | DataProcessor.ПроцессорКоллекций 57 | 58 | -------------------------------------------------------------------------------- /example/src/Configuration/Configuration.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ФреймворкХТТП_Демо 4 | 5 | ru 6 | Фреймворк ХТТП демо 7 | 8 | Adopted 9 | 10 | Checked 11 | Checked 12 | Extended 13 | Extended 14 | Extended 15 | Checked 16 | Checked 17 | Extended 18 | Extended 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | true 28 | Демо_ 29 | 8.3.16 30 | Customization 31 | ManagedApplication 32 | PersonalComputer 33 | Russian 34 | Role.ФреймворкХТТП_Тесты_ПолныеПрава 35 | Language.Русский 36 | 37 | Русский 38 | Adopted 39 | 40 | Checked 41 | 42 | ru 43 | 44 | Role.ФреймворкХТТП_Тесты_ПолныеПрава 45 | CommonModule.Демо_Заявки 46 | CommonModule.Демо_КонтроллерСервиса 47 | CommonModule.Демо_ФункцииВосстановления 48 | XDTOPackage.common_1_0 49 | HTTPService.Демо_ 50 | Catalog.Демо_Проекты 51 | Document.Демо_Заявка 52 | Document.Демо_Сообщение 53 | 54 | -------------------------------------------------------------------------------- /src/src/Roles/ПолныеПрава/Rights.rights: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | true 5 | false 6 | 7 | DataProcessor.ПроцессорКоллекций 8 | 9 | Use 10 | true 11 | 12 | 13 | View 14 | true 15 | 16 | 17 | 18 | Subsystem.ХТТП 19 | 20 | View 21 | true 22 | 23 | 24 | 25 | Configuration.ФреймворкХТТП 26 | 27 | Administration 28 | true 29 | 30 | 31 | DataAdministration 32 | true 33 | 34 | 35 | UpdateDataBaseConfiguration 36 | true 37 | 38 | 39 | ExclusiveMode 40 | true 41 | 42 | 43 | ActiveUsers 44 | true 45 | 46 | 47 | EventLog 48 | true 49 | 50 | 51 | ThinClient 52 | true 53 | 54 | 55 | WebClient 56 | true 57 | 58 | 59 | MobileClient 60 | true 61 | 62 | 63 | ThickClient 64 | true 65 | 66 | 67 | ExternalConnection 68 | true 69 | 70 | 71 | Automation 72 | true 73 | 74 | 75 | TechnicalSpecialistMode 76 | true 77 | 78 | 79 | CollaborationSystemInfoBaseRegistration 80 | true 81 | 82 | 83 | MainWindowModeNormal 84 | true 85 | 86 | 87 | MainWindowModeWorkplace 88 | true 89 | 90 | 91 | MainWindowModeEmbeddedWorkplace 92 | true 93 | 94 | 95 | MainWindowModeFullscreenWorkplace 96 | true 97 | 98 | 99 | MainWindowModeKiosk 100 | true 101 | 102 | 103 | AnalyticsSystemClient 104 | true 105 | 106 | 107 | ExclusiveModeTerminationAtSessionStart 108 | true 109 | 110 | 111 | SaveUserData 112 | true 113 | 114 | 115 | ConfigurationExtensionsAdministration 116 | true 117 | 118 | 119 | InteractiveOpenExtDataProcessors 120 | true 121 | 122 | 123 | InteractiveOpenExtReports 124 | true 125 | 126 | 127 | Output 128 | true 129 | 130 | 131 | 132 | Subsystem.ХТТП.Subsystem.ПроцессорыКоллекций 133 | 134 | View 135 | true 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /example/src/Catalogs/Демо_Проекты/ManagerModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 4 | 5 | #Область ПрограммныйИнтерфейс 6 | 7 | #Область АПИ 8 | 9 | // В формат. 10 | // 11 | // Параметры: 12 | // Ссылка - СправочникСсылка.Демо_Проекты 13 | // Данные - см. НовыеДанные 14 | // Кеш - Структура - Кеш 15 | // 16 | // Возвращаемое значение: 17 | // см. СхемаОтветаАПИ 18 | Функция ВФормат(Ссылка, Данные = Неопределено, Кеш = Неопределено) Экспорт 19 | 20 | ЛокальныйКеш = Кеширование.ЛокальныйКеш(Кеш, "Формат_Демо_Проект"); 21 | Если ЛокальныйКеш <> Неопределено И Кеширование.ЗначениеИзКеша(Ссылка, ЛокальныйКеш) <> Неопределено Тогда 22 | Возврат Кеширование.ЗначениеИзКеша(Ссылка, ЛокальныйКеш); 23 | КонецЕсли; 24 | 25 | // Здесь уже можно заполнять при наличии БСП удобнее 26 | // Реквизиты = ОбщегоНазначения.ЗначенияРеквизитов() 27 | Если Данные = Неопределено Тогда 28 | Реквизиты = НовыеДанные(); 29 | ЗаполнитьЗначенияСвойств(Реквизиты, Ссылка, , "Файлы"); 30 | Реквизиты.Файлы = Ссылка.Файлы.Выгрузить(); 31 | Иначе 32 | Реквизиты = Данные; 33 | КонецЕсли; 34 | 35 | Результат = СхемаОтветаАПИ(); 36 | Результат.id = XMLСтрока(Ссылка); 37 | Результат.name = Реквизиты.Наименование; 38 | Результат.project_owner = Реквизиты.Ответственный; 39 | 40 | Для Каждого Файл Из Реквизиты.Файлы Цикл 41 | ФайлВФормате = СхемаФайлаПроектаАПИ(); 42 | ФайлВФормате.fileID = XMLСтрока(Файл.Идентификатор); 43 | ФайлВФормате.filename = Файл.ИмяФайла; // Строка 44 | Результат.files.Добавить(ФайлВФормате); 45 | КонецЦикла; 46 | 47 | Кеширование.ПоместитьЗначениеВКеш(Новый ФиксированнаяСтруктура(Результат), Ссылка, ЛокальныйКеш); 48 | 49 | Возврат Результат; 50 | КонецФункции 51 | 52 | // Схема ответа АПИ. 53 | // 54 | // Возвращаемое значение: 55 | // Структура - Схема ответа АПИ: 56 | // * name - Строка 57 | // * project_owner - Строка 58 | // * id - Строка 59 | // * files - Массив из см. СхемаФайлаПроектаАПИ 60 | Функция СхемаОтветаАПИ() Экспорт 61 | 62 | Схема = Новый Структура(); 63 | Схема.Вставить("name", ""); 64 | Схема.Вставить("project_owner", ""); 65 | Схема.Вставить("id", ""); 66 | Схема.Вставить("files", Новый Массив()); 67 | 68 | Возврат Схема; 69 | 70 | КонецФункции 71 | 72 | // Схема файла проекта АПИ. 73 | // 74 | // Возвращаемое значение: 75 | // Структура - Схема файла проекта АПИ: 76 | // * filename - Строка - 77 | // * fileID - Строка - 78 | Функция СхемаФайлаПроектаАПИ() Экспорт 79 | Схема = Новый Структура; 80 | Схема.Вставить("filename", ""); 81 | Схема.Вставить("fileID", ""); 82 | 83 | Возврат Схема; 84 | КонецФункции 85 | 86 | // Новые данные. 87 | // 88 | // Возвращаемое значение: 89 | // Структура - Новые данные: 90 | // * Наименование - Строка 91 | // * Ответственный - Строка 92 | // * Файлы - ТаблицаЗначений 93 | Функция НовыеДанные() Экспорт 94 | НовыеДанные = Новый Структура(); 95 | НовыеДанные.Вставить("Наименование"); 96 | НовыеДанные.Вставить("Ответственный"); 97 | НовыеДанные.Вставить("Файлы"); 98 | 99 | Возврат НовыеДанные; 100 | КонецФункции 101 | 102 | #КонецОбласти 103 | 104 | #Область Общее 105 | 106 | // Добавить файл. 107 | // 108 | // Параметры: 109 | // Проект - СправочникСсылка.Демо_Проекты 110 | // ИмяФайла - Строка 111 | // ДД - ДвоичныеДанные 112 | // 113 | // Возвращаемое значение: 114 | // 115 | Функция ДобавитьФайл(Проект, ИмяФайла, ДД) Экспорт 116 | ПроектОбъект = Проект.ПолучитьОбъект(); 117 | Файл = ПроектОбъект.Файлы.Добавить(); 118 | Файл.Идентификатор = Новый УникальныйИдентификатор(); 119 | Файл.ИмяФайла = ИмяФайла; 120 | Файл.Файл = Новый ХранилищеЗначения(ДД, Новый СжатиеДанных(9)); 121 | ПроектОбъект.Записать(); 122 | 123 | Возврат Файл.Идентификатор; 124 | 125 | КонецФункции 126 | 127 | #КонецОбласти 128 | 129 | #КонецОбласти 130 | 131 | #КонецЕсли 132 | -------------------------------------------------------------------------------- /example/src/Documents/Демо_Заявка/Демо_Заявка.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Демо_Заявка 11 | 12 | ru 13 | Запрос 14 | 15 | true 16 | Document.Демо_Заявка.StandardAttribute.Number 17 | DontUse 18 | Use 19 | Use 20 | String 21 | 9 22 | Variable 23 | true 24 | true 25 | true 26 | true 27 | 28 | Тема 29 | 30 | ru 31 | Тема 32 | 33 | 34 | String 35 | 36 | 100 37 | 38 | 39 | 40 | 41 | ShowError 42 | true 43 | 44 | Use 45 | Use 46 | 47 | 48 | Проект 49 | 50 | ru 51 | Проект 52 | 53 | 54 | CatalogRef.Демо_Проекты 55 | 56 | 57 | 58 | ShowError 59 | true 60 | 61 | Use 62 | Use 63 | 64 | 65 | Срочный 66 | 67 | ru 68 | Срочный 69 | 70 | 71 | Boolean 72 | 73 | 74 | 75 | true 76 | 77 | Use 78 | Use 79 | 80 | 81 | ДатаСоздания 82 | 83 | ru 84 | Дата создания 85 | 86 | 87 | Date 88 | 89 | Date 90 | 91 | 92 | 93 | 94 | 95 | Use 96 | Use 97 | 98 | 99 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбработкаHTTPЗапросов/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | // Обработать запрос. 6 | // 7 | // Параметры: 8 | // Запрос - HTTPСервисЗапрос - Запрос 9 | // МетодОбработчик - Строка - Имя экспортного метода обработчика. Параметры: Запрос, МетаданныеСервиса. Возвращает HTTPСервисОтвет 10 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Метаданные ХТТП сервиса 11 | // УстанавливатьТранзакцию - Булево - указывает требуется ли устанавливать верхнеуровневую транзакцию 12 | // 13 | // Возвращаемое значение: 14 | // HTTPСервисОтвет - Ответ 15 | Функция ОбработатьЗапрос(Запрос, МетодОбработчик, МетаданныеСервиса, УстанавливатьТранзакцию = Ложь) Экспорт 16 | 17 | Если УстанавливатьТранзакцию Тогда 18 | НачатьТранзакцию(); 19 | КонецЕсли; 20 | 21 | Попытка 22 | 23 | Результат = Вычислить(МетодОбработчик + "(Запрос, МетаданныеСервиса)"); // HTTPСервисОтвет 24 | 25 | Если УстанавливатьТранзакцию Тогда 26 | ЗафиксироватьТранзакцию(); 27 | КонецЕсли; 28 | 29 | Исключение 30 | 31 | Если УстанавливатьТранзакцию Тогда 32 | ОтменитьТранзакцию(); 33 | КонецЕсли; 34 | 35 | Возврат ОбработатьИсключениеВызова(Запрос, МетаданныеСервиса, ИнформацияОбОшибке()); 36 | 37 | КонецПопытки; 38 | 39 | Возврат Результат; 40 | 41 | КонецФункции 42 | 43 | #КонецОбласти 44 | 45 | #Область СлужебныеПроцедурыИФункции 46 | 47 | Функция ОбработатьИсключениеВызова(Запрос, МетаданныеСервиса, ИнформацияОбОшибке) 48 | 49 | ПростойТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); 50 | 51 | Если СтрНайти(ПростойТекстОшибки, ОбработкаЗапросовПовтИсп.БазовыйКодОшибкиПроверки()) Тогда 52 | Возврат СервисыОбщее.ПлохойЗапрос(ПростойТекстОшибки); 53 | КонецЕсли; 54 | 55 | ПодробныйТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); 56 | 57 | ИдентификаторОшибки = ЗарегистрироватьОшибку(Запрос, МетаданныеСервиса, ИнформацияОбОшибке); 58 | 59 | ИтоговыйТекстОшибки = ?( 60 | ОбработкаЗапросовПовтИсп.ВыводитьПодробноеОписаниеОшибок(), 61 | СтрШаблон( 62 | "%1", 63 | ПодробныйТекстОшибки 64 | ), 65 | "" 66 | ); 67 | 68 | Возврат СервисыОбщее.ОшибкаСервера(ИтоговыйТекстОшибки, ИдентификаторОшибки); 69 | 70 | КонецФункции 71 | 72 | Функция ЗарегистрироватьОшибку(Запрос, МетаданныеСервиса, ИнформацияОбОшибке) 73 | 74 | ИдентификаторОшибки = ВРег(ОбщегоНазначенияХТТП.КонтрольнаяСуммаСтрокой(Новый УникальныйИдентификатор())); 75 | 76 | ИмяСобытия = СтрШаблон( 77 | "%1.%2.%3.%4", 78 | ОбработкаЗапросовПовтИсп.БазовыйКодЖурналаРегистрации(), 79 | МетаданныеСервиса.КорневойURL, 80 | СтрСоединить(СтрРазделить(Запрос.ОтносительныйURL, "/", Ложь), "."), 81 | Запрос.HTTPМетод 82 | ); 83 | 84 | ТекстОшибки = СформироватьТекстОшибки(Запрос, ИнформацияОбОшибке); 85 | 86 | ЗаписьЖурналаРегистрации( 87 | ИмяСобытия, 88 | УровеньЖурналаРегистрации.Ошибка, 89 | МетаданныеСервиса, 90 | ИдентификаторОшибки, 91 | ТекстОшибки 92 | ); 93 | 94 | Возврат ИдентификаторОшибки; 95 | 96 | КонецФункции 97 | 98 | Функция СформироватьТекстОшибки(Запрос, ИнформацияОбОшибке) 99 | 100 | ДанныеОшибки = Новый Соответствие(); 101 | ДанныеОшибки.Вставить("ТекстОшибки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); 102 | 103 | ДанныеОшибки.Вставить("Заголовки", Новый Соответствие()); 104 | ОбщегоНазначенияХТТП.ДополнитьСоответствие(ДанныеОшибки.Получить("Заголовки"), Запрос.Заголовки); 105 | ДанныеОшибки.Получить("Заголовки").Удалить("Authorization"); 106 | 107 | ДанныеОшибки.Вставить("ПараметрыURL", Новый Соответствие()); 108 | ОбщегоНазначенияХТТП.ДополнитьСоответствие(ДанныеОшибки.Получить("ПараметрыURL"), Запрос.ПараметрыURL); 109 | 110 | ДанныеОшибки.Вставить("ПараметрыЗапроса", Новый Соответствие()); 111 | ОбщегоНазначенияХТТП.ДополнитьСоответствие(ДанныеОшибки.Получить("ПараметрыЗапроса"), Запрос.ПараметрыЗапроса); 112 | 113 | РазмерТела = Запрос.ПолучитьТелоКакПоток().Размер(); 114 | Если РазмерТела < ОбработкаЗапросовПовтИсп.МаксимальныйРазмерТелаДляЛогирования() Тогда 115 | ДанныеОшибки.Вставить("ТелоЗапроса", Base64Строка(Запрос.ПолучитьТелоКакДвоичныеДанные())); 116 | Иначе 117 | ДанныеОшибки.Вставить("ПревышенЛимит", Истина); 118 | ДанныеОшибки.Вставить("ИсходныйРазмер", РазмерТела); 119 | КонецЕсли; 120 | ЗаписьJSON = Новый ЗаписьJSON(); 121 | ЗаписьJSON.УстановитьСтроку(); 122 | ЗаписатьJSON(ЗаписьJSON, ДанныеОшибки); 123 | 124 | Возврат ЗаписьJSON.Закрыть(); 125 | 126 | КонецФункции 127 | 128 | #КонецОбласти 129 | -------------------------------------------------------------------------------- /example/src/Catalogs/Демо_Проекты/Демо_Проекты.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Демо_Проекты 11 | 12 | ru 13 | Проекты 14 | 15 | true 16 | Catalog.Демо_Проекты.StandardAttribute.Code 17 | Catalog.Демо_Проекты.StandardAttribute.Description 18 | DontUse 19 | Use 20 | Use 21 | 2 22 | true 23 | 9 24 | 25 25 | String 26 | Variable 27 | true 28 | true 29 | AsDescription 30 | InDialog 31 | BothWays 32 | 33 | Ответственный 34 | 35 | ru 36 | Ответственный 37 | 38 | 39 | String 40 | 41 | 200 42 | 43 | 44 | 45 | 46 | 47 | Use 48 | Use 49 | 50 | 51 | 52 | 53 | 54 | 55 | Файлы 56 | 57 | ru 58 | Файлы 59 | 60 | 61 | Файл 62 | 63 | ru 64 | Файл 65 | 66 | 67 | ValueStorage 68 | 69 | 70 | 71 | Use 72 | Use 73 | 74 | 75 | Идентификатор 76 | 77 | ru 78 | Идентификатор 79 | 80 | 81 | UUID 82 | 83 | 84 | 85 | Use 86 | Use 87 | 88 | 89 | ИмяФайла 90 | 91 | ru 92 | Имя файла 93 | 94 | 95 | String 96 | 97 | 100 98 | 99 | 100 | 101 | 102 | Use 103 | Use 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /example/.settings/Default.cset: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "settings": { 4 | "md-standard-attribute-synonym-empty": { 5 | "enabled": false 6 | }, 7 | "configuration-data-lock-mode": { 8 | "enabled": false 9 | }, 10 | "common-module-name-client-server": { 11 | "enabled": false 12 | }, 13 | "right-administration": { 14 | "enabled": false 15 | }, 16 | "use-non-recommended-method": { 17 | "enabled": false 18 | }, 19 | "mdo-scheduled-job-description": { 20 | "enabled": false 21 | }, 22 | "ql-temp-table-index": { 23 | "enabled": false 24 | }, 25 | "lock-out-of-try": { 26 | "enabled": false 27 | }, 28 | "right-configuration-extensions-administration": { 29 | "enabled": false 30 | }, 31 | "common-module-name-client-cached": { 32 | "enabled": false 33 | }, 34 | "right-interactive-delete": { 35 | "enabled": false 36 | }, 37 | "right-data-administration": { 38 | "enabled": false 39 | }, 40 | "event-heandler-boolean-param": { 41 | "enabled": false 42 | }, 43 | "right-interactive-clear-deletion-mark-predefined-data": { 44 | "enabled": false 45 | }, 46 | "doc-comment-export-function-return-section": { 47 | "enabled": false 48 | }, 49 | "input-field-list-choice-mode": { 50 | "enabled": false 51 | }, 52 | "doc-comment-parameter-section": { 53 | "enabled": false 54 | }, 55 | "role-right-has-rls": { 56 | "enabled": false 57 | }, 58 | "method-too-many-params": { 59 | "enabled": false 60 | }, 61 | "empty-except-statement": { 62 | "enabled": false 63 | }, 64 | "form-module-missing-pragma": { 65 | "enabled": false 66 | }, 67 | "doc-comment-return-section-type": { 68 | "enabled": false 69 | }, 70 | "right-active-users": { 71 | "enabled": false 72 | }, 73 | "module-structure-top-region": { 74 | "enabled": false 75 | }, 76 | "right-interactive-set-deletion-mark-predefined-data": { 77 | "enabled": false 78 | }, 79 | "right-output-to-printer-file-clipboard": { 80 | "enabled": false 81 | }, 82 | "right-update-database-configuration": { 83 | "enabled": false 84 | }, 85 | "right-start-thick-client": { 86 | "enabled": false 87 | }, 88 | "right-all-functions-mode": { 89 | "enabled": false 90 | }, 91 | "common-module-name-server-call": { 92 | "enabled": false 93 | }, 94 | "right-start-web-client": { 95 | "enabled": false 96 | }, 97 | "ql-camel-case-string-literal": { 98 | "enabled": false 99 | }, 100 | "shceduled-job-periodicity-too-short": { 101 | "enabled": false 102 | }, 103 | "right-interactive-open-external-data-processors": { 104 | "enabled": false 105 | }, 106 | "module-accessibility-at-client": { 107 | "enabled": false 108 | }, 109 | "doc-comment-field-type": { 110 | "enabled": false 111 | }, 112 | "new-color": { 113 | "enabled": false 114 | }, 115 | "ql-virtual-table-filters": { 116 | "enabled": false 117 | }, 118 | "ql-join-to-sub-query": { 119 | "enabled": false 120 | }, 121 | "common-module-name-server-call-cached": { 122 | "enabled": false 123 | }, 124 | "using-isinrole": { 125 | "enabled": false 126 | }, 127 | "data-exchange-load": { 128 | "enabled": false 129 | }, 130 | "common-module-type": { 131 | "enabled": false 132 | }, 133 | "invocation-form-event-handler": { 134 | "enabled": false 135 | }, 136 | "right-start-automation": { 137 | "enabled": false 138 | }, 139 | "doc-comment-collection-item-type": { 140 | "enabled": false 141 | }, 142 | "common-module-name-client": { 143 | "enabled": false 144 | }, 145 | "common-module-name-global": { 146 | "enabled": false 147 | }, 148 | "ql-cast-to-max-number": { 149 | "enabled": false 150 | }, 151 | "common-module-name-cached": { 152 | "enabled": false 153 | }, 154 | "right-view-event-log": { 155 | "enabled": false 156 | }, 157 | "ql-using-for-update": { 158 | "enabled": false 159 | }, 160 | "export-method-in-command-form-module": { 161 | "enabled": false 162 | }, 163 | "right-interactive-delete-predefined-data": { 164 | "enabled": false 165 | }, 166 | "form-module-pragma": { 167 | "enabled": false 168 | }, 169 | "right-start-external-connection": { 170 | "enabled": false 171 | }, 172 | "right-interactive-delete-marked-predefined-data": { 173 | "enabled": false 174 | }, 175 | "md-list-object-presentation": { 176 | "enabled": false 177 | }, 178 | "right-start-thin-client": { 179 | "enabled": false 180 | }, 181 | "query-in-loop": { 182 | "enabled": false 183 | }, 184 | "structure-consructor-too-many-keys": { 185 | "enabled": false 186 | }, 187 | "right-exclusive-mode": { 188 | "enabled": false 189 | }, 190 | "right-save-user-data": { 191 | "enabled": false 192 | }, 193 | "right-interactive-open-external-reports": { 194 | "enabled": false 195 | } 196 | } 197 | } -------------------------------------------------------------------------------- /example/src/Documents/Демо_Заявка/ManagerModule.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда 4 | 5 | #Область ПрограммныйИнтерфейс 6 | 7 | #Область АПИ 8 | 9 | // В формат. 10 | // 11 | // Параметры: 12 | // Ссылка - ДокументСсылка.Демо_Заявка 13 | // Данные - см. НовыеДанные 14 | // Кеш - Структура - Кеш 15 | // 16 | // Возвращаемое значение: 17 | // см. СхемаОтветаАПИ 18 | Функция ВФормат(Ссылка, Данные = Неопределено, Кеш = Неопределено) Экспорт 19 | 20 | ЛокальныйКеш = Кеширование.ЛокальныйКеш(Кеш, "Формат_Демо_Заявка"); 21 | Если ЛокальныйКеш <> Неопределено И Кеширование.ЗначениеИзКеша(Ссылка, ЛокальныйКеш) <> Неопределено Тогда 22 | Возврат Кеширование.ЗначениеИзКеша(Ссылка, ЛокальныйКеш); 23 | КонецЕсли; 24 | 25 | // Здесь уже можно заполнять при наличии БСП удобнее 26 | // Реквизиты = ОбщегоНазначения.ЗначенияРеквизитов() 27 | Если Данные = Неопределено Тогда 28 | Реквизиты = НовыеДанные(); 29 | ЗаполнитьЗначенияСвойств(Реквизиты, Ссылка); 30 | Сообщения = СообщенияЗапросов(ОбщегоНазначенияХТТП.ЗначениеВМассиве(Ссылка)).Получить(Ссылка); // Массив 31 | Реквизиты.Сообщения = Сообщения; 32 | Иначе 33 | Реквизиты = Данные; 34 | КонецЕсли; 35 | 36 | Результат = СхемаОтветаАПИ(); 37 | Результат.date = Реквизиты.Дата; 38 | Результат.topic = Реквизиты.Тема; 39 | Результат.project = Справочники.Демо_Проекты.ВФормат(Реквизиты.Проект, , Кеш); 40 | Результат.urgent = Реквизиты.Срочный; 41 | //@skip-check invocation-parameter-type-intersect 42 | Результат.Вставить( 43 | "messages", 44 | ПроцессорыКоллекций.ИзКоллекции(Сообщения).Обработать("Результат = XMLСтрока(Элемент)").ВМассив() 45 | ); 46 | 47 | Кеширование.ПоместитьЗначениеВКеш(Новый ФиксированнаяСтруктура(Результат), Ссылка, ЛокальныйКеш); 48 | 49 | Возврат Результат; 50 | 51 | КонецФункции 52 | 53 | // Новые данные. 54 | // 55 | // Возвращаемое значение: 56 | // Структура - Новые данные: 57 | // * Дата - Дата,Неопределено 58 | // * Тема - Строка 59 | // * Проект - СправочникСсылка.Демо_Проекты 60 | // * Срочный - Булево 61 | // * Сообщения - Массив 62 | Функция НовыеДанные() Экспорт 63 | НовыеДанные = Новый Структура(); 64 | НовыеДанные.Вставить("Дата", Неопределено); 65 | НовыеДанные.Вставить("Тема", ""); 66 | НовыеДанные.Вставить("Проект", Справочники.Демо_Проекты.ПустаяСсылка()); 67 | НовыеДанные.Вставить("Срочный", Ложь); 68 | НовыеДанные.Вставить("Сообщения", Новый Массив()); 69 | 70 | Возврат НовыеДанные; 71 | КонецФункции 72 | 73 | // Схема ответа АПИ. 74 | // 75 | // Возвращаемое значение: 76 | // Структура - Схема ответа АПИ: 77 | // * date - Дата 78 | // * topic - Строка 79 | // * project - см. Справочники.Демо_Проекты.СхемаОтветаАПИ 80 | // * urgent - Булево 81 | // * messages - Массив из Строка 82 | Функция СхемаОтветаАПИ() Экспорт 83 | 84 | Схема = Новый Структура(); 85 | Схема.Вставить("date"); 86 | Схема.Вставить("topic"); 87 | Схема.Вставить("project"); 88 | Схема.Вставить("urgent"); 89 | Схема.Вставить("messages"); 90 | 91 | //@skip-check constructor-function-return-section 92 | Возврат Схема; 93 | 94 | КонецФункции 95 | 96 | // см. ВосстановлениеXDTO.НовыеПараметрыВосстановления 97 | Функция ФункцииВосстановления() Экспорт 98 | 99 | ПараметрыВосстановления = ВосстановлениеXDTO.НовыеПараметрыВосстановления(); 100 | Строка = ПараметрыВосстановления.Добавить(); 101 | Строка.СвойствоИсходное = "project_id"; 102 | Строка.ИмяСвойства = "Проект"; 103 | Строка.ФункцияВосстановленияЗначения = "Демо_ФункцииВосстановления.ВосстановитьПроект"; 104 | 105 | Строка = ПараметрыВосстановления.Добавить(); 106 | Строка.СвойствоИсходное = "subject"; 107 | Строка.ИмяСвойства = "Тема"; 108 | 109 | Строка = ПараметрыВосстановления.Добавить(); 110 | Строка.СвойствоИсходное = "message"; 111 | Строка.ИмяСвойства = "Сообщение"; 112 | 113 | Строка = ПараметрыВосстановления.Добавить(); 114 | Строка.СвойствоИсходное = "urgent"; 115 | Строка.ИмяСвойства = "Срочный"; 116 | 117 | Строка = ПараметрыВосстановления.Добавить(); 118 | Строка.СвойствоИсходное = "date"; 119 | Строка.ИмяСвойства = "Дата"; 120 | 121 | ОбщегоНазначенияХТТП.ДополнитьТаблицу(ПараметрыВосстановления, Документы.Демо_Сообщение.ФункцииВосстановления()); 122 | 123 | Возврат ПараметрыВосстановления; 124 | 125 | КонецФункции 126 | 127 | #КонецОбласти 128 | 129 | // Сообщения запросов. 130 | // 131 | // Параметры: 132 | // Запросы - Массив из ДокументСсылка.Демо_Заявка 133 | // 134 | // Возвращаемое значение: 135 | // Соответствие - Сообщения запросов 136 | Функция СообщенияЗапросов(Запросы) Экспорт 137 | 138 | Запрос = Новый Запрос; 139 | Запрос.Текст = 140 | "ВЫБРАТЬ 141 | | Демо_Запрос.Ссылка КАК Заявка, 142 | | Демо_Сообщение.Ссылка КАК Сообщение 143 | |ИЗ 144 | | Документ.Демо_Сообщение КАК Демо_Сообщение 145 | | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Демо_Заявка КАК Демо_Запрос 146 | | ПО Демо_Сообщение.Запрос = Демо_Запрос.Ссылка 147 | |ГДЕ 148 | | Демо_Запрос.Ссылка В (&Запросы) 149 | | 150 | |УПОРЯДОЧИТЬ ПО 151 | | Демо_Сообщение.МоментВремени 152 | |ИТОГИ 153 | |ПО 154 | | Заявка"; 155 | 156 | Запрос.УстановитьПараметр("Запросы", Запросы); 157 | РезультатЗапроса = Запрос.Выполнить(); 158 | ВыборкаЗапрос = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); 159 | Результат = Новый Соответствие(); 160 | Пока ВыборкаЗапрос.Следующий() Цикл 161 | ВыборкаДетальныеЗаписи = ВыборкаЗапрос.Выбрать(); 162 | Сообщения = Новый Массив(); 163 | Пока ВыборкаДетальныеЗаписи.Следующий() Цикл 164 | Сообщения.Добавить(ВыборкаДетальныеЗаписи.Сообщение); 165 | КонецЦикла; 166 | Результат.Вставить(ВыборкаДетальныеЗаписи.Заявка, Сообщения); 167 | КонецЦикла; 168 | 169 | Возврат Результат; 170 | 171 | КонецФункции 172 | 173 | #КонецОбласти 174 | 175 | #КонецЕсли 176 | -------------------------------------------------------------------------------- /src/src/CommonModules/ВосстановлениеXDTO/Module.bsl: -------------------------------------------------------------------------------- 1 | //@strict-types 2 | //@skip-check doc-comment-collection-item-type 3 | 4 | #Область ПрограммныйИнтерфейс 5 | 6 | // Восстановить значение XDTO. 7 | // 8 | // Параметры: 9 | // Свойство - Строка - Имя свойства 10 | // Тип - ТипОбъектаXDTO,ТипЗначенияXDTO - Тип XDTO 11 | // Значение - Произвольный - Исходное значение 12 | // ДопПараметры - Неопределено,Структура - Доп параметры 13 | // 14 | // Возвращаемое значение: 15 | // Произвольный 16 | Функция ВосстановитьЗначениеXDTO(Свойство, Тип, Значение, ДопПараметры) Экспорт 17 | Результат = Значение; 18 | ВосстановлениеXDTOПереопределяемый.ВосстановитьЗначениеXDTO(Результат, Свойство, Тип, Значение, ДопПараметры); 19 | Возврат Значение; 20 | КонецФункции 21 | 22 | // Конвертировать из формата. 23 | // 24 | // Параметры: 25 | // ОбъектXDTO - ОбъектXDTO,СписокXDTO - Прочитанные данные в объект или список XDTO 26 | // ФункцииВосстановления - см. НовыеПараметрыВосстановления 27 | // ДопПараметры - Неопределено, Структура - Доп параметры 28 | // ИмяСвойстваСписка - Строка - Имя свойства для поиска функции восстановления элементов списка 29 | // 30 | // Возвращаемое значение: 31 | // - Соответствие из КлючИЗначение: 32 | // * Ключ - Произвольный 33 | // * Значение - Число,Строка,Булево,Дата,Соответствие,Массив 34 | // - Массив из Произвольный 35 | Функция КонвертироватьИзФормата(ОбъектXDTO, ФункцииВосстановления = Неопределено, 36 | ДопПараметры = Неопределено, ИмяСвойстваСписка = Неопределено) Экспорт 37 | 38 | ТипОбъекта = ТипЗнч(ОбъектXDTO); 39 | Если ТипОбъекта = Тип("ОбъектXDTO") Тогда 40 | Результат = ВосстановитьОбъектXDTO(ОбъектXDTO, ФункцииВосстановления, ДопПараметры); 41 | ИначеЕсли ТипОбъекта = Тип("СписокXDTO") Тогда 42 | //@skip-check statement-type-change 43 | Результат = ВосстановитьСписокXDTO(ОбъектXDTO, ФункцииВосстановления, ДопПараметры, ИмяСвойстваСписка); 44 | Иначе 45 | ВызватьИсключение "Неподдерживаемый тип для конвертации"; 46 | КонецЕсли; 47 | 48 | ВосстановлениеXDTOПереопределяемый.КонвертироватьИзФормата( 49 | Результат, 50 | ОбъектXDTO, 51 | ФункцииВосстановления, 52 | ДопПараметры, 53 | ИмяСвойстваСписка 54 | ); 55 | Возврат Результат; 56 | 57 | 58 | КонецФункции 59 | 60 | // Новые параметры восстановления. 61 | // 62 | // Возвращаемое значение: 63 | // ТаблицаЗначений - Новые параметры восстановления: 64 | // * СвойствоИсходное - Строка - Имя исходного свойства 65 | // * ИмяСвойства - Строка - имя желаемоего свойства 66 | // * ФункцияВосстановленияЗначения - Строка - Имя функции восстановления. Например Общее.ВосстановитьСтроку 67 | Функция НовыеПараметрыВосстановления() Экспорт 68 | Результат = Новый ТаблицаЗначений(); 69 | Результат.Колонки.Добавить("СвойствоИсходное", Новый ОписаниеТипов("Строка")); 70 | Результат.Колонки.Добавить("ИмяСвойства", Новый ОписаниеТипов("Строка")); 71 | Результат.Колонки.Добавить("ФункцияВосстановленияЗначения", Новый ОписаниеТипов("Строка")); 72 | Возврат Результат; 73 | КонецФункции 74 | 75 | #КонецОбласти 76 | 77 | #Область СлужебныеПроцедурыИФункции 78 | 79 | // Восстановить список XDTO. 80 | // 81 | // Параметры: 82 | // СписокXDTO - СписокXDTO - Список XDTO 83 | // ФункцииВосстановления - см. НовыеПараметрыВосстановления 84 | // ДопПараметры - Неопределено, Структура - Доп параметры 85 | // ИмяСвойства - Строка,Неопределено - Имя свойства для восстановления элементов списка 86 | // 87 | // Возвращаемое значение: 88 | // Массив из Произвольный 89 | Функция ВосстановитьСписокXDTO(СписокXDTO, ФункцииВосстановления, ДопПараметры, ИмяСвойства = Неопределено) 90 | Результат = Новый Массив(); 91 | 92 | Для Каждого Строка Из СписокXDTO Цикл 93 | Если ТипЗнч(Строка) = Тип("ОбъектXDTO") Или ТипЗнч(Строка) = Тип("СписокXDTO") Тогда 94 | Результат.Добавить(КонвертироватьИзФормата(Строка, ФункцииВосстановления, ДопПараметры)); 95 | Иначе 96 | СтрокаФункцииВосстановления = СтрокаВосстановления(ИмяСвойства, ФункцииВосстановления); 97 | 98 | Если СтрокаФункцииВосстановления <> Неопределено 99 | И ЗначениеЗаполнено(СтрокаФункцииВосстановления.ФункцияВосстановленияЗначения) Тогда 100 | УстановитьБезопасныйРежим(Истина); 101 | Значение = Вычислить( 102 | СтрокаФункцииВосстановления.ФункцияВосстановленияЗначения + "(Строка, ДопПараметры)" 103 | ); 104 | Результат.Добавить(Значение); 105 | УстановитьБезопасныйРежим(Ложь); 106 | Иначе 107 | Результат.Добавить(Строка); 108 | КонецЕсли; 109 | КонецЕсли; 110 | КонецЦикла; 111 | 112 | Возврат Результат; 113 | 114 | КонецФункции 115 | 116 | // Восстановить объект XDTO. 117 | // 118 | // Параметры: 119 | // ОбъектXDTO - ОбъектXDTO - Исходный объект 120 | // ФункцииВосстановления - см. НовыеПараметрыВосстановления 121 | // ДопПараметры - Структура - доп папарметры 122 | // 123 | // Возвращаемое значение: 124 | // Соответствие из КлючИЗначение - Восстановленный объект XDTO: 125 | // * Ключ - Строка 126 | // * Значение - Произвольный 127 | Функция ВосстановитьОбъектXDTO(ОбъектXDTO, ФункцииВосстановления, ДопПараметры) 128 | 129 | Результат = Новый Соответствие(); 130 | 131 | Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл 132 | 133 | ИмяСвойства = Свойство.Имя; 134 | ТребуетсяКонвертация = ТипЗнч(ОбъектXDTO[ИмяСвойства]) = Тип("ОбъектXDTO") 135 | Или ТипЗнч(ОбъектXDTO[ИмяСвойства]) = Тип("СписокXDTO"); 136 | 137 | Значение = ?( 138 | ТребуетсяКонвертация, 139 | КонвертироватьИзФормата( 140 | ОбъектXDTO[ИмяСвойства], 141 | ФункцииВосстановления, 142 | ДопПараметры, 143 | ИмяСвойства 144 | ), 145 | ОбъектXDTO[ИмяСвойства] 146 | ); // Произвольный 147 | 148 | ОбработатьВосстановление(ФункцииВосстановления, Значение, ИмяСвойства, ДопПараметры); 149 | 150 | Результат.Вставить(ИмяСвойства, Значение); 151 | 152 | КонецЦикла; 153 | 154 | Возврат Результат; 155 | 156 | КонецФункции 157 | 158 | Процедура ОбработатьВосстановление(ФункцииВосстановления, Значение, ИмяСвойства, ДопПараметры) 159 | 160 | СтрокаФункцийВосстановления = СтрокаВосстановления(ИмяСвойства, ФункцииВосстановления); 161 | 162 | Если СтрокаФункцийВосстановления = Неопределено Тогда 163 | Возврат; 164 | КонецЕсли; 165 | 166 | Если ЗначениеЗаполнено(СтрокаФункцийВосстановления.ИмяСвойства) Тогда 167 | ИмяСвойства = СтрокаФункцийВосстановления.ИмяСвойства; 168 | КонецЕсли; 169 | 170 | Если ЗначениеЗаполнено(СтрокаФункцийВосстановления.ФункцияВосстановленияЗначения) Тогда 171 | УстановитьБезопасныйРежим(Истина); 172 | Значение = Вычислить(СтрокаФункцийВосстановления.ФункцияВосстановленияЗначения + "(Значение, ДопПараметры)"); 173 | УстановитьБезопасныйРежим(Ложь); 174 | КонецЕсли; 175 | 176 | КонецПроцедуры 177 | 178 | Функция СтрокаВосстановления(ИмяСвойства, ФункцииВосстановления) 179 | 180 | Если ФункцииВосстановления = Неопределено Или ИмяСвойства = Неопределено Тогда 181 | Возврат Неопределено; 182 | КонецЕсли; 183 | 184 | СтрокиФункцийВосстановления = ФункцииВосстановления.НайтиСтроки(Новый Структура("СвойствоИсходное", ИмяСвойства)); 185 | 186 | Если СтрокиФункцийВосстановления.Количество() = 0 Тогда 187 | Возврат Неопределено; 188 | КонецЕсли; 189 | 190 | Возврат СтрокиФункцийВосстановления[0]; 191 | 192 | КонецФункции 193 | 194 | #КонецОбласти 195 | -------------------------------------------------------------------------------- /example/src/CommonModules/Демо_КонтроллерСервиса/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область СлужебныйПрограммныйИнтерфейс 4 | 5 | // Создать заявку. 6 | // 7 | // Параметры: 8 | // Запрос - HTTPСервисЗапрос - Входящий запрос 9 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Исходные метаданные сервиса 10 | // 11 | // Возвращаемое значение: 12 | // HTTPСервисОтвет - Ответ 13 | Функция СоздатьЗаявку(Запрос, МетаданныеСервиса) Экспорт 14 | 15 | ДопПараметры = Новый Структура(); 16 | 17 | ДанныеЗапроса = СервисыОбщее.ИзвлечьТелоJSONПоСхеме( 18 | Запрос, 19 | ФабрикаXDTO.Тип("http://www.example.com/api/common/1.0", "request.create"), 20 | ДопПараметры 21 | ); 22 | 23 | ПараметрыВосстановления = ВосстановлениеXDTO.НовыеПараметрыВосстановления(); 24 | ОбщегоНазначенияХТТП.ДополнитьТаблицу(Документы.Демо_Заявка.ФункцииВосстановления(), ПараметрыВосстановления); 25 | ВосстановленныеДанные = ВосстановлениеXDTO.КонвертироватьИзФормата( 26 | ДанныеЗапроса, 27 | ПараметрыВосстановления, 28 | ДопПараметры 29 | ); 30 | 31 | ПараметрыСозданияЗаявки = Новый Структура( 32 | "Тема,Проект,Срочный,Сообщение", 33 | ВосстановленныеДанные.Получить("Тема"), 34 | ВосстановленныеДанные.Получить("Проект"), 35 | ВосстановленныеДанные.Получить("Срочный"), 36 | ВосстановленныеДанные.Получить("Сообщение").Получить("ТелоСообщения") 37 | ); 38 | 39 | Заявка = Демо_Заявки.СоздатьЗаявку(ПараметрыСозданияЗаявки); 40 | 41 | ЗаявкаВФормате = документы.Демо_Заявка.ВФормат(Заявка); 42 | 43 | Возврат СервисыОбщее.ОтветИзОбъекта(ЗаявкаВФормате); 44 | 45 | КонецФункции 46 | 47 | // Создать проект. 48 | // 49 | // Параметры: 50 | // Запрос - HTTPСервисЗапрос - Входящий запрос 51 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Исходные метаданные сервиса 52 | // 53 | // Возвращаемое значение: 54 | // HTTPСервисОтвет - Ответ 55 | Функция СоздатьПроект(Запрос, МетаданныеСервиса) Экспорт 56 | ДопПараметры = Новый Структура(); 57 | 58 | ДанныеЗапроса = СервисыОбщее.ИзвлечьТелоJSONПоСхеме( 59 | Запрос, 60 | ФабрикаXDTO.Тип("http://www.example.com/api/common/1.0", "project.create"), 61 | ДопПараметры 62 | ); 63 | 64 | Проект = Справочники.Демо_Проекты.СоздатьЭлемент(); 65 | Проект.Заполнить(Неопределено); 66 | //@skip-check statement-type-change, property-return-type 67 | Проект.Наименование = ДанныеЗапроса.name; 68 | //@skip-check statement-type-change, property-return-type 69 | Проект.Ответственный = ДанныеЗапроса.project_owner; 70 | Проект.Записать(); 71 | 72 | ПроектВФормате = Справочники.Демо_Проекты.ВФормат(Проект.Ссылка); 73 | Возврат СервисыОбщее.ОтветИзОбъекта(ПроектВФормате); 74 | КонецФункции 75 | 76 | // Получить проекты 77 | // 78 | // Параметры: 79 | // Запрос - HTTPСервисЗапрос - Входящий запрос 80 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Исходные метаданные сервиса 81 | // 82 | // Возвращаемое значение: 83 | // HTTPСервисОтвет - Ответ 84 | Функция ПолучитьПроекты(Запрос, МетаданныеСервиса) Экспорт 85 | 86 | 87 | ВыборкаПроектов = Справочники.Демо_Проекты.Выбрать(); 88 | 89 | Результат = Новый Массив(); 90 | ДанныеПроектов = Новый Соответствие(); 91 | Пока ВыборкаПроектов.Следующий() Цикл 92 | ДанныеПроекта = Справочники.Демо_Проекты.НовыеДанные(); 93 | ДанныеПроекта.Наименование = ВыборкаПроектов.Наименование; 94 | ДанныеПроекта.Ответственный = ВыборкаПроектов.Ответственный; 95 | ДанныеПроекта.Файлы = ВыборкаПроектов.Файлы.Выгрузить(); 96 | ДанныеПроектов.Вставить(ВыборкаПроектов.Ссылка, ДанныеПроекта); 97 | Результат.Добавить(ВыборкаПроектов.Ссылка); 98 | КонецЦикла; 99 | 100 | ДопПараметры = Новый Структура(); 101 | ДопПараметры.Вставить("ДанныеПроектов", ДанныеПроектов); 102 | 103 | ПараметрыПреобразования = ОбщиеПараметрыПреобразования(ДопПараметры); 104 | ДопПараметры.Вставить("ПараметрыПреобразованияJson", ПараметрыПреобразования); 105 | 106 | Возврат СервисыОбщее.ОтветИзОбъекта( 107 | Результат, 108 | 200, 109 | ДопПараметры 110 | ); 111 | 112 | 113 | КонецФункции 114 | 115 | // Получить проекты 116 | // 117 | // Параметры: 118 | // Запрос - HTTPСервисЗапрос - Входящий запрос 119 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Исходные метаданные сервиса 120 | // 121 | // Возвращаемое значение: 122 | // HTTPСервисОтвет - Ответ 123 | Функция ПолучитьПроект(Запрос, МетаданныеСервиса) Экспорт 124 | 125 | ПараметрАйдиПроекта = СервисыОбщее.НовыйПараметрЗапроса("project_id", "ИД", Истина); 126 | ПараметрКод = СервисыОбщее.НовыйПараметрЗапроса("code", "Число"); 127 | ПараметрУдален = СервисыОбщее.НовыйПараметрЗапроса("deleted", "Булево"); 128 | ПараметрСтатус = СервисыОбщее.НовыйПараметрЗапроса("status"); 129 | ПараметрСтатус.ВозможныеЗначения.Добавить("active"); 130 | ПараметрСтатус.ВозможныеЗначения.Добавить("disabled"); 131 | 132 | ОжидаемыеПараметры = Новый Массив(); 133 | ОжидаемыеПараметры.Добавить(ПараметрАйдиПроекта); 134 | ОжидаемыеПараметры.Добавить(ПараметрКод); 135 | ОжидаемыеПараметры.Добавить(ПараметрУдален); 136 | ОжидаемыеПараметры.Добавить(ПараметрСтатус); 137 | 138 | ПараметрыЗапроса = СервисыОбщее.ПараметрыЗапроса( 139 | Запрос, 140 | ОжидаемыеПараметры 141 | ); 142 | 143 | Проект = Демо_ФункцииВосстановления.ВосстановитьПроект( 144 | ПараметрыЗапроса.Получить("project_id") 145 | ); // СправочникСсылка.Демо_Проекты 146 | 147 | Возврат СервисыОбщее.ОтветИзОбъекта( 148 | Справочники.Демо_Проекты.ВФормат(Проект) 149 | ); 150 | 151 | 152 | КонецФункции 153 | 154 | // Получить проекты 155 | // 156 | // Параметры: 157 | // Запрос - HTTPСервисЗапрос - Входящий запрос 158 | // МетаданныеСервиса - ОбъектМетаданныхHTTPСервис - Исходные метаданные сервиса 159 | // 160 | // Возвращаемое значение: 161 | // HTTPСервисОтвет - Ответ 162 | Функция ПоместитьФайлыПроекта(Запрос, МетаданныеСервиса) Экспорт 163 | 164 | ПараметрАйдиПроекта = СервисыОбщее.НовыйПараметрЗапроса("project_id", "ИД", Истина); 165 | ОжидаемыеПараметры = Новый Массив(); 166 | ОжидаемыеПараметры.Добавить(ПараметрАйдиПроекта); 167 | 168 | ПараметрыЗапроса = СервисыОбщее.ПараметрыЗапроса( 169 | Запрос, 170 | ОжидаемыеПараметры 171 | ); 172 | 173 | Проект = Демо_ФункцииВосстановления.ВосстановитьПроект( 174 | ПараметрыЗапроса.Получить("project_id") 175 | ); // СправочникСсылка.Демо_Проекты 176 | 177 | СодержимоеСоставногоЗапроса = СервисыОбщее.ПрочитатьСоставноеСодержимоеЗапроса(Запрос); 178 | 179 | Для Каждого Элемент Из СодержимоеСоставногоЗапроса Цикл 180 | Если ЗначениеЗаполнено(Элемент.Значение.ИмяФайла) Тогда 181 | Справочники.Демо_Проекты.ДобавитьФайл(Проект, Элемент.Значение.ИмяФайла, Элемент.Значение.Содержимое); 182 | КонецЕсли; 183 | КонецЦикла; 184 | 185 | 186 | 187 | Возврат СервисыОбщее.ОтветИзОбъекта( 188 | Справочники.Демо_Проекты.ВФормат(Проект) 189 | ); 190 | 191 | 192 | КонецФункции 193 | 194 | // Преобразование. 195 | // 196 | // Параметры: 197 | // Свойство - Строка 198 | // Значение - Произвольный 199 | // ДополнительныеПараметры - Структура 200 | // Отказ - Булево 201 | // 202 | // Возвращаемое значение: 203 | // Произвольный 204 | Функция Преобразование(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт 205 | Если ТипЗнч(Значение) = Тип("СправочникСсылка.Демо_Проекты") Тогда 206 | ЛокальныйКеш = Кеширование.ЛокальныйКеш(ДополнительныеПараметры, "ДанныеПроектов"); 207 | ДанныеПроекта = Кеширование.ЗначениеИзКеша(Значение, ЛокальныйКеш); 208 | 209 | Возврат Справочники.Демо_Проекты.ВФормат(Значение, ДанныеПроекта, ДополнительныеПараметры); 210 | ИначеЕсли ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда 211 | Возврат XMLСтрока(Значение); 212 | КонецЕсли; 213 | КонецФункции 214 | 215 | #КонецОбласти 216 | 217 | #Область СлужебныеПроцедурыИФункции 218 | 219 | // Общие параметры преобразования. 220 | // 221 | // Параметры: 222 | // ДопПараметры - Структура 223 | // 224 | // Возвращаемое значение: 225 | // Структура - см. КоннекторХТТПСлужебный.ПараметрыПреобразованияJSONПоУмолчанию 226 | Функция ОбщиеПараметрыПреобразования(ДопПараметры) 227 | Параметры = КоннекторХТТПСлужебный.ПараметрыПреобразованияJSONПоУмолчанию(); 228 | Параметры.ИмяФункцииПреобразования = "Преобразование"; 229 | Параметры.МодульФункцииПреобразования = Демо_КонтроллерСервиса; 230 | Параметры.ДополнительныеПараметрыФункцииПреобразования = ДопПараметры; 231 | Возврат Параметры; 232 | КонецФункции 233 | 234 | #КонецОбласти 235 | 236 | -------------------------------------------------------------------------------- /src/src/CommonModules/ПроцессорыКоллекций/Module.bsl: -------------------------------------------------------------------------------- 1 | // https://github.com/sfaqer/onec-fluent 2 | 3 | //@skip-check doc-comment-type 4 | //@skip-check constructor-function-return-section 5 | 6 | #Область ПрограммныйИнтерфейс 7 | 8 | // Создаёт новый процессор коллекций, если вызван с сервера то объект обработки, если с клиента то форму обработки 9 | // 10 | // Возвращаемое значение: 11 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс серверного процессора коллекций 12 | // 13 | Функция НовыйПроцессорКоллекций() Экспорт 14 | 15 | ПроцессорКоллекций = Обработки.ПроцессорКоллекций.Создать(); 16 | 17 | Возврат ПроцессорКоллекций; 18 | 19 | КонецФункции 20 | 21 | // Создать ПроцессорКоллекций на основании переданной коллекции. 22 | // 23 | // Параметры: 24 | // Коллекция - Произвольный - Коллекция (Массив, ТаблицаЗначений...), на основании которой нужно 25 | // сформировать ПроцессорКоллекций. 26 | // 27 | // Возвращаемое значение: 28 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс серверного процессора коллекций 29 | // ФормаКлиентскогоПриложения - Инстанс клиентского процессора коллекций 30 | // 31 | Функция ИзКоллекции(Коллекция) Экспорт 32 | 33 | ПроцессорКоллекций = НовыйПроцессорКоллекций(); 34 | ПроцессорКоллекций.УстановитьКоллекцию(Коллекция); 35 | 36 | Возврат ПроцессорКоллекций; 37 | 38 | КонецФункции 39 | 40 | // Создать ПроцессорКоллекций на основании переданной строки. 41 | // Переданная строка преобразуется в коллекцию путем разделения строк. 42 | // 43 | // Параметры: 44 | // Строка - Строка - Строка, на основании которой нужно сформировать ПроцессорКоллекций. 45 | // РазделительСтрок - Строка - Разделитель строк, применяемый к Строке для получения коллекции. 46 | // Если не передан, строка разделяется на элементы посимвольно. 47 | // ВключатьПустые - Булево - Указывает необходимость включать в коллекцию пустые строки, 48 | // которые могут образоваться в результате разделения исходной строки. 49 | // 50 | // Возвращаемое значение: 51 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс серверного процессора коллекций 52 | // ФормаКлиентскогоПриложения - Инстанс клиентского процессора коллекций 53 | // 54 | Функция ИзСтроки(Строка, РазделительСтрок = Неопределено, ВключатьПустые = Истина) Экспорт 55 | 56 | Если РазделительСтрок = Неопределено Тогда 57 | Коллекция = Новый Массив; 58 | ДлинаСтроки = СтрДлина(Строка); 59 | Для сч = 1 По ДлинаСтроки Цикл 60 | Коллекция.Добавить(Сред(Строка, сч, 1)); 61 | КонецЦикла; 62 | Иначе 63 | Коллекция = СтрРазделить(Строка, РазделительСтрок, ВключатьПустые); 64 | КонецЕсли; 65 | 66 | ПроцессорКоллекций = НовыйПроцессорКоллекций(); 67 | ПроцессорКоллекций.УстановитьКоллекцию(Коллекция); 68 | 69 | Возврат ПроцессорКоллекций; 70 | 71 | КонецФункции 72 | 73 | // Создать ПроцессорКоллекций на основании переданного набора значений. 74 | // Добавляет элемент в ПроцессорКоллекций, если он не равен NULL. 75 | // 76 | // Параметры: 77 | // Элемент1 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 78 | // Элемент2 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 79 | // Элемент3 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 80 | // Элемент4 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 81 | // Элемент5 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 82 | // Элемент6 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 83 | // Элемент7 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 84 | // Элемент8 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 85 | // Элемент9 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 86 | // Элемент10 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 87 | // Элемент11 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 88 | // Элемент12 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 89 | // Элемент13 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 90 | // Элемент14 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 91 | // Элемент15 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 92 | // Элемент16 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 93 | // Элемент17 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 94 | // Элемент18 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 95 | // Элемент19 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 96 | // Элемент20 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 97 | // Элемент21 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 98 | // Элемент22 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 99 | // Элемент23 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 100 | // Элемент24 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 101 | // Элемент25 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 102 | // Элемент26 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 103 | // Элемент27 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 104 | // Элемент28 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 105 | // Элемент29 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 106 | // Элемент30 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 107 | // Элемент31 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 108 | // Элемент32 - Произвольный - Элемент для добавления в ПроцессорКоллекций. 109 | // 110 | // Возвращаемое значение: 111 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс серверного процессора коллекций 112 | // ФормаКлиентскогоПриложения - Инстанс клиентского процессора коллекций 113 | // 114 | Функция ИзНабора( 115 | //@skip-check method-too-many-params 116 | // BSLLS:NumberOfParams-off 117 | // BSLLS:NumberOfOptionalParams-off 118 | Элемент1 = NULL, Элемент2 = NULL, Элемент3 = NULL, Элемент4 = NULL, Элемент5 = NULL, 119 | Элемент6 = NULL, Элемент7 = NULL, Элемент8 = NULL, Элемент9 = NULL, Элемент10 = NULL, 120 | Элемент11 = NULL, Элемент12 = NULL, Элемент13 = NULL, Элемент14 = NULL, Элемент15 = NULL, 121 | Элемент16 = NULL, Элемент17 = NULL, Элемент18 = NULL, Элемент19 = NULL, Элемент20 = NULL, 122 | Элемент21 = NULL, Элемент22 = NULL, Элемент23 = NULL, Элемент24 = NULL, Элемент25 = NULL, 123 | Элемент26 = NULL, Элемент27 = NULL, Элемент28 = NULL, Элемент29 = NULL, Элемент30 = NULL, 124 | Элемент31 = NULL, Элемент32 = NULL 125 | // BSLLS:NumberOfParams-on 126 | // BSLLS:NumberOfOptionalParams-on 127 | ) Экспорт 128 | 129 | Коллекция = Новый Массив; 130 | Для сч = 1 По 32 Цикл 131 | ДобавитьНеПустоеЗначениеВКоллекцию(Коллекция, Вычислить("Элемент" + сч)); 132 | КонецЦикла; 133 | 134 | ПроцессорКоллекций = НовыйПроцессорКоллекций(); 135 | ПроцессорКоллекций.УстановитьКоллекцию(Коллекция); 136 | 137 | Возврат ПроцессорКоллекций; 138 | 139 | КонецФункции 140 | 141 | // Стандартная функция сравнения. 142 | // Сравнивает значения элементов коллекции через операторы ">", "<" и "=". 143 | // 144 | // Возвращаемое значение: 145 | // Структура - . 146 | // 147 | Функция СтандартнаяФункцияСравнения() Экспорт 148 | 149 | ДополнительныеПараметры = Новый Структура; 150 | ДополнительныеПараметры.Вставить("Элемент1"); 151 | ДополнительныеПараметры.Вставить("Элемент2"); 152 | 153 | ФункцияСравнения = НовыйОписаниеОповещения( 154 | "ФункцияСравнения", 155 | ПроцессорыКоллекцийСлужебный, 156 | ДополнительныеПараметры 157 | ); 158 | 159 | Возврат ФункцияСравнения; 160 | 161 | КонецФункции 162 | 163 | // Стандартная функция обработки - "Сообщить". 164 | // Выполняет процедуру "Сообщить()" над каждым элементом коллекции. 165 | // 166 | // Возвращаемое значение: 167 | // ОписаниеОповещения - Инстанс класса ОписаниеОповещения, указывающий на стандартную функцию обработки. 168 | // 169 | Функция СтандартнаяФункцияОбработки_Сообщить() Экспорт 170 | 171 | ФункцияОбработки = НовыйОписаниеОповещения( 172 | "ФункцияОбработки_Сообщить", 173 | ПроцессорыКоллекцийСлужебный 174 | ); 175 | 176 | Возврат ФункцияОбработки; 177 | 178 | КонецФункции 179 | 180 | // Конструктор описания оповещения. 181 | // 182 | // Параметры: 183 | // ИмяПроцедуры - Строка - Имя экспортной процедуры которую необходимо вызвать при выполнеии оповщения 184 | // Модуль - Модуль - Модуль, в котором распогается процедура 185 | // ДополнительныеПараметры - Структура - Дополнительные параметры оповщения 186 | // ИмяПроцедурыОбработкиОшибки - Строка - Имя экспортной процедуры которую необходимо вызвать при ошибке 187 | // МодульОбработкиОшибки - Модуль - Модуль, в котором распогается процедура обработки ошибки 188 | // 189 | // Возвращаемое значение: 190 | // Структура - Описание повощения со свойствами: 191 | // * ИмяПроцедуры - Строка - 192 | // * Модуль - Модуль - 193 | // * ДополнительныеПараметры - Структура, Неопределено - 194 | // * ИмяПроцедурыОбработкиОшибки - Строка - 195 | // * МодульОбработкиОшибки - Модуль, Неопределено - 196 | // 197 | Функция НовыйОписаниеОповещения( 198 | ИмяПроцедуры, 199 | Модуль, 200 | ДополнительныеПараметры = Неопределено, 201 | ИмяПроцедурыОбработкиОшибки = "", 202 | МодульОбработкиОшибки = Неопределено) Экспорт 203 | 204 | Результат = Новый Структура(); 205 | 206 | Результат.Вставить("ИмяПроцедуры", ИмяПроцедуры); 207 | Результат.Вставить("Модуль", Модуль); 208 | Результат.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); 209 | Результат.Вставить("ИмяПроцедурыОбработкиОшибки", ИмяПроцедурыОбработкиОшибки); 210 | Результат.Вставить("МодульОбработкиОшибки", МодульОбработкиОшибки); 211 | 212 | Возврат Результат; 213 | 214 | КонецФункции 215 | 216 | #КонецОбласти 217 | 218 | #Область СлужебныеПроцедурыИФункции 219 | 220 | Процедура ДобавитьНеПустоеЗначениеВКоллекцию(Коллекция, Значение) 221 | Если Значение <> NULL Тогда 222 | Коллекция.Добавить(Значение); 223 | КонецЕсли; 224 | КонецПроцедуры 225 | 226 | #КонецОбласти 227 | -------------------------------------------------------------------------------- /src/src/CommonModules/СервисыОбщее/Module.bsl: -------------------------------------------------------------------------------- 1 | // @strict-types 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | // Извлечь тело запроса по указанной схеме 6 | // 7 | // Параметры: 8 | // Источник - HTTPСервисЗапрос,Строка,Поток,ДвоичныеДанные - Источник для извлечения 9 | // ТипXDTO - ТипОбъектаXDTO,ТипЗначенияXDTO - Источник хттп 10 | // ДопПараметры - Неопределено, Структура - Доп параметры (Параметры прокидываются во всех переопределяемые процедуры) 11 | // Кодировка - Строка,КодировкаТекста - Кодировка считывания тела запроса 12 | // 13 | // Возвращаемое значение: 14 | // ОбъектXDTO,СписокXDTO 15 | Функция ИзвлечьТелоJSONПоСхеме(Источник, ТипXDTO, ДопПараметры = Неопределено, Кодировка = Неопределено) Экспорт 16 | 17 | ЧтениеJson = ЧтениеJsonИзИсточника(Источник, Кодировка); 18 | 19 | Попытка 20 | //@skip-check invocation-parameter-type-intersect 21 | ОбъектXDTO = ФабрикаXDTO.ПрочитатьJSON( 22 | ЧтениеJSON, 23 | ТипXDTO, 24 | "ВосстановитьЗначениеXDTO", // Можно переопределить в см. ВосстановлениеXDTOПереопределяемый 25 | ВосстановлениеXDTO, 26 | ДопПараметры 27 | ); // ОбъектXDTO, СписокXDTO 28 | Исключение 29 | ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); 30 | ВызватьИсключениеПроверки(ТекстОшибки); 31 | КонецПопытки; 32 | 33 | Возврат ОбъектXDTO; 34 | 35 | КонецФункции 36 | 37 | // Извлекает параметры из запроса, проверяет наличие обязательных параметров, преобразует 38 | // параметры запроса в примитивные типы, переименовывает параметры в локальное представление 39 | // 40 | // Параметры: 41 | // Запрос - HTTPСервисЗапрос 42 | // ПроверяемыеПараметры - Массив из см. НовыйПараметрЗапроса 43 | // 44 | // Возвращаемое значение: 45 | // Соответствие из КлючИЗначение - Параметры запроса: 46 | // * Ключ - Строка 47 | // * Значение - Строка,Булево,Число 48 | Функция ПараметрыЗапроса(Запрос, ПроверяемыеПараметры) Экспорт 49 | 50 | ПараметрыЗапроса = Новый Соответствие(); 51 | 52 | Для Каждого Элемент Из Запрос.ПараметрыЗапроса Цикл 53 | ПараметрыЗапроса.Вставить(Элемент.Ключ, Элемент.Значение); 54 | КонецЦикла; 55 | 56 | Для Каждого Элемент Из Запрос.ПараметрыURL Цикл 57 | ПараметрыЗапроса.Вставить(Элемент.Ключ, Элемент.Значение); 58 | КонецЦикла; 59 | 60 | Для Каждого ЗапрашиваемыйПараметр Из ПроверяемыеПараметры Цикл 61 | Если ЗапрашиваемыйПараметр.Обязательный И ПараметрыЗапроса.Получить(ЗапрашиваемыйПараметр.Имя) = Неопределено Тогда 62 | ВызватьИсключениеПроверки(СтрШаблон("No required parameter [%1]", ЗапрашиваемыйПараметр.Имя)); 63 | КонецЕсли; 64 | 65 | Если ПараметрыЗапроса.Получить(ЗапрашиваемыйПараметр.Имя) = Неопределено Тогда 66 | Продолжить; 67 | КонецЕсли; 68 | 69 | ЗначениеПараметра = ПараметрыЗапроса.Получить(ЗапрашиваемыйПараметр.Имя); // Строка 70 | 71 | Если ЗапрашиваемыйПараметр.ВозможныеЗначения.Количество() > 0 72 | И ЗапрашиваемыйПараметр.ВозможныеЗначения.Найти(НРег(ЗначениеПараметра)) = Неопределено Тогда 73 | ТекстОшибки = СтрШаблон( 74 | "Invalid parameter value for parameter [%1], only following values are available [%2]", 75 | ЗапрашиваемыйПараметр.Имя, 76 | СтрСоединить(ЗапрашиваемыйПараметр.ВозможныеЗначения, ",") 77 | ); 78 | ВызватьИсключениеПроверки(ТекстОшибки); 79 | КонецЕсли; 80 | 81 | Тип = ВРЕГ(ЗапрашиваемыйПараметр.Тип); 82 | Если Тип = "БУЛЕВО" Тогда 83 | Попытка 84 | ЗначениеБулево = Булево(ЗначениеПараметра); 85 | ПараметрыЗапроса.Вставить(ЗапрашиваемыйПараметр.Имя, ЗначениеБулево); 86 | Исключение 87 | ВызватьИсключениеПроверки(СтрШаблон("failed to convert value [%1] to boolean", ЗначениеПараметра)); 88 | КонецПопытки; 89 | ИначеЕсли Тип = "ЧИСЛО" Тогда 90 | Попытка 91 | ЗначениеЧислом = Число(ЗначениеПараметра); 92 | ПараметрыЗапроса.Вставить(ЗапрашиваемыйПараметр.Имя, ЗначениеЧислом); 93 | Исключение 94 | ВызватьИсключениеПроверки(СтрШаблон("failed to convert value [%1] to number", ЗначениеПараметра)); 95 | КонецПопытки; 96 | ИначеЕсли Тип = "ИД" Тогда 97 | Попытка 98 | ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("https://github.com/Daabramov/1c-http-framework", "guid"), ЗначениеПараметра); 99 | ПараметрыЗапроса.Вставить(ЗапрашиваемыйПараметр.Имя, ЗначениеПараметра); 100 | Исключение 101 | ВызватьИсключениеПроверки(СтрШаблон("value [%1] is not guid", ЗначениеПараметра)); 102 | КонецПопытки; 103 | ИначеЕсли Тип = "СТРОКА" Тогда 104 | Продолжить; 105 | Иначе 106 | ВызватьИсключение СтрШаблон("Неподдерживаемый тип параметра %1 для %2", Тип, ЗапрашиваемыйПараметр.Имя); 107 | КонецЕсли; 108 | КонецЦикла; 109 | 110 | Возврат ПараметрыЗапроса; 111 | 112 | КонецФункции 113 | 114 | // Новый параметр запроса. 115 | // 116 | // Параметры: 117 | // Имя - Строка - Имя 118 | // Тип - Строка - Описание типа строкой (Число,Строка,Булево,Ид) 119 | // Обязательный - Булево - Признак обязательности параметра 120 | // 121 | // Возвращаемое значение: 122 | // Структура - Новый параметр запроса: 123 | // * Имя - Строка 124 | // * Обязательный - Булево 125 | // * Тип - Строка - Тип строкой "Число", "Строка", "Булево" или "Ид" 126 | // * ВозможныеЗначения - Массив из Строка - возможные значения строк указывать в нижнем регистре 127 | Функция НовыйПараметрЗапроса(Имя, Тип = "Строка", Обязательный = Ложь) Экспорт 128 | 129 | Параметр = Новый Структура(); 130 | Параметр.Вставить("Имя", Имя); 131 | Параметр.Вставить("Обязательный", Обязательный); 132 | Параметр.Вставить("Тип", Тип); 133 | Параметр.Вставить("ВозможныеЗначения", Новый Массив()); 134 | 135 | Возврат Параметр; 136 | 137 | КонецФункции 138 | 139 | // Выполняет чтение тела запроса HTTP-сервиса, имеющее составное содержимое (multipart/form-data) и возвращает поля 140 | // этого содержимого в виде соответствия. В качестве ключа используется имя поля. 141 | // 142 | // Параметры: 143 | // Запрос - HTTPСервисЗапрос - запрос, полученный HTTP-сервисом. 144 | // 145 | // Возвращаемое значение: 146 | // Соответствие из КлючИЗначение - соответствие, содержащее описание полей составного содержимого: 147 | // * Ключ - Строка - В качестве ключа используется имя поля 148 | // * Значение - см. ПолеСоставногоСодержимогоЗапроса 149 | // 150 | // Ссылки: 151 | // https://infostart.ru/public/1277790/ 152 | Функция ПрочитатьСоставноеСодержимоеЗапроса(Запрос) Экспорт 153 | ПоляЗапроса = Новый Соответствие; 154 | 155 | РазделительПолей = ПолучитьРазделитьПолейСоставногоСодержимого(Запрос); 156 | ОкончаниеПолей = "--"; 157 | 158 | ТелоЗапроса = Запрос.ПолучитьТелоКакПоток(); 159 | ЧтениеДанных = Новый ЧтениеДанных(ТелоЗапроса); 160 | 161 | ЕстьДанные = Истина; 162 | Пока ЕстьДанные Цикл 163 | 164 | //@skip-check invocation-parameter-type-intersect 165 | РезультатЧтения = ЧтениеДанных.ПрочитатьДо(РазделительПолей); 166 | ЕстьДанные = РезультатЧтения.МаркерНайден; 167 | 168 | Если ЕстьДанные Тогда 169 | Строка = ЧтениеДанных.ПрочитатьСтроку(); 170 | ЕстьДанные = (Строка <> ОкончаниеПолей); 171 | КонецЕсли; 172 | 173 | Если РезультатЧтения.Размер = 0 Тогда 174 | Продолжить; 175 | КонецЕсли; 176 | 177 | Поток = РезультатЧтения.ОткрытьПотокДляЧтения(); 178 | 179 | Поле = ПрочитатьПолеСоставногоСодержимогоИзПотока(Поток); 180 | ПоляЗапроса.Вставить(Поле.Имя, Поле); 181 | 182 | Поток.Закрыть(); 183 | 184 | КонецЦикла; 185 | 186 | ЧтениеДанных.Закрыть(); 187 | ТелоЗапроса.Закрыть(); 188 | 189 | Возврат ПоляЗапроса; 190 | КонецФункции 191 | 192 | // Ответ из объекта. 193 | // 194 | // Параметры: 195 | // Объект - Структура,Соответствие,Массив,ФиксированнаяКоллекция 196 | // Код - Число - Код 197 | // ДопПараметры - Структура: 198 | // * ПараметрыПреобразованияJson - см. КоннекторХТТПСлужебный.ПараметрыПреобразованияJSONПоУмолчанию 199 | // * ПараметрыЗаписиJson - см. КоннекторХТТПСлужебный.ПараметрыЗаписиJSONПоУмолчанию 200 | // 201 | // Возвращаемое значение: 202 | // HTTPСервисОтвет - Ответ из объекта 203 | Функция ОтветИзОбъекта(Объект, Код = 200, ДопПараметры = Неопределено) Экспорт 204 | //@skip-check invocation-parameter-type-intersect 205 | СтрокаJson = КоннекторХТТПСлужебный.ОбъектВJson( 206 | Объект, 207 | ОбщегоНазначенияХТТП.ЗначениеПоКлючу(ДопПараметры, "ПараметрыПреобразованияJson"), 208 | ОбщегоНазначенияХТТП.ЗначениеПоКлючу(ДопПараметры, "ПараметрыЗаписиJson") 209 | ); 210 | Ответ = ОтветИзСтроки(СтрокаJson, Код); 211 | Ответ.Заголовки.Вставить("Content-Type", "application/json"); 212 | Возврат Ответ; 213 | КонецФункции 214 | 215 | // Ответ из строки. 216 | // 217 | // Параметры: 218 | // ТелоОтвета - Строка - Тело ответа 219 | // Код - Число - Код 220 | // 221 | // Возвращаемое значение: 222 | // HTTPСервисОтвет - Ответ из строка 223 | Функция ОтветИзСтроки(ТелоОтвета, Код = 200) Экспорт 224 | Ответ = ОтветПоКоду(Код); 225 | Ответ.УстановитьТелоИзСтроки(ТелоОтвета); 226 | Возврат Ответ; 227 | КонецФункции 228 | 229 | // Ответ из двоичных данных. 230 | // 231 | // Параметры: 232 | // Данные - ДвоичныеДанные - Данные 233 | // Код - Число - Код 234 | // 235 | // Возвращаемое значение: 236 | // HTTPСервисОтвет - Ответ из двоичных данных 237 | Функция ОтветИзДвоичныхДанных(Данные, Код = 200) Экспорт 238 | Ответ = ОтветПоКоду(Код); 239 | Ответ.УстановитьТелоИзДвоичныхДанных(Данные); 240 | Ответ.Заголовки.Вставить("Content-Type", "application/octet-stream"); 241 | Возврат Ответ; 242 | КонецФункции 243 | 244 | // Ответ по коду. 245 | // 246 | // Параметры: 247 | // Код - Число - Код 248 | // 249 | // Возвращаемое значение: 250 | // HTTPСервисОтвет - Ответ по коду 251 | Функция ОтветПоКоду(Код = 200) Экспорт 252 | Ответ = Новый HTTPСервисОтвет(Код); 253 | Возврат Ответ; 254 | КонецФункции 255 | 256 | // Плохой запрос (400). 257 | // 258 | // Параметры: 259 | // Сообщение - Строка - Тест ошибки проверки 260 | // Код - Число - Код ХТТП ответа 261 | // 262 | // Возвращаемое значение: 263 | // HTTPСервисОтвет - Новый плохой запрос 264 | Функция ПлохойЗапрос(Сообщение, Код = 400) Экспорт 265 | 266 | ОписаниеПроблемы = Новый Структура( 267 | "error", 268 | СтрЗаменить(Сообщение, ОбработкаЗапросовПовтИсп.БазовыйКодОшибкиПроверки(), "") 269 | ); 270 | Возврат ОтветИзОбъекта(ОписаниеПроблемы, Код); 271 | 272 | КонецФункции 273 | 274 | // Ошибка Сервиса (500). 275 | // 276 | // Параметры: 277 | // Сообщение - Строка - Тест ошибки проверки 278 | // ИдентификатораОшибки - Строка - Идентификатор ошибки 279 | // Код - Число - Код ХТТП ответа 280 | // 281 | // Возвращаемое значение: 282 | // HTTPСервисОтвет - Новый плохой запрос 283 | Функция ОшибкаСервера(Сообщение, ИдентификатораОшибки, Код = 500) Экспорт 284 | ОписаниеОшибки = Новый Структура("trace_code", ИдентификатораОшибки); 285 | Если ЗначениеЗаполнено(Сообщение) Тогда 286 | ОписаниеОшибки.Вставить("error", Сообщение); 287 | КонецЕсли; 288 | Возврат ОтветИзОбъекта(ОписаниеОшибки, Код); 289 | КонецФункции 290 | 291 | // Вызвать исключение проверки. 292 | // 293 | // Параметры: 294 | // Сообщение - Строка - Передаваемое сообщение ошибки проверки 295 | Процедура ВызватьИсключениеПроверки(Сообщение) Экспорт 296 | ВызватьИсключение СтрШаблон( 297 | "%1%2", 298 | ОбработкаЗапросовПовтИсп.БазовыйКодОшибкиПроверки(), 299 | Сообщение 300 | ); 301 | КонецПроцедуры 302 | 303 | #КонецОбласти 304 | 305 | #Область СлужебныеПроцедурыИФункции 306 | 307 | Функция ЧтениеJsonИзИсточника(Источник, Кодировка) 308 | ЧтениеJson = Новый ЧтениеJSON; 309 | Если ТипЗнч(Источник) = Тип("HTTPСервисЗапрос") Тогда 310 | Поток = Источник.ПолучитьТелоКакПоток(); 311 | Если Поток.Размер() = 0 Тогда 312 | ВызватьИсключениеПроверки("body is empty"); 313 | КонецЕсли; 314 | ЧтениеJson.ОткрытьПоток(Поток, Кодировка); 315 | ИначеЕсли ТипЗнч(Источник) = Тип("Поток") Тогда 316 | Если Источник.Размер() = 0 Тогда 317 | ВызватьИсключениеПроверки("body is empty"); 318 | КонецЕсли; 319 | ЧтениеJson.ОткрытьПоток(Источник, Кодировка); 320 | ИначеЕсли ТипЗнч(Источник) = Тип("ДвоичныеДанные") Тогда 321 | Если Источник.Размер() = 0 Тогда 322 | ВызватьИсключениеПроверки("body is empty"); 323 | КонецЕсли; 324 | ЧтениеJson.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Источник, Кодировка)); 325 | ИначеЕсли ТипЗнч(Источник) = Тип("Строка") Тогда 326 | Если Не ЗначениеЗаполнено(Источник) Тогда 327 | ВызватьИсключениеПроверки("body is empty"); 328 | КонецЕсли; 329 | ЧтениеJson.УстановитьСтроку(Источник); 330 | Иначе 331 | ВызватьИсключение "Недопустимый тип данных"; 332 | КонецЕсли; 333 | Возврат ЧтениеJson 334 | КонецФункции 335 | 336 | // Выполняет чтение поля составного содержимого из потока, полученного из тела запроса. 337 | // 338 | // Параметры: 339 | // Поток - Поток - поток, содержащий данные поля составного содержимого. 340 | // 341 | // Возвращаемое значение: 342 | // Структура - см. ПолеСоставногоСодержимогоЗапроса 343 | // 344 | Функция ПрочитатьПолеСоставногоСодержимогоИзПотока(Поток) 345 | 346 | Поле = ПолеСоставногоСодержимогоЗапроса(); 347 | 348 | ЧтениеДанных = Новый ЧтениеДанных(Поток); 349 | 350 | ЭтоСодержимое = Ложь; 351 | Пока Не ЭтоСодержимое Цикл 352 | Строка = ЧтениеДанных.ПрочитатьСтроку(); 353 | 354 | Если ЗначениеЗаполнено(Строка) Тогда 355 | ОбработатьЗаголовокСоставногоСодержимого(Поле, Строка); 356 | Иначе 357 | // Пустая строка является разделителем заголовков и содержимого поля. 358 | ЭтоСодержимое = Истина; 359 | КонецЕсли; 360 | КонецЦикла; 361 | 362 | РезультатЧтения = ЧтениеДанных.Прочитать(); 363 | 364 | Если РезультатЧтения.Размер > 0 Тогда 365 | 366 | ПотокСодержимого = РезультатЧтения.ОткрытьПотокДляЧтения(); 367 | ЧтениеДанныхСодержимого = Новый ЧтениеДанных(ПотокСодержимого); 368 | 369 | ДвоичноеСодержимое = (Поле.ИмяФайла <> Неопределено); 370 | Если ДвоичноеСодержимое Тогда 371 | РазмерСодержимого = РезультатЧтения.Размер - 2; // Конечный разделитель строк (ВК + ПС) не нужен. 372 | РезультатЧтенияСодержимого = ЧтениеДанныхСодержимого.Прочитать(РазмерСодержимого); 373 | 374 | Поле.Содержимое = РезультатЧтенияСодержимого.ПолучитьДвоичныеДанные(); 375 | Иначе 376 | Поле.Содержимое = ЧтениеДанныхСодержимого.ПрочитатьСимволы(); 377 | 378 | // Конечный разделитель строк (ПС) не нужен (согласно RFC7578 разделителем строк является ВК + ПС, но 1С 379 | // конвертирует в ПС при чтении строк). 380 | Поле.Содержимое = Лев(Поле.Содержимое, СтрДлина(Поле.Содержимое) - 1); 381 | КонецЕсли; 382 | 383 | ЧтениеДанныхСодержимого.Закрыть(); 384 | ПотокСодержимого.Закрыть(); 385 | 386 | КонецЕсли; 387 | 388 | ЧтениеДанных.Закрыть(); 389 | 390 | Возврат Поле; 391 | 392 | КонецФункции 393 | 394 | // Обрабатывает строку заголовка поля составного содержимого (multipart/form-data) и заполняет свойства "Имя", 395 | // "ИмяФайла" и "ТипСодержимого" (в зависимости от заголока) структуры, описывающей это поле. 396 | // 397 | // Параметры: 398 | // Поле - см. ПолеСоставногоСодержимогоЗапроса 399 | // ПолныйЗаголовок - Строка - полный заголовок поля составного содержимого. Например, 400 | // Content-Disposition: form-data; name="file"; filename="image01.jpg" 401 | // 402 | Процедура ОбработатьЗаголовокСоставногоСодержимого(Поле, ПолныйЗаголовок) 403 | 404 | Поз = СтрНайти(ПолныйЗаголовок, ":"); 405 | Заголовок = НРег(Лев(ПолныйЗаголовок, Поз - 1)); 406 | 407 | Если Заголовок = "content-disposition" Тогда 408 | 409 | Поз = СтрНайти(ПолныйЗаголовок, ";"); 410 | СвойстваЗаголовка = СокрЛ(Сред(ПолныйЗаголовок, Поз + 1)); 411 | 412 | МассивСвойств = СтрРазделить(СвойстваЗаголовка, ";"); 413 | Для каждого Свойство Из МассивСвойств Цикл 414 | 415 | КлючЗначение = СтрРазделить(СокрЛП(Свойство), "="); 416 | Ключ = НРег(СокрЛП(КлючЗначение[0])); 417 | Значение = УдалитьОбрамляющиеКавычкиИзСтроки(СокрЛП(КлючЗначение[1])); 418 | 419 | Если Ключ = "name" Тогда 420 | Поле.Имя = Значение; 421 | ИначеЕсли Ключ = "filename" Тогда 422 | Поле.ИмяФайла = Значение; 423 | КонецЕсли; 424 | 425 | КонецЦикла; 426 | 427 | ИначеЕсли Заголовок = "content-type" Тогда 428 | 429 | Поле.ТипСодержимого = СокрЛ(Сред(ПолныйЗаголовок, Поз + 1)); 430 | 431 | КонецЕсли; 432 | 433 | КонецПроцедуры 434 | 435 | // Возвращает инициализированную структуру, описывающую поле составного запроса. 436 | // 437 | // Возвращаемое значение: 438 | // Структура - структура, описывающая поле составного содержимого запроса: 439 | // * Имя - Строка - имя поля (name). 440 | // * ИмяФайла - Строка - имя файла (filename). Если имя файла указано, то содержимое является двоичными данными. 441 | // * ТипСодержимого - Строка - тип содержимого, указанный в заголовке Content-Type поля. 442 | // Например: text/plain, image/jpeg и т.п. Может отсутствовать. 443 | // * Содержимое - Строка, ДвоичныеДанные - содержимое поля. Если указано имя файла, то содержит двоичные данные, 444 | // иначе Строка. 445 | // 446 | Функция ПолеСоставногоСодержимогоЗапроса() 447 | 448 | Возврат Новый Структура("Имя, ИмяФайла, ТипСодержимого, Содержимое"); 449 | 450 | КонецФункции 451 | 452 | // Получает разделитель (boundary) составного содержимого (multipart/form-data) из заголовка Content-Type. 453 | // Если значение заголовка Content-Type не равно multipart/form-data или свойство boundary не указано, то будет вызвано 454 | // исключение. 455 | // 456 | // Параметры: 457 | // Запрос - HTTPСервисЗапрос - запрос, полученный HTTP-сервисом. 458 | // 459 | // Возвращаемое значение: 460 | // Строка - значение свойства boundary заголовка Content-Type для multipart/form-data. 461 | // 462 | Функция ПолучитьРазделитьПолейСоставногоСодержимого(Запрос) 463 | 464 | ПолныйТипСодержимого = Запрос.Заголовки["Content-Type"]; // Строка 465 | 466 | Поз = СтрНайти(ПолныйТипСодержимого, ";"); 467 | ТипСодержимого = НРег(?(Поз > 0, Лев(ПолныйТипСодержимого, Поз - 1), ПолныйТипСодержимого)); 468 | 469 | Если ТипСодержимого <> "multipart/form-data" Тогда 470 | ВызватьИсключениеПроверки("The request value is not multipart content or the Content-Type header is incorrect"); 471 | КонецЕсли; 472 | 473 | Поз = СтрНайти(ПолныйТипСодержимого, "boundary", , Поз + 1); 474 | Если Поз = 0 Тогда 475 | ВызватьИсключениеПроверки("The boundary of the multipart content in the Content-Type header is not specified'"); 476 | КонецЕсли; 477 | 478 | Поз = СтрНайти(ПолныйТипСодержимого, "=", , Поз); 479 | Если Поз = 0 Тогда 480 | ВызватьИсключениеПроверки("The boundary value of the multipart content in the Content-Type header is not specified"); 481 | КонецЕсли; 482 | 483 | ПозНачалаРазделителя = Поз + 1; 484 | ПозОкончанияРазделителя = СтрНайти(ПолныйТипСодержимого, ";", , ПозНачалаРазделителя); 485 | 486 | Если ПозОкончанияРазделителя = 0 Тогда 487 | РазделительПолей = СокрЛП(Сред(ПолныйТипСодержимого, ПозНачалаРазделителя)); 488 | Иначе 489 | КоличествоСимволов = ПозОкончанияРазделителя - ПозНачалаРазделителя; 490 | РазделительПолей = СокрЛП(Сред(ПолныйТипСодержимого, ПозНачалаРазделителя, КоличествоСимволов)); 491 | КонецЕсли; 492 | 493 | Если Не ЗначениеЗаполнено(РазделительПолей) Тогда 494 | ВызватьИсключениеПроверки("The boundary value of the multipart content in the Content-Type header is not specified"); 495 | КонецЕсли; 496 | 497 | Возврат "--" + РазделительПолей; 498 | 499 | КонецФункции 500 | 501 | // Если строка указана в кавычках, то выполняет удаление этих кавычек в начале и конце строки. 502 | // Например, строка "Пример" будет преобразована в Пример (без кавычек). 503 | // 504 | // Параметры: 505 | // Строка - Строка - строка, указанная в кавычках 506 | // 507 | // Возвращаемое значение: 508 | // Строка - строка, переданная в параметре без кавычек. 509 | // 510 | Функция УдалитьОбрамляющиеКавычкиИзСтроки(Строка) 511 | 512 | ПервыйСимвол = Лев(Строка, 1); 513 | ПоследнийСимвол = Прав(Строка, 1); 514 | 515 | СтрокаВКавычках = (ПервыйСимвол = """" И ПоследнийСимвол = """"); 516 | 517 | Возврат ?(СтрокаВКавычках, 518 | Сред(Строка, 2, СтрДлина(Строка) - 2), 519 | Строка); 520 | 521 | КонецФункции 522 | 523 | #КонецОбласти 524 | -------------------------------------------------------------------------------- /src/src/CommonModules/ОбщегоНазначенияХТТП/Module.bsl: -------------------------------------------------------------------------------- 1 | // Заимствовано из БСП 3.1.6 2 | // 3 | /////////////////////////////////////////////////////////////////////////////////////////////////////// 4 | // Copyright (c) 2022, ООО 1С-Софт 5 | // Все права защищены. Эта программа и сопроводительные материалы предоставляются 6 | // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) 7 | // Текст лицензии доступен по ссылке: 8 | // https://creativecommons.org/licenses/by/4.0/legalcode 9 | /////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | 11 | 12 | #Область ПрограммныйИнтерфейс 13 | 14 | // Создает массив и помещает в него переданное значение. 15 | // 16 | // Параметры: 17 | // Значение - Произвольный - любое значение. 18 | // 19 | // Возвращаемое значение: 20 | // Массив - массив из одного элемента. 21 | // 22 | Функция ЗначениеВМассиве(Значение) Экспорт 23 | 24 | Массив = Новый Массив; 25 | Массив.Добавить(Значение); 26 | 27 | Возврат Массив; 28 | 29 | КонецФункции 30 | 31 | // Возвращает ссылку на общий модуль или модуль менеджера по имени. 32 | // 33 | // Параметры: 34 | // Имя - Строка - имя общего модуля. 35 | // 36 | // Возвращаемое значение: 37 | // ОбщийМодуль 38 | // МодульМенеджераОбъекта 39 | // 40 | // Пример: 41 | // Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда 42 | // МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); 43 | // МодульОбновлениеКонфигурации.<Имя метода>(); 44 | // КонецЕсли; 45 | // 46 | // Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда 47 | // МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); 48 | // МодульПолнотекстовыйПоискСервер.<Имя метода>(); 49 | // КонецЕсли; 50 | // 51 | Функция ОбщийМодуль(Имя) Экспорт 52 | 53 | Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда 54 | // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно. 55 | УстановитьБезопасныйРежим(Истина); 56 | Модуль = Вычислить(Имя); 57 | // АПК:488-вкл 58 | ИначеЕсли СтрЧислоВхождений(Имя, ".") = 1 Тогда 59 | Возврат СерверныйМодульМенеджера(Имя); 60 | Иначе 61 | Модуль = Неопределено; 62 | КонецЕсли; 63 | 64 | Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда 65 | ВызватьИсключение ПодставитьПараметрыВСтроку( 66 | НСтр("ru = 'Общий модуль ""%1"" не существует.'; 67 | |en = 'Common module ""%1"" does not exist.'"), 68 | Имя); 69 | КонецЕсли; 70 | 71 | Возврат Модуль; 72 | 73 | КонецФункции 74 | 75 | // Подставляет параметры в строку. Максимально возможное число параметров - 9. 76 | // Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. 77 | // 78 | // Параметры: 79 | // ШаблонСтроки - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", 80 | // например "%1 пошел в %2"); 81 | // Параметр1 - Строка - значение подставляемого параметра. 82 | // Параметр2 - Строка 83 | // Параметр3 - Строка 84 | // Параметр4 - Строка 85 | // Параметр5 - Строка 86 | // Параметр6 - Строка 87 | // Параметр7 - Строка 88 | // Параметр8 - Строка 89 | // Параметр9 - Строка 90 | // 91 | // Возвращаемое значение: 92 | // Строка - текстовая строка с подставленными параметрами. 93 | // 94 | // Пример: 95 | // СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел 96 | // в Зоопарк". 97 | // 98 | Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки, 99 | Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 100 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 101 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт 102 | 103 | ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%") 104 | Или СтрНайти(Параметр2, "%") 105 | Или СтрНайти(Параметр3, "%") 106 | Или СтрНайти(Параметр4, "%") 107 | Или СтрНайти(Параметр5, "%") 108 | Или СтрНайти(Параметр6, "%") 109 | Или СтрНайти(Параметр7, "%") 110 | Или СтрНайти(Параметр8, "%") 111 | Или СтрНайти(Параметр9, "%"); 112 | 113 | Если ЕстьПараметрыСПроцентом Тогда 114 | Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1, 115 | Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); 116 | КонецЕсли; 117 | 118 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1); 119 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2); 120 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3); 121 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4); 122 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5); 123 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6); 124 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7); 125 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8); 126 | ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9); 127 | Возврат ШаблонСтроки; 128 | 129 | КонецФункции 130 | 131 | // Вычисляет контрольную сумму для произвольных данных по указанному алгоритму. 132 | // 133 | // Параметры: 134 | // Данные - Произвольный - любое сериализуемое значение. 135 | // Алгоритм - ХешФункция - алгоритм расчета контрольной суммы. По умолчанию, MD5. 136 | // 137 | // Возвращаемое значение: 138 | // Строка - контрольная сумма строкой без пробелов (например 32 символа). 139 | // 140 | //@skip-check invocation-parameter-type-intersect 141 | Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт 142 | 143 | Если Алгоритм = Неопределено Тогда 144 | Алгоритм = ХешФункция.MD5; 145 | КонецЕсли; 146 | 147 | ХешированиеДанных = Новый ХешированиеДанных(Алгоритм); 148 | Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда 149 | Данные = ЗначениеВСтрокуXML(Данные); 150 | КонецЕсли; 151 | ХешированиеДанных.Добавить(Данные); 152 | 153 | Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("ДвоичныеДанные") Тогда 154 | Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); 155 | ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("Число") Тогда 156 | Результат = Формат(ХешированиеДанных.ХешСумма, "ЧГ="); 157 | КонецЕсли; 158 | 159 | Возврат Результат; 160 | 161 | КонецФункции 162 | 163 | // Преобразует (сериализует) любое значение в XML-строку. 164 | // Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются. 165 | // См. также ЗначениеИзСтрокиXML. 166 | // 167 | // Параметры: 168 | // Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку. 169 | // 170 | // Возвращаемое значение: 171 | // Строка - XML-строка. 172 | // 173 | Функция ЗначениеВСтрокуXML(Значение) Экспорт 174 | 175 | ЗаписьXML = Новый ЗаписьXML; 176 | ЗаписьXML.УстановитьСтроку(); 177 | СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное); 178 | 179 | Возврат ЗаписьXML.Закрыть(); 180 | КонецФункции 181 | 182 | // Дополняет соответствие значениями из другого соответствия. 183 | // 184 | // Параметры: 185 | // Приемник - Соответствие - коллекция, в которую будут добавляться новые значения. 186 | // Источник - Соответствие из КлючИЗначение - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. 187 | // - ФиксированноеСоответствие из КлючИЗначение - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. 188 | // Заменять - Булево 189 | // - Неопределено - что делать в местах пересечения ключей источника и приемника: 190 | // Истина - заменять значения приемника (самый быстрый способ), 191 | // Ложь - не заменять значения приемника (пропускать), 192 | // Неопределено - значение по умолчанию. Бросать исключение. 193 | // 194 | Процедура ДополнитьСоответствие(Приемник, Источник, Заменять = Неопределено) Экспорт 195 | 196 | Для Каждого Элемент Из Источник Цикл 197 | Если Заменять <> Истина И Приемник[Элемент.Ключ] <> Неопределено Тогда 198 | Если Заменять = Ложь Тогда 199 | Продолжить; 200 | Иначе 201 | ВызватьИсключение ПодставитьПараметрыВСтроку( 202 | НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'; 203 | |en = 'The source and destination have identical keys: ""%1"".'"), 204 | Элемент.Ключ 205 | ); 206 | КонецЕсли 207 | КонецЕсли; 208 | Приемник.Вставить(Элемент.Ключ, Элемент.Значение); 209 | КонецЦикла; 210 | 211 | КонецПроцедуры 212 | 213 | // Проверяет физическое наличие записи в информационной базе данных о переданном значении ссылки. 214 | // 215 | // Параметры: 216 | // ПроверяемаяСсылка - ЛюбаяСсылка - значение любой ссылки информационной базы данных. 217 | // 218 | // Возвращаемое значение: 219 | // Булево - Истина, если существует. 220 | // 221 | Функция СсылкаСуществует(ПроверяемаяСсылка) Экспорт 222 | 223 | ТекстЗапроса = 224 | "ВЫБРАТЬ ПЕРВЫЕ 1 225 | | 1 КАК Поле1 226 | |ИЗ 227 | | &ИмяТаблицы КАК Таблица 228 | |ГДЕ 229 | | Таблица.Ссылка = &Ссылка"; 230 | 231 | ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ИмяТаблицыПоСсылке(ПроверяемаяСсылка)); 232 | 233 | Запрос = Новый Запрос; 234 | Запрос.Текст = ТекстЗапроса; 235 | Запрос.УстановитьПараметр("Ссылка", ПроверяемаяСсылка); 236 | 237 | УстановитьПривилегированныйРежим(Истина); 238 | Возврат НЕ Запрос.Выполнить().Пустой(); 239 | 240 | КонецФункции 241 | 242 | // Возвращает полное имя объекта метаданных по переданному значению ссылки. 243 | // 244 | // Параметры: 245 | // Ссылка - ЛюбаяСсылка - объект, для которого необходимо получить имя таблицы ИБ. 246 | // 247 | // Возвращаемое значение: 248 | // Строка - полное имя объекта метаданных для указанного объекта. Например: "Справочник.Номенклатура". 249 | // 250 | Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт 251 | 252 | Возврат Ссылка.Метаданные().ПолноеИмя(); 253 | 254 | КонецФункции 255 | 256 | Функция ЗначениеПоКлючу(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт 257 | 258 | Если ТипЗнч(Структура) = Тип("Структура") И Структура.Свойство(Ключ) Тогда 259 | Значение = Структура[Ключ]; 260 | ИначеЕсли ТипЗнч(Структура) = Тип("Соответствие") И Структура.Получить(Ключ) <> Неопределено Тогда 261 | Значение = Структура.Получить(Ключ); 262 | Иначе 263 | Значение = ЗначениеПоУмолчанию; 264 | КонецЕсли; 265 | 266 | Возврат Значение; 267 | 268 | КонецФункции 269 | 270 | // Создает полную копию структуры, соответствия, массива, списка или таблицы значений, рекурсивно, 271 | // с учетом типов дочерних элементов. При этом содержимое значений объектных типов 272 | // (СправочникОбъект, ДокументОбъект и т.п.) не копируются, а возвращаются ссылки на исходный объект. 273 | // 274 | // Параметры: 275 | // Источник - Структура 276 | // - ФиксированнаяСтруктура 277 | // - Соответствие 278 | // - ФиксированноеСоответствие 279 | // - Массив 280 | // - ФиксированныйМассив 281 | // - СписокЗначений - объект, который необходимо скопировать. 282 | // ФиксироватьДанные - Булево - если Истина - фиксировать, если Ложь - снять фиксацию. 283 | // - Неопределено - не изменять. 284 | // 285 | // Возвращаемое значение: 286 | // Структура, 287 | // ФиксированнаяСтруктура, 288 | // Соответствие 289 | // ФиксированноеСоответствие 290 | // Массив 291 | // ФиксированныйМассив 292 | // СписокЗначений - копия объекта, переданного в параметре Источник. 293 | // 294 | Функция СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) Экспорт 295 | 296 | Перем Приемник; 297 | 298 | ТипИсточника = ТипЗнч(Источник); 299 | 300 | Если ТипИсточника = Тип("ТаблицаЗначений") Тогда 301 | Возврат Источник.Скопировать(); 302 | КонецЕсли; 303 | 304 | Если ТипИсточника = Тип("Структура") 305 | Или ТипИсточника = Тип("ФиксированнаяСтруктура") Тогда 306 | Приемник = СкопироватьСтруктуру(Источник, ФиксироватьДанные); 307 | ИначеЕсли ТипИсточника = Тип("Соответствие") 308 | Или ТипИсточника = Тип("ФиксированноеСоответствие") Тогда 309 | Приемник = СкопироватьСоответствие(Источник, ФиксироватьДанные); 310 | ИначеЕсли ТипИсточника = Тип("Массив") 311 | Или ТипИсточника = Тип("ФиксированныйМассив") Тогда 312 | Приемник = СкопироватьМассив(Источник, ФиксироватьДанные); 313 | ИначеЕсли ТипИсточника = Тип("СписокЗначений") Тогда 314 | Приемник = СкопироватьСписокЗначений(Источник, ФиксироватьДанные); 315 | Иначе 316 | Приемник = Источник; 317 | КонецЕсли; 318 | 319 | Возврат Приемник; 320 | 321 | КонецФункции 322 | 323 | // Дополняет таблицу значений - приемник данными из таблицы значений - источника. 324 | // Типы ТаблицаЗначений, ДеревоЗначений, ТабличнаяЧасть не доступны на клиенте. 325 | // 326 | // Параметры: 327 | // ТаблицаИсточник - ТаблицаЗначений 328 | // - ДеревоЗначений 329 | // - ТабличнаяЧасть 330 | // - ДанныеФормыКоллекция - таблица, из которой будут 331 | // браться строки для заполнения; 332 | // ТаблицаПриемник - ТаблицаЗначений 333 | // - ДеревоЗначений 334 | // - ТабличнаяЧасть 335 | // - ДанныеФормыКоллекция - таблица, в которую будут 336 | // добавлены строки из таблицы-источника. 337 | // 338 | Процедура ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник) Экспорт 339 | 340 | Для Каждого СтрокаТаблицыИсточник Из ТаблицаИсточник Цикл 341 | 342 | ЗаполнитьЗначенияСвойств(ТаблицаПриемник.Добавить(), СтрокаТаблицыИсточник); 343 | 344 | КонецЦикла; 345 | 346 | КонецПроцедуры 347 | 348 | #КонецОбласти 349 | 350 | #Область СлужебныеПроцедурыИФункции 351 | 352 | // Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. 353 | Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки, 354 | Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, 355 | Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, 356 | Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) 357 | 358 | Результат = ""; 359 | Позиция = СтрНайти(СтрокаПодстановки, "%"); 360 | Пока Позиция > 0 Цикл 361 | Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); 362 | СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); 363 | ПодставляемыйПараметр = Неопределено; 364 | Если СимволПослеПроцента = "1" Тогда 365 | ПодставляемыйПараметр = Параметр1; 366 | ИначеЕсли СимволПослеПроцента = "2" Тогда 367 | ПодставляемыйПараметр = Параметр2; 368 | ИначеЕсли СимволПослеПроцента = "3" Тогда 369 | ПодставляемыйПараметр = Параметр3; 370 | ИначеЕсли СимволПослеПроцента = "4" Тогда 371 | ПодставляемыйПараметр = Параметр4; 372 | ИначеЕсли СимволПослеПроцента = "5" Тогда 373 | ПодставляемыйПараметр = Параметр5; 374 | ИначеЕсли СимволПослеПроцента = "6" Тогда 375 | ПодставляемыйПараметр = Параметр6; 376 | ИначеЕсли СимволПослеПроцента = "7" Тогда 377 | ПодставляемыйПараметр = Параметр7 378 | ИначеЕсли СимволПослеПроцента = "8" Тогда 379 | ПодставляемыйПараметр = Параметр8; 380 | ИначеЕсли СимволПослеПроцента = "9" Тогда 381 | ПодставляемыйПараметр = Параметр9; 382 | КонецЕсли; 383 | Если ПодставляемыйПараметр = Неопределено Тогда 384 | Результат = Результат + "%"; 385 | СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); 386 | Иначе 387 | Результат = Результат + ПодставляемыйПараметр; 388 | СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); 389 | КонецЕсли; 390 | Позиция = СтрНайти(СтрокаПодстановки, "%"); 391 | КонецЦикла; 392 | Результат = Результат + СтрокаПодстановки; 393 | 394 | Возврат Результат; 395 | КонецФункции 396 | 397 | 398 | // Возвращает серверный модуль менеджера по имени объекта. 399 | // 400 | // Параметры: 401 | // Имя - Строка - Имя 402 | // 403 | // Возвращаемое значение: 404 | // Произвольный - Серверный модуль менеджера 405 | Функция СерверныйМодульМенеджера(Имя) Экспорт 406 | ОбъектНайден = Ложь; 407 | 408 | ЧастиИмени = СтрРазделить(Имя, "."); 409 | Если ЧастиИмени.Количество() = 2 Тогда 410 | 411 | ИмяВида = ВРег(ЧастиИмени[0]); 412 | ИмяОбъекта = ЧастиИмени[1]; 413 | 414 | Если ИмяВида = ВРег("Константы") Тогда 415 | Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда 416 | ОбъектНайден = Истина; 417 | КонецЕсли; 418 | ИначеЕсли ИмяВида = ВРег("РегистрыСведений") Тогда 419 | Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда 420 | ОбъектНайден = Истина; 421 | КонецЕсли; 422 | ИначеЕсли ИмяВида = ВРег("РегистрыНакопления") Тогда 423 | Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда 424 | ОбъектНайден = Истина; 425 | КонецЕсли; 426 | ИначеЕсли ИмяВида = ВРег("РегистрыБухгалтерии") Тогда 427 | Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда 428 | ОбъектНайден = Истина; 429 | КонецЕсли; 430 | ИначеЕсли ИмяВида = ВРег("РегистрыРасчета") Тогда 431 | Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда 432 | ОбъектНайден = Истина; 433 | КонецЕсли; 434 | ИначеЕсли ИмяВида = ВРег("Справочники") Тогда 435 | Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда 436 | ОбъектНайден = Истина; 437 | КонецЕсли; 438 | ИначеЕсли ИмяВида = ВРег("Документы") Тогда 439 | Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда 440 | ОбъектНайден = Истина; 441 | КонецЕсли; 442 | ИначеЕсли ИмяВида = ВРег("Отчеты") Тогда 443 | Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда 444 | ОбъектНайден = Истина; 445 | КонецЕсли; 446 | ИначеЕсли ИмяВида = ВРег("Обработки") Тогда 447 | Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда 448 | ОбъектНайден = Истина; 449 | КонецЕсли; 450 | ИначеЕсли ИмяВида = ВРег("БизнесПроцессы") Тогда 451 | Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда 452 | ОбъектНайден = Истина; 453 | КонецЕсли; 454 | ИначеЕсли ИмяВида = ВРег("ЖурналыДокументов") Тогда 455 | Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда 456 | ОбъектНайден = Истина; 457 | КонецЕсли; 458 | ИначеЕсли ИмяВида = ВРег("Задачи") Тогда 459 | Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда 460 | ОбъектНайден = Истина; 461 | КонецЕсли; 462 | ИначеЕсли ИмяВида = ВРег("ПланыСчетов") Тогда 463 | Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда 464 | ОбъектНайден = Истина; 465 | КонецЕсли; 466 | ИначеЕсли ИмяВида = ВРег("ПланыОбмена") Тогда 467 | Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда 468 | ОбъектНайден = Истина; 469 | КонецЕсли; 470 | ИначеЕсли ИмяВида = ВРег("ПланыВидовХарактеристик") Тогда 471 | Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда 472 | ОбъектНайден = Истина; 473 | КонецЕсли; 474 | ИначеЕсли ИмяВида = ВРег("ПланыВидовРасчета") Тогда 475 | Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда 476 | ОбъектНайден = Истина; 477 | КонецЕсли; 478 | // Добавлено перечисления, в исходном методе отсутствует 479 | ИначеЕсли ИмяВида = ВРег("Перечисления") Тогда 480 | Если Метаданные.Перечисления.Найти(ИмяОбъекта) <> Неопределено Тогда 481 | ОбъектНайден = Истина; 482 | КонецЕсли; 483 | КонецЕсли; 484 | 485 | КонецЕсли; 486 | 487 | Если Не ОбъектНайден Тогда 488 | ВызватьИсключение ПодставитьПараметрыВСтроку( 489 | НСтр("ru = 'Объект метаданных ""%1"" не существует.'; 490 | |en = 'Metadata object ""%1"" does not exist.'"), Имя); 491 | КонецЕсли; 492 | 493 | // АПК:488-выкл ВычислитьВБезопасномРежиме не используется, чтобы избежать вызова ОбщийМодуль рекурсивно. 494 | УстановитьБезопасныйРежим(Истина); 495 | Модуль = Вычислить(Имя); 496 | // АПК:488-вкл 497 | 498 | Возврат Модуль; 499 | КонецФункции 500 | 501 | 502 | #Область СкопироватьРекурсивно 503 | 504 | Функция СкопироватьСтруктуру(СтруктураИсточник, ФиксироватьДанные) 505 | 506 | СтруктураРезультат = Новый Структура; 507 | 508 | Для Каждого КлючИЗначение Из СтруктураИсточник Цикл 509 | СтруктураРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные)); 510 | КонецЦикла; 511 | 512 | Если ФиксироватьДанные = Истина 513 | Или ФиксироватьДанные = Неопределено 514 | И ТипЗнч(СтруктураИсточник) = Тип("ФиксированнаяСтруктура") Тогда 515 | 516 | Возврат Новый ФиксированнаяСтруктура(СтруктураРезультат); 517 | КонецЕсли; 518 | 519 | Возврат СтруктураРезультат; 520 | 521 | КонецФункции 522 | 523 | Функция СкопироватьСоответствие(СоответствиеИсточник, ФиксироватьДанные) 524 | 525 | СоответствиеРезультат = Новый Соответствие; 526 | 527 | Для Каждого КлючИЗначение Из СоответствиеИсточник Цикл 528 | СоответствиеРезультат.Вставить(КлючИЗначение.Ключ, СкопироватьРекурсивно(КлючИЗначение.Значение, ФиксироватьДанные)); 529 | КонецЦикла; 530 | 531 | Если ФиксироватьДанные = Истина 532 | Или ФиксироватьДанные = Неопределено 533 | И ТипЗнч(СоответствиеИсточник) = Тип("ФиксированноеСоответствие") Тогда 534 | Возврат Новый ФиксированноеСоответствие(СоответствиеРезультат); 535 | КонецЕсли; 536 | 537 | Возврат СоответствиеРезультат; 538 | 539 | КонецФункции 540 | 541 | Функция СкопироватьМассив(МассивИсточник, ФиксироватьДанные) 542 | 543 | МассивРезультат = Новый Массив; 544 | 545 | Для Каждого Элемент Из МассивИсточник Цикл 546 | МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент, ФиксироватьДанные)); 547 | КонецЦикла; 548 | 549 | Если ФиксироватьДанные = Истина 550 | Или ФиксироватьДанные = Неопределено 551 | И ТипЗнч(МассивИсточник) = Тип("ФиксированныйМассив") Тогда 552 | Возврат Новый ФиксированныйМассив(МассивРезультат); 553 | КонецЕсли; 554 | 555 | Возврат МассивРезультат; 556 | 557 | КонецФункции 558 | 559 | Функция СкопироватьСписокЗначений(СписокИсточник, ФиксироватьДанные) 560 | 561 | СписокРезультат = Новый СписокЗначений; 562 | 563 | Для Каждого ЭлементСписка Из СписокИсточник Цикл 564 | СписокРезультат.Добавить( 565 | СкопироватьРекурсивно(ЭлементСписка.Значение, ФиксироватьДанные), 566 | ЭлементСписка.Представление, 567 | ЭлементСписка.Пометка, 568 | ЭлементСписка.Картинка); 569 | КонецЦикла; 570 | 571 | Возврат СписокРезультат; 572 | 573 | КонецФункции 574 | 575 | #КонецОбласти 576 | 577 | 578 | #КонецОбласти 579 | -------------------------------------------------------------------------------- /src/src/CommonModules/ПроцессорыКоллекцийСлужебный/Module.bsl: -------------------------------------------------------------------------------- 1 | // https://github.com/sfaqer/onec-fluent 2 | 3 | #Область СлужебныеПроцедурыИФункции 4 | 5 | #Область СтандартныеФункцииОбработки 6 | 7 | Процедура ФункцияСравнения(РезультатСортировки, ДополнительныеПараметры) Экспорт 8 | 9 | Элемент1 = ДополнительныеПараметры.Элемент1; 10 | Элемент2 = ДополнительныеПараметры.Элемент2; 11 | 12 | Если Элемент1 = Элемент2 Тогда 13 | РезультатСортировки = 0; 14 | ИначеЕсли Элемент1 > Элемент2 Тогда 15 | РезультатСортировки = 1; 16 | Иначе 17 | РезультатСортировки = -1; 18 | КонецЕсли; 19 | 20 | КонецПроцедуры 21 | 22 | Процедура ФункцияОбработки_Сообщить(Результат, ДополнительныеПараметры) Экспорт 23 | 24 | Элемент = ДополнительныеПараметры.Элемент; 25 | //@skip-check use-non-recommended-method 26 | Сообщить(Элемент); 27 | 28 | КонецПроцедуры 29 | 30 | #КонецОбласти 31 | 32 | Процедура УстановитьКоллекцию(Коллекция, КэшКолонок, НоваяКоллекция, ОбновлятьКэшКолонок = Истина) Экспорт 33 | 34 | Коллекция = Новый Массив; 35 | 36 | Для Каждого ЭлементНовойКоллекции Из НоваяКоллекция Цикл 37 | Коллекция.Добавить(ЭлементНовойКоллекции); 38 | КонецЦикла; 39 | 40 | Если НЕ ОбновлятьКэшКолонок Тогда 41 | Возврат; 42 | КонецЕсли; 43 | 44 | КэшКолонок = Новый Массив; 45 | 46 | ЕстьРеквизитКолонки = Истина; 47 | Попытка 48 | Колонки = НоваяКоллекция.Колонки; 49 | Исключение 50 | ЕстьРеквизитКолонки = Ложь; 51 | Конецпопытки; 52 | 53 | Если ЕстьРеквизитКолонки Тогда 54 | Для Каждого Колонка Из НоваяКоллекция.Колонки Цикл 55 | КэшКолонок.Добавить(Колонка); 56 | КонецЦикла; 57 | КонецЕсли; 58 | 59 | КонецПроцедуры 60 | 61 | #Область КонвеерныеМетоды 62 | 63 | Процедура Первые(Конвейер, Количество) Экспорт 64 | 65 | ДополнительныеПараметры = Новый Структура; 66 | ДополнительныеПараметры.Вставить("Количество", Количество); 67 | 68 | ПоложитьЯчейкуВКонвейер(Конвейер, "Первые", , ДополнительныеПараметры); 69 | 70 | КонецПроцедуры 71 | 72 | Процедура Пропустить(Конвейер, Количество) Экспорт 73 | 74 | ДополнительныеПараметры = Новый Структура; 75 | ДополнительныеПараметры.Вставить("Количество", Количество); 76 | 77 | ПоложитьЯчейкуВКонвейер(Конвейер, "Пропустить", , ДополнительныеПараметры); 78 | 79 | КонецПроцедуры 80 | 81 | Процедура Различные( 82 | Конвейер, 83 | Знач ФункцияСравнения = Неопределено, 84 | Знач ДополнительныеПараметры = Неопределено) Экспорт 85 | 86 | Если ФункцияСравнения = Неопределено Тогда 87 | ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); 88 | Иначе 89 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 90 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 91 | КонецЕсли; 92 | КонецЕсли; 93 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 94 | 95 | ПоложитьЯчейкуВКонвейер(Конвейер, "Различные", ФункцияСравнения); 96 | 97 | КонецПроцедуры 98 | 99 | Процедура Обработать(Конвейер, Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт 100 | 101 | Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда 102 | ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); 103 | КонецЕсли; 104 | ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 105 | 106 | ПоложитьЯчейкуВКонвейер(Конвейер, "Обработать", ФункцияОбработки); 107 | 108 | КонецПроцедуры 109 | 110 | Процедура Развернуть(Конвейер, Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт 111 | 112 | Если ТипЗнч(ФункцияРазворачивания) = Тип("Строка") Тогда 113 | ФункцияРазворачивания = СформироватьВременноеОписаниеОповещения(ФункцияРазворачивания, ДополнительныеПараметры); 114 | КонецЕсли; 115 | ДополнитьСтруктуру(ФункцияРазворачивания.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 116 | 117 | ПоложитьЯчейкуВКонвейер(Конвейер, "Развернуть", ФункцияРазворачивания); 118 | 119 | КонецПроцедуры 120 | 121 | Процедура Фильтровать(Конвейер, Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) Экспорт 122 | 123 | Если ТипЗнч(ФункцияФильтрации) = Тип("Строка") Тогда 124 | ФункцияФильтрации = СформироватьВременноеОписаниеОповещения(ФункцияФильтрации, ДополнительныеПараметры); 125 | КонецЕсли; 126 | ДополнитьСтруктуру(ФункцияФильтрации.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 127 | 128 | ПоложитьЯчейкуВКонвейер(Конвейер, "Фильтровать", ФункцияФильтрации); 129 | 130 | КонецПроцедуры 131 | 132 | Процедура Сортировать( 133 | Конвейер, 134 | Знач ФункцияСравнения = Неопределено, 135 | Знач ДополнительныеПараметры = Неопределено) Экспорт 136 | 137 | Если ФункцияСравнения = Неопределено Тогда 138 | ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); 139 | Иначе 140 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 141 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 142 | КонецЕсли; 143 | КонецЕсли; 144 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 145 | 146 | ПоложитьЯчейкуВКонвейер(Конвейер, "Сортировать", ФункцияСравнения); 147 | 148 | КонецПроцедуры 149 | 150 | Процедура СортироватьПо( 151 | Конвейер, 152 | Знач ИмяПоля, 153 | Знач ФункцияСравнения = Неопределено, 154 | Знач ДополнительныеПараметры = Неопределено) Экспорт 155 | 156 | Если ФункцияСравнения = Неопределено Тогда 157 | ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); 158 | Иначе 159 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 160 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 161 | КонецЕсли; 162 | КонецЕсли; 163 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 164 | 165 | ФункцияСравнения.ДополнительныеПараметры.Вставить("ИмяПоля", ИмяПоля); 166 | 167 | ПоложитьЯчейкуВКонвейер(Конвейер, "СортироватьПо", ФункцияСравнения); 168 | 169 | КонецПроцедуры 170 | 171 | #КонецОбласти 172 | 173 | #Область ТерминальныеМетоды 174 | 175 | Функция ПолучитьПервый(Конвейер, Коллекция, КэшКолонок) Экспорт 176 | 177 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 178 | 179 | Результат = Неопределено; 180 | 181 | Для Каждого Элемент Из Коллекция Цикл 182 | Результат = Элемент; 183 | Прервать; 184 | КонецЦикла; 185 | 186 | Возврат Результат; 187 | 188 | КонецФункции 189 | 190 | Функция ВМассив(Конвейер, Коллекция, КэшКолонок) Экспорт 191 | 192 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 193 | 194 | Результат = Новый Массив; 195 | 196 | Для Каждого Элемент Из Коллекция Цикл 197 | Результат.Добавить(Элемент); 198 | КонецЦикла; 199 | 200 | Возврат Результат; 201 | 202 | КонецФункции 203 | 204 | Функция ВСтроку(Конвейер, Коллекция, КэшКолонок, РазделительСтрок = "") Экспорт 205 | 206 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 207 | 208 | Результат = ""; 209 | 210 | Для Каждого Элемент Из Коллекция Цикл 211 | Результат = Результат + Элемент + РазделительСтрок; 212 | КонецЦикла; 213 | 214 | Если НЕ РазделительСтрок = "" И СтрДлина(Результат) > 0 Тогда 215 | Результат = Лев(Результат, СтрДлина(Результат) - СтрДлина(РазделительСтрок)); 216 | КонецЕсли; 217 | 218 | Возврат Результат; 219 | 220 | КонецФункции 221 | 222 | Функция Количество(Конвейер, Коллекция, КэшКолонок) Экспорт 223 | 224 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 225 | 226 | Результат = Коллекция.Количество(); 227 | 228 | Возврат Результат; 229 | 230 | КонецФункции 231 | 232 | Процедура ДляКаждого( 233 | Конвейер, 234 | Коллекция, 235 | КэшКолонок, 236 | Знач ФункцияОбработки, 237 | Знач ДополнительныеПараметры = Неопределено) Экспорт 238 | 239 | Если ТипЗнч(ФункцияОбработки) = Тип("Строка") Тогда 240 | ФункцияОбработки = СформироватьВременноеОписаниеОповещения(ФункцияОбработки, ДополнительныеПараметры); 241 | КонецЕсли; 242 | ДополнитьСтруктуру(ФункцияОбработки.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 243 | 244 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 245 | 246 | ДополнительныеПараметры = Новый Структура; 247 | ДополнительныеПараметры.Вставить("Обработчик", ФункцияОбработки); 248 | ДополнительныеПараметры.Вставить("Коллекция", Коллекция); 249 | 250 | ВыполнитьОбработать(Неопределено, ДополнительныеПараметры); 251 | 252 | КонецПроцедуры 253 | 254 | Функция Минимум( 255 | Конвейер, 256 | Коллекция, 257 | КэшКолонок, 258 | Знач ФункцияСравнения = Неопределено, 259 | Знач ДополнительныеПараметры = Неопределено) Экспорт 260 | 261 | Если ФункцияСравнения = Неопределено Тогда 262 | ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); 263 | Иначе 264 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 265 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 266 | КонецЕсли; 267 | КонецЕсли; 268 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 269 | 270 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 271 | 272 | Результат = Новый Массив; 273 | ДополнительныеПараметры = Новый Структура; 274 | ДополнительныеПараметры.Вставить("Обработчик", ФункцияСравнения); 275 | ДополнительныеПараметры.Вставить("Коллекция", Коллекция); 276 | 277 | ВыполнитьСортировать(Результат, ДополнительныеПараметры); 278 | 279 | Если Результат.Количество() = 0 Тогда 280 | Возврат Неопределено; 281 | Иначе 282 | Возврат Результат[0]; 283 | КонецЕсли; 284 | 285 | КонецФункции 286 | 287 | Функция Максимум( 288 | Конвейер, 289 | Коллекция, 290 | КэшКолонок, 291 | Знач ФункцияСравнения = Неопределено, 292 | Знач ДополнительныеПараметры = Неопределено) Экспорт 293 | 294 | Если ФункцияСравнения = Неопределено Тогда 295 | ФункцияСравнения = ПроцессорыКоллекций.СтандартнаяФункцияСравнения(); 296 | Иначе 297 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 298 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 299 | КонецЕсли; 300 | КонецЕсли; 301 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 302 | 303 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 304 | 305 | Результат = Новый Массив; 306 | ДополнительныеПараметры = Новый Структура; 307 | ДополнительныеПараметры.Вставить("Обработчик", ФункцияСравнения); 308 | ДополнительныеПараметры.Вставить("Коллекция", Коллекция); 309 | 310 | ВыполнитьСортировать(Результат, ДополнительныеПараметры); 311 | 312 | Если Результат.Количество() = 0 Тогда 313 | Возврат Неопределено; 314 | Иначе 315 | Возврат Результат[Результат.Количество() - 1]; 316 | КонецЕсли; 317 | 318 | КонецФункции 319 | 320 | Функция Сократить( 321 | Конвейер, 322 | Коллекция, 323 | КэшКолонок, 324 | Знач ФункцияСокращения, 325 | Знач НачальноеЗначение = Неопределено, 326 | Знач ДополнительныеПараметры = Неопределено) Экспорт 327 | 328 | Если ТипЗнч(ФункцияСокращения) = Тип("Строка") Тогда 329 | ФункцияСокращения = СформироватьВременноеОписаниеОповещения(ФункцияСокращения, ДополнительныеПараметры); 330 | КонецЕсли; 331 | ДополнитьСтруктуру(ФункцияСокращения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 332 | 333 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 334 | 335 | Результат = НачальноеЗначение; 336 | 337 | Для Каждого Элемент Из Коллекция Цикл 338 | ФункцияСокращения.ДополнительныеПараметры.Вставить("Элемент", Элемент); 339 | ВыполнитьОбработкуОповещенияСлужебный(ФункцияСокращения, Результат); 340 | КонецЦикла; 341 | 342 | Возврат Результат; 343 | 344 | КонецФункции 345 | 346 | Функция Получить(Конвейер, Коллекция, КэшКолонок, ТипРезультата) Экспорт 347 | 348 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 349 | 350 | Результат = Новый(ТипРезультата); 351 | 352 | РезультатСодержитКолонки = Истина; 353 | Попытка 354 | Колонки = Результат.Колонки; 355 | Исключение 356 | РезультатСодержитКолонки = Ложь; 357 | КонецПопытки; 358 | 359 | Если РезультатСодержитКолонки Тогда 360 | Для Каждого Колонка Из КэшКолонок Цикл 361 | Результат.Колонки.Добавить( 362 | Колонка.Имя, 363 | Колонка.ТипЗначения, 364 | Колонка.Заголовок, 365 | Колонка.Ширина 366 | ); 367 | КонецЦикла; 368 | 369 | Если Результат.Колонки.Количество() = 0 Тогда 370 | Результат.Колонки.Добавить("Значение"); 371 | КонецЕсли; 372 | КонецЕсли; 373 | 374 | ЭлементСодержитКолонки = КэшКолонок.Количество() > 0; 375 | 376 | Для Каждого ЭлементКоллекции Из Коллекция Цикл 377 | Если РезультатСодержитКолонки И ЭлементСодержитКолонки Тогда 378 | ЗаполнитьЗначенияСвойств(Результат.Добавить(), ЭлементКоллекции); 379 | ИначеЕсли РезультатСодержитКолонки Тогда 380 | НоваяСтрока = Результат.Добавить(); 381 | НоваяСтрока.Значение = ЭлементКоллекции; 382 | Иначе 383 | Результат.Добавить(ЭлементКоллекции); 384 | КонецЕсли; 385 | КонецЦикла; 386 | 387 | Возврат Результат; 388 | 389 | КонецФункции 390 | 391 | Функция ЛюбойСоответствует( 392 | Конвейер, 393 | Коллекция, 394 | КэшКолонок, 395 | Знач ФункцияСравнения, 396 | Знач ДополнительныеПараметры = Неопределено) Экспорт 397 | 398 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 399 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 400 | КонецЕсли; 401 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 402 | 403 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 404 | 405 | Результат = Ложь; 406 | 407 | ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); 408 | 409 | Для Каждого Элемент Из Коллекция Цикл 410 | ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; 411 | РезультатФильтрации = Ложь; 412 | ВыполнитьОбработкуОповещенияСлужебный(ФункцияСравнения, РезультатФильтрации); 413 | 414 | Если РезультатФильтрации Тогда 415 | Результат = Истина; 416 | Прервать; 417 | КонецЕсли; 418 | КонецЦикла; 419 | 420 | Возврат Результат; 421 | 422 | КонецФункции 423 | 424 | Функция ВсеСоответствуют( 425 | Конвейер, 426 | Коллекция, 427 | КэшКолонок, 428 | Знач ФункцияСравнения, 429 | Знач ДополнительныеПараметры = Неопределено) Экспорт 430 | 431 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 432 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 433 | КонецЕсли; 434 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 435 | 436 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 437 | 438 | Результат = Истина; 439 | 440 | ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); 441 | 442 | Для Каждого Элемент Из Коллекция Цикл 443 | ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; 444 | РезультатФильтрации = Ложь; 445 | ВыполнитьОбработкуОповещенияСлужебный(ФункцияСравнения, РезультатФильтрации); 446 | 447 | Если НЕ РезультатФильтрации Тогда 448 | Результат = Ложь; 449 | Прервать; 450 | КонецЕсли; 451 | КонецЦикла; 452 | 453 | Возврат Результат; 454 | 455 | КонецФункции 456 | 457 | Функция ВсеНеСоответствуют( 458 | Конвейер, 459 | Коллекция, 460 | КэшКолонок, 461 | Знач ФункцияСравнения, 462 | Знач ДополнительныеПараметры = Неопределено) Экспорт 463 | 464 | Если ТипЗнч(ФункцияСравнения) = Тип("Строка") Тогда 465 | ФункцияСравнения = СформироватьВременноеОписаниеОповещения(ФункцияСравнения, ДополнительныеПараметры); 466 | КонецЕсли; 467 | ДополнитьСтруктуру(ФункцияСравнения.ДополнительныеПараметры, ДополнительныеПараметры, Истина); 468 | 469 | ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок); 470 | 471 | Результат = Истина; 472 | 473 | ФункцияСравнения.ДополнительныеПараметры.Вставить("Элемент"); 474 | 475 | Для Каждого Элемент Из Коллекция Цикл 476 | ФункцияСравнения.ДополнительныеПараметры.Элемент = Элемент; 477 | РезультатФильтрации = Ложь; 478 | ВыполнитьОбработкуОповещенияСлужебный(ФункцияСравнения, РезультатФильтрации); 479 | 480 | Если РезультатФильтрации Тогда 481 | Результат = Ложь; 482 | Прервать; 483 | КонецЕсли; 484 | КонецЦикла; 485 | 486 | Возврат Результат; 487 | 488 | КонецФункции 489 | 490 | #КонецОбласти 491 | 492 | #Область ПрохождениеКонвеера 493 | 494 | Процедура ВыполнитьПервые(Результат, ДополнительныеПараметры) Экспорт 495 | 496 | Количество = ДополнительныеПараметры.Количество; 497 | 498 | Результат = Новый Массив; 499 | Для сч = 0 По Количество - 1 Цикл 500 | Элемент = ДополнительныеПараметры.Коллекция[сч]; 501 | Результат.Добавить(Элемент); 502 | КонецЦикла; 503 | 504 | КонецПроцедуры 505 | 506 | Процедура ВыполнитьПропустить(Результат, ДополнительныеПараметры) Экспорт 507 | 508 | Количество = ДополнительныеПараметры.Количество; 509 | 510 | Результат = Новый Массив; 511 | Для сч = Количество По ДополнительныеПараметры.Коллекция.ВГраница() Цикл 512 | Элемент = ДополнительныеПараметры.Коллекция[сч]; 513 | Результат.Добавить(Элемент); 514 | КонецЦикла; 515 | 516 | КонецПроцедуры 517 | 518 | Процедура ВыполнитьРазличные(Результат, ДополнительныеПараметры) Экспорт 519 | 520 | Результат = Новый Массив; 521 | 522 | ОбработчикСравнения = ДополнительныеПараметры.Обработчик; 523 | 524 | Для Каждого Элемент Из ДополнительныеПараметры.Коллекция Цикл 525 | 526 | КоличествоСовпадений = 0; 527 | 528 | Для Каждого ЭлементРезультат Из Результат Цикл 529 | ОбработчикСравнения.ДополнительныеПараметры.Элемент1 = Элемент; 530 | ОбработчикСравнения.ДополнительныеПараметры.Элемент2 = ЭлементРезультат; 531 | РезультатСортировки = Неопределено; 532 | ВыполнитьОбработкуОповещенияСлужебный(ОбработчикСравнения, РезультатСортировки); 533 | Если РезультатСортировки = 0 Тогда 534 | КоличествоСовпадений = КоличествоСовпадений + 1; 535 | КонецЕсли; 536 | КонецЦикла; 537 | 538 | Если КоличествоСовпадений = 0 Тогда 539 | Результат.Добавить(Элемент); 540 | КонецЕсли; 541 | 542 | КонецЦикла; 543 | 544 | КонецПроцедуры 545 | 546 | Процедура ВыполнитьФильтровать(Результат, ДополнительныеПараметры) Экспорт 547 | 548 | Обработчик = ДополнительныеПараметры.Обработчик; 549 | 550 | Результат = Новый Массив; 551 | 552 | Если Обработчик.ДополнительныеПараметры = Неопределено Тогда 553 | Обработчик.ДополнительныеПараметры = Новый Структура; 554 | КонецЕсли; 555 | Обработчик.ДополнительныеПараметры.Вставить("Элемент"); 556 | 557 | Для Каждого Элемент Из ДополнительныеПараметры.Коллекция Цикл 558 | Обработчик.ДополнительныеПараметры.Элемент = Элемент; 559 | РезультатФильтрации = Ложь; 560 | ВыполнитьОбработкуОповещенияСлужебный(Обработчик, РезультатФильтрации); 561 | 562 | Если РезультатФильтрации Тогда 563 | Результат.Добавить(Элемент); 564 | КонецЕсли; 565 | КонецЦикла; 566 | 567 | КонецПроцедуры 568 | 569 | Процедура ВыполнитьОбработать(Результат, ДополнительныеПараметры) Экспорт 570 | 571 | Обработчик = ДополнительныеПараметры.Обработчик; 572 | 573 | Результат = Новый Массив; 574 | 575 | Если Обработчик.ДополнительныеПараметры = Неопределено Тогда 576 | Обработчик.ДополнительныеПараметры = Новый Структура; 577 | КонецЕсли; 578 | Обработчик.ДополнительныеПараметры.Вставить("Элемент"); 579 | 580 | Для Каждого Элемент Из ДополнительныеПараметры.Коллекция Цикл 581 | Обработчик.ДополнительныеПараметры.Элемент = Элемент; 582 | РезультатОбработки = Элемент; 583 | ВыполнитьОбработкуОповещенияСлужебный(Обработчик, РезультатОбработки); 584 | 585 | Результат.Добавить(РезультатОбработки); 586 | КонецЦикла; 587 | 588 | КонецПроцедуры 589 | 590 | Процедура ВыполнитьРазвернуть(Результат, ДополнительныеПараметры) Экспорт 591 | 592 | Обработчик = ДополнительныеПараметры.Обработчик; 593 | 594 | Результат = Новый Массив; 595 | 596 | Если Обработчик.ДополнительныеПараметры = Неопределено Тогда 597 | Обработчик.ДополнительныеПараметры = Новый Структура; 598 | КонецЕсли; 599 | Обработчик.ДополнительныеПараметры.Вставить("Элемент"); 600 | 601 | Для Каждого Элемент Из ДополнительныеПараметры.Коллекция Цикл 602 | Обработчик.ДополнительныеПараметры.Элемент = Элемент; 603 | РезультатРазворачивания = Элемент; 604 | ВыполнитьОбработкуОповещенияСлужебный(Обработчик, РезультатРазворачивания); 605 | 606 | ДСО = СтрШаблон("Результат разворачивания для элемента %1 должен иметь тип ПроцессорКоллекций", Элемент); 607 | 608 | Если Не ТипЗнч(РезультатРазворачивания) = Тип("ОбработкаОбъект.ПроцессорКоллекций") Тогда 609 | ВызватьИсключение ДСО; 610 | КонецЕсли; 611 | 612 | РезультатРазворачивания.ДляКаждого( 613 | "ДополнительныеПараметры.Результат.Добавить(Элемент);", 614 | Новый Структура("Результат", Результат) 615 | ); 616 | 617 | КонецЦикла; 618 | 619 | КонецПроцедуры 620 | 621 | Процедура ВыполнитьСортировать(Результат, ДополнительныеПараметры) Экспорт 622 | 623 | Обработчик = ДополнительныеПараметры.Обработчик; 624 | 625 | Результат = ДополнительныеПараметры.Коллекция; 626 | 627 | Если Обработчик.ДополнительныеПараметры = Неопределено Тогда 628 | Обработчик.ДополнительныеПараметры = Новый Структура; 629 | КонецЕсли; 630 | Обработчик.ДополнительныеПараметры.Вставить("Элемент1"); 631 | Обработчик.ДополнительныеПараметры.Вставить("Элемент2"); 632 | 633 | Для й = 0 По Результат.Количество() - 1 Цикл 634 | Флаг = Ложь; 635 | к = Результат.Количество() - 1; 636 | Пока к > й Цикл 637 | Элемент = Результат[к - 1]; 638 | СледующийЭлемент = Результат[к]; 639 | Обработчик.ДополнительныеПараметры.Элемент1 = Элемент; 640 | Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент; 641 | РезультатСортировки = Неопределено; 642 | ВыполнитьОбработкуОповещенияСлужебный(Обработчик, РезультатСортировки); 643 | Если РезультатСортировки > 0 Тогда 644 | Результат[к - 1] = СледующийЭлемент; 645 | Результат[к] = Элемент; 646 | Флаг = Истина; 647 | КонецЕсли; 648 | к = к - 1; 649 | КонецЦикла; 650 | Если НЕ Флаг Тогда 651 | Прервать; 652 | КонецЕсли; 653 | КонецЦикла; 654 | 655 | КонецПроцедуры 656 | 657 | Процедура ВыполнитьСортироватьПо(Результат, ДополнительныеПараметры) Экспорт 658 | 659 | Обработчик = ДополнительныеПараметры.Обработчик; 660 | ИмяПоля = Обработчик.ДополнительныеПараметры.ИмяПоля; 661 | 662 | Результат = ДополнительныеПараметры.Коллекция; 663 | 664 | Если Обработчик.ДополнительныеПараметры = Неопределено Тогда 665 | Обработчик.ДополнительныеПараметры = Новый Структура; 666 | КонецЕсли; 667 | Обработчик.ДополнительныеПараметры.Вставить("Элемент1"); 668 | Обработчик.ДополнительныеПараметры.Вставить("Элемент2"); 669 | 670 | Для й = 0 По Результат.Количество() - 1 Цикл 671 | Флаг = Ложь; 672 | к = Результат.Количество() - 1; 673 | Пока к > й Цикл 674 | Элемент = Результат[к - 1]; 675 | СледующийЭлемент = Результат[к]; 676 | 677 | Обработчик.ДополнительныеПараметры.Элемент1 = Элемент[ИмяПоля]; 678 | Обработчик.ДополнительныеПараметры.Элемент2 = СледующийЭлемент[ИмяПоля]; 679 | РезультатСортировки = Неопределено; 680 | ВыполнитьОбработкуОповещенияСлужебный(Обработчик, РезультатСортировки); 681 | Если РезультатСортировки > 0 Тогда 682 | Результат[к - 1] = СледующийЭлемент; 683 | Результат[к] = Элемент; 684 | Флаг = Истина; 685 | КонецЕсли; 686 | к = к - 1; 687 | КонецЦикла; 688 | Если НЕ Флаг Тогда 689 | Прервать; 690 | КонецЕсли; 691 | КонецЦикла; 692 | 693 | КонецПроцедуры 694 | 695 | Процедура ВыполнитьОбработкуОповещенияСлужебный(ВыполняемоеОповещение, Результат = Неопределено) 696 | 697 | #Если Клиент Тогда 698 | 699 | Если ЗначениеЗаполнено(ВыполняемоеОповещение.ИмяПроцедурыОбработкиОшибки) Тогда 700 | 701 | ОписаниеОповещения = Новый ОписаниеОповещения( 702 | ВыполняемоеОповещение.ИмяПроцедуры, 703 | ВыполняемоеОповещение.Модуль, 704 | ВыполняемоеОповещение.ДополнительныеПараметры, 705 | ВыполняемоеОповещение.ИмяПроцедурыОбработкиОшибки, 706 | ВыполняемоеОповещение.МодульОбработкиОшибки 707 | ); 708 | 709 | Иначе 710 | 711 | ОписаниеОповещения = Новый ОписаниеОповещения( 712 | ВыполняемоеОповещение.ИмяПроцедуры, 713 | ВыполняемоеОповещение.Модуль, 714 | ВыполняемоеОповещение.ДополнительныеПараметры 715 | ); 716 | 717 | КонецЕсли; 718 | 719 | ВыполнитьОбработкуОповещения( 720 | ОписаниеОповещения, 721 | Результат 722 | ); 723 | 724 | #Иначе 725 | 726 | Выполнить "ВыполняемоеОповещение.Модуль." + 727 | ВыполняемоеОповещение.ИмяПроцедуры + 728 | "(Результат, ВыполняемоеОповещение.ДополнительныеПараметры)"; 729 | 730 | #КонецЕсли 731 | 732 | КонецПроцедуры 733 | 734 | Процедура ОбработкаОповещения(Результат, ДополнительныеПараметры) Экспорт 735 | 736 | Элемент = Неопределено; 737 | Элемент1 = Неопределено; 738 | Элемент2 = Неопределено; 739 | 740 | ПользовательскоеВыражение = "А = 0;"; 741 | 742 | ДополнительныеПараметры.Свойство("Элемент", Элемент); 743 | ДополнительныеПараметры.Свойство("Элемент1", Элемент1); 744 | ДополнительныеПараметры.Свойство("Элемент2", Элемент2); 745 | 746 | ДополнительныеПараметры.Свойство("ПользовательскоеВыражение", ПользовательскоеВыражение); 747 | 748 | Выполнить ПользовательскоеВыражение; 749 | 750 | КонецПроцедуры 751 | 752 | #КонецОбласти 753 | 754 | Процедура ПройтиКонвейер(Конвейер, Коллекция, КэшКолонок) 755 | 756 | Результат = Новый Массив; 757 | Для Каждого Ячейка Из Конвейер Цикл 758 | 759 | Ячейка.ДополнительныеПараметры.Вставить("Коллекция", Коллекция); 760 | 761 | ВыполнитьОбработкуОповещенияСлужебный(Ячейка, Результат); 762 | УстановитьКоллекцию(Коллекция, КэшКолонок, Результат, Ложь); 763 | 764 | КонецЦикла; 765 | 766 | Конвейер.Очистить(); 767 | 768 | КонецПроцедуры 769 | 770 | Процедура ПоложитьЯчейкуВКонвейер( 771 | Конвейер, 772 | ИмяОперации, 773 | ВходящееОписаниеОповещения = Неопределено, 774 | ДополнительныеПараметры = Неопределено) 775 | 776 | Сообщение = ИмяОперации; 777 | Если ВходящееОписаниеОповещения <> Неопределено Тогда 778 | Сообщение = Сообщение + " " + ВходящееОписаниеОповещения.ИмяПроцедуры; 779 | КонецЕсли; 780 | 781 | Если ДополнительныеПараметры = Неопределено Тогда 782 | ДополнительныеПараметры = Новый Структура; 783 | КонецЕсли; 784 | 785 | Если ВходящееОписаниеОповещения <> Неопределено Тогда 786 | ДополнительныеПараметры.Вставить("Обработчик", ВходящееОписаниеОповещения); 787 | КонецЕсли; 788 | 789 | Ячейка = ПроцессорыКоллекций.НовыйОписаниеОповещения( 790 | "Выполнить" + ИмяОперации, 791 | ПроцессорыКоллекцийСлужебный, 792 | ДополнительныеПараметры 793 | ); 794 | 795 | Конвейер.Добавить(Ячейка); 796 | 797 | КонецПроцедуры 798 | 799 | Функция СформироватьВременноеОписаниеОповещения(ПользовательскоеВыражение, ДополнительныеПараметры) 800 | 801 | Если ДополнительныеПараметры = Неопределено Тогда 802 | ДополнительныеПараметры = Новый Структура; 803 | КонецЕсли; 804 | 805 | ДополнительныеПараметры.Вставить( 806 | "ПользовательскоеВыражение", 807 | ПользовательскоеВыражение 808 | ); 809 | 810 | ОписаниеОповещения = ПроцессорыКоллекций.НовыйОписаниеОповещения( 811 | "ОбработкаОповещения", 812 | ПроцессорыКоллекцийСлужебный, 813 | ДополнительныеПараметры 814 | ); 815 | 816 | Возврат ОписаниеОповещения; 817 | 818 | КонецФункции 819 | 820 | // Дополняет структуру значениями из другой структуры. 821 | // 822 | // Параметры: 823 | // Приемник - Структура - коллекция, в которую будут добавляться новые значения. 824 | // Источник - Структура - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. 825 | // Заменять - Булево, Неопределено - что делать в местах пересечения ключей источника и приемника: 826 | // Истина - заменять значения приемника (самый быстрый способ), 827 | // Ложь - не заменять значения приемника (пропускать), 828 | // Неопределено - значение по умолчанию. Бросать исключение. 829 | // 830 | // Функция скопирована из "Библиотеки Стандартных Подсистем" на следующих условиях: 831 | // 832 | // Copyright (c) 2018, ООО 1С-Софт 833 | // Все права защищены. Эта программа и сопроводительные материалы предоставляются 834 | // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) 835 | // Текст лицензии доступен по ссылке: 836 | // https://creativecommons.org/licenses/by/4.0/legalcode 837 | // 838 | // В функцию внесены следующие изменения: 839 | // * использование СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку заменено на СтрШаблон; 840 | // * добавлена инициализиация структур приемника и источника 841 | // 842 | Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) 843 | 844 | Если Приемник = Неопределено Тогда 845 | Приемник = Новый Структура; 846 | КонецЕсли; 847 | 848 | Если Источник = Неопределено Тогда 849 | Источник = Новый Структура; 850 | КонецЕсли; 851 | 852 | Для Каждого Элемент Из Источник Цикл 853 | Если Заменять <> Истина И Приемник.Свойство(Элемент.Ключ) Тогда 854 | Если Заменять = Ложь Тогда 855 | Продолжить; 856 | Иначе 857 | ВызватьИсключение СтрШаблон(НСтр("ru = 'Пересечение ключей источника и приемника: ""%1"".'"), Элемент.Ключ); 858 | КонецЕсли 859 | КонецЕсли; 860 | Приемник.Вставить(Элемент.Ключ, Элемент.Значение); 861 | КонецЦикла; 862 | 863 | КонецПроцедуры 864 | 865 | #КонецОбласти 866 | -------------------------------------------------------------------------------- /src/src/DataProcessors/ПроцессорКоллекций/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // https://github.com/sfaqer/onec-fluent 2 | 3 | #Область ОписаниеПеременных 4 | 5 | // Аккамулирует шаги конвеера 6 | Перем Конвейер; 7 | 8 | // Коллекция для потоковой обработки 9 | Перем Коллекция; 10 | 11 | // Кэш колонок коллекции таблицы 12 | Перем КэшКолонок; 13 | 14 | #КонецОбласти 15 | 16 | #Область ПрограммныйИнтерфейс 17 | 18 | // Устанавливает коллекцию для обработки Процессора коллекций. 19 | // 20 | // Параметры: 21 | // НоваяКоллекция - Массив, ТаблицаЗначений, ДеревоЗначений, ... - Коллекция, устанавливаемая в процессор. 22 | // 23 | Процедура УстановитьКоллекцию(НоваяКоллекция) Экспорт 24 | ПроцессорыКоллекцийСлужебный.УстановитьКоллекцию(Коллекция, КэшКолонок, НоваяКоллекция); 25 | КонецПроцедуры 26 | 27 | #Область КонвейерныеМетоды 28 | 29 | // Получить первые N элементов. 30 | // Конвейерный метод. 31 | // 32 | // Параметры: 33 | // Количество - Число - Число отбираемых элементов. 34 | // 35 | // Возвращаемое значение: 36 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 37 | // 38 | Функция Первые(Количество) Экспорт 39 | 40 | ПроцессорыКоллекцийСлужебный.Первые(Конвейер, Количество); 41 | 42 | Возврат ЭтотОбъект; 43 | 44 | КонецФункции 45 | 46 | // Пропустить первые N элементов. 47 | // Конвейерный метод. 48 | // 49 | // Параметры: 50 | // Количество - Число - Число пропускаемых элементов. 51 | // 52 | // Возвращаемое значение: 53 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 54 | // 55 | Функция Пропустить(Количество) Экспорт 56 | 57 | ПроцессорыКоллекцийСлужебный.Пропустить(Конвейер, Количество); 58 | 59 | Возврат ЭтотОбъект; 60 | 61 | КонецФункции 62 | 63 | // Выбрать различные элементы. 64 | // Конвейерный метод. 65 | // 66 | // Параметры: 67 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 68 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 69 | // "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". 70 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 71 | // (имена произвольные): 72 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 73 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 74 | // Если параметр не передан, выполняется стандартная функция сравнения: 75 | // см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() 76 | // 77 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 78 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 79 | // По умолчанию содержит два значения - Элемент1 и Элемент2. 80 | // 81 | // Возвращаемое значение: 82 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 83 | // 84 | // Примеры: 85 | // 1: 86 | // ПроцессорКоллекций.Различные("Результат = Элемент1 > Элемент2"); 87 | // 88 | // 2: 89 | // Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт 90 | // Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; 91 | // КонецПроцедуры 92 | // 93 | // ФункцияСравнения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); 94 | // ПроцессорКоллекций.Различные(ФункцияСравнения); 95 | // 96 | Функция Различные(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт 97 | 98 | ПроцессорыКоллекцийСлужебный.Различные( 99 | Конвейер, 100 | ФункцияСравнения, 101 | ДополнительныеПараметры 102 | ); 103 | 104 | Возврат ЭтотОбъект; 105 | 106 | КонецФункции 107 | 108 | // Обработать каждый элемент коллекции. 109 | // Конвейерный метод. 110 | // 111 | // Параметры: 112 | // ФункцияОбработки - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - функция обработки. 113 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 114 | // "Результат", "ДополнительныеПараметры", "Элемент". 115 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 116 | // (имена произвольные): 117 | // "Результат" - Произвольный - Переменная, в которой возвращается значение работы обработчика. 118 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. 119 | // 120 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. 121 | // Служит для передачи дополнительных данных из прикладного кода в функцию обработки. 122 | // По умолчанию содержит одно значение - Элемент. 123 | // 124 | // Возвращаемое значение: 125 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 126 | // 127 | // Примеры: 128 | // 1: 129 | // ПроцессорКоллекций.Обработать("Результат = Элемент + 1;"); 130 | // 131 | // 2: 132 | // Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт 133 | // Результат = ДополнительныеПараметры.Элемент + 1; 134 | // КонецПроцедуры 135 | // 136 | // ФункцияОбработки = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); 137 | // ПроцессорКоллекций.Обработать(ФункцияОбработки); 138 | // 139 | Функция Обработать(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт 140 | 141 | ПроцессорыКоллекцийСлужебный.Обработать( 142 | Конвейер, 143 | ФункцияОбработки, 144 | ДополнительныеПараметры 145 | ); 146 | 147 | Возврат ЭтотОбъект; 148 | 149 | КонецФункции 150 | 151 | // Развернуть каждый элемент коллекции в процессор коллекций. 152 | // Позволяет расширить имеющуюся коллекцию. 153 | // Например, разворачивание массива массивов сделает новый массив, содерщщий все элементы всех массивов. 154 | // Конвейерный метод. 155 | // 156 | // Параметры: 157 | // ФункцияРазворачивания - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - функция разворачивания. 158 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 159 | // "Результат", "ДополнительныеПараметры", "Элемент". 160 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 161 | // (имена произвольные): 162 | // Результат - ПроцессорКоллекций - Переменная, в которую должен быть 163 | // помещен результат работы функции в виде ПроцессораКоллекций. 164 | // ДополнительныеПараметры - Структура - Структура параметров, передаваемая функции разворачивания. 165 | // 166 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции разворачивания. 167 | // Служит для передачи дополнительных данных из прикладного кода в функцию разворачивания. 168 | // По умолчанию содержит одно значение - Элемент. 169 | // 170 | // Возвращаемое значение: 171 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 172 | // 173 | // Примеры: 174 | // 1: 175 | // ПроцессорКоллекций.Развернуть("Результат = ПроцессорыКоллекций.ИзСтроки(Элемент);"); 176 | // 177 | // 2: 178 | // Процедура МояФункцияРазворачивания(Результат, ДополнительныеПараметры) Экспорт 179 | // Результат = ПроцессорыКоллекций.ИзСтроки(ДополнительныеПараметры.Элемент); 180 | // КонецПроцедуры 181 | // 182 | // ФункцияРазворачивания = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияРазворачивания", ЭтотОбъект); 183 | // ПроцессорКоллекций.Развернуть(ФункцияРазворачивания); 184 | // 185 | Функция Развернуть(Знач ФункцияРазворачивания, Знач ДополнительныеПараметры = Неопределено) Экспорт 186 | 187 | ПроцессорыКоллекцийСлужебный.Развернуть( 188 | Конвейер, 189 | ФункцияРазворачивания, 190 | ДополнительныеПараметры 191 | ); 192 | 193 | Возврат ЭтотОбъект; 194 | 195 | КонецФункции 196 | 197 | // Фильтровать коллекцию по условию. 198 | // Конвейерный метод. 199 | // 200 | // Параметры: 201 | // ФункцияФильтрации - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция фильтрации. 202 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 203 | // "Результат", "ДополнительныеПараметры", "Элемент". 204 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 205 | // (имена произвольные): 206 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 207 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 208 | // 209 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции фильтрации. 210 | // Служит для передачи дополнительных данных из прикладного кода в функцию фильтрации. 211 | // По умолчанию содержит одно значение - Элемент. 212 | // 213 | // Возвращаемое значение: 214 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 215 | // 216 | // Примеры: 217 | // 1: 218 | // ПроцессорКоллекций.Фильтровать("Результат = СтрДлина(Элемент) > 1"); 219 | // 220 | // 2: 221 | // Процедура МояПроцедураФильтрации(Результат, ДополнительныеПараметры) Экспорт 222 | // Результат = СтрДлина(ДополнительныеПараметры.Элемент) > 1; 223 | // КонецПроцедуры 224 | // 225 | // ФункцияФильтрации = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояПроцедураФильтрации", ЭтотОбъект); 226 | // ПроцессорКоллекций.Фильтровать(ФункцияФильтрации); 227 | // 228 | Функция Фильтровать(Знач ФункцияФильтрации, Знач ДополнительныеПараметры = Неопределено) Экспорт 229 | 230 | ПроцессорыКоллекцийСлужебный.Фильтровать( 231 | Конвейер, 232 | ФункцияФильтрации, 233 | ДополнительныеПараметры 234 | ); 235 | 236 | Возврат ЭтотОбъект; 237 | 238 | КонецФункции 239 | 240 | // Сортировать элементы коллекции. 241 | // Конвейерный метод. 242 | // 243 | // Параметры: 244 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 245 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 246 | // "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". 247 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 248 | // (имена произвольные): 249 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 250 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 251 | // Если параметр не передан, выполняется стандартная функция сравнения: 252 | // см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() 253 | // 254 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 255 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 256 | // По умолчанию содержит два значения - Элемент1 и Элемент2. 257 | // 258 | // Возвращаемое значение: 259 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 260 | // 261 | // Примеры: 262 | // 1: 263 | // ПроцессорКоллекций.Сортировать("Результат = Элемент1 > Элемент2"); 264 | // 265 | // 2: 266 | // Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт 267 | // Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; 268 | // КонецПроцедуры 269 | // 270 | // ФункцияСравнения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); 271 | // ПроцессорКоллекций.Сортировать(ФункцияСравнения); 272 | // 273 | Функция Сортировать(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт 274 | 275 | ПроцессорыКоллекцийСлужебный.Сортировать( 276 | Конвейер, 277 | ФункцияСравнения, 278 | ДополнительныеПараметры 279 | ); 280 | 281 | Возврат ЭтотОбъект; 282 | 283 | КонецФункции 284 | 285 | // Сортировать элементы коллекции по выбранному полю. 286 | // Конвейерный метод. 287 | // 288 | // Параметры: 289 | // ИмяПоля - Строка - Имя поля элемента коллекции, по которому необходимо осуществлять сортировку. 290 | // 291 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 292 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 293 | // "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". 294 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 295 | // (имена произвольные): 296 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 297 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 298 | // Если параметр не передан, выполняется стандартная функция сравнения: 299 | // см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() 300 | // 301 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 302 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 303 | // По умолчанию содержит два значения - Элемент1 и Элемент2. 304 | // 305 | // Возвращаемое значение: 306 | // ОбработкаОбъект.ПроцессорКоллекций - Инстанс класса "ПроцессорКоллекций". 307 | // 308 | // Примеры: 309 | // 1: 310 | // ПроцессорКоллекций.СортироватьПо("НомерСтроки", "Результат = Элемент1 > Элемент2"); 311 | // 312 | // 2: 313 | // Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт 314 | // Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; 315 | // КонецПроцедуры 316 | // 317 | // ФункцияСравнения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); 318 | // ПроцессорКоллекций.СортироватьПо("НомерСтроки", ФункцияСравнения); 319 | // 320 | Функция СортироватьПо( 321 | Знач ИмяПоля, 322 | Знач ФункцияСравнения = Неопределено, 323 | Знач ДополнительныеПараметры = Неопределено) Экспорт 324 | 325 | ПроцессорыКоллекцийСлужебный.СортироватьПо( 326 | Конвейер, 327 | ИмяПоля, 328 | ФункцияСравнения, 329 | ДополнительныеПараметры 330 | ); 331 | 332 | Возврат ЭтотОбъект; 333 | 334 | КонецФункции 335 | 336 | #КонецОбласти 337 | 338 | #Область ТерминальныеМетоды 339 | 340 | // Получить первый элемент. 341 | // Терминальный метод. 342 | // 343 | // Возвращаемое значение: 344 | // Произвольный - Первый элемент из коллекции. Если коллекция пуста, возвращает Неопределено. 345 | // 346 | Функция ПолучитьПервый() Экспорт 347 | 348 | Возврат ПроцессорыКоллекцийСлужебный.ПолучитьПервый( 349 | Конвейер, 350 | Коллекция, 351 | КэшКолонок 352 | ); 353 | 354 | КонецФункции 355 | 356 | // Получить коллекцию в виде массива. 357 | // Терминальный метод. 358 | // 359 | // Возвращаемое значение: 360 | // Массив - Массив элементов коллекции. 361 | // 362 | Функция ВМассив() Экспорт 363 | 364 | Возврат ПроцессорыКоллекцийСлужебный.ВМассив( 365 | Конвейер, 366 | Коллекция, 367 | КэшКолонок 368 | ); 369 | 370 | КонецФункции 371 | 372 | // Получить коллекцию в виде строки. 373 | // Терминальный метод. 374 | // 375 | // Параметры: 376 | // РазделительСтрок - Строка - Используемый разделитель между элементами при конкатенации строк. 377 | // 378 | // Возвращаемое значение: 379 | // Строка - Элементы коллекции, соединенные в строку методом конкатенации. 380 | // 381 | Функция ВСтроку(РазделительСтрок = "") Экспорт 382 | 383 | Возврат ПроцессорыКоллекцийСлужебный.ВСтроку( 384 | Конвейер, 385 | Коллекция, 386 | КэшКолонок, 387 | РазделительСтрок 388 | ); 389 | 390 | КонецФункции 391 | 392 | // Получить количество элементов коллекции. 393 | // Терминальный метод. 394 | // 395 | // Возвращаемое значение: 396 | // Число - Количество элементов коллекции. 397 | // 398 | Функция Количество() Экспорт 399 | 400 | Возврат ПроцессорыКоллекцийСлужебный.Количество( 401 | Конвейер, 402 | Коллекция, 403 | КэшКолонок 404 | ); 405 | 406 | КонецФункции 407 | 408 | // Обработать каждый элемент коллекции и завершить работу процессора. 409 | // Терминальный метод. 410 | // 411 | // Параметры: 412 | // ФункцияОбработки - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - функция обработки. 413 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 414 | // "Результат", "ДополнительныеПараметры", "Элемент". 415 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 416 | // (имена произвольные): 417 | // "Результат" - Произвольный - Игнорируется. 418 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая обработчику. 419 | // 420 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции обработки. 421 | // Служит для передачи дополнительных данных из прикладного кода в функцию обработки. 422 | // По умолчанию содержит одно значение - Элемент. 423 | // 424 | // Примеры: 425 | // 1: 426 | // ПроцессорКоллекций.ДляКаждого("Сообщить(Элемент);"); 427 | // 428 | // 2: 429 | // ПроцессорКоллекций.ДляКаждого(ПроцессорыКоллекций.СтандартнаяФункцияОбработки_Сообщить()); 430 | // 431 | // 3: 432 | // Процедура МояФункцияОбработки(Результат, ДополнительныеПараметры) Экспорт 433 | // Сообщить(ДополнительныеПараметры.Элемент); 434 | // КонецПроцедуры 435 | // 436 | // ФункцияОбработки = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияОбработки", ЭтотОбъект); 437 | // ПроцессорКоллекций.ДляКаждого(ФункцияОбработки); 438 | // 439 | Процедура ДляКаждого(Знач ФункцияОбработки, Знач ДополнительныеПараметры = Неопределено) Экспорт 440 | 441 | ПроцессорыКоллекцийСлужебный.ДляКаждого( 442 | Конвейер, 443 | Коллекция, 444 | КэшКолонок, 445 | ФункцияОбработки, 446 | ДополнительныеПараметры 447 | ); 448 | 449 | КонецПроцедуры 450 | 451 | // Получить минимальный элемент. 452 | // Терминальный метод. 453 | // 454 | // Параметры: 455 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 456 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 457 | // "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". 458 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 459 | // (имена произвольные): 460 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 461 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 462 | // Если параметр не передан, выполняется стандартная функция сравнения: 463 | // см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() 464 | // 465 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 466 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 467 | // По умолчанию содержит два значения - Элемент1 и Элемент2. 468 | // 469 | // Возвращаемое значение: 470 | // Произвольный - минимальный элемент коллекции. 471 | // 472 | // Примеры: 473 | // 1: 474 | // ПроцессорКоллекций.Минимум(); 475 | // 476 | // 2: 477 | // ПроцессорКоллекций.Минимум("Результат = Элемент1 > Элемент2"); 478 | // 479 | // 3: 480 | // Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт 481 | // Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; 482 | // КонецПроцедуры 483 | // 484 | // ФункцияСравнения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); 485 | // ПроцессорКоллекций.Минимум(ФункцияСравнения); 486 | // 487 | Функция Минимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт 488 | 489 | Возврат ПроцессорыКоллекцийСлужебный.Минимум( 490 | Конвейер, 491 | Коллекция, 492 | КэшКолонок, 493 | ФункцияСравнения, 494 | ДополнительныеПараметры 495 | ); 496 | 497 | КонецФункции 498 | 499 | // Получить максимальный элемент. 500 | // Терминальный метод. 501 | // 502 | // Параметры: 503 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 504 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 505 | // "Результат", "ДополнительныеПараметры", "Элемент1", "Элемент2". 506 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 507 | // (имена произвольные): 508 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 509 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 510 | // Если параметр не передан, выполняется стандартная функция сравнения: 511 | // см. ПроцессорыКоллекций.СтандартнаяФункцияСравнения() 512 | // 513 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 514 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 515 | // По умолчанию содержит два значения - Элемент1 и Элемент2. 516 | // 517 | // Возвращаемое значение: 518 | // Произвольный - максимальный элемент коллекции. 519 | // 520 | // Примеры: 521 | // 1: 522 | // ПроцессорКоллекций.Максимум(); 523 | // 524 | // 2: 525 | // ПроцессорКоллекций.Максимум("Результат = Элемент1 > Элемент2"); 526 | // 527 | // 3: 528 | // Процедура МояФункцияСравнения(Результат, ДополнительныеПараметры) Экспорт 529 | // Результат = ДополнительныеПараметры.Элемент1 > ДополнительныеПараметры.Элемент2; 530 | // КонецПроцедуры 531 | // 532 | // ФункцияСравнения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСравнения", ЭтотОбъект); 533 | // ПроцессорКоллекций.Максимум(ФункцияСравнения); 534 | // 535 | Функция Максимум(Знач ФункцияСравнения = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт 536 | 537 | Возврат ПроцессорыКоллекцийСлужебный.Максимум( 538 | Конвейер, 539 | Коллекция, 540 | КэшКолонок, 541 | ФункцияСравнения, 542 | ДополнительныеПараметры 543 | ); 544 | 545 | КонецФункции 546 | 547 | // Выполнить агрегатную функцию над элементами коллекции. 548 | // Терминальный метод. 549 | // 550 | // Параметры: 551 | // ФункцияСокращения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сокращения. 552 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 553 | // "Результат", "ДополнительныеПараметры", "Элемент". 554 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 555 | // (имена произвольные): 556 | // "Результат" - Произвольный - Переменная, в которой возвращается значение работы функции. 557 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 558 | // 559 | // НачальноеЗначение - Произвольный - начальное значение, передаваемое в функцию сокращения в параметр "Результат" 560 | // 561 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сокращения. 562 | // Служит для передачи дополнительных данных из прикладного кода в функцию сокращения. 563 | // По умолчанию содержит одно значение - Элемент. 564 | // 565 | // Возвращаемое значение: 566 | // Произвольный - результат работы агрегатной функции. 567 | // 568 | // Примеры: 569 | // 2: 570 | // ПроцессорКоллекций.Сократить("Результат = Результат + Элемент"); 571 | // 572 | // 2: 573 | // Процедура МояФункцияСокращения(Результат, ДополнительныеПараметры) Экспорт 574 | // Элемент = ДополнительныеПараметры.Элемент; 575 | // Результат = Результат + Элемент; 576 | // КонецПроцедуры 577 | // 578 | // ФункцияСокращения = ПроцессорыКоллекций.НовыйОписаниеОповещения("МояФункцияСокращения", ЭтотОбъект); 579 | // ПроцессорКоллекций.Сократить(ФункцияСокращения); 580 | // 581 | Функция Сократить( 582 | Знач ФункцияСокращения, 583 | Знач НачальноеЗначение = Неопределено, 584 | Знач ДополнительныеПараметры = Неопределено) Экспорт 585 | 586 | Возврат ПроцессорыКоллекцийСлужебный.Сократить( 587 | Конвейер, 588 | Коллекция, 589 | КэшКолонок, 590 | ФункцияСокращения, 591 | НачальноеЗначение, 592 | ДополнительныеПараметры 593 | ); 594 | 595 | КонецФункции 596 | 597 | // Получить коллекцию в виде объекта заданного типа. 598 | // Терминальный метод. 599 | // 600 | // Параметры: 601 | // ТипРезультата - Тип - Тип, в котором необходимо вернуть коллекцию. 602 | // 603 | // Возвращаемое значение: 604 | // Произвольный - Коллекция в виде объекта нужного типа. 605 | // 606 | Функция Получить(ТипРезультата) Экспорт 607 | 608 | Возврат ПроцессорыКоллекцийСлужебный.Получить( 609 | Конвейер, 610 | Коллекция, 611 | КэшКолонок, 612 | ТипРезультата 613 | ); 614 | 615 | КонецФункции 616 | 617 | // Проверить, что хотя бы один элемент коллекции удовлетворяет условию в функции сравнения. 618 | // Терминальный метод. 619 | // 620 | // Параметры: 621 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 622 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 623 | // "Результат", "ДополнительныеПараметры", "Элемент". 624 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 625 | // (имена произвольные): 626 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 627 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 628 | // 629 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 630 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 631 | // По умолчанию содержит одно значение - Элемент. 632 | // 633 | // Возвращаемое значение: 634 | // Булево - Истина, если минимум один из элементов коллекции удовлетворяет условию Функции сравнения. 635 | // В обратном случае возвращает Ложь. 636 | // Если коллекция пустая, возвращает Ложь. 637 | // 638 | Функция ЛюбойСоответствует(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт 639 | 640 | Возврат ПроцессорыКоллекцийСлужебный.ЛюбойСоответствует( 641 | Конвейер, 642 | Коллекция, 643 | КэшКолонок, 644 | ФункцияСравнения, 645 | ДополнительныеПараметры 646 | ); 647 | 648 | КонецФункции 649 | 650 | // Проверить, что все элементы коллекции удовлетворяют условию в функции сравнения. 651 | // Терминальный метод. 652 | // 653 | // Параметры: 654 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 655 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 656 | // "Результат", "ДополнительныеПараметры", "Элемент". 657 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 658 | // (имена произвольные): 659 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 660 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 661 | // 662 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 663 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 664 | // По умолчанию содержит одно значение - Элемент. 665 | // 666 | // Возвращаемое значение: 667 | // Булево - Истина, если все элементы коллекции удовлетворяют условию Функции сравнения. 668 | // В обратном случае возвращает Ложь. 669 | // Если коллекция пустая, возвращает Истина. 670 | // 671 | Функция ВсеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт 672 | 673 | Возврат ПроцессорыКоллекцийСлужебный.ВсеСоответствуют( 674 | Конвейер, 675 | Коллекция, 676 | КэшКолонок, 677 | ФункцияСравнения, 678 | ДополнительныеПараметры 679 | ); 680 | 681 | КонецФункции 682 | 683 | // Проверить, что все элементы коллекции не удовлетворяют условию в функции сравнения. 684 | // Терминальный метод. 685 | // 686 | // Параметры: 687 | // ФункцияСравнения - Строка, ПроцессорыКоллекций.НовыйОписаниеОповещения - Функция сравнения. 688 | // В случае передачи Строки формируется служебное описание оповещения, в контексте которого заданы переменные 689 | // "Результат", "ДополнительныеПараметры", "Элемент". 690 | // В случае передачи ОписанияОповещения обработчик данного описания должен содержать два параметра 691 | // (имена произвольные): 692 | // "Результат" - Булево - Переменная, в которой возвращается значение работы функции. 693 | // "ДополнительныеПараметры" - Структура - Структура параметров, передаваемая функции. 694 | // 695 | // ДополнительныеПараметры - Структура - Структура дополнительных параметров, передаваемая функции сравнения. 696 | // Служит для передачи дополнительных данных из прикладного кода в функцию сравнения. 697 | // По умолчанию содержит одно значение - Элемент. 698 | // 699 | // Возвращаемое значение: 700 | // Булево - Истина, если все элементы коллекции не удовлетворяют условию Функции сравнения. 701 | // В обратном случае возвращает Ложь. 702 | // Если коллекция пустая, возвращает Истина. 703 | // 704 | Функция ВсеНеСоответствуют(Знач ФункцияСравнения, Знач ДополнительныеПараметры = Неопределено) Экспорт 705 | 706 | Возврат ПроцессорыКоллекцийСлужебный.ВсеНеСоответствуют( 707 | Конвейер, 708 | Коллекция, 709 | КэшКолонок, 710 | ФункцияСравнения, 711 | ДополнительныеПараметры 712 | ); 713 | 714 | КонецФункции 715 | 716 | #КонецОбласти 717 | 718 | #КонецОбласти 719 | 720 | #Область Инициализация 721 | 722 | Конвейер = Новый Массив; 723 | 724 | #КонецОбласти 725 | --------------------------------------------------------------------------------