From f16c003f4612cb9544f054ef1250b6a019d5068e Mon Sep 17 00:00:00 2001 From: Vladislav_k0ncept Date: Thu, 20 Feb 2025 15:05:58 +0000 Subject: [PATCH] Initial commit --- .gitignore | 2 + Koncept/Testovoe/Мероприятия/Задачи.xbsl | 80 +++ Koncept/Testovoe/Мероприятия/Задачи.yaml | 78 +++ .../Testovoe/Мероприятия/Задачи.Объект.xbsl | 14 + .../Мероприятия/ЗадачиФормаОбъекта.xbsl | 58 ++ .../Мероприятия/ЗадачиФормаОбъекта.yaml | 90 +++ .../Мероприятия/ЗадачиФормаСписка.xbsl | 73 +++ .../Мероприятия/ЗадачиФормаСписка.yaml | 137 +++++ .../Testovoe/Мероприятия/ЗаписанаЗадача.yaml | 4 + .../Testovoe/Мероприятия/ЗаписаноСобытие.yaml | 4 + .../Локализация/En/ЛокализованныеСтроки.yaml | 62 +++ .../Мероприятия/ЛокализованныеСтроки.yaml | 68 +++ .../Мероприятия/МероприятияКлиентИСервер.xbsl | 72 +++ .../Мероприятия/МероприятияКлиентИСервер.yaml | 6 + Koncept/Testovoe/Мероприятия/Подсистема.yaml | 4 + .../Testovoe/Мероприятия/ПриоритетЗадачи.xbsl | 15 + .../Testovoe/Мероприятия/ПриоритетЗадачи.yaml | 18 + .../Мероприятия/Ресурсы/ЗадачаВРамке.svg | 4 + .../Мероприятия/Ресурсы/МакетТаблицыЗадач.mxl | Bin 0 -> 1652 bytes .../Ресурсы/ПустойСписокМероприятий.svg | 7 + .../Ресурсы/ПустойСписокУчастников.png | Bin 0 -> 2690 bytes .../Мероприятия/Ресурсы/РазделМероприятия.svg | 3 + .../Мероприятия/Ресурсы/СобытиеВРамке.svg | 4 + .../Мероприятия/РольУчастникаМероприятия.yaml | 13 + Koncept/Testovoe/Мероприятия/События.xbsl | 38 ++ Koncept/Testovoe/Мероприятия/События.yaml | 68 +++ .../Testovoe/Мероприятия/События.Объект.xbsl | 6 + .../Мероприятия/СобытияФормаОбъекта.xbsl | 79 +++ .../Мероприятия/СобытияФормаОбъекта.yaml | 127 +++++ .../Мероприятия/СобытияФормаСписка.yaml | 98 ++++ .../Мероприятия/СтатусМероприятия.xbsl | 17 + .../Мероприятия/СтатусМероприятия.yaml | 22 + .../Мероприятия/УчастникиМероприятия.yaml | 16 + .../Мероприятия/ФормаДобавленияУчастника.xbsl | 10 + .../Мероприятия/ФормаДобавленияУчастника.yaml | 49 ++ Koncept/Testovoe/Общие/КурсыВалют/Валюты.xbsl | 49 ++ Koncept/Testovoe/Общие/КурсыВалют/Валюты.yaml | 30 + .../Общие/КурсыВалют/ВалютыФормаОбъекта.xbsl | 19 + .../Общие/КурсыВалют/ВалютыФормаОбъекта.yaml | 32 ++ .../Общие/КурсыВалют/ВалютыФормаСписка.xbsl | 8 + .../Общие/КурсыВалют/ВалютыФормаСписка.yaml | 83 +++ .../Testovoe/Общие/КурсыВалют/КурсВалюты.yaml | 21 + .../Testovoe/Общие/КурсыВалют/КурсыВалют.xbsl | 11 + .../Testovoe/Общие/КурсыВалют/КурсыВалют.yaml | 32 ++ .../Общие/КурсыВалют/КурсыВалютЗагружены.yaml | 4 + .../Общие/КурсыВалют/КурсыВалютСервер.xbsl | 315 +++++++++++ .../Общие/КурсыВалют/КурсыВалютСервер.yaml | 5 + .../КурсыВалют/КурсыВалютФормаОбъекта.yaml | 38 ++ .../КурсыВалют/КурсыВалютФормаСписка.yaml | 52 ++ .../КурсыВалют/ОперацияЗагрузкиКурсовВалют.yaml | 21 + .../КурсыВалют/ОшибкаЗагрузкиКурсовВалюты.yaml | 20 + .../КурсыВалют/ФормаЗагрузкиКурсовВалют.xbsl | 48 ++ .../КурсыВалют/ФормаЗагрузкиКурсовВалют.yaml | 40 ++ .../Локализация/En/ЛокализованныеСтроки.yaml | 30 + .../Testovoe/Общие/ЛокализованныеСтроки.yaml | 34 ++ Koncept/Testovoe/Общие/Направления.xbsl | 23 + Koncept/Testovoe/Общие/Направления.yaml | 20 + .../Общие/НаправленияФормаОбъекта.xbsl | 7 + .../Общие/НаправленияФормаОбъекта.yaml | 21 + .../Общие/НаправленияФормаСписка.yaml | 30 + .../Общие/ОкноПолнотекстовогоПоиска.xbsl | 12 + .../Общие/ОкноПолнотекстовогоПоиска.yaml | 31 ++ Koncept/Testovoe/Общие/Подсистема.yaml | 4 + Koncept/Testovoe/Общие/Регионы.xbsl | 24 + Koncept/Testovoe/Общие/Регионы.yaml | 15 + .../РезультатыПолнотекстовогоПоиска.xbsl | 0 .../РезультатыПолнотекстовогоПоиска.yaml | 232 ++++++++ .../Testovoe/Основное/ГлавнаяСтраница.xbsl | 113 ++++ .../Testovoe/Основное/ГлавнаяСтраница.yaml | 195 +++++++ .../Testovoe/Основное/ДанныеПользователя.yaml | 23 + .../Основное/ДемонстрационноеПриложение.xbsl | 24 + .../Основное/ДемонстрационноеПриложение.yaml | 22 + .../Основное/ЗаполнениеДемоДанными.xbsl | 518 +++++++++++++++++ .../Основное/ЗаполнениеДемоДанными.yaml | 5 + .../Основное/КлючДоступаМенеджера.xbsl | 40 ++ .../Основное/КлючДоступаМенеджера.yaml | 10 + .../Основное/КлючДоступаРуководителя.xbsl | 26 + .../Основное/КлючДоступаРуководителя.yaml | 4 + .../Основное/КомандаЗавершитьРаботу.xbsl | 4 + .../Основное/КомандаЗавершитьРаботу.yaml | 6 + .../Локализация/En/ЛокализованныеСтроки.yaml | 26 + .../Основное/ЛокализованныеСтроки.yaml | 30 + .../ОперацияЗаполненияДемоДанными.yaml | 10 + .../ОперацияЗаполненияДемоДаннымиДляПользователя.yaml | 17 + .../Testovoe/Основное/ПанельНавигации.yaml | 67 +++ Koncept/Testovoe/Основное/Подсистема.yaml | 5 + .../Основное/ПользователиКлиентИСервер.xbsl | 127 +++++ .../Основное/ПользователиКлиентИСервер.yaml | 5 + .../Основное/ПутеводительПоПроекту.xbsl | 67 +++ .../Основное/ПутеводительПоПроекту.yaml | 104 ++++ Koncept/Testovoe/Основное/Ресурсы/Валюты.svg | 3 + Koncept/Testovoe/Основное/Ресурсы/Логотип.svg | 5 + .../Основное/Ресурсы/Путеводитель.json | 66 +++ .../Ресурсы/РазделГлавнаяСтраница.svg | 3 + .../Основное/Ресурсы/РазделНастройки.svg | 3 + .../Основное/Ресурсы/РазделПутеводитель.svg | 3 + .../Основное/Ресурсы/РазделСервис.svg | 3 + .../Ресурсы/РесурсыДемо/СтадияЗаключенДоговор.png | Bin 0 -> 148 bytes .../Ресурсы/РесурсыДемо/СтадияОтказано.png | Bin 0 -> 144 bytes .../Ресурсы/РесурсыДемо/СтадияПервичныйКонтакт.png | Bin 0 -> 504 bytes .../Ресурсы/РесурсыДемо/СтадияПереговоры.png | Bin 0 -> 525 bytes .../Ресурсы/РесурсыДемо/СтадияСделаноПредложение.png | Bin 0 -> 390 bytes Koncept/Testovoe/Основное/РольСотрудника.yaml | 14 + Koncept/Testovoe/Основное/Сотрудники.xbsl | 22 + Koncept/Testovoe/Основное/Сотрудники.yaml | 41 ++ .../Testovoe/Основное/Сотрудники.Объект.xbsl | 15 + .../Основное/СотрудникиФормаОбъекта.xbsl | 40 ++ .../Основное/СотрудникиФормаОбъекта.yaml | 68 +++ .../Основное/СотрудникиФормаСписка.yaml | 51 ++ Koncept/Testovoe/Пресейл/ВидСтадииСделки.yaml | 18 + Koncept/Testovoe/Пресейл/ДанныеСделки.yaml | 44 ++ .../Пресейл/ДиаграммаВоронкаПродаж.xbsl | 57 ++ .../Пресейл/ДиаграммаВоронкаПродаж.yaml | 15 + .../ДиаграммаПродажиПоНаправлениям.xbsl | 60 ++ .../ДиаграммаПродажиПоНаправлениям.yaml | 16 + Koncept/Testovoe/Пресейл/ЗаписанаСделка.yaml | 8 + Koncept/Testovoe/Пресейл/Клиенты.xbsl | 68 +++ Koncept/Testovoe/Пресейл/Клиенты.yaml | 39 ++ Koncept/Testovoe/Пресейл/Клиенты.Объект.xbsl | 35 ++ .../Testovoe/Пресейл/КлиентыФормаОбъекта.xbsl | 49 ++ .../Testovoe/Пресейл/КлиентыФормаОбъекта.yaml | 43 ++ .../Testovoe/Пресейл/КлиентыФормаСписка.yaml | 59 ++ Koncept/Testovoe/Пресейл/КонтактныеЛица.xbsl | 41 ++ Koncept/Testovoe/Пресейл/КонтактныеЛица.yaml | 45 ++ .../Пресейл/КонтактныеЛица.Объект.xbsl | 6 + .../Пресейл/КонтактныеЛицаФормаОбъекта.xbsl | 56 ++ .../Пресейл/КонтактныеЛицаФормаОбъекта.yaml | 54 ++ .../Пресейл/КонтактныеЛицаФормаСписка.yaml | 72 +++ .../Локализация/En/ЛокализованныеСтроки.yaml | 68 +++ .../Пресейл/ЛокализованныеСтроки.yaml | 72 +++ Koncept/Testovoe/Пресейл/ОтчетОПродажах.yaml | 78 +++ .../Пресейл/ОтчетОПродажахТаблица.xbql | 10 + .../Пресейл/ОтчетОПродажахТаблица.yaml | 11 + .../Testovoe/Пресейл/ОтчетОПродажахФорма.xbsl | 11 + .../Testovoe/Пресейл/ОтчетОПродажахФорма.yaml | 37 ++ .../Пресейл/ОшибкаНастроекПользователя.yaml | 26 + Koncept/Testovoe/Пресейл/Подсистема.yaml | 4 + .../Ресурсы/ОбучающиеПодсказки/Приветствие.png | Bin 0 -> 16303 bytes .../Пресейл/Ресурсы/РазделПресейл.svg | 3 + .../Testovoe/Пресейл/Ресурсы/Справочник.svg | 3 + Koncept/Testovoe/Пресейл/Сделки.xbsl | 245 +++++++++ Koncept/Testovoe/Пресейл/Сделки.yaml | 126 +++++ Koncept/Testovoe/Пресейл/Сделки.Объект.xbsl | 48 ++ .../Testovoe/Пресейл/СделкиHttpСервис.xbsl | 98 ++++ .../Testovoe/Пресейл/СделкиHttpСервис.yaml | 24 + .../Testovoe/Пресейл/СделкиФормаОбъекта.xbsl | 366 ++++++++++++ .../Testovoe/Пресейл/СделкиФормаОбъекта.yaml | 520 ++++++++++++++++++ .../Testovoe/Пресейл/СделкиФормаСписка.xbsl | 19 + .../Testovoe/Пресейл/СделкиФормаСписка.yaml | 116 ++++ Koncept/Testovoe/Пресейл/СтадииСделок.xbsl | 53 ++ Koncept/Testovoe/Пресейл/СтадииСделок.yaml | 36 ++ .../Пресейл/СтадииСделокФормаОбъекта.xbsl | 22 + .../Пресейл/СтадииСделокФормаОбъекта.yaml | 64 +++ .../Пресейл/СтадииСделокФормаСписка.yaml | 52 ++ Koncept/Testovoe/Пресейл/Услуги.xbsl | 25 + Koncept/Testovoe/Пресейл/Услуги.yaml | 24 + .../Testovoe/Пресейл/УслугиФормаСписка.yaml | 44 ++ Koncept/Testovoe/Проект.xbsl | 41 ++ Koncept/Testovoe/Проект.yaml | 10 + LICENSE | 232 -------- README.md | 2 - 161 files changed, 7483 insertions(+), 234 deletions(-) create mode 100644 .gitignore create mode 100644 Koncept/Testovoe/Мероприятия/Задачи.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/Задачи.yaml create mode 100644 Koncept/Testovoe/Мероприятия/Задачи.Объект.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ЗаписанаЗадача.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ЗаписаноСобытие.yaml create mode 100644 Koncept/Testovoe/Мероприятия/Локализация/En/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.yaml create mode 100644 Koncept/Testovoe/Мероприятия/Подсистема.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.yaml create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/ЗадачаВРамке.svg create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/МакетТаблицыЗадач.mxl create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокМероприятий.svg create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокУчастников.png create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/РазделМероприятия.svg create mode 100644 Koncept/Testovoe/Мероприятия/Ресурсы/СобытиеВРамке.svg create mode 100644 Koncept/Testovoe/Мероприятия/РольУчастникаМероприятия.yaml create mode 100644 Koncept/Testovoe/Мероприятия/События.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/События.yaml create mode 100644 Koncept/Testovoe/Мероприятия/События.Объект.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Мероприятия/СобытияФормаСписка.yaml create mode 100644 Koncept/Testovoe/Мероприятия/СтатусМероприятия.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/СтатусМероприятия.yaml create mode 100644 Koncept/Testovoe/Мероприятия/УчастникиМероприятия.yaml create mode 100644 Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.xbsl create mode 100644 Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/Валюты.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/Валюты.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсВалюты.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютЗагружены.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаСписка.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ОперацияЗагрузкиКурсовВалют.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ОшибкаЗагрузкиКурсовВалюты.yaml create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.xbsl create mode 100644 Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.yaml create mode 100644 Koncept/Testovoe/Общие/Локализация/En/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Общие/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Общие/Направления.xbsl create mode 100644 Koncept/Testovoe/Общие/Направления.yaml create mode 100644 Koncept/Testovoe/Общие/НаправленияФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Общие/НаправленияФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Общие/НаправленияФормаСписка.yaml create mode 100644 Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.xbsl create mode 100644 Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.yaml create mode 100644 Koncept/Testovoe/Общие/Подсистема.yaml create mode 100644 Koncept/Testovoe/Общие/Регионы.xbsl create mode 100644 Koncept/Testovoe/Общие/Регионы.yaml create mode 100644 Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.xbsl create mode 100644 Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.yaml create mode 100644 Koncept/Testovoe/Основное/ГлавнаяСтраница.xbsl create mode 100644 Koncept/Testovoe/Основное/ГлавнаяСтраница.yaml create mode 100644 Koncept/Testovoe/Основное/ДанныеПользователя.yaml create mode 100644 Koncept/Testovoe/Основное/ДемонстрационноеПриложение.xbsl create mode 100644 Koncept/Testovoe/Основное/ДемонстрационноеПриложение.yaml create mode 100644 Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.xbsl create mode 100644 Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.yaml create mode 100644 Koncept/Testovoe/Основное/КлючДоступаМенеджера.xbsl create mode 100644 Koncept/Testovoe/Основное/КлючДоступаМенеджера.yaml create mode 100644 Koncept/Testovoe/Основное/КлючДоступаРуководителя.xbsl create mode 100644 Koncept/Testovoe/Основное/КлючДоступаРуководителя.yaml create mode 100644 Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.xbsl create mode 100644 Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.yaml create mode 100644 Koncept/Testovoe/Основное/Локализация/En/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Основное/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДанными.yaml create mode 100644 Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДаннымиДляПользователя.yaml create mode 100644 Koncept/Testovoe/Основное/ПанельНавигации.yaml create mode 100644 Koncept/Testovoe/Основное/Подсистема.yaml create mode 100644 Koncept/Testovoe/Основное/ПользователиКлиентИСервер.xbsl create mode 100644 Koncept/Testovoe/Основное/ПользователиКлиентИСервер.yaml create mode 100644 Koncept/Testovoe/Основное/ПутеводительПоПроекту.xbsl create mode 100644 Koncept/Testovoe/Основное/ПутеводительПоПроекту.yaml create mode 100644 Koncept/Testovoe/Основное/Ресурсы/Валюты.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/Логотип.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/Путеводитель.json create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РазделГлавнаяСтраница.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РазделНастройки.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РазделПутеводитель.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РазделСервис.svg create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияЗаключенДоговор.png create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияОтказано.png create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияПервичныйКонтакт.png create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияПереговоры.png create mode 100644 Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияСделаноПредложение.png create mode 100644 Koncept/Testovoe/Основное/РольСотрудника.yaml create mode 100644 Koncept/Testovoe/Основное/Сотрудники.xbsl create mode 100644 Koncept/Testovoe/Основное/Сотрудники.yaml create mode 100644 Koncept/Testovoe/Основное/Сотрудники.Объект.xbsl create mode 100644 Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Основное/СотрудникиФормаСписка.yaml create mode 100644 Koncept/Testovoe/Пресейл/ВидСтадииСделки.yaml create mode 100644 Koncept/Testovoe/Пресейл/ДанныеСделки.yaml create mode 100644 Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.xbsl create mode 100644 Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.yaml create mode 100644 Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.xbsl create mode 100644 Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.yaml create mode 100644 Koncept/Testovoe/Пресейл/ЗаписанаСделка.yaml create mode 100644 Koncept/Testovoe/Пресейл/Клиенты.xbsl create mode 100644 Koncept/Testovoe/Пресейл/Клиенты.yaml create mode 100644 Koncept/Testovoe/Пресейл/Клиенты.Объект.xbsl create mode 100644 Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Пресейл/КлиентыФормаСписка.yaml create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛица.xbsl create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛица.yaml create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛица.Объект.xbsl create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаСписка.yaml create mode 100644 Koncept/Testovoe/Пресейл/Локализация/En/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Пресейл/ЛокализованныеСтроки.yaml create mode 100644 Koncept/Testovoe/Пресейл/ОтчетОПродажах.yaml create mode 100644 Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.xbql create mode 100644 Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.yaml create mode 100644 Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.xbsl create mode 100644 Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.yaml create mode 100644 Koncept/Testovoe/Пресейл/ОшибкаНастроекПользователя.yaml create mode 100644 Koncept/Testovoe/Пресейл/Подсистема.yaml create mode 100644 Koncept/Testovoe/Пресейл/Ресурсы/ОбучающиеПодсказки/Приветствие.png create mode 100644 Koncept/Testovoe/Пресейл/Ресурсы/РазделПресейл.svg create mode 100644 Koncept/Testovoe/Пресейл/Ресурсы/Справочник.svg create mode 100644 Koncept/Testovoe/Пресейл/Сделки.xbsl create mode 100644 Koncept/Testovoe/Пресейл/Сделки.yaml create mode 100644 Koncept/Testovoe/Пресейл/Сделки.Объект.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СделкиHttpСервис.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СделкиHttpСервис.yaml create mode 100644 Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Пресейл/СделкиФормаСписка.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СделкиФормаСписка.yaml create mode 100644 Koncept/Testovoe/Пресейл/СтадииСделок.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СтадииСделок.yaml create mode 100644 Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.xbsl create mode 100644 Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.yaml create mode 100644 Koncept/Testovoe/Пресейл/СтадииСделокФормаСписка.yaml create mode 100644 Koncept/Testovoe/Пресейл/Услуги.xbsl create mode 100644 Koncept/Testovoe/Пресейл/Услуги.yaml create mode 100644 Koncept/Testovoe/Пресейл/УслугиФормаСписка.yaml create mode 100644 Koncept/Testovoe/Проект.xbsl create mode 100644 Koncept/Testovoe/Проект.yaml delete mode 100644 LICENSE delete mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b02dcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.theia +/.vscode \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/Задачи.xbsl b/Koncept/Testovoe/Мероприятия/Задачи.xbsl new file mode 100644 index 0000000..174750d --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Задачи.xbsl @@ -0,0 +1,80 @@ +импорт Основное +импорт Пресейл + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<Задачи.ДанныеРасчетаРазрешений>): ЧитаемоеСоответствие<Задачи.ДанныеРасчетаРазрешений, ЧитаемаяКоллекция<РазрешениеДоступа>> + знч СделкиЗадач = Объекты + .Фильтровать(Объект -> Объект.Владелец != Неопределено) + .Преобразовать(Объект -> Объект.Владелец!) + + знч РегионыСделок = Сделки.ПолучитьРегионыСделок(СделкиЗадач) + + знч Результат = <Задачи.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[] + + Разрешения.Добавить(ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя()) + + знч Регион = РегионыСделок.ПолучитьИлиУмолчание(Объект.Владелец) + + если Регион != Неопределено + Разрешения.Добавить( + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Регион)], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) + ) + ; + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; + +@ВПроекте +метод КоличествоОткрытыхЗадачСотрудника(Сотрудник: Сотрудники.Ссылка): ЧитаемоеСоответствие<СтатусМероприятия, Число> + знч Запрос = Запрос{ + ВЫБРАТЬ + Статус КАК Статус, + КОЛИЧЕСТВО(*) КАК КоличествоЗадач + ИЗ + Задачи + ГДЕ + Ответственный == %Сотрудник + И Статус В (СтатусМероприятия.Запланировано, СтатусМероприятия.ВПроцессе) + СГРУППИРОВАТЬ ПО + Статус + } + + знч ЗадачиПоНаправлениям = <СтатусМероприятия, Число>{ + СтатусМероприятия.Запланировано : 0, + СтатусМероприятия.ВПроцессе : 0 + } + + исп РезультатЗапроса = Запрос.Выполнить() + для СтрокаРезультата из РезультатЗапроса + ЗадачиПоНаправлениям.Вставить(СтрокаРезультата.Статус, СтрокаРезультата.КоличествоЗадач) + ; + + возврат ЗадачиПоНаправлениям +; + +@ВПодсистеме +метод ПолучитьЗадачиСотрудника(Сотрудник: Сотрудники.Ссылка): ЧитаемыйМассив<Задачи.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Задачи КАК Задачи + ГДЕ + Ответственный == %Сотрудник + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; diff --git a/Koncept/Testovoe/Мероприятия/Задачи.yaml b/Koncept/Testovoe/Мероприятия/Задачи.yaml new file mode 100644 index 0000000..ebb8ec4 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Задачи.yaml @@ -0,0 +1,78 @@ +ВидЭлемента: Справочник +Ид: 406e6ddd-779f-42c3-8272-5a50d0974dc2 +Имя: Задачи +ОбластьВидимости: ВПроекте +Импорт: + - Основное + - Пресейл +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Владелец +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.Задачи + Форма: ЗадачиФормаСписка + Объект: + Представление: $ЛокализованныеСтроки.Задача + Форма: ЗадачиФормаОбъекта +Представление: Наименование +Реквизиты: + - + Имя: Код + Тип: Строка + Длина: 20 + Автонумерация: + Формат: + РазделительПрефикса: "-" + ДлинаПрефикса: -1 + Префикс: ДЕМО + - + Имя: Наименование + Длина: 100 + НезаполненноеЗначение: ЗапретитьВсегда + - + Имя: Владелец + Тип: Сделки.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 83e6d427-a1b3-4c67-8839-f611e812c5cc + Имя: ДатаСоздания + Тип: Момент + НезаполненноеЗначение: ЗапретитьВсегда + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 032807ca-8fbb-43fe-93e5-28b151fa187b + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 1a68d1aa-d5aa-47a9-8fd6-b5c8c714c30e + Имя: Описание + Тип: Строка + - + Ид: e963b98d-e66d-4447-912d-fd6eea07de87 + Имя: ДатаНачала + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 67b99b06-e049-4dd3-8f6d-a9941e2e9066 + Имя: ДатаЗавершения + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 57b437d2-5747-4fc5-a4a9-89450a276aac + Имя: Статус + Тип: СтатусМероприятия? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 29cc7ab3-162e-46cb-a097-200e1bf2de95 + Имя: Приоритет + Тип: ПриоритетЗадачи + ИспользоватьВПолнотекстовомПоиске: Ложь +Индексы: + - + Имя: Ответственный + Поля: + - Ответственный diff --git a/Koncept/Testovoe/Мероприятия/Задачи.Объект.xbsl b/Koncept/Testovoe/Мероприятия/Задачи.Объект.xbsl new file mode 100644 index 0000000..ab36e3a --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Задачи.Объект.xbsl @@ -0,0 +1,14 @@ +импорт Основное + +@Обработчик +метод ПриЗаполнении() + Ответственный = ПользователиКлиентИСервер.ПолучитьТекущегоСотрудника() + Статус = СтатусМероприятия.Запланировано +; + +@ВПроекте +метод Завершить() + Статус = СтатусМероприятия.Завершено + ДатаЗавершения = Момент.Сейчас() + Записать() +; diff --git a/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.xbsl b/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.xbsl new file mode 100644 index 0000000..ae9946c --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.xbsl @@ -0,0 +1,58 @@ +импорт Основное +импорт Пресейл + +@Обработчик +метод ПослеЧтения() + если ЭтоНовый() + Объект.Владелец = Сделка + ; +; + +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Владелец == Неопределено + Компоненты.ПолеВводаСделка.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаСделка.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Статус == Неопределено + Компоненты.ПолеВводаСтатус.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаСтатус.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; + + если ЭтоНовый() + Объект.ДатаСоздания = Момент.Сейчас() + иначе + ПоказыватьУведомление = Ложь + ; +; + +@Обработчик +метод ПослеЗаписиОбъекта() + ЗаписанаЗадача.Оповестить() + + если ПоказыватьУведомление + знч Уведомление = новый Уведомление(ЛокализованныеСтроки.СозданиеЗадачи(), ЛокализованныеСтроки.СозданаЗадача(Объект.Наименование)) + Уведомление.Данные = КлючОбъекта + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() + ; +; + +@Обработчик +метод ПослеУдаленияОбъекта(ПараметрыУдаления: Объект) + ЗаписанаЗадача.Оповестить() +; diff --git a/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.yaml b/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.yaml new file mode 100644 index 0000000..e5ba94b --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗадачиФормаОбъекта.yaml @@ -0,0 +1,90 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: f24541dc-7bc3-4a83-96e0-d7c6db75df4d +Имя: ЗадачиФормаОбъекта +ОбластьВидимости: ВПроекте +Импорт: + - Основное + - Пресейл +Свойства: + - + Имя: Сделка + Тип: Сделки.Ссылка? + - + Имя: ПоказыватьУведомление + Тип: Булево + ЗначениеПоУмолчанию: Истина +Наследует: + Тип: ФормаОбъекта<Задачи.Объект> + Заголовок: $ЛокализованныеСтроки.Задача + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Записать + - =Удалить + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Двойная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Код + Доступность: Ложь + Значение: =Объект.Код + - + Тип: ПолеВвода<Сделки.Ссылка?> + Имя: ПолеВводаСделка + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + Доступность: =(Сделка == Неопределено) + Значение: =Объект.Владелец + НастройкиВводаСсылок: + НастройкиПоТипу: + - + Ключ: Сделки.Ссылка + Значение: + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Стадия.Вид + ВидСравнения: Равно + Значение: + Тип: ВидСтадииСделки + Значение: Активна + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + ШиринаВКолонках: Двойная + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Описание + Значение: =Объект.Описание + НастройкиВводаСтроки: + Многострочная: Истина + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Ответственный + Значение: =Объект.Ответственный + - + Тип: ПолеВвода<ПриоритетЗадачи> + Заголовок: $ЛокализованныеСтроки.Приоритет + Значение: =Объект.Приоритет + - + Тип: ПолеВвода<СтатусМероприятия?> + Имя: ПолеВводаСтатус + Заголовок: $ЛокализованныеСтроки.Статус + Значение: =Объект.Статус + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Момент> + Заголовок: $ЛокализованныеСтроки.ДатаЗавершения + Значение: =Объект.ДатаЗавершения diff --git a/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.xbsl b/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.xbsl new file mode 100644 index 0000000..3693926 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.xbsl @@ -0,0 +1,73 @@ +импорт Общие +импорт Основное + +конст ИМЯ_ФАЙЛА_ВЫГРУЗКИ = "Задачи.xls" + +метод ПриЧтенииНастроекТаблицы(Источник: Таблица<ДинамическийСписок>, Событие: СобытиеСДанными<Массив<СохраненнаяНастройкаТаблицы>>) + знч НастройкаМоиЗадачи = новый СохраненнаяНастройкаТаблицы("Мои задачи") + + НастройкаМоиЗадачи.Фильтр.Элементы.Добавить(новый ЭлементФильтра( + Поле = "Статус", + ВидСравнения = ВидСравнения.ВСписке, + Значение = новый Массив<СтатусМероприятия>([СтатусМероприятия.Запланировано, СтатусМероприятия.ВПроцессе]), + Использовать = Истина + )) + + знч Сотрудник = ПользователиКлиентИСервер.ПолучитьТекущегоСотрудника() + если Сотрудник != Неопределено + НастройкаМоиЗадачи.Фильтр.Элементы.Добавить(новый ЭлементФильтра( + Поле = "Ответственный", + ВидСравнения = ВидСравнения.Равно, + Значение = Сотрудник, + Использовать = Истина + )) + ; + + НастройкаМоиЗадачи.Сортировка.Добавить(новый ЭлементСортировки( + Поле = "ДатаСоздания", + НаправлениеСортировки = НаправлениеСортировки.ПоУбыванию + )) + + Событие.Данные.Добавить(НастройкаМоиЗадачи) +; + +@Обработчик +метод ПослеСоздания() + ТекущийСотрудник = ПользователиКлиентИСервер.ПолучитьТекущегоСотрудника() +; + +метод ОтмеченныеЗадачиВЗавершенные(Команда: КомандаСПараметром<Массив<Сущность.Ключ>>, Отмеченные: Массив<Сущность.Ключ>) + знч Задачи = Отмеченные.Преобразовать(Задача -> Задача как Задачи.Ссылка) + + Компоненты.ТаблицаСписка.ОчиститьОтмеченныеСтроки() + ЗавершитьЗадачи(Задачи) + Компоненты.ТаблицаСписка.Обновить() + + знч Уведомление = новый Уведомление(ЛокализованныеСтроки.ЗавершениеЗадач(), ЛокализованныеСтроки.ЗадачиПомеченыКакЗавершенные()) + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() +; + +метод ОтмеченныеЗадачиВФайл(Команда: КомандаСПараметром<Массив<Сущность.Ключ>>, Отмеченные: Массив<Сущность.Ключ>) + знч Задачи = Отмеченные.Преобразовать(Задача -> Задача как Задачи.Ссылка) + + знч ДвоичнаяСсылка = МероприятияКлиентИСервер.ВыгрузитьЗадачиВExcel(Задачи) + ВыгрузкаФайлов.НачатьВыгрузку(ДвоичнаяСсылка, ИМЯ_ФАЙЛА_ВЫГРУЗКИ) +; + +метод МоиЗадачиВФайлПриНажатии(Команда: ОбычнаяКоманда) + если ТекущийСотрудник != Неопределено + знч ДвоичнаяСсылка = МероприятияКлиентИСервер.ВыгрузитьЗадачиСотрудникаВExcel(ТекущийСотрудник) + ВыгрузкаФайлов.НачатьВыгрузку(ДвоичнаяСсылка, ИМЯ_ФАЙЛА_ВЫГРУЗКИ) + ; +; + +@НаСервере @ДоступноСКлиента +статический метод ЗавершитьЗадачи(Задачи: Массив<Задачи.Ссылка>) + для Задача из Задачи + знч ЗадачаОбъект = Задача.ЗагрузитьОбъект() + если ЗадачаОбъект.Статус != СтатусМероприятия.Завершено + ЗадачаОбъект.Завершить() + ; + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.yaml b/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.yaml new file mode 100644 index 0000000..96cc968 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗадачиФормаСписка.yaml @@ -0,0 +1,137 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: bc76475a-3766-4064-8247-954b95ad46cd +Имя: ЗадачиФормаСписка +ОбластьВидимости: ВПроекте +Импорт: + - Общие + - Основное +Свойства: + - + Имя: ТекущийСотрудник + Тип: Сотрудники.Ссылка? +Наследует: + Тип: ФормаСписка + Заголовок: $ЛокализованныеСтроки.Задачи + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + ДополнительныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Представление: $ЛокализованныеСтроки.МоиЗадачиВФайл + Изображение: СкачатьВКруге.svg + Доступность: =ТекущийСотрудник != Неопределено + Обработчик: МоиЗадачиВФайлПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Задачи + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец.Клиент + Псевдоним: Владелец_Клиент + Представление: Клиент + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + Представление: Сделка + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Приоритет + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаЗавершения + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Статус + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + ПрокруткаПоВертикали: Истина + ОтображатьНастройки: Истина + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + КомандыНадОтмеченнымиСтроками: + Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сущность.Ключ>>> + Элементы: + - + Тип: КомандаСПараметром<Массив<Сущность.Ключ>> + Представление: $ЛокализованныеСтроки.ВЗавершенные + Изображение: Галочка.svg + Обработчик: ОтмеченныеЗадачиВЗавершенные + - + Тип: КомандаСПараметром<Массив<Сущность.Ключ>> + Представление: $ЛокализованныеСтроки.ВыгрузитьВФайл + Изображение: Скачать.svg + Обработчик: ОтмеченныеЗадачиВФайл + ИспользоватьОтметкиСтрок: Истина + ПриЧтенииНастроекТаблицы: ПриЧтенииНастроекТаблицы + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаСоздания + ПолеЗначения: ДатаСоздания + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Клиент + ПолеЗначения: Владелец_Клиент + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + ПолеЗначения: Владелец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Приоритет + ПолеЗначения: Приоритет + Вид: Значок + Цвет: =(ДанныеСтроки.Данные["Приоритет"] как ПриоритетЗадачи).ПолучитьЦвет() + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Ответственный + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Статус + ПолеЗначения: Статус + Вид: Значок + Цвет: =(ДанныеСтроки.Данные["Статус"] как СтатусМероприятия).ПолучитьЦвет() + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код diff --git a/Koncept/Testovoe/Мероприятия/ЗаписанаЗадача.yaml b/Koncept/Testovoe/Мероприятия/ЗаписанаЗадача.yaml new file mode 100644 index 0000000..98f000d --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗаписанаЗадача.yaml @@ -0,0 +1,4 @@ +ВидЭлемента: ГлобальноеКлиентскоеСобытие +Ид: 1966d887-44a4-4954-871d-47b769ecd557 +Имя: ЗаписанаЗадача +ОбластьВидимости: ВПроекте diff --git a/Koncept/Testovoe/Мероприятия/ЗаписаноСобытие.yaml b/Koncept/Testovoe/Мероприятия/ЗаписаноСобытие.yaml new file mode 100644 index 0000000..7bf0be1 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЗаписаноСобытие.yaml @@ -0,0 +1,4 @@ +ВидЭлемента: ГлобальноеКлиентскоеСобытие +Ид: 5a365589-8804-43f6-82a6-841728aac4e1 +Имя: ЗаписаноСобытие +ОбластьВидимости: ВПроекте diff --git a/Koncept/Testovoe/Мероприятия/Локализация/En/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Мероприятия/Локализация/En/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..df5514f --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Локализация/En/ЛокализованныеСтроки.yaml @@ -0,0 +1,62 @@ +Строки: + Мероприятия: Activities + Задачи: Tasks + События: Events + Задача: Task + ДобавитьЗадачу: Add task + МоиЗадачи: My tasks + Событие: Event + ДатаСоздания: Creation date + ДатаНачала: Start date + ДатаЗавершения: Due date + Описание: Description + Ответственный: Assigned to + Статус: Status + Код: Code + Наименование: Name + ВЗавершенные: To completed + Участники: Participants + Участник: Participant + ДобавитьУчастника: Add participant + УдалитьУчастника: Delete participant + ВыберитеУчастника: Select participant + НоваяЗадача: New task + НовоеСобытие: New event + ДобавлениеУчастника: Adding participant + Роль: Role + Добавить: Add + Сохранить: Save + Создать: Create + Удалить: Delete + Завершить: Complete + СозданиеЗадачи: Task creation + ЗавершениеЗадач: Tasks completion + ЗавершениеМероприятия: Activity completion + ЗадачиПомеченыКакЗавершенные: Selected tasks are marked as completed + СозданиеСобытия: Event creation + УдалениеМероприятия: Removing an activity + ДобавитьМероприятие: Add an activity + ДляСозданияМероприятийСохранитеСделку: Save the deal to create activities + ДляСозданияНажмитеДобавитьМероприятие: To create press Add an activity + ВсеМероприятия: All activities + Сегодня: Today + Запланировано: Is planned + ВПроцессе: In progress + Завершено: Completed + Отменено: Canceled + Организатор: Organizer + ПриглашенныйУчастник: Guest + НетМероприятийПоСделке: No deal activities + Приоритет: Priority + Низкий: Low + Обычный: Normal + Высокий: High + МоиЗадачиВФайл: My tasks to file + ВыгрузитьВФайл: Save to file + НетУчастниковСобытия: You have not added any participant yet... +Шаблоны: + СозданаЗадача: "Task \"$0\" created" + СозданоСобытие: "Event \"$0\" created" + МероприятиеЗавершено: "Activity \"$0\" completed" + ПодтвеждениеУдаленияСобытия: "Are you sure you want to delete event \"$0\"?" + ПодтвеждениеУдаленияЗадачи: "Are you sure you want to delete task \"$0\"?" \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Мероприятия/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..2539e3b --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ЛокализованныеСтроки.yaml @@ -0,0 +1,68 @@ +ВидЭлемента: ЛокализованныеСтроки +Ид: d0adc076-d030-4546-bd1a-8b497668b0fc +Имя: ЛокализованныеСтроки +ОбластьВидимости: ВПроекте +Строки: + Мероприятия: Мероприятия + Задачи: Задачи + События: События + Задача: Задача + ДобавитьЗадачу: Добавить задачу + МоиЗадачи: Мои задачи + Событие: Событие + ДатаСоздания: Дата создания + ДатаНачала: Дата начала + ДатаЗавершения: Дата завершения + Описание: Описание + Ответственный: Ответственный + Статус: Статус + Код: Код + Наименование: Наименование + НеВыбрано: Не выбрано + ПодсказкаПоляПоискаМероприятий: Код, клиент, сделка или наименование + ВЗавершенные: В завершенные + Участники: Участники + Участник: Участник + ДобавитьУчастника: Добавить участника + УдалитьУчастника: Удалить участника + ВыберитеУчастника: Выберите участника + НоваяЗадача: Новая задача + НовоеСобытие: Новое событие + ДобавлениеУчастника: Добавление участника + Роль: Роль + Добавить: Добавить + Сохранить: Сохранить + Создать: Создать + Удалить: Удалить + Завершить: Завершить + СозданиеЗадачи: Создание задачи + ЗавершениеЗадач: Завершение задач + ЗавершениеМероприятия: Завершение мероприятия + ЗадачиПомеченыКакЗавершенные: Выбранные задачи помечены как завершенные + СозданиеСобытия: Создание события + УдалениеМероприятия: Удаление мероприятия + ДобавитьМероприятие: Добавить мероприятие + ДляСозданияМероприятийСохранитеСделку: Для создания мероприятий сохраните сделку + ДляСозданияНажмитеДобавитьМероприятие: Для создания нажмите Добавить мероприятие + ВсеМероприятия: Все мероприятия + Сегодня: Сегодня + Запланировано: Запланировано + ВПроцессе: В процессе + Завершено: Завершено + Отменено: Отменено + Организатор: Организатор + ПриглашенныйУчастник: Приглашенный участник + НетМероприятийПоСделке: Нет мероприятий по сделке + Приоритет: Приоритет + Низкий: Низкий + Обычный: Обычный + Высокий: Высокий + МоиЗадачиВФайл: Мои задачи в файл + ВыгрузитьВФайл: Выгрузить в файл + НетУчастниковСобытия: Вы не добавили ещё ни одного участника... +Шаблоны: + СозданаЗадача: "Создана задача \"$0\"" + СозданоСобытие: "Создано событие \"$0\"" + МероприятиеЗавершено: "Мероприятие \"$0\" завершено" + ПодтвеждениеУдаленияСобытия: "Вы уверены, что хотите удалить событие \"$0\"" + ПодтвеждениеУдаленияЗадачи: "Вы уверены, что хотите удалить задачу \"$0\"" diff --git a/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.xbsl b/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.xbsl new file mode 100644 index 0000000..5a62a45 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.xbsl @@ -0,0 +1,72 @@ +импорт Основное + +@ВПодсистеме +@НаСервере @ДоступноСКлиента +метод ВыгрузитьЗадачиСотрудникаВExcel(Сотрудник: Сотрудники.Ссылка): ДвоичныйОбъект.Ссылка + знч ЗадачиСотрудника = Задачи.ПолучитьЗадачиСотрудника(Сотрудник) + возврат ВыгрузитьЗадачиВExcel(ЗадачиСотрудника) +; + +@ВПодсистеме +@НаСервере @ДоступноСКлиента +метод ВыгрузитьЗадачиВExcel(Задачи: ЧитаемыйМассив<Задачи.Ссылка>): ДвоичныйОбъект.Ссылка + знч МакетДанные = Ресурс{МакетТаблицыЗадач.mxl}.ОткрытьПотокЧтения() + пер Макет = ТабличныйДокумент.Прочитать(МакетДанные) + МакетДанные.Закрыть() + + знч ИтоговыйТабличныйДокумент = новый ТабличныйДокумент() + знч Писатель = ИтоговыйТабличныйДокумент.Запись + + знч ЗапросДанныхЗадач = новый ПроизвольныйЗапрос( + "ВЫБРАТЬ + ДатаСоздания КАК Дата, + Владелец КАК Сделка, + Наименование, + Приоритет, + Статус, + Код + ИЗ + Задачи + ГДЕ + Ссылка В (&МассивСсылок)") + + знч ШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы") + знч СтрокаТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы") + + Писатель.ВывестиВертикально(ШапкаТаблицы) + + пер Счетчик = 0 + знч РазмерПакета = 500 + + пока Счетчик < Задачи.Размер() + знч ВерхняяГраница = Мин(Счетчик + РазмерПакета, Задачи.Размер()) + знч ПакетСсылок = Задачи.ПодМассив(Счетчик, ВерхняяГраница) + ЗапросДанныхЗадач.УстановитьПараметр("МассивСсылок", ПакетСсылок) + + исп ДанныеЗадач = ЗапросДанныхЗадач.Выполнить() + + для ДанныеЗадачи из ДанныеЗадач + знч ОбластьСтроки = СтрокаТаблицы.ВВыводимуюОбласть() + + знч ПараметрыОбласти: Соответствие<Строка, Объект> = { + "Дата": ДанныеЗадачи.Дата.Представление(), + "Сделка": ДанныеЗадачи.Сделка.Представление(), + "Наименование": ДанныеЗадачи.Наименование, + "Приоритет": ДанныеЗадачи.Приоритет.Представление(), + "Статус": ДанныеЗадачи.Статус.Представление(), + "Код": ДанныеЗадачи.Код + } + + ОбластьСтроки.ЗаполнитьПараметры(ПараметрыОбласти) + Писатель.ВывестиВертикально(ОбластьСтроки) + + Счетчик += 1 + ; + ; + + знч БайтыТаблицы = ИтоговыйТабличныйДокумент.ЭкспортироватьВБайты(ФорматЭкспортаТабличногоДокумента.Xls) + знч СвойстваДвоичногоОбъекта = новый ДвоичныйОбъект.Свойства("ВыгрузкаЗадач").Временные() + знч Результат = ОбъектноеХранилище.ЗагрузитьИзБайт(Байты = БайтыТаблицы, Свойства = СвойстваДвоичногоОбъекта) + + возврат Результат.Ссылка +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.yaml b/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.yaml new file mode 100644 index 0000000..af584d9 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/МероприятияКлиентИСервер.yaml @@ -0,0 +1,6 @@ +ВидЭлемента: ОбщийМодуль +Ид: e33f6f48-7b80-47ff-b660-130903607243 +Имя: МероприятияКлиентИСервер +ОбластьВидимости: ВПодсистеме +Окружение: КлиентИСервер + diff --git a/Koncept/Testovoe/Мероприятия/Подсистема.yaml b/Koncept/Testovoe/Мероприятия/Подсистема.yaml new file mode 100644 index 0000000..6c5f839 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Подсистема.yaml @@ -0,0 +1,4 @@ +Использование: + - Общие + - Основное + - Пресейл \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.xbsl b/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.xbsl new file mode 100644 index 0000000..712fadb --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.xbsl @@ -0,0 +1,15 @@ +/** + Описание: + Определение цвета фона бейджа, соответствующего приоритету задачи + */ +@ВПроекте +метод ПолучитьЦвет(): Цвет | Авто + выбор этот + когда Низкий + возврат Цвета.Желтый + когда Обычный + возврат Цвета.Синий + когда Высокий + возврат Цвета.Красный + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.yaml b/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.yaml new file mode 100644 index 0000000..16b6a98 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ПриоритетЗадачи.yaml @@ -0,0 +1,18 @@ +ВидЭлемента: Перечисление +Ид: 5d2a2b03-8c93-4af6-a9fa-db95c523fc6b +Имя: ПриоритетЗадачи +ОбластьВидимости: ВПроекте +Элементы: + - + Ид: e7aacd76-81ee-44eb-925c-dcb5918f93a1 + Имя: Низкий + Представление: $ЛокализованныеСтроки.Низкий + - + Ид: f9bbfe05-21e6-4a1d-b87a-2d0f1b071da0 + Имя: Обычный + Представление: $ЛокализованныеСтроки.Обычный + ПоУмолчанию: Истина + - + Ид: 09c77530-4c0a-4391-9146-2346084d969e + Имя: Высокий + Представление: $ЛокализованныеСтроки.Высокий diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/ЗадачаВРамке.svg b/Koncept/Testovoe/Мероприятия/Ресурсы/ЗадачаВРамке.svg new file mode 100644 index 0000000..42c3f09 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Ресурсы/ЗадачаВРамке.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/МакетТаблицыЗадач.mxl b/Koncept/Testovoe/Мероприятия/Ресурсы/МакетТаблицыЗадач.mxl new file mode 100644 index 0000000000000000000000000000000000000000..963b04a7bf7a52137772a28dd770ba0a26378484 GIT binary patch literal 1652 zcma)6y>8nu5O%jBXx<@UR~isW$&$yS=+>XLYsUhavIYWL2WW=?nKBh9igfB$w}??A zZsk`vK1p7o-yKC-@=t8bqR8X@eD~dvuim_U{^I4}@!-+m$>4smJg>CT#_HpvbM;hd zrFf}jNU&;yw^1K6Pl{}_y|GjR%4sy4c*d=7IfFq77n)h{fdm|$bN>r8~Ppc zr&)^Q1j)8I-~0zyHar5^%ukX{zSHK0bMO;?;XfwrVyE^OAi7O@%+rdYfU9MQtF?=u z0H&k(5I+G+NBK~CM%{ujoc-)M*M_(!9F|D20-u$3daQH2 zg&x;!8*(eghnqRJcA8t{2e7Do!(B$-@%}=`&HX2TsR9$yze8?e8DjJ`P_m4B($|W9 zz}s@K-;DhpmNEO~Q-kvlRGbAk5JJ^!TnPwY>yo!t%c{Q|_m@Tv`AXZ!aZPK);&2iO zAk#nQxrc+qJ=cJ9G$;?8nbH(aHmmk}akd=cijz=9mgQrp8dpLG8f$WA*>+QIEjP}l z+?c#4=UWcGB^J+}Dbn0n$mNRR*zgv+r_AEapwTSgxm>GfXYb#g%3aLNBeONDJXu9+ zG+f^(Y)D84&+suck@P5V;i?owD81Ay@Q0E!QxJtQhUtIBrXv!l031Zpe5k{JrOesj literal 0 HcmV?d00001 diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокМероприятий.svg b/Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокМероприятий.svg new file mode 100644 index 0000000..990d7b9 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокМероприятий.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокУчастников.png b/Koncept/Testovoe/Мероприятия/Ресурсы/ПустойСписокУчастников.png new file mode 100644 index 0000000000000000000000000000000000000000..007b313c74d6615e59187ff5bad0592b62e2e965 GIT binary patch literal 2690 zcmb`JX*3&H8^;r3joNo@w8o&dmr`4lNi0p#qO=;dMC>6d)yPC>)fm$n?I^9iqH1fA zS{g!7MWb3(Tg4I-wS^dzkn);$zPxkZnGf$d?>*Ri`62MbV; zjgt)kKuH7h`~(01Q3XesjXNI59*+wj*gPV{*|K8QHEYjGf}(ue*2Lg~h@T9>Zrrel z_o-;NbSL-#CO$kAk9EGAby+eTU}$Tj-X6g4pPRoWfsi+i@=rJWr5 zn^Fv@o5%ok}KGH7c_a-FFJ)|p6OQ(!qT+o z16mOo){?E=*~+D1L9MEQ`*KVWa!`#(*mawWt{MibY1b~2w~0_$wUCXB^$c%FsXiq6 zqB9C<7Sv8b=Y1ke?0sEj*`ZKH#r2^{zL74grL6AB}QoI+2vH*QuCRbpkBcRCtRz79x@pEhQ4i;`44w2#R)bJ z%}>bf55|}{iLv=BZ^doDky;+#QZu)(urdBH(-WZV$;1!KJt2>O(>EKB0KGDr+PLH+ zTJgThn%6DGo7)_g5(Z(H8n0h!ZtTvab%o&5r8!8wJ74=X`?y;zn=Nx9Nd{jkShl|9 zb)xP^j^yD(_7SJ|I&%WE>V90It7v=Z1W`jIb%)6?HLFq!oN#0lSDr{xUD@5+;-p%v z&e#bn+rCZkY1-B|Ha2d>;KEEM_7fUH?@c|O3RdC>faQIcGT+Vr3ggUPi7mOHk%zgTE>pbF|qo&A$m@1 zmo9o^fXWywhEkaqeLUn9`#a9?VTKbG2&Y`p5ar%n8w3I|5mPWuC7DL%;LM9IjtFlS z+y^Q+vx|t^g-&zZT&y{*k@NdhyE&%riDkF~cCd;b%VtWkJU83Y=sPEt62WcV9-k-I zsC7(ykM|~AGHhRV1h&UiGb_@6w3sSJ(9JogHWUNNqF1j~-(QD&K)0Dmxz~6kdN2)7g8D@Bxv9Ka7drNmQC7BB9oE6BOWH`NIA;?PO~x z^H)!8B=7+<7H^)Czj>qnuVjT-;tv zgN|CzehR%leye51I8eMoUjHV|^3i@3mNupIK|@i@e{H(sk=XGfL`O>gM~@k8Du0Hl z&dErVbw;3(gI%MLz}W02IrKtm-RujbG(z4xPp?}GcsM3|+!FV(jpKS@B!X;z{kR^I z>N}AuZl7n6>3C%+hB`R1+Q>^bhPost%2-X8ozfa5?K~;&@ZgrN+R6pSVNamz!PIPk zXmb0UGmq%r3bwj%>uhp8&^i)lG(b@=Xj$ttj6=fV0{Nfn&y^}|&jpf>$hUhPx9wX~6A1Lo0JU;l6 zmmqPjCkwx!X>I4^bV$#ee%qTCx;9b3vNyNd@sfY>kRd`fE;}74BcC3qC#u zT@q^Y@bpBDX1=>rAFc#7+ZPE93yYfTu|KLD?7A}%~4whFNi6n=BLQ zL(4DDm1XmhZ`P`6xQ}PNOS2BlkBqf)ffwx;#kCG*5Ie=fW+&c|sO*1G7MW%UGUF^H z*S#$`C`&AHu8LdLL z_0~rQaRZLkir|BS6k=9KP|*09sbqsVG1|3PZYBPe9p*`-7FG3R6QGNR41Rycah=<| zHDUBL!ROFopsplG;snTRaoJ<=tRIjU#aWww^;=gIRyq}^+4l*qBm@Cn*-_;1m0`Cw zHbRa1_-h7`N}7Z>=BF+e49=WbsSX)Y{Mz`LK0=tE5#F*Bw~qJp`IWV z6c}F%iG2!Ibitv2Y)s6t7K}H^>7Z#&{NUy$qk-_eVS3f<8i*1s=FY4IQyW7er?CK- zN3aa%%+Z7l?XX`abR9~JP?Z=mGoBY!vqm|7KBQk`a`E(iAIn{xUv!o49D}&rT|hN9 zHddp$#BnO#atoET2zgv*P7fa_(I$MP5nl0;k@T@yTAu$Z;3Damtk})7s$G9J?yvTw z=9@ubEXiW|Mr~IBw!CT+6kmo>#nyq2wzm6dz7EKhdaX_6f~zK7DH8vSvHB(?e5iew Uly|T1z%l|H;m)v1Ti;v%0;j77Y5)KL literal 0 HcmV?d00001 diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/РазделМероприятия.svg b/Koncept/Testovoe/Мероприятия/Ресурсы/РазделМероприятия.svg new file mode 100644 index 0000000..e2e3039 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Ресурсы/РазделМероприятия.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Мероприятия/Ресурсы/СобытиеВРамке.svg b/Koncept/Testovoe/Мероприятия/Ресурсы/СобытиеВРамке.svg new file mode 100644 index 0000000..13858ce --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/Ресурсы/СобытиеВРамке.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Koncept/Testovoe/Мероприятия/РольУчастникаМероприятия.yaml b/Koncept/Testovoe/Мероприятия/РольУчастникаМероприятия.yaml new file mode 100644 index 0000000..f9615be --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/РольУчастникаМероприятия.yaml @@ -0,0 +1,13 @@ +ВидЭлемента: Перечисление +Ид: 73931242-dfc4-439d-a12b-a3ec3fa217f6 +Имя: РольУчастникаМероприятия +ОбластьВидимости: ВПроекте +Элементы: + - + Ид: a97101d2-8516-4e66-99e7-039aa2a5a638 + Имя: Организатор + Представление: $ЛокализованныеСтроки.Организатор + - + Ид: 9979d9b2-c75d-4503-ac37-0d56ec18bec8 + Имя: ПриглашенныйУчастник + Представление: $ЛокализованныеСтроки.ПриглашенныйУчастник diff --git a/Koncept/Testovoe/Мероприятия/События.xbsl b/Koncept/Testovoe/Мероприятия/События.xbsl new file mode 100644 index 0000000..0adf774 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/События.xbsl @@ -0,0 +1,38 @@ +импорт Основное +импорт Пресейл + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<События.ДанныеРасчетаРазрешений>): ЧитаемоеСоответствие<События.ДанныеРасчетаРазрешений, ЧитаемаяКоллекция<РазрешениеДоступа>> + знч СделкиСобытий = Объекты + .Фильтровать(Объект -> Объект.Владелец != Неопределено) + .Преобразовать(Объект -> Объект.Владелец!) + + знч РегионыСделок = Сделки.ПолучитьРегионыСделок(СделкиСобытий) + + знч Результат = <События.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[] + + Разрешения.Добавить(ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя()) + + знч Регион = РегионыСделок.ПолучитьИлиУмолчание(Объект.Владелец) + + если Регион != Неопределено + Разрешения.Добавить( + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Регион)], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) + ) + ; + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; diff --git a/Koncept/Testovoe/Мероприятия/События.yaml b/Koncept/Testovoe/Мероприятия/События.yaml new file mode 100644 index 0000000..0f93421 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/События.yaml @@ -0,0 +1,68 @@ +ВидЭлемента: Справочник +Ид: 17c884df-fd27-48d8-a6c5-75c87bf0e20f +Имя: События +ОбластьВидимости: ВПроекте +Импорт: + - Основное + - Пресейл +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Владелец +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.События + Форма: СобытияФормаСписка + Объект: + Представление: $ЛокализованныеСтроки.Событие + Форма: СобытияФормаОбъекта +Представление: Наименование +Реквизиты: + - + Имя: Код + Тип: Строка + Длина: 20 + Автонумерация: + Формат: + РазделительПрефикса: "-" + ДлинаПрефикса: -1 + Префикс: ДЕМО + - + Имя: Наименование + Длина: 100 + НезаполненноеЗначение: ЗапретитьВсегда + - + Имя: Владелец + Тип: Сделки.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: cdf1f408-87ed-4ed3-817e-991b530e5254 + Имя: ДатаСоздания + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: c1a16573-fef5-4a5f-8ca3-b6535cde5a70 + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 4b36c330-d385-4105-be72-52a2e5cadc40 + Имя: Описание + Тип: Строка + - + Ид: b676086f-3856-4a6b-8228-4fdb415c2c26 + Имя: ДатаНачала + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 67b99b06-e049-4dd3-8f6d-a9941e2e9066 + Имя: ДатаЗавершения + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: af2cc703-b11b-4f3e-a09c-c28408e12bca + Имя: Участники + Тип: Массив<УчастникиМероприятия> + ИспользоватьВПолнотекстовомПоиске: Ложь diff --git a/Koncept/Testovoe/Мероприятия/События.Объект.xbsl b/Koncept/Testovoe/Мероприятия/События.Объект.xbsl new file mode 100644 index 0000000..9bf30f2 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/События.Объект.xbsl @@ -0,0 +1,6 @@ +импорт Основное + +@Обработчик +метод ПриЗаполнении() + Ответственный = ПользователиКлиентИСервер.ПолучитьТекущегоСотрудника() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.xbsl b/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.xbsl new file mode 100644 index 0000000..f690917 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.xbsl @@ -0,0 +1,79 @@ +импорт Основное +импорт Пресейл + +@Обработчик +метод ПослеЧтения() + если ЭтоНовый() + Объект.Владелец = Сделка + ; +; + +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Владелец == Неопределено + Компоненты.ПолеВводаСделка.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаСделка.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; + + если ЭтоНовый() + Объект.ДатаСоздания = Момент.Сейчас() + иначе + ПоказыватьУведомление = Ложь + ; +; + +@Обработчик +метод ПослеЗаписиОбъекта() + ЗаписаноСобытие.Оповестить() + + если ПоказыватьУведомление + знч Уведомление = новый Уведомление(ЛокализованныеСтроки.СозданиеСобытия(), ЛокализованныеСтроки.СозданоСобытие(Объект.Наименование)) + Уведомление.Данные = КлючОбъекта + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() + ; +; + +@Обработчик +метод ПослеУдаленияОбъекта(ПараметрыУдаления: Объект) + ЗаписаноСобытие.Оповестить() +; + +метод ДобавитьУчастникаПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + знч Клиент = Объект.Владелец != Неопределено ? ПолучитьКлиентаСделки(Объект.Владелец) : Неопределено + знч ДанныеУчастника = ФормаДобавленияУчастника.ОткрытьВМодальномОкне(Клиент = Клиент) + если ДанныеУчастника это УчастникиМероприятия + ДобавитьУчастника(ДанныеУчастника) + ; +; + +метод УдалитьУчастникаПриНажатии(Команда: КомандаСПараметром<Массив<УчастникиМероприятия>>, Параметр: Массив<УчастникиМероприятия>) + УдалитьУчастника(Параметр.Единственный()) +; + +метод ДобавитьУчастника(Участник: УчастникиМероприятия) + если не Объект.Участники.Содержит(Участник) + Объект.Участники.Добавить(Участник) + ; +; + +метод УдалитьУчастника(Участник: УчастникиМероприятия) + Объект.Участники.Удалить(Участник) +; + +@НаСервере @ДоступноСКлиента +статический метод ПолучитьКлиентаСделки(Сделка: Сделки.Ссылка): Клиенты.Ссылка? + возврат Сделки.ПолучитьКлиентаСделки(Сделка) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.yaml b/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.yaml new file mode 100644 index 0000000..212186e --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/СобытияФормаОбъекта.yaml @@ -0,0 +1,127 @@ +ВидЭлемента: КомпонентИнтерфейса +ОбластьВидимости: ВПроекте +Ид: 83f7e7b2-f448-460a-806b-246ca1e9eff1 +Имя: СобытияФормаОбъекта +Импорт: + - Основное + - Пресейл +Свойства: + - + Имя: Сделка + Тип: Сделки.Ссылка? + - + Имя: ПоказыватьУведомление + Тип: Булево + ЗначениеПоУмолчанию: Истина +Наследует: + Тип: ФормаОбъекта<События.Объект> + Заголовок: $ЛокализованныеСтроки.Событие + РастягиватьПоВертикали: Истина + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Записать + - =Удалить + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Двойная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Код + Доступность: Ложь + Значение: =Объект.Код + - + Тип: ПолеВвода<Сделки.Ссылка?> + Имя: ПолеВводаСделка + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + Доступность: =(Сделка == Неопределено) + Значение: =Объект.Владелец + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Ответственный + Значение: =Объект.Ответственный + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Описание + Значение: =Объект.Описание + НастройкиВводаСтроки: + Многострочная: Истина + - + Тип: ПолеВвода<Момент> + Заголовок: $ЛокализованныеСтроки.ДатаНачала + Значение: =Объект.ДатаНачала + - + Тип: ПолеВвода<Момент> + Заголовок: $ЛокализованныеСтроки.ДатаЗавершения + Значение: =Объект.ДатаЗавершения + - + Тип: АвтоматическаяГруппа + Заголовок: $ЛокализованныеСтроки.Участники + Содержимое: + - + Тип: ФиксированнаяГруппа + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + Видимость: =Объект.Участники.Пусто() + Содержимое: + - + Тип: Картинка + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Изображение: ПустойСписокУчастников.png + - + Тип: Надпись + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Шрифт: =СтилевыеШрифты.Крупный + Значение: $Мероприятия::ЛокализованныеСтроки.НетУчастниковСобытия + - + Тип: Кнопка + Заголовок: $ЛокализованныеСтроки.ДобавитьУчастника + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Центр + ПриНажатии: ДобавитьУчастникаПриНажатии + - + Тип: Таблица<ИсточникДанныхМассив<УчастникиМероприятия>> + Имя: ТаблицаУчастников + РастягиватьПоВертикали: Ложь + ОтображатьШапку: Ложь + ИспользованиеПоиска: Ложь + Источник: + Данные: =Объект.Участники + КомандыСтроки: + Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<УчастникиМероприятия>>|КомандаСПараметром<УчастникиМероприятия>> + Элементы: + - + Тип: КомандаСПараметром<Массив<УчастникиМероприятия>> + Представление: $ЛокализованныеСтроки.УдалитьУчастника + Изображение: МусорнаяКорзинаКонтур.svg + Обработчик: УдалитьУчастникаПриНажатии + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<УчастникиМероприятия> + ПолеЗначения: Участник + - + Тип: СтандартнаяКолонкаТаблицы<УчастникиМероприятия> + ПолеЗначения: Роль + - + Тип: Кнопка + Заголовок: $ЛокализованныеСтроки.ДобавитьУчастника + Видимость: =не Объект.Участники.Пусто() + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Начало + Изображение: Плюс.svg + ПриНажатии: ДобавитьУчастникаПриНажатии diff --git a/Koncept/Testovoe/Мероприятия/СобытияФормаСписка.yaml b/Koncept/Testovoe/Мероприятия/СобытияФормаСписка.yaml new file mode 100644 index 0000000..438bb31 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/СобытияФормаСписка.yaml @@ -0,0 +1,98 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: e4ce8276-8ed2-4741-bd76-2a3706a15444 +Имя: СобытияФормаСписка +ОбластьВидимости: ВПроекте +Импорт: + - Общие +Наследует: + Тип: ФормаСписка + Заголовок: $ЛокализованныеСтроки.События + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + ИспользованиеПоиска: Ложь + Имя: ТаблицаСписка + ОтображатьНастройки: Истина + Источник: + ОсновнаяТаблица: + Таблица: События + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец.Клиент + Псевдоним: Владелец_Клиент + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + Представление: Клиент + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаНачала + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаЗавершения + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + ПрокруткаПоВертикали: Истина + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаСоздания + ПолеЗначения: ДатаСоздания + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаНачала + ПолеЗначения: ДатаНачала + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаЗавершения + ПолеЗначения: ДатаЗавершения + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Клиент + ПолеЗначения: Владелец_Клиент + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + ПолеЗначения: Владелец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Ответственный + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код diff --git a/Koncept/Testovoe/Мероприятия/СтатусМероприятия.xbsl b/Koncept/Testovoe/Мероприятия/СтатусМероприятия.xbsl new file mode 100644 index 0000000..4e0ce60 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/СтатусМероприятия.xbsl @@ -0,0 +1,17 @@ +/** + Описание: + Определение цвета фона бейджа, соответствующего статусу мероприятия + */ +@ВПроекте +метод ПолучитьЦвет(): Цвет | Авто + выбор этот + когда Запланировано + возврат Цвета.Желтый + когда ВПроцессе + возврат Цвета.Зеленый + когда Завершено + возврат Цвета.Синий + когда Отменено + возврат Цвета.Красный + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/СтатусМероприятия.yaml b/Koncept/Testovoe/Мероприятия/СтатусМероприятия.yaml new file mode 100644 index 0000000..94ab8b8 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/СтатусМероприятия.yaml @@ -0,0 +1,22 @@ +ВидЭлемента: Перечисление +Ид: 9780afad-b5e2-4936-9c5a-73c1c41da281 +Имя: СтатусМероприятия +ОбластьВидимости: ВПроекте +Элементы: + - + Ид: 2f7086c4-ace2-4e9e-8d4f-2ad72f4cac71 + Имя: Запланировано + Представление: $ЛокализованныеСтроки.Запланировано + ПоУмолчанию: Истина + - + Ид: 90c57c56-5211-4945-8b5b-6417af980d33 + Имя: ВПроцессе + Представление: $ЛокализованныеСтроки.ВПроцессе + - + Ид: 5f729039-b60a-473d-8639-16c904ed85e8 + Имя: Завершено + Представление: $ЛокализованныеСтроки.Завершено + - + Ид: bb0b532a-8e4c-42ee-a833-9431e93a87cc + Имя: Отменено + Представление: $ЛокализованныеСтроки.Отменено diff --git a/Koncept/Testovoe/Мероприятия/УчастникиМероприятия.yaml b/Koncept/Testovoe/Мероприятия/УчастникиМероприятия.yaml new file mode 100644 index 0000000..0a2cb8f --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/УчастникиМероприятия.yaml @@ -0,0 +1,16 @@ +ВидЭлемента: ХранимаяСтруктура +Ид: 277d8ff8-28d2-4b56-83fc-85f855f0c5ce +Имя: УчастникиМероприятия +ОбластьВидимости: ВПроекте +Импорт: + - Основное + - Пресейл +Поля: + - + Ид: cc5fa2e6-6dbb-4032-b92e-19da7dd2b767 + Имя: Участник + Тип: Сотрудники.Ссылка|КонтактныеЛица.Ссылка|? + - + Ид: e5b45063-d819-41be-a6f0-608c5a234721 + Имя: Роль + Тип: РольУчастникаМероприятия? diff --git a/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.xbsl b/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.xbsl new file mode 100644 index 0000000..e8189a8 --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.xbsl @@ -0,0 +1,10 @@ +метод ВыбратьУчастникаПриНажатии(Команда: ОбычнаяКоманда) + знч Участник = Компоненты.ПолеВводаУчастника.Значение + знч Роль = Компоненты.ПолеВводаРоли.Значение + + Компоненты.ПолеВводаУчастника.РезультатПроверкиДанных = Участник == Неопределено ? РезультатПроверкиДанных.Ошибка : РезультатПроверкиДанных.Отсутствует + + если Участник != Неопределено + Закрыть(новый УчастникиМероприятия(Участник, Роль)) + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.yaml b/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.yaml new file mode 100644 index 0000000..ca8b84a --- /dev/null +++ b/Koncept/Testovoe/Мероприятия/ФормаДобавленияУчастника.yaml @@ -0,0 +1,49 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: bfe0d84f-84a1-4ccd-9fa9-44c01b69ffe7 +Имя: ФормаДобавленияУчастника +ОбластьВидимости: ВПодсистеме +Импорт: + - Основное + - Пресейл +Свойства: + - + Имя: Клиент + Тип: Клиенты.Ссылка? +Наследует: + Тип: Форма<УчастникиМероприятия> + Заголовок: $ЛокализованныеСтроки.ДобавлениеУчастника + ОсновнаяКоманда: + Тип: ОбычнаяКоманда + Представление: $ЛокализованныеСтроки.Добавить + Обработчик: ВыбратьУчастникаПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: ФиксированнаяГруппа + Содержимое: + - + Тип: ПолеВвода<КонтактныеЛица.Ссылка?> + Имя: ПолеВводаУчастника + Заголовок: $ЛокализованныеСтроки.Участник + НастройкиВводаСсылок: + НастройкиПоТипу: + - + Ключ: КонтактныеЛица.Ссылка + Значение: + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Владелец + ВидСравнения: Равно + Значение: =Клиент + РастягиватьПоГоризонтали: Истина + ВидОтображенияКнопкиОчистки: Всегда + Обязательное: Истина + СообщениеОшибка: $ЛокализованныеСтроки.ВыберитеУчастника + - + Тип: ПолеВвода<РольУчастникаМероприятия?> + Имя: ПолеВводаРоли + Заголовок: $ЛокализованныеСтроки.Роль + РастягиватьПоГоризонтали: Истина diff --git a/Koncept/Testovoe/Общие/КурсыВалют/Валюты.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/Валюты.xbsl new file mode 100644 index 0000000..3c1584d --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/Валюты.xbsl @@ -0,0 +1,49 @@ +импорт Основное + +@ВПроекте +конст КОД_БАЗОВОЙ_ВАЛЮТЫ = "RUB" + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Чтение]) + ] +; + +@ВПроекте +метод ПолучитьВсе(): ЧитаемыйМассив<Валюты.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Валюты + ГДЕ + Код != %КОД_БАЗОВОЙ_ВАЛЮТЫ + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; + +@ВПроекте +метод ПолучитьБазовуюВалюту(): Валюты.Ссылка? + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Валюты + ГДЕ + Код == %КОД_БАЗОВОЙ_ВАЛЮТЫ + } + + возврат Запрос.Выполнить().ЕдинственныйИлиУмолчание()?.Ссылка +; + +@ВПроекте +метод СоздатьБазовуюВалюту(): Валюты.Ссылка + знч БазоваяВалюта = новый Валюты.Объект(Код = КОД_БАЗОВОЙ_ВАЛЮТЫ, Наименование = "Рубль") + БазоваяВалюта.Записать() + возврат БазоваяВалюта.Ссылка +; diff --git a/Koncept/Testovoe/Общие/КурсыВалют/Валюты.yaml b/Koncept/Testovoe/Общие/КурсыВалют/Валюты.yaml new file mode 100644 index 0000000..655a6d5 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/Валюты.yaml @@ -0,0 +1,30 @@ +ВидЭлемента: Справочник +Ид: a139815d-dd1e-4988-a21d-dbe7c212fc95 +Имя: Валюты +ОбластьВидимости: ВПроекте +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляются +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.Валюты + Форма: ВалютыФормаСписка + Объект: + Форма: ВалютыФормаОбъекта +Представление: Наименование +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Код + Тип: Строка + Длина: 3 + Автонумерация: + Использовать: Ложь + - + Имя: Наименование + Длина: 100 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: b27ec4eb-ea82-4c04-aa6a-127b80fc9eee + Имя: ВнешнийИдентификатор + Тип: Строка diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.xbsl new file mode 100644 index 0000000..2a83f00 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.xbsl @@ -0,0 +1,19 @@ +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Код.Сократить().Пусто() + Компоненты.ПолеВводаКод.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаКод.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.yaml b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.yaml new file mode 100644 index 0000000..125e441 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаОбъекта.yaml @@ -0,0 +1,32 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 6ab801c8-17a3-4172-960f-86c5b02ca148 +Имя: ВалютыФормаОбъекта +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаОбъекта<Валюты.Объект> + Заголовок: $ЛокализованныеСтроки.Валюта + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Удалить + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаКод + Заголовок: $ЛокализованныеСтроки.Код + Значение: =Объект.Код + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.xbsl new file mode 100644 index 0000000..060d0ed --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.xbsl @@ -0,0 +1,8 @@ +@Обработчик +метод ПослеСоздания() + КурсыВалютЗагружены.ПодключитьОбработчик(() -> Компоненты.ТаблицаСписка.Обновить()) +; + +метод ЗагрузкаКурсовПриНажатии(Команда: ОбычнаяКоманда) + ФормаЗагрузкиКурсовВалют.ОткрытьВМодальномОкне() +; diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.yaml b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.yaml new file mode 100644 index 0000000..346099a --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ВалютыФормаСписка.yaml @@ -0,0 +1,83 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: e2f98ffc-4fb7-47fb-aa84-e48063d26ba3 +Имя: ВалютыФормаСписка +ОбластьВидимости: ВПроекте +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + ДополнительныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Представление: $ЛокализованныеСтроки.ЗагрузкаКурсовВалют + Изображение: Скачать.svg + Обработчик: ЗагрузкаКурсовПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + ИспользованиеПоиска: Ложь + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Валюты + Псевдоним: Валюты + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Валюты.Ссылка + Псевдоним: Валюты_Ссылка + - + Тип: ПолеДинамическогоСписка + Выражение: Валюты.Наименование + Псевдоним: Валюты_Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Валюты.Код + Псевдоним: Валюты_Код + - + Тип: ПолеДинамическогоСписка + Выражение: КурсыСрезПоследних.Курс + Псевдоним: КурсыСрезПоследних_Курс + - + Тип: ПолеДинамическогоСписка + Выражение: КурсыСрезПоследних.Кратность + Псевдоним: КурсыСрезПоследних_Кратность + - + Тип: ПолеДинамическогоСписка + Выражение: КурсыСрезПоследних.Период + Псевдоним: КурсыСрезПоследних_Период + ПрисоединенныеТаблицы: + - + Таблица: КурсыВалют.СрезПоследних + Псевдоним: КурсыСрезПоследних + Фильтр: + Элементы: + - + Тип: ЭлементФильтраВыражение + Выражение: Валюты.Ссылка == КурсыСрезПоследних.Валюта + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Валюты_Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Валюты_Код + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаКурса + ПолеЗначения: КурсыСрезПоследних_Период + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Курс + ПолеЗначения: КурсыСрезПоследних_Курс + ВыравниваниеВГруппеПоГоризонтали: Конец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Кратность + ПолеЗначения: КурсыСрезПоследних_Кратность + ВыравниваниеВГруппеПоГоризонтали: Конец diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсВалюты.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсВалюты.yaml new file mode 100644 index 0000000..6a6de9b --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсВалюты.yaml @@ -0,0 +1,21 @@ +ВидЭлемента: Структура +Ид: 26425742-9626-4e70-911e-abe55b52232b +Имя: КурсВалюты +ОбластьВидимости: ВПроекте +Окружение: КлиентИСервер +Поля: + - + Имя: Валюта + Тип: Валюты.Ссылка? + - + Имя: Код + Тип: Строка + - + Имя: Период + Тип: Дата? + - + Имя: Курс + Тип: Число + - + Имя: Кратность + Тип: Число diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.xbsl new file mode 100644 index 0000000..d0f3e0f --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.xbsl @@ -0,0 +1,11 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ + ПользователиКлиентИСервер.ПолныеПраваНаРегистрСведенийДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Чтение]) + ] +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.yaml new file mode 100644 index 0000000..9c19f8a --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалют.yaml @@ -0,0 +1,32 @@ +ВидЭлемента: РегистрСведений +Ид: e571296e-602d-478b-a51a-fdfa1c1701be +Имя: КурсыВалют +ОбластьВидимости: ВПроекте +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляются +Интерфейс: + Список: + Форма: КурсыВалютФормаСписка + Представление: $ЛокализованныеСтроки.КурсыВалют + Объект: + Форма: КурсыВалютФормаОбъекта +Периодичность: День +ИспользоватьВПолнотекстовомПоиске: Ложь +Измерения: + - + Ид: 6bfdd2a9-53bf-40be-a84b-e849e23cd887 + Имя: Валюта + Тип: Валюты.Ссылка? +Ресурсы: + - + Ид: 734935b9-5911-4087-b29d-409bebcf4943 + Имя: Курс + Тип: Число + ДлинаДробнойЧасти: 4 + МинимальноеЗначение: 0 + - + Ид: 05e1f67e-c22a-4c5b-a5ee-6834e83bf46e + Имя: Кратность + Тип: Число + МинимальноеЗначение: 0 diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютЗагружены.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютЗагружены.yaml new file mode 100644 index 0000000..4a29678 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютЗагружены.yaml @@ -0,0 +1,4 @@ +ВидЭлемента: ГлобальноеКлиентскоеСобытие +Ид: 8d7437cf-44a6-4125-9afe-a4929cc228a5 +Имя: КурсыВалютЗагружены +ОбластьВидимости: ВПроекте diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.xbsl new file mode 100644 index 0000000..8854a5c --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.xbsl @@ -0,0 +1,315 @@ +конст КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ = "RatesLoadTask" + +@ВПодсистеме +исключение ИсключениеЗагрузкиКурсовВалют + обз знч Валюта: Валюты.Ссылка +; + +/** + Описание: + Загружает курсы валют из справочника Валюты за заданный период + Параметры: + НачалоПериода - дата начала периода загрузки + КонецПериода - дата конца периода загрузки + */ +@ВПроекте +метод ЗагрузитьКурсыВалют(НачалоПериода: Дата, КонецПериода: Дата) + знч Событие = новый ОперацияЗагрузкиКурсовВалют( + НачалоПериодаЗагрузки = НачалоПериода.Представление(), + КонецПериодаЗагрузки = КонецПериода.Представление() + ) + + исп Событие.ЗаписатьНачало() + + знч МассивВалют = Валюты.ПолучитьВсе() + для Валюта из МассивВалют + попытка + ЗагрузитьКурсыВалюты(Валюта, НачалоПериода, КонецПериода) + поймать Искл: ИсключениеЗагрузкиКурсовВалют + новый ОшибкаЗагрузкиКурсовВалюты( + Валюта = Искл.Валюта.Представление(), + ОписаниеОшибки = "%{Искл.Описание}", + ХарактерОшибки = ХарактерОшибки.ДляПользователя, + Важность = ВажностьСобытияЖурналаСобытий.Высокая + ).Записать() + + выбросить новый ИсключениеВыполнения(Искл.Описание, Искл) + ; + ; +; + +/** + Описание: + Загружает курсы валют из справочника Валюты начиная с последней даты курса и по текущую дату + */ +@ВПроекте +метод ЗагрузитьКурсыВалют() + знч ТекущаяДата = Дата.Сейчас() + + знч Событие = новый ОперацияЗагрузкиКурсовВалют( + НачалоПериодаЗагрузки = "", + КонецПериодаЗагрузки = ТекущаяДата.Представление() + ) + + исп Событие.ЗаписатьНачало() + + знч ДатыКурсов = ПолучитьКурсыВалют() + + для ДатаКурса из ДатыКурсов + попытка + ЗагрузитьКурсыВалюты(ДатаКурса.Валюта, ДатаКурса.Период == Неопределено ? ТекущаяДата : ДатаКурса.Период, ТекущаяДата) + поймать Искл: ИсключениеЗагрузкиКурсовВалют + новый ОшибкаЗагрузкиКурсовВалюты( + Валюта = Искл.Валюта.Представление(), + ОписаниеОшибки = "%{Искл.Описание}", + ХарактерОшибки = ХарактерОшибки.ДляПользователя, + Важность = ВажностьСобытияЖурналаСобытий.Высокая + ).Записать() + + выбросить новый ИсключениеВыполнения(Искл.Описание) + ; + ; +; + +/** + Описание: + Получение курса валюты на дату + Параметры: + Валюта - валюта, курс которой требуется получить + ДатаКурса - дата, на которую требуется получить курс + Возвращает: + Структура КурсВалюты или Неопределено, если курс не установлен + */ +@ВПроекте +метод ПолучитьКурсВалюты(Валюта: Валюты.Ссылка, ДатаКурса: Дата): КурсВалюты? + знч Запрос = Запрос{ + ВЫБРАТЬ + КурсыВалютСрезПоследних.Валюта КАК Валюта, + КурсыВалютСрезПоследних.Период КАК Период, + КурсыВалютСрезПоследних.Курс КАК Курс, + КурсыВалютСрезПоследних.Кратность КАК Кратность + ЗАПОЛНИТЬ КурсВалюты + ИЗ + КурсыВалют.СрезПоследних(%ДатаКурса) КАК КурсыВалютСрезПоследних + ГДЕ + КурсыВалютСрезПоследних.Валюта == %Валюта + } + + возврат Запрос.Выполнить().ЕдинственныйИлиУмолчание() +; + +/** + Описание: + Получение курсов валют из справочника Валюты + Возвращает: + Массив структур КурсВалюты + Замечания: + Если для валюты не загружен курс, значением поля Период структуры будет Неопределено + */ +@ВПроекте +метод ПолучитьКурсыВалют(): Массив<КурсВалюты> + знч Курсы = <КурсВалюты>[] + + знч Запрос = Запрос{ + ВЫБРАТЬ + Валюты.Ссылка КАК Валюта, + Валюты.Код КАК Код, + Курсы.Период.ЗаменитьNull(Неопределено) КАК Период, + Курсы.Курс.ЗаменитьNull(0) КАК Курс, + Курсы.Кратность.ЗаменитьNull(0) КАК Кратность + ИЗ + Валюты КАК Валюты + ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют.СрезПоследних() КАК Курсы + ПО Валюты.Ссылка == Курсы.Валюта + ГДЕ + Валюты.Код != %{Валюты.КОД_БАЗОВОЙ_ВАЛЮТЫ} + } + + для СтрокаРезультата из Запрос.Выполнить() + знч Курс = новый КурсВалюты( + Валюта = СтрокаРезультата.Валюта, + Код = СтрокаРезультата.Код, + Период = СтрокаРезультата.Период, + Курс = СтрокаРезультата.Курс, + Кратность = СтрокаРезультата.Кратность + ) + + Курсы.Добавить(Курс) + ; + + возврат Курсы +; + +/** + Описание: + Пересчитывает сумму в базовую валюту + Параметры: + Сумма - сумма, которую требуется пересчитать + Валюта - пересчитываемая валюта + Возвращает: + Сумма, пересчитанная по курсу + */ +@ВПроекте +метод ПересчитатьПоКурсу(Сумма: Число, Валюта: Валюты.Ссылка): Число + знч КурсВалюты = ПолучитьКурсВалюты(Валюта, Дата.Сейчас()) + если КурсВалюты != Неопределено и КурсВалюты.Кратность != 0 + возврат (Сумма * КурсВалюты.Курс / КурсВалюты.Кратность).Округлить(2) + иначе + возврат 0 + ; +; + +/** + Описание: + Загружает курсы определенной валюты за заданный период с сайта ЦБ + Параметры: + ВалютаСсылка - валюта, курсы которой требуется загрузить + НачалоПериода - дата начала периода загрузки + КонецПериода - дата конца периода загрузки + Исключения: + ОшибкаЗагрузкиКурсовВалют - + если не удалось найти валюту во внешнем справочнике и при других ошибках загрузки + Замечания: + Идентификатор валюты во внешнем справочнике определяется по коду валюты + и сохраняется в поле ВнешнийИдентификатор объекта Валюты + */ +@ВПодсистеме +метод ЗагрузитьКурсыВалюты(ВалютаСсылка: Валюты.Ссылка, НачалоПериода: Дата, КонецПериода: Дата) + знч Клиент = КлиентHttp.СБазовымUrl("https://www.cbr.ru/scripts/").СМаксимумомПеренаправлений(0) + + знч Валюта = ВалютаСсылка.ЗагрузитьОбъект() + + // Получение идентификатора валюты во внешнем справочнике + + если Валюта.ВнешнийИдентификатор.Пусто() + знч ЗапросСправочникаВалют = Клиент.ЗапросGet("XML_valFull.asp") + попытка + исп Ответ = ЗапросСправочникаВалют.Выполнить() + если Ответ.КодСостояния == 200 + знч ЧтениеXml = новый ЧтениеXml(Ответ.Тело, Кодировка = "windows-1251") + пер ТекущийИд: Строка + пер ЭтоЭлементКода: Булево + пока ЧтениеXml.Следующий() + если ЧтениеXml.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеXml.Имя == "Item" + ТекущийИд = ЧтениеXml.ЗначениеАтрибутаПоИндексу(0) + ; + если ЭтоЭлементКода и ЧтениеXml.ВидУзла == ВидУзлаXml.Текст и Валюта.Код == ЧтениеXml.Значение + Валюта.ВнешнийИдентификатор = ТекущийИд + прервать + ; + ЭтоЭлементКода = ЧтениеXml.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеXml.Имя == "ISO_Char_Code" + ; + иначе + выбросить новый ИсключениеЗагрузкиКурсовВалют( + "Ошибка при получении внешнего справочника валют. Код %{Ответ.КодСостояния}", + ВалютаСсылка) + ; + поймать Искл: ИсключениеHttp + выбросить новый ИсключениеЗагрузкиКурсовВалют("Ошибка при выполнении запроса к сервису курсов валют", ВалютаСсылка, Искл) + поймать Искл: ИсключениеЧтенияXml + выбросить новый ИсключениеЗагрузкиКурсовВалют("Ошибка при чтении внешнего справочника валют", ВалютаСсылка, Искл) + ; + + если не Валюта.ВнешнийИдентификатор.Пусто() + исп КонтекстДоступа.Дополнить(Тип<Валюты.Объект>, [Сущность.Право.Изменение]) + Валюта.Записать() + иначе + выбросить новый ИсключениеЗагрузкиКурсовВалют("Во внешнем справочнике не удалось найти валюту с кодом %{Валюта.Код}", ВалютаСсылка) + ; + ; + + // Загрузка курсов валюты + + знч Url = "XML_dynamic.asp?date_req1=${НачалоПериода|дд/ММ/гггг}&date_req2=${КонецПериода|дд/ММ/гггг}&VAL_NM_RQ=%{Валюта.ВнешнийИдентификатор}" + знч ЗапросКурсов = Клиент.ЗапросGet(Url) + + пер КурсыВалюты = <КурсВалюты>[] + попытка + исп Ответ = ЗапросКурсов.Выполнить() + если Ответ.КодСостояния == 200 + знч ЧтениеXml = новый ЧтениеXml(Ответ.Тело, Кодировка = "windows-1251") + + пер ДатаКурса: Дата? + пер Кратность: Число + + пер ЭтоЭлементКурса: Булево + пер ЭтоЭлементКратности: Булево + + пока ЧтениеXml.Следующий() + если ЧтениеXml.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеXml.Имя == "Record" + ДатаКурса = новый Дата(ЧтениеXml.ЗначениеАтрибутаПоИндексу(0)) + ; + если ЭтоЭлементКратности и ЧтениеXml.ВидУзла == ВидУзлаXml.Текст + Кратность = новый Число(ЧтениеXml.Значение) + ; + если ЭтоЭлементКурса и ЧтениеXml.ВидУзла == ВидУзлаXml.Текст + знч Курс = новый Число(ЧтениеXml.Значение.Заменить(",",".")) + + знч КурсВалюты = новый КурсВалюты( + Валюта = ВалютаСсылка, + Период = ДатаКурса, + Курс = Курс, + Кратность = Кратность + ) + + КурсыВалюты.Добавить(КурсВалюты) + ; + ЭтоЭлементКурса = ЧтениеXml.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеXml.Имя == "Value" + ЭтоЭлементКратности = ЧтениеXml.ВидУзла == ВидУзлаXml.НачалоЭлемента и ЧтениеXml.Имя == "Nominal" + ; + иначе + выбросить новый ИсключениеЗагрузкиКурсовВалют("Ошибка при получении курсов валют. Код %{Ответ.КодСостояния}", ВалютаСсылка) + ; + поймать Искл: ИсключениеHttp + выбросить новый ИсключениеЗагрузкиКурсовВалют("Ошибка при выполнении запроса к сервису курсов валют", ВалютаСсылка, Искл) + поймать Искл: ИсключениеЧтенияXml + выбросить новый ИсключениеЗагрузкиКурсовВалют("Ошибка при чтении курсов валют", ВалютаСсылка, Искл) + ; + + // Запись полученных данных в регистр сведений + + если не КурсыВалюты.Пусто() + для КурсВалюты из КурсыВалюты + знч НоваяЗапись = новый КурсыВалют.Запись( + Период = КурсВалюты.Период, + Валюта = ВалютаСсылка, + Курс = КурсВалюты.Курс, + Кратность = КурсВалюты.Кратность + ) + + КурсыВалют.Записать(НоваяЗапись) + ; + ; +; + +@ВПроекте +метод ЗапланироватьЗагрузкуКурсовВалют() + ЗапланированныеЗадания.Создать(&КурсыВалютСервер.ЗагрузитьКурсыВалют) + .Настроить(Ключ = КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ, + СтратегияПубликации = СтратегияПубликацииЗадания.Отбросить, + Расписание = Расписание.Ежедневно(ЗапуститьВ = Время{12:00}, ИсполнятьПропущенное = Истина), + Описание = "Загрузка курсов валют") + .ЗапланироватьБезТранзакции() +; + +@ВПодсистеме +метод ПриостановитьЗагрузкуКурсовВалют() + ЗапланированныеЗадания.Приостановить(КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ) +; + +@ВПодсистеме +метод ВозобновитьЗагрузкуКурсовВалют() + если ЗапланированныеЗадания.Возобновить(КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ) == Неопределено + ЗапланироватьЗагрузкуКурсовВалют() + ; +; + +@ВПодсистеме +метод ЗагрузкаКурсовВалютЗапланирована(): Булево + знч Дескриптор = ЗапланированныеЗадания.ПолучитьПоКлючу(КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ) + если Дескриптор != Неопределено + возврат Дескриптор.Статус == СтатусЗадания.Ожидает или Дескриптор.Статус == СтатусЗадания.Выполняется + иначе + возврат Ложь + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.yaml new file mode 100644 index 0000000..0d834b0 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютСервер.yaml @@ -0,0 +1,5 @@ +ВидЭлемента: ОбщийМодуль +Ид: 23d62ccc-cf7e-4ca6-9ee7-3249fa4d7c62 +ОбластьВидимости: ВПроекте +Имя: КурсыВалютСервер +Окружение: Сервер diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаОбъекта.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаОбъекта.yaml new file mode 100644 index 0000000..2c69feb --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаОбъекта.yaml @@ -0,0 +1,38 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: d7a056c6-4166-43d9-b1a5-ae6ccbb410d8 +Имя: КурсыВалютФормаОбъекта +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаОбъекта<КурсыВалют.Запись> + Заголовок: $ЛокализованныеСтроки.КурсыВалют + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Удалить + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Дата> + Заголовок: $ЛокализованныеСтроки.Период + Значение: =Объект.Период + Обязательное: Истина + - + Тип: ПолеВвода<Валюты.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Валюта + Значение: =Объект.Валюта + Обязательное: Истина + - + Тип: ПолеВвода<Число> + Заголовок: $ЛокализованныеСтроки.Курс + Значение: =Объект.Курс + Обязательное: Истина + - + Тип: ПолеВвода<Число> + Заголовок: $ЛокализованныеСтроки.Кратность + Значение: =Объект.Кратность + Обязательное: Истина diff --git a/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаСписка.yaml b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаСписка.yaml new file mode 100644 index 0000000..1d8f291 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/КурсыВалютФормаСписка.yaml @@ -0,0 +1,52 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 4eeaba79-571b-4801-9a2d-fa068b9446aa +Имя: КурсыВалютФормаСписка +ОбластьВидимости: ВПроекте +Наследует: + Тип: ФормаСписка + ПовторноеИспользованиеФормы: Ложь + КомпонентТаблицы: =Компоненты.ТаблицаСписка + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: КурсыВалют + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Период + - + Тип: ПолеДинамическогоСписка + Выражение: Валюта + - + Тип: ПолеДинамическогоСписка + Выражение: Курс + - + Тип: ПолеДинамическогоСписка + Выражение: Кратность + ПрокруткаПоВертикали: Истина + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Период + ПолеЗначения: Период + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Валюта + ПолеЗначения: Валюта + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Курс + ПолеЗначения: Курс + ВыравниваниеВГруппеПоГоризонтали: Конец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Кратность + ПолеЗначения: Кратность + ВыравниваниеВГруппеПоГоризонтали: Конец diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ОперацияЗагрузкиКурсовВалют.yaml b/Koncept/Testovoe/Общие/КурсыВалют/ОперацияЗагрузкиКурсовВалют.yaml new file mode 100644 index 0000000..4fb321a --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ОперацияЗагрузкиКурсовВалют.yaml @@ -0,0 +1,21 @@ +ВидЭлемента: СобытиеЖурналаСобытий +Ид: 647137c2-e728-45bf-b1b7-eec040c598cd +Имя: ОперацияЗагрузкиКурсовВалют +ОбластьВидимости: ВПодсистеме +Описание: Событие операции загрузки курсов валют +Важность: Обычная +ВидСобытия: Операция +ШаблонПредставленияНачала: Начало загрузки курсов валют за период c %{НачалоПериодаЗагрузки} по %{КонецПериодаЗагрузки} +ШаблонПредставленияКонца: Завершение загрузки курсов валют за период c %{НачалоПериодаЗагрузки} по %{КонецПериодаЗагрузки} +ШаблонПредставленияОшибки: Не удалось выполнить загрузку курсов валют +Свойства: + - + Ид: a1d5b90d-fe38-4160-a330-77e2861ae314 + Имя: НачалоПериодаЗагрузки + Описание: Начало периода загрузки курсов валют + Тип: Строка + - + Ид: 8e35aa38-aa61-4cb3-ab95-1000be7cf368 + Имя: КонецПериодаЗагрузки + Описание: Конец периода загрузки курсов валют + Тип: Строка diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ОшибкаЗагрузкиКурсовВалюты.yaml b/Koncept/Testovoe/Общие/КурсыВалют/ОшибкаЗагрузкиКурсовВалюты.yaml new file mode 100644 index 0000000..9d1441e --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ОшибкаЗагрузкиКурсовВалюты.yaml @@ -0,0 +1,20 @@ +ВидЭлемента: СобытиеЖурналаСобытий +Ид: f8ced091-9bee-44c9-be81-0b69647278bc +Имя: ОшибкаЗагрузкиКурсовВалюты +ОбластьВидимости: ВПодсистеме +Описание: Ошибка при загрузке курсов валюты +ВидСобытия: Ошибка +ШаблонПредставления: "При загрузке курсов валюты %{Валюта}: %{ОписаниеОшибки}" +Свойства: + - + Ид: e10762eb-cb69-4be1-be7b-767b920afaa6 + Имя: Валюта + Описание: Валюта, при загрузке курсов которой произошла ошибка + Тип: Строка + Обязательно: Истина + - + Ид: 5d4f03a9-5603-4cf4-8e57-d4518d65ec8e + Имя: ОписаниеОшибки + Описание: Описание ошибки + Тип: Строка + Обязательно: Истина diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.xbsl b/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.xbsl new file mode 100644 index 0000000..c824f51 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.xbsl @@ -0,0 +1,48 @@ +@Обработчик +метод ПослеСоздания() + ЗагружатьКурсыАвтоматически = ЗагрузкаКурсовВалютЗапланирована() + знч ТекущаяДата = ДатаВремя.Сейчас().Дата + ПериодЗагрузки = новый ЗакрытыйДиапазон<Дата>(ТекущаяДата, ТекущаяДата) +; + +метод ЗагрузитьПриНажатии(Команда: ОбычнаяКоманда) + ЗагрузитьКурсыВалют(ПериодЗагрузки.От, ПериодЗагрузки.До) + + КурсыВалютЗагружены.Оповестить() + + знч Уведомление = новый Уведомление(ЛокализованныеСтроки.ЗагрузкаКурсовВалют(), ЛокализованныеСтроки.КурсыВалютЗагружены()) + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() + + Закрыть() +; + +метод ЗагружатьАвтоматическиПриИзменении(Источник: Флажок, Событие: СобытиеПриИзменении<Булево?>) + если Событие.НовоеЗначение + ВозобновитьЗагрузкуКурсовВалют() + иначе + ПриостановитьЗагрузкуКурсовВалют() + ; +; + +@НаСервере @ДоступноСКлиента +статический метод ЗагрузитьКурсыВалют(НачалоПериода: Дата, КонецПериода: Дата) + исп КонтекстДоступа.Дополнить(Тип<КурсыВалют.Запись>, [Сущность.Право.Изменение]) + + КурсыВалютСервер.ЗагрузитьКурсыВалют(НачалоПериода, КонецПериода) +; + +@НаСервере @ДоступноСКлиента +статический метод ВозобновитьЗагрузкуКурсовВалют() + КурсыВалютСервер.ВозобновитьЗагрузкуКурсовВалют() +; + +@НаСервере @ДоступноСКлиента +статический метод ПриостановитьЗагрузкуКурсовВалют() + КурсыВалютСервер.ПриостановитьЗагрузкуКурсовВалют() +; + +@НаСервере @ДоступноСКлиента +статический метод ЗагрузкаКурсовВалютЗапланирована(): Булево + возврат КурсыВалютСервер.ЗагрузкаКурсовВалютЗапланирована() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.yaml b/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.yaml new file mode 100644 index 0000000..ab225e1 --- /dev/null +++ b/Koncept/Testovoe/Общие/КурсыВалют/ФормаЗагрузкиКурсовВалют.yaml @@ -0,0 +1,40 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 05fb961d-73c4-4988-8ce9-0d6908035c89 +Имя: ФормаЗагрузкиКурсовВалют +ОбластьВидимости: ВПроекте +Импорт: + - Основное +Свойства: + - + Имя: ПериодЗагрузки + Тип: ЗакрытыйДиапазон<Дата>? + - + Имя: ЗагружатьКурсыАвтоматически + Тип: Булево +Наследует: + Тип: Форма + Заголовок: $ЛокализованныеСтроки.ЗагрузкаКурсовВалют + ОсновнаяКоманда: + Тип: ОбычнаяКоманда + Представление: $ЛокализованныеСтроки.Загрузить + Изображение: Скачать.svg + Обработчик: ЗагрузитьПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: Флажок + Заголовок: $ЛокализованныеСтроки.ЗагружатьКурсыАвтоматически + Видимость: =ПользователиКлиентИСервер.ЭтоАдминистраторПриложения() + Значение: =ЗагружатьКурсыАвтоматически + Вид: Переключатель + ПриИзменении: ЗагружатьАвтоматическиПриИзменении + РастягиватьПоГоризонтали: Истина + - + Тип: ПолеВвода<ЗакрытыйДиапазон<Дата>?> + Заголовок: $ЛокализованныеСтроки.ПериодЗагрузки + Значение: =ПериодЗагрузки + РастягиватьПоГоризонтали: Истина diff --git a/Koncept/Testovoe/Общие/Локализация/En/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Общие/Локализация/En/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..7e7413c --- /dev/null +++ b/Koncept/Testovoe/Общие/Локализация/En/ЛокализованныеСтроки.yaml @@ -0,0 +1,30 @@ +Строки: + Регион: Region + Регионы: Regions + Направление: Line of business + Направления: Lines of business + ДобавитьНаправление: Add line of business + Валюта: Currency + Валюты: Currencies + Наименование: Name + Код: Code + ДатаКурса: Rate date + Курс: Rate + Кратность: Multiplicity + КурсыВалют: Currency rates + Период: Period + ЗагрузкаКурсовВалют: Download currency rates + ЗагрузитьКурсыВалют: Download currency rates + ЗагружатьКурсыАвтоматически: Download currency rates automatically + ПериодЗагрузки: Download period + Загрузить: Download + КурсыВалютЗагружены: Currency rates are loaded + ОбязательноеПоле: Required field + НеУказаныНаправления: Lines of business not specified + Уведомления: Notifications + Добавить: Add + Удалить: Delete + Поиск: Search + Найти: Search + СтрокаПоиска: Search request + РезультатыПоиска: Search results diff --git a/Koncept/Testovoe/Общие/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Общие/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..6fcc253 --- /dev/null +++ b/Koncept/Testovoe/Общие/ЛокализованныеСтроки.yaml @@ -0,0 +1,34 @@ +ВидЭлемента: ЛокализованныеСтроки +Ид: 6b87da6c-a775-4443-ba27-88e952e24207 +Имя: ЛокализованныеСтроки +ОбластьВидимости: ВПроекте +Строки: + Регион: Регион + Регионы: Регионы + Направление: Направление + Направления: Направления + ДобавитьНаправление: Добавить направление + Валюта: Валюта + Валюты: Валюты + Наименование: Наименование + Код: Код + ДатаКурса: Дата курса + Курс: Курс + Кратность: Кратность + КурсыВалют: Курсы валют + Период: Период + ЗагрузкаКурсовВалют: Загрузка курсов валют + ЗагрузитьКурсыВалют: Загрузить курсы валют + ЗагружатьКурсыАвтоматически: Загружать курсы автоматически + ПериодЗагрузки: Период загрузки + Загрузить: Загрузить + КурсыВалютЗагружены: Курсы валют загружены + ОбязательноеПоле: Обязательное поле + НеУказаныНаправления: Не указаны направления + Уведомления: Уведомления + Добавить: Добавить + Удалить: Удалить + Поиск: Поиск + Найти: Найти + СтрокаПоиска: Строка поиска + РезультатыПоиска: Результаты поиска diff --git a/Koncept/Testovoe/Общие/Направления.xbsl b/Koncept/Testovoe/Общие/Направления.xbsl new file mode 100644 index 0000000..20ad671 --- /dev/null +++ b/Koncept/Testovoe/Общие/Направления.xbsl @@ -0,0 +1,23 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Чтение]) + ] +; + +@ВПроекте +метод ПолучитьНаправления(): ЧитаемыйМассив<Направления.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Направления + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; diff --git a/Koncept/Testovoe/Общие/Направления.yaml b/Koncept/Testovoe/Общие/Направления.yaml new file mode 100644 index 0000000..d26620d --- /dev/null +++ b/Koncept/Testovoe/Общие/Направления.yaml @@ -0,0 +1,20 @@ +ВидЭлемента: Справочник +Ид: 03a6ab0b-1e6b-4cc4-ac1e-028c27d1db89 +Имя: Направления +ОбластьВидимости: ВПроекте +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляются +Интерфейс: + Список: + Форма: НаправленияФормаСписка + Представление: $ЛокализованныеСтроки.Направления + Объект: + Форма: НаправленияФормаОбъекта +Представление: Наименование +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Наименование + Длина: 200 + НезаполненноеЗначение: ЗапретитьВсегда \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.xbsl b/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.xbsl new file mode 100644 index 0000000..93aaca0 --- /dev/null +++ b/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.xbsl @@ -0,0 +1,7 @@ +@Обработчик +метод ПередЗаписьюОбъекта() + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.yaml b/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.yaml new file mode 100644 index 0000000..bd4f4ec --- /dev/null +++ b/Koncept/Testovoe/Общие/НаправленияФормаОбъекта.yaml @@ -0,0 +1,21 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: e7c284ab-3307-410d-8dcf-aa3c042d5f6b +Имя: НаправленияФормаОбъекта +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаОбъекта<Направления.Объект> + Заголовок: $ЛокализованныеСтроки.Направление + ОсновнаяКоманда: =ЗаписатьИЗакрыть + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле diff --git a/Koncept/Testovoe/Общие/НаправленияФормаСписка.yaml b/Koncept/Testovoe/Общие/НаправленияФормаСписка.yaml new file mode 100644 index 0000000..716b0b0 --- /dev/null +++ b/Koncept/Testovoe/Общие/НаправленияФормаСписка.yaml @@ -0,0 +1,30 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: a22f1f8a-3264-4f0a-b1d5-ecda6885326d +Имя: НаправленияФормаСписка +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: ФиксированнаяГруппа + Содержимое: + - + Тип: Таблица<ДинамическийСписок> + ИспользованиеПоиска: Ложь + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Направления + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + ШиринаВКолонках: Одинарная diff --git a/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.xbsl b/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.xbsl new file mode 100644 index 0000000..0c43abf --- /dev/null +++ b/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.xbsl @@ -0,0 +1,12 @@ +импорт Пресейл +импорт Мероприятия + +метод НайтиПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + знч РезультатыПоиска = ВыполнитьПоиск(СтрокаПоиска) + Закрыть(РезультатыПоиска) +; + +@НаСервере @ДоступноСКлиента +статический метод ВыполнитьПоиск(СтрокаПоиска: Строка): ЧитаемыйМассив<Сущность.Ключ> + возврат ПолнотекстовыйПоиск.Искать(СтрокаПоиска, 0, 100, ОбластьПоиска = [Тип<Сделки.Ссылка>, Тип<Задачи.Ссылка>, Тип<События.Ссылка>]) +; diff --git a/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.yaml b/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.yaml new file mode 100644 index 0000000..80e2fd1 --- /dev/null +++ b/Koncept/Testovoe/Общие/ОкноПолнотекстовогоПоиска.yaml @@ -0,0 +1,31 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 0cffd919-3385-4201-a771-741c4bc7b0fd +Имя: ОкноПолнотекстовогоПоиска +ОбластьВидимости: ВПроекте +Свойства: + - + Имя: СтрокаПоиска + Тип: Строка +Наследует: + Тип: ВсплывающийКомпонент<ЧитаемыйМассив<Сущность.Ключ>> + ШиринаВКолонках: Четверная + РастягиватьПоГоризонтали: Истина + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: АвтоматическаяГруппа + Заголовок: $ЛокализованныеСтроки.Поиск + Ориентация: Вертикальная + ОтступПоВертикали: Одинарный + ОтступПоГоризонтали: Одинарный + Содержимое: + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.СтрокаПоиска + Значение: =СтрокаПоиска + - + Тип: Кнопка + Заголовок: $ЛокализованныеСтроки.Найти + Доступность: =не СтрокаПоиска.Сократить().Пусто() + ВыравниваниеВГруппеПоГоризонтали: Конец + ПриНажатии: НайтиПриНажатии diff --git a/Koncept/Testovoe/Общие/Подсистема.yaml b/Koncept/Testovoe/Общие/Подсистема.yaml new file mode 100644 index 0000000..8437133 --- /dev/null +++ b/Koncept/Testovoe/Общие/Подсистема.yaml @@ -0,0 +1,4 @@ +Использование: + - Основное + - Пресейл + - Мероприятия \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/Регионы.xbsl b/Koncept/Testovoe/Общие/Регионы.xbsl new file mode 100644 index 0000000..b6bbb51 --- /dev/null +++ b/Koncept/Testovoe/Общие/Регионы.xbsl @@ -0,0 +1,24 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<Регионы.ДанныеРасчетаРазрешений>): ЧитаемоеСоответствие<Регионы.ДанныеРасчетаРазрешений, ЧитаемаяКоллекция<РазрешениеДоступа>> + знч Результат = <Регионы.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Объект.Ссылка)], + [Сущность.Право.Чтение]) + ] + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; \ No newline at end of file diff --git a/Koncept/Testovoe/Общие/Регионы.yaml b/Koncept/Testovoe/Общие/Регионы.yaml new file mode 100644 index 0000000..af9089d --- /dev/null +++ b/Koncept/Testovoe/Общие/Регионы.yaml @@ -0,0 +1,15 @@ +ВидЭлемента: Справочник +Ид: 7489a9bf-adae-4e8e-a01b-0bdc76e94c7c +Имя: Регионы +ОбластьВидимости: ВПроекте +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Ссылка +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Наименование + Длина: 300 + НезаполненноеЗначение: ЗапретитьВсегда diff --git a/Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.xbsl b/Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.xbsl new file mode 100644 index 0000000..e69de29 diff --git a/Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.yaml b/Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.yaml new file mode 100644 index 0000000..6b2a8b7 --- /dev/null +++ b/Koncept/Testovoe/Общие/РезультатыПолнотекстовогоПоиска.yaml @@ -0,0 +1,232 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: fb08c5e5-c360-44be-a352-c0ba15229dfc +Имя: РезультатыПолнотекстовогоПоиска +ОбластьВидимости: ВПроекте +Импорт: + - Пресейл + - Мероприятия +Свойства: + - + Имя: РезультатыПоиска + Тип: ЧитаемыйМассив<Сущность.Ключ> +Наследует: + Тип: Форма + Заголовок: $ЛокализованныеСтроки.РезультатыПоиска + ШиринаВКолонках: Тройная + РастягиватьПоВертикали: Истина + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Страницы + Страницы: + - + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделки + Содержимое: + Тип: Таблица<ДинамическийСписок> + Источник: + ОсновнаяТаблица: + Таблица: Сделки + Псевдоним: Сделки + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Клиент + - + Тип: ПолеДинамическогоСписка + Выражение: Стадия + - + Тип: ПолеДинамическогоСписка + Выражение: Стадия.Иконка + Псевдоним: Стадия_Иконка + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Сделки.Ссылка + ВидСравнения: ВСписке + Значение: =РезультатыПоиска + Использовать: Истина + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + ПрокруткаПоВертикали: Истина + ОтображатьНастройки: Ложь + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.ДатаСоздания + ПолеЗначения: ДатаСоздания + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Клиент + ПолеЗначения: Клиент + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Содержание + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Стадия + ПолеЗначения: Стадия + ОбрабатыватьНажатие: Ложь + Изображение: =ДанныеСтроки.Данные["Стадия_Иконка"] как ДвоичныйОбъект.Ссылка? + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код + - + Заголовок: $Мероприятия::ЛокализованныеСтроки.Задачи + Содержимое: + Тип: Таблица<ДинамическийСписок> + Источник: + ОсновнаяТаблица: + Таблица: Задачи + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Описание + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + Представление: Сделка + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + - + Тип: ПолеДинамическогоСписка + Выражение: Статус + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Задачи.Ссылка + ВидСравнения: ВСписке + Значение: =РезультатыПоиска + Использовать: Истина + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + ОтображатьНастройки: Ложь + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.ДатаСоздания + ПолеЗначения: ДатаСоздания + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + ПолеЗначения: Владелец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.Описание + ПолеЗначения: Описание + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.Ответственный + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.Статус + ПолеЗначения: Статус + Вид: Значок + Цвет: =(ДанныеСтроки.Данные["Статус"] как СтатусМероприятия).ПолучитьЦвет() + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код + - + Заголовок: $Мероприятия::ЛокализованныеСтроки.События + Содержимое: + Тип: Таблица<ДинамическийСписок> + Источник: + ОсновнаяТаблица: + Таблица: События + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаНачала + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаЗавершения + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: События.Ссылка + ВидСравнения: ВСписке + Значение: =РезультатыПоиска + Использовать: Истина + Сортировка: + - + Поле: ДатаНачала + НаправлениеСортировки: ПоУбыванию + ПрокруткаПоВертикали: Истина + ОтображатьНастройки: Ложь + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.ДатаНачала + ПолеЗначения: ДатаНачала + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.ДатаЗавершения + ПолеЗначения: ДатаЗавершения + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Пресейл::ЛокализованныеСтроки.Сделка + ПолеЗначения: Владелец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Мероприятия::ЛокализованныеСтроки.Описание + ПолеЗначения: Описание + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код diff --git a/Koncept/Testovoe/Основное/ГлавнаяСтраница.xbsl b/Koncept/Testovoe/Основное/ГлавнаяСтраница.xbsl new file mode 100644 index 0000000..1def961 --- /dev/null +++ b/Koncept/Testovoe/Основное/ГлавнаяСтраница.xbsl @@ -0,0 +1,113 @@ +импорт Мероприятия +импорт Пресейл +импорт Общие::КурсыВалют + +@Обработчик +метод ПослеСоздания() + ЗаполнитьКарточки() + + КурсыВалютЗагружены.ПодключитьОбработчик(() -> ЗаполнитьКарточкуКурсыВалют()) + ЗаписанаЗадача.ПодключитьОбработчик(() -> ЗаполнитьКарточкуЗадачи()) + + ЗаписанаСделка.ПодключитьОбработчик(метод(Сделка) -> + ЗаполнитьКарточкуСделки() + ОбновитьДиаграммы() + ;) + + // Если выполняется задание заполнения демо-данными, обновим компоненты после его завершения + если СтатусЗаданияЗаполненияДемоДанными() == СтатусЗадания.Выполняется + знч Уведомление = новый Уведомление("Заполнение данными", "Выполняется заполнение демонстрационными данными") + Уведомление.ОценкаИнформации = ОценкаИнформации.Предупреждающая + Уведомление.Показать() + + ПодключитьОбработчикТаймера(&ОбновитьКомпонентыПослеЗаполненияДанными, 1с, Ложь) + ; +; + +метод ЗаполнитьКарточки() + ЗаполнитьКарточкуКурсыВалют() + ЗаполнитьКарточкуСделки() + ЗаполнитьКарточкуЗадачи() +; + +метод ОбновитьДиаграммы() + Компоненты.ДиаграммаВоронкаПродаж.ОбновитьДиаграмму() + Компоненты.ДиаграммаПродажиПоНаправлениям.ОбновитьДиаграмму() +; + +метод ЗаполнитьКарточкуКурсыВалют() + Компоненты.ТаблицаВалют.Источник.Данные = КурсыВалют() +; + +метод ЗаполнитьКарточкуСделки() + знч СтатистикаСделок = СтатистикаАктивныхСделок() + Компоненты.НадписьКоличествоСделок.Значение = СтатистикаСделок.ОбщееКоличество.Представление() + Компоненты.НадписьСуммаСделок.Значение = "${СтатистикаСделок.ОбщаяСумма} руб." +; + +метод ЗаполнитьКарточкуЗадачи() + знч КоличествоЗадач = КоличествоОткрытыхЗадачСотрудника() + если КоличествоЗадач != Неопределено + Компоненты.НадписьЗадачВПроцессе.Значение = КоличествоЗадач[СтатусМероприятия.ВПроцессе].Представление() + Компоненты.НадписьЗадачЗапланировано.Значение = КоличествоЗадач[СтатусМероприятия.Запланировано].Представление() + ; +; + +метод КарточкаПутеводительПриНажатии(Источник: Карточка, Событие: СобытиеПриНажатии) + ПутеводительПоПроекту.Открыть() +; + +метод КарточкаЗадачиПриНажатии(Источник: Карточка, Событие: СобытиеПриНажатии) + ЗадачиФормаСписка.Открыть() +; + +метод КарточкаСделкиПриНажатии(Источник: Карточка, Событие: СобытиеПриНажатии) + СделкиФормаСписка.Открыть() +; + +метод СоздатьСделкуПриНажатии(Команда: ОбычнаяКоманда) + СделкиФормаОбъекта.ОткрытьВМодальномОкне() +; + +метод ДобавитьЗадачуПриНажатии(Команда: ОбычнаяКоманда) + ЗадачиФормаОбъекта.ОткрытьВМодальномОкне() +; + +метод ЗагрузитьКурсыВалютПриНажатии(Команда: ОбычнаяКоманда) + ФормаЗагрузкиКурсовВалют.ОткрытьВМодальномОкне() +; + +@НаСервере @ДоступноСКлиента +статический метод СтатистикаАктивныхСделок(): Сделки.СтатистикаСделок + возврат Сделки.ПолучитьСтатистикуАктивныхСделок() +; + +@НаСервере @ДоступноСКлиента +статический метод КоличествоОткрытыхЗадачСотрудника(): ЧитаемоеСоответствие<СтатусМероприятия, Число>? + знч Сотрудник = ПользователиКлиентИСервер.ПолучитьТекущегоСотрудника() + возврат Сотрудник != Неопределено ? Задачи.КоличествоОткрытыхЗадачСотрудника(Сотрудник) : Неопределено +; + +@НаСервере @ДоступноСКлиента +статический метод КурсыВалют(): Массив<КурсВалюты> + возврат КурсыВалютСервер.ПолучитьКурсыВалют() +; + +метод ОбновитьКомпонентыПослеЗаполненияДанными() + если СтатусЗаданияЗаполненияДемоДанными() != СтатусЗадания.Выполняется + ОтключитьОбработчикТаймера(&ОбновитьКомпонентыПослеЗаполненияДанными) + ЗаполнитьКарточки() + ОбновитьДиаграммы() + + знч Уведомление = новый Уведомление("Заполнение данными", "Завершено заполнение демонстрационными данными") + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() + ; +; + +@НаСервере @ДоступноСКлиента +статический метод СтатусЗаданияЗаполненияДемоДанными(): СтатусЗадания? + знч КлючЗадания = ЗаполнениеДемоДанными.КлючЗаданияЗаполненияДанными(Пользователи.ТекущийПользователь) + знч Задание = ЗапланированныеЗадания.ПолучитьПоКлючу(КлючЗадания) + возврат Задание?.Статус +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/ГлавнаяСтраница.yaml b/Koncept/Testovoe/Основное/ГлавнаяСтраница.yaml new file mode 100644 index 0000000..9fab312 --- /dev/null +++ b/Koncept/Testovoe/Основное/ГлавнаяСтраница.yaml @@ -0,0 +1,195 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 097d7ca4-59f0-4d80-abd1-95c4292bba72 +Имя: ГлавнаяСтраница +ОбластьВидимости: ВПодсистеме +Импорт: + - Пресейл + - Общие::КурсыВалют +Наследует: + Тип: Форма + ПовторноеИспользованиеФормы: Истина + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: АвтоматическаяГруппа + ШиринаВКолонках: Четверная + Ориентация: Горизонтальная + РастягиватьПоВертикали: Ложь + Содержимое: + - + Тип: СтандартнаяКарточка + Заголовок: $ЛокализованныеСтроки.ПутеводительПоДемо + ОбрабатыватьНажатие: Истина + ШиринаВКолонках: Двойная + МинимальнаяВысота: 230 + РастягиватьПоГоризонтали: Ложь + Картинка: + Тип: Картинка + Изображение: РазделПутеводитель.svg + Цвет: =Цвета.Фиолетовый + ПриНажатии: КарточкаПутеводительПриНажатии + Содержимое: + Тип: Надпись + Значение: ="В разделе «Путеводитель» вы можете найти описание демо-приложения и его компонентов, в которых используются те или иные механизмы технологии «1С:Предприятие.Элемент»" + Важность: Высокая + - + Тип: СтандартнаяКарточка + Заголовок: $Пресейл::ЛокализованныеСтроки.АктивныеСделки + ОбрабатыватьНажатие: Истина + ШиринаВКолонках: Двойная + МинимальнаяВысота: 230 + РастягиватьПоГоризонтали: Ложь + Картинка: + Тип: Картинка + Изображение: РазделПресейл.svg + Цвет: =Цвета.Оранжевый + ПриНажатии: КарточкаСделкиПриНажатии + Команды: + Тип: ОбычнаяКоманда + Представление: $Пресейл::ЛокализованныеСтроки.СоздатьСделку + Изображение: Плюс.svg + Обработчик: СоздатьСделкуПриНажатии + Содержимое: + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + Содержимое: + - + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Отсутствует + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Надпись + Важность: Низкая + Значение: $Пресейл::ЛокализованныеСтроки.Сделок + - + Тип: Надпись + Имя: НадписьКоличествоСделок + МаксимальнаяВысотаВСтроках: 1 + Шрифт: =СтилевыеШрифты.ЗаголовокОбычный + - + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Отсутствует + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Надпись + Важность: Низкая + Значение: $Пресейл::ЛокализованныеСтроки.Сумма + - + Тип: Надпись + Имя: НадписьСуммаСделок + МаксимальнаяВысотаВСтроках: 1 + Шрифт: =СтилевыеШрифты.ЗаголовокОбычный + - + Тип: СтандартнаяКарточка + Заголовок: $Мероприятия::ЛокализованныеСтроки.МоиЗадачи + ОбрабатыватьНажатие: Истина + ШиринаВКолонках: Двойная + МинимальнаяВысота: 230 + РастягиватьПоГоризонтали: Ложь + Картинка: + Тип: Картинка + Изображение: Задачи.svg + Цвет: =Цвета.Зеленый + ПриНажатии: КарточкаЗадачиПриНажатии + Команды: + Тип: ОбычнаяКоманда + Представление: $Мероприятия::ЛокализованныеСтроки.ДобавитьЗадачу + Изображение: Плюс.svg + Обработчик: ДобавитьЗадачуПриНажатии + Содержимое: + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Отсутствует + Содержимое: + - + Тип: ФиксированнаяГруппа + ВыравниваниеСодержимогоПоВертикали: Центр + Ориентация: Горизонтальная + Содержимое: + - + Тип: Надпись + Имя: НадписьЗадачВПроцессе + Значение: + Тип: Строка + Значение: 0 + РазрешитьСжатие: Ложь + Шрифт: =СтилевыеШрифты.ЗаголовокКрупный + - + Тип: Надпись + Значение: =Мероприятия::ЛокализованныеСтроки.ВПроцессе().ВНижнийРегистр() + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: ФиксированнаяГруппа + ВыравниваниеСодержимогоПоВертикали: Центр + Ориентация: Горизонтальная + Содержимое: + - + Тип: Надпись + Имя: НадписьЗадачЗапланировано + Значение: + Тип: Строка + Значение: 0 + РазрешитьСжатие: Ложь + Шрифт: =СтилевыеШрифты.ЗаголовокКрупный + - + Тип: Надпись + Значение: =Мероприятия::ЛокализованныеСтроки.Запланировано().ВНижнийРегистр() + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: СтандартнаяКарточка + Имя: КарточкаКурсыВалют + Заголовок: $Общие::ЛокализованныеСтроки.КурсыВалют + ШиринаВКолонках: Двойная + МинимальнаяВысота: 230 + РастягиватьПоГоризонтали: Ложь + Картинка: + Тип: Картинка + Изображение: Валюты.svg + Цвет: =Цвета.Голубой + Команды: + Тип: ОбычнаяКоманда + Представление: $Общие::ЛокализованныеСтроки.ЗагрузитьКурсыВалют + Обработчик: ЗагрузитьКурсыВалютПриНажатии + Содержимое: + Тип: Таблица<ИсточникДанныхМассив<КурсВалюты>> + Имя: ТаблицаВалют + ТолькоЧтение: Истина + ОтображатьШапку: Ложь + ИспользованиеПоиска: Ложь + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<КурсВалюты> + ПолеЗначения: Код + - + Тип: СтандартнаяКолонкаТаблицы<КурсВалюты> + ПолеЗначения: Валюта + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<КурсВалюты> + ПолеЗначения: Курс + - + Тип: СтандартнаяКарточка + Заголовок: $Пресейл::ЛокализованныеСтроки.ВоронкаПродаж + ШиринаВКолонках: Двойная + РастягиватьПоГоризонтали: Ложь + Содержимое: + Тип: ФиксированнаяГруппа + ОтступПоГоризонтали: Двойной + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: ДиаграммаВоронкаПродаж + Имя: ДиаграммаВоронкаПродаж + - + Тип: СтандартнаяКарточка + Заголовок: $Пресейл::ЛокализованныеСтроки.ПродажиПоНаправлениям + ШиринаВКолонках: Двойная + РастягиватьПоГоризонтали: Ложь + Содержимое: + Тип: ФиксированнаяГруппа + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: ДиаграммаПродажиПоНаправлениям + Имя: ДиаграммаПродажиПоНаправлениям diff --git a/Koncept/Testovoe/Основное/ДанныеПользователя.yaml b/Koncept/Testovoe/Основное/ДанныеПользователя.yaml new file mode 100644 index 0000000..345c8c6 --- /dev/null +++ b/Koncept/Testovoe/Основное/ДанныеПользователя.yaml @@ -0,0 +1,23 @@ +ВидЭлемента: Структура +Ид: a76d2f8f-40c3-4f1a-8921-8f39d5ec704e +Имя: ДанныеПользователя +ОбластьВидимости: ВПроекте +Импорт: + - Общие +Окружение: КлиентИСервер +Поля: + - + Имя: Пользователь + Тип: Пользователи.Ссылка? + - + Имя: Сотрудник + Тип: Сотрудники.Ссылка? + - + Имя: Регион + Тип: Регионы.Ссылка? + - + Имя: Роль + Тип: РольСотрудника? + - + Имя: ЭтоАдминистраторПриложения + Тип: Булево diff --git a/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.xbsl b/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.xbsl new file mode 100644 index 0000000..5f3c60e --- /dev/null +++ b/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.xbsl @@ -0,0 +1,24 @@ +импорт Общие + +@Обработчик +метод ПослеСоздания() + знч ДанныеПользователя = ПользователиКлиентИСервер.ПолучитьДанныеТекущегоПользователя() + если не ДанныеПользователя.ЭтоАдминистраторПриложения и ДанныеПользователя.Сотрудник == Неопределено + ЗаполнитьДемоДанныеДляНовогоПользователя(ДанныеПользователя.Пользователь) + ; +; + +метод ПоискПриНажатии(Команда: ОбычнаяКоманда) + знч РезультатыПоиска = ОкноПолнотекстовогоПоиска.ОткрытьВоВсплывающемОкне() + + если РезультатыПоиска != Неопределено + РезультатыПолнотекстовогоПоиска.ОткрытьВМодальномОкне(РезультатыПоиска = РезультатыПоиска) + ; +; + +@НаСервере @ДоступноСКлиента +статический метод ЗаполнитьДемоДанныеДляНовогоПользователя(Пользователь: Пользователи.Ссылка) + ЗапланированныеЗадания.Создать(&ЗаполнениеДемоДанными.ЗаполнитьДляНовогоПользователя, Пользователь) + .Настроить(Ключ = ЗаполнениеДемоДанными.КлючЗаданияЗаполненияДанными(Пользователь)) + .Запланировать() +; diff --git a/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.yaml b/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.yaml new file mode 100644 index 0000000..47e036b --- /dev/null +++ b/Koncept/Testovoe/Основное/ДемонстрационноеПриложение.yaml @@ -0,0 +1,22 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 76eb6f8f-e340-42ed-8dad-7a1104a6da02 +Имя: ДемонстрационноеПриложение +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: СтандартноеКлиентскоеПриложениеСРазделами + Заголовок: DEMO CRM + ВидПоследнегоУровняНавигации: ВПанелиНавигации + ТемаОформления: + Логотип: Логотип.svg + ЗаголовокСтраницыВхода: $ЛокализованныеСтроки.ЗаголовокСтраницыВхода + ПриветственныйТекстСтраницыВхода: $ЛокализованныеСтроки.ПриветственныйТекстСтраницыВхода + КомандныйИнтерфейсПанелиНавигации: =ПанельНавигации + ДополнительныйКомандныйИнтерфейс: =КомандаЗавершитьРаботу + КомандныйИнтерфейсПанелиДействий: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Изображение: Лупа.svg + Представление: $Общие::ЛокализованныеСтроки.Поиск + Обработчик: ПоискПриНажатии diff --git a/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.xbsl b/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.xbsl new file mode 100644 index 0000000..33a4d04 --- /dev/null +++ b/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.xbsl @@ -0,0 +1,518 @@ +импорт Пресейл +импорт Мероприятия +импорт Общие +импорт Общие::КурсыВалют + +конст ИМЯ_СТАДИИ_ЗАКЛЮЧЕН_ДОГОВОР = "Заключен договор" +конст ИМЯ_СТАДИИ_ОТКАЗАНО = "Отказано" + +@ВПроекте +метод КлючЗаданияЗаполненияДанными(Пользователь: Пользователи.Ссылка): Строка + возврат "ГенерацияДанных_%{Пользователь.Ид}" +; + +@ВПроекте +метод Заполнить() + исп новый ОперацияЗаполненияДемоДанными().ЗаписатьНачало() + + исп Транзакция = Транзакции.Начать() + + Валюты.СоздатьБазовуюВалюту() + + знч Регионы = СоздатьРегионы() + знч Направления = СоздатьНаправления() + знч Услуги = СоздатьУслуги(Направления) + знч Стадии = СоздатьСтадииСделок() + знч Сотрудники = СоздатьСотрудников(Регионы, Ложь) + знч Клиенты = СоздатьКлиентов(Регионы, Направления, Сотрудники) + знч КонтактныеЛица = СоздатьКонтактныхЛиц(Клиенты, Сотрудники) + знч Сделки = СоздатьСделки(Сотрудники, Направления, Клиенты, КонтактныеЛица, Стадии, Услуги) + СоздатьЗадачи(Сделки) + СоздатьСобытия(Сделки) + СоздатьВалюты() + + Транзакция.Фиксировать() + + ПолнотекстовыйПоиск.ПерестроитьИндекс() +; + +@ВПроекте +метод ЗаполнитьДляНовогоПользователя(Пользователь: Пользователи.Ссылка) + исп новый ОперацияЗаполненияДемоДаннымиДляПользователя(Пользователь = Пользователь.Представление()).ЗаписатьНачало() + + исп КонтекстДоступа.Привилегированный() + + знч Регионы = СоздатьРегионы() + знч Направления = Направления.ПолучитьНаправления() + знч СтадииСделок = СтадииСделок.ПолучитьСтадииСделок() + знч Услуги = Услуги.ПолучитьУслуги() + + знч Сотрудник = новый Сотрудники.Объект( + Наименование = Пользователь.Представление(), + Пользователь = Пользователь, + Регион = Регионы[0], + Роль = РольСотрудника.Менеджер + ) + + Сотрудник.Записать() + + знч Сотрудники = СоздатьСотрудников(Регионы, Ложь) + Сотрудники.Вставить(0, Сотрудник.Ссылка) + + знч Клиенты = СоздатьКлиентов(Регионы, Направления, Сотрудники) + знч КонтактныеЛица = СоздатьКонтактныхЛиц(Клиенты, Сотрудники) + знч Сделки = СоздатьСделки(Сотрудники, Направления, Клиенты, КонтактныеЛица, СтадииСделок, Услуги) + СоздатьЗадачи(Сделки) + СоздатьСобытия(Сделки) +; + +метод СоздатьРегионы(): ЧитаемыйМассив<Регионы.Ссылка> + знч Регионы = <Регионы.Ссылка>[] + + знч Регион = новый Регионы.Объект(Наименование = "Россия") + Регион.Записать() + + Регионы.Добавить(Регион.Ссылка) + + возврат Регионы +; + +метод СоздатьНаправления(): ЧитаемыйМассив<Направления.Ссылка> + знч Направления = <Направления.Ссылка>[] + + пер Направление = новый Направления.Объект(Наименование = "Разработка и продвижение сайтов") + Направление.Записать() + Направления.Добавить(Направление.Ссылка) + + Направление = новый Направления.Объект(Наименование = "Разработка мобильных приложений") + Направление.Записать() + Направления.Добавить(Направление.Ссылка) + + возврат Направления +; + +метод СоздатьУслуги(Направления: ЧитаемыйМассив<Направления.Ссылка>): ЧитаемыйМассив<Услуги.Ссылка> + знч Услуги = <Услуги.Ссылка>[] + + // 0 + пер Услуга = новый Услуги.Объект(Наименование = "Лендинг для рекламной кампании", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 1 + Услуга = новый Услуги.Объект(Наименование = "Разработка корпоративного сайта", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 2 + Услуга = новый Услуги.Объект(Наименование = "Разработка дизайна сайта", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 3 + Услуга = новый Услуги.Объект(Наименование = "Сайт для фотовыставки", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 4 + Услуга = новый Услуги.Объект(Наименование = "Приложение для сотрудников", Владелец = Направления[1]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 5 + Услуга = новый Услуги.Объект(Наименование = "Разработка интернет-магазина", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 6 + Услуга = новый Услуги.Объект(Наименование = "Приложение для клиентов", Владелец = Направления[1]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 7 + Услуга = новый Услуги.Объект(Наименование = "Продвижение интернет-магазина", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 8 + Услуга = новый Услуги.Объект(Наименование = "Редизайн сайта", Владелец = Направления[0]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + // 9 + Услуга = новый Услуги.Объект(Наименование = "Приложение доставки", Владелец = Направления[1]) + Услуга.Записать() + Услуги.Добавить(Услуга.Ссылка) + + возврат Услуги +; + +метод СоздатьСтадииСделок(): ЧитаемыйМассив<СтадииСделок.Ссылка> + знч Стадии = <СтадииСделок.Ссылка>[] + + пер Стадия = новый СтадииСделок.Объект( + Наименование = "Первичный контакт", + Вид = ВидСтадииСделки.Активна, + Порядок = 10, + Иконка = Ресурс{РесурсыДемо/СтадияПервичныйКонтакт.png}.Ссылка, + ИмяФайлаИконки = "СтадияПервичныйКонтакт.png" + ) + + Стадия.Записать() + Стадии.Добавить(Стадия.Ссылка) + + Стадия = новый СтадииСделок.Объект( + Наименование = "Сделано предложение", + Вид = ВидСтадииСделки.Активна, + Порядок = 20, + Иконка = Ресурс{РесурсыДемо/СтадияСделаноПредложение.png}.Ссылка, + ИмяФайлаИконки = "СтадияСделаноПредложение.png" + ) + + Стадия.Записать() + Стадии.Добавить(Стадия.Ссылка) + + Стадия = новый СтадииСделок.Объект( + Наименование = "Переговоры", + Вид = ВидСтадииСделки.Активна, + Порядок = 30, + Иконка = Ресурс{РесурсыДемо/СтадияПереговоры.png}.Ссылка, + ИмяФайлаИконки = "СтадияПереговоры.png" + ) + + Стадия.Записать() + Стадии.Добавить(Стадия.Ссылка) + + Стадия = новый СтадииСделок.Объект( + Наименование = ИМЯ_СТАДИИ_ЗАКЛЮЧЕН_ДОГОВОР, + Вид = ВидСтадииСделки.ЗакрытаВыиграна, + Порядок = 40, + Иконка = Ресурс{РесурсыДемо/СтадияЗаключенДоговор.png}.Ссылка, + ИмяФайлаИконки = "СтадияЗаключенДоговор.png" + ) + + Стадия.Записать() + Стадии.Добавить(Стадия.Ссылка) + + Стадия = новый СтадииСделок.Объект( + Наименование = ИМЯ_СТАДИИ_ОТКАЗАНО, + Вид = ВидСтадииСделки.ЗакрытаПроиграна, + Порядок = 50, + Иконка = Ресурс{РесурсыДемо/СтадияОтказано.png}.Ссылка, + ИмяФайлаИконки = "СтадияОтказано.png" + ) + + Стадия.Записать() + Стадии.Добавить(Стадия.Ссылка) + + возврат Стадии +; + +метод СоздатьВалюты() + пер Валюта = новый Валюты.Объект(Код = "USD", Наименование = "Доллар") + Валюта.Записать() + + Валюта = новый Валюты.Объект(Код = "EUR", Наименование = "Евро") + Валюта.Записать() +; + +метод СоздатьСотрудников(Регионы: ЧитаемыйМассив<Регионы.Ссылка>, СоздатьПользователей: Булево): Массив<Сотрудники.Ссылка> + знч Сотрудники = <Сотрудники.Ссылка>[] + + пер Сотрудник = новый Сотрудники.Объект( + Наименование = "Яковлев С.Л.", + Регион = Регионы[0], + Роль = РольСотрудника.Менеджер + ) + + если СоздатьПользователей + Сотрудник.Пользователь = ПользователиКлиентИСервер.СоздатьПользователя("yakovlev", "yakovlev") + ; + + Сотрудник.Записать() + Сотрудники.Добавить(Сотрудник.Ссылка) + + Сотрудник = новый Сотрудники.Объект( + Наименование = "Смирнов В.Т.", + Регион = Регионы[0], + Роль = РольСотрудника.Менеджер + ) + + если СоздатьПользователей + Сотрудник.Пользователь = ПользователиКлиентИСервер.СоздатьПользователя("smirnov", "smirnov") + ; + + Сотрудник.Записать() + Сотрудники.Добавить(Сотрудник.Ссылка) + + возврат Сотрудники +; + +метод СоздатьКлиентов(Регионы: ЧитаемыйМассив<Регионы.Ссылка>, Направления: ЧитаемыйМассив<Направления.Ссылка>, Сотрудники: ЧитаемыйМассив<Сотрудники.Ссылка>): ЧитаемыйМассив<Клиенты.Ссылка> + знч Клиенты = <Клиенты.Ссылка>[] + Клиенты.Добавить(СоздатьКлиента("Мастерская \"Планета-3\"", Регионы[0], "620143, г. Екатеринбург, ул. Победы, д. 108", Сотрудники[0], Направления)) + Клиенты.Добавить(СоздатьКлиента("Художественный музей", Регионы[0], "150040, г. Ярославль, ул. Некрасова, д. 94", Сотрудники[1], Направления)) + Клиенты.Добавить(СоздатьКлиента("Предприятие \"Ротор-К\"", Регионы[0], "119501, г. Красногорск, ул. Речная, д. 83", Сотрудники[1], Направления)) + Клиенты.Добавить(СоздатьКлиента("Ресторан \"Ибис\"", Регионы[0], "420099, г. Казань, ул. Чехова, д. 86", Сотрудники[0], Направления)) + Клиенты.Добавить(СоздатьКлиента("Агентство \"Город\"", Регионы[0], "194044, г. Санкт-Петербург, Лесной пр., д. 117", Сотрудники[1], Направления)) + Клиенты.Добавить(СоздатьКлиента("Магазин \"Луч 24\"", Регионы[0], "105187, г. Москва, ул. Ткацкая, д. 137", Сотрудники[0], Направления)) + + возврат Клиенты +; + +метод СоздатьКлиента(Наименование: Строка, Регион: Регионы.Ссылка, Адрес: Строка, Ответственный: Сотрудники.Ссылка, Направления: ЧитаемыйМассив<Направления.Ссылка>): Клиенты.Ссылка + знч Клиент = новый Клиенты.Объект( + Наименование = Наименование, + Адрес = Адрес, + Ответственный = Ответственный, + Регион = Регион + ) + + Клиент.Записать() + + возврат Клиент.Ссылка +; + +метод СоздатьКонтактныхЛиц(Клиенты: ЧитаемыйМассив<Клиенты.Ссылка>, Сотрудники: ЧитаемыйМассив<Сотрудники.Ссылка>): ЧитаемыйМассив<КонтактныеЛица.Ссылка> + знч КонтактныеЛица = <КонтактныеЛица.Ссылка>[] + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[0], "Новиков Пётр Матвеевич", "Директор", "", "novikov@clplnt.ru", Сотрудники[0])) + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[1], "Гусев Максим Константинович", "Руководитель проекта", "+7 (999) 480-23-82", "", Сотрудники[1])) + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[2], "Казакова Людмила Федоровна", "Руководитель отдела продаж", "", "kazakova@rtrmsk.ru", Сотрудники[1])) + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[3], "Орлова Ольга Николаевна", "Менеджер по маркетингу", "+7 (999) 372-94-13", "orlova@ibisrst.ru", Сотрудники[0])) + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[4], "Соколов Николай Сергеевич", "Руководитель департамента", "+7 (999) 232-76-22", "sokolov@grdspb.ru", Сотрудники[1])) + КонтактныеЛица.Добавить(СоздатьКонтактноеЛицо(Клиенты[5], "Фролов Дмитрий Андреевич", "Директор", "+7 (999) 834-73-46", "", Сотрудники[0])) + + возврат КонтактныеЛица +; + +метод СоздатьКонтактноеЛицо(Клиент: Клиенты.Ссылка, Наименование: Строка, Должность: Строка, Телефон: Строка, + ЭлектроннаяПочта: Строка, Ответственный: Сотрудники.Ссылка): КонтактныеЛица.Ссылка + + знч КонтактноеЛицо = новый КонтактныеЛица.Объект( + Владелец = Клиент, + Наименование = Наименование, + Должность = Должность, + Телефон = Телефон, + ЭлектроннаяПочта = ЭлектроннаяПочта, + Ответственный = Ответственный + ) + + КонтактноеЛицо.Записать() + возврат КонтактноеЛицо.Ссылка +; + +метод СоздатьСделки(Сотрудники: ЧитаемыйМассив<Сотрудники.Ссылка>, + Направления: ЧитаемыйМассив<Направления.Ссылка>, + Клиенты: ЧитаемыйМассив<Клиенты.Ссылка>, + КонтактныеЛица: ЧитаемыйМассив<КонтактныеЛица.Ссылка>, + Стадии: ЧитаемыйМассив<СтадииСделок.Ссылка>, + Услуги: ЧитаемыйМассив<Услуги.Ссылка>): ЧитаемыйМассив<Сделки.Ссылка> + + знч Сделки = <Сделки.Ссылка>[] + + знч Валюта = Валюты.ПолучитьБазовуюВалюту() + + знч ЧасовойПояс = ЧасовойПояс.Текущий() + знч Сейчас = ДатаВремя.Сейчас() + + знч Генератор = новый СлучайныйГенератор() + знч СекундВСутках = 86400 + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-5).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(27).Дата, Направления[0], Клиенты[4], КонтактныеЛица[4], "Лендинг для рекламной кампании", Стадии[0], Валюта, 22000, [Услуги[0], Услуги[2]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-6).ВМомент(ЧасовойПояс), Сейчас.ДобавитьДни(20).Дата, Направления[1], Клиенты[3], + КонтактныеЛица[3], "Приложение доставки", Стадии[1], Валюта, 105000, [Услуги[9], Услуги[6]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-5).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(20).Дата, Направления[0], Клиенты[5], КонтактныеЛица[5], "Разработка корпоративного сайта", Стадии[1], Валюта, 240000, [Услуги[1], Услуги[2]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-7).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(14).Дата, Направления[0], Клиенты[1], КонтактныеЛица[1], "Разработка дизайна сайта", Стадии[0], Валюта, 138000, [Услуги[2], Услуги[8]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-6).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(40).Дата, Направления[0], Клиенты[1], КонтактныеЛица[1], "Сайт для фотовыставки", Стадии[2], Валюта, 64000, [Услуги[3], Услуги[8]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-7).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(37).Дата, Направления[1], Клиенты[2], КонтактныеЛица[2], "Приложение для сотрудников", Стадии[0], Валюта, 78000, [Услуги[4], Услуги[6]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-5).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(28).Дата, Направления[0], Клиенты[5], КонтактныеЛица[5], "Разработка интернет-магазина", Стадии[1], Валюта, 131000, [Услуги[5], Услуги[7]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-5).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(25).Дата, Направления[1], Клиенты[0], КонтактныеЛица[0], "Приложение для клиентов", Стадии[2], Валюта, 68000, [Услуги[6], Услуги[4]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-14).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-9).Дата, Направления[0], Клиенты[5], КонтактныеЛица[5], "Продвижение интернет-магазина", Стадии[0], Валюта, 35000, [Услуги[7], Услуги[8]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-5).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(35).Дата, Направления[0], Клиенты[4], КонтактныеЛица[4], "Редизайн сайта", Стадии[0], Валюта, 56000, [Услуги[8], Услуги[7]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-127).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-96).Дата, Направления[0], Клиенты[4], КонтактныеЛица[4], "Лендинг для рекламной кампании", Стадии[3], Валюта, 22000, [Услуги[0], Услуги[8]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-123).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-103).Дата, Направления[1], Клиенты[3], КонтактныеЛица[3], "Приложение доставки", Стадии[3], Валюта, 105000, [Услуги[9], Услуги[6]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-96).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-52).Дата, Направления[0], Клиенты[1], КонтактныеЛица[1], "Сайт для фотовыставки", Стадии[3], Валюта, 64000, [Услуги[3], Услуги[8]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-95).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-55).Дата, Направления[1], Клиенты[2], КонтактныеЛица[2], "Приложение для сотрудников", Стадии[3], Валюта, 78000, [Услуги[4], Услуги[6]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-66).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-34).Дата, Направления[0], Клиенты[5], КонтактныеЛица[5], "Разработка интернет-магазина", Стадии[3], Валюта, 131000, [Услуги[5], Услуги[7]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-65).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-37).Дата, Направления[1], Клиенты[0], КонтактныеЛица[0], "Приложение для клиентов", Стадии[3], Валюта, 68000, [Услуги[6], Услуги[4]])) + + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-13).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-1).Дата, Направления[0], Клиенты[5], КонтактныеЛица[5], "Продвижение интернет-магазина", Стадии[3], Валюта, 35000, [Услуги[7], Услуги[8]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[1], Сейчас.ДобавитьДни(-13).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-1).Дата, Направления[1], Клиенты[2], КонтактныеЛица[2], "Приложение для сотрудников", Стадии[3], Валюта, 89000, [Услуги[4], Услуги[6]])) + Сделки.Добавить(СоздатьСделку(Сотрудники[0], Сейчас.ДобавитьДни(-14).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + Сейчас.ДобавитьДни(-1).Дата, Направления[0], Клиенты[4], КонтактныеЛица[4], "Редизайн сайта", Стадии[3], Валюта, 12000, [Услуги[8], Услуги[7]])) + возврат Сделки +; + +метод СоздатьСделку(Ответственный: Сотрудники.Ссылка, + ДатаСоздания: Момент, + ДатаЗакрытия: Дата, + Направление: Направления.Ссылка, + Клиент: Клиенты.Ссылка, + КонтактноеЛицо: КонтактныеЛица.Ссылка, + Наименование: Строка, + Стадия: СтадииСделок.Ссылка, + ВалютаСделки: Валюты.Ссылка, + Сумма: Число, + Услуги: ЧитаемыйМассив<Услуги.Ссылка>): Сделки.Ссылка + + знч Сделка = новый Сделки.Объект( + Ответственный = Ответственный, + ДатаСоздания = ДатаСоздания, + ДатаЗакрытия = ДатаЗакрытия, + Направление = Направление, + Клиент = Клиент, + КонтактноеЛицо = КонтактноеЛицо, + Наименование = Наименование, + Стадия = Стадия, + ВалютаСделки = ВалютаСделки, + СуммаВВалютеСделки = Сумма, + СуммаВВалютеУчета = Сумма + ) + + знч СтоимостьУслуги = Сумма / 2 + знч УслугиСделки = Услуги.Преобразовать(Услуга -> новый Сделки.Услуги(Услуга = Услуга, Количество = 1, Цена = СтоимостьУслуги, Сумма = СтоимостьУслуги)) + Сделка.Услуги.ДобавитьВсе(УслугиСделки) + + Сделка.Записать() + + возврат Сделка.Ссылка +; + +метод СоздатьЗадачи(Сделки: ЧитаемыйМассив<Сделки.Ссылка>): ЧитаемыйМассив<Задачи.Ссылка> + знч Задачи = <Задачи.Ссылка>[] + + знч ДанныеСделок = Пресейл::Сделки.ПолучитьДанныеСделок(Сделки) + + знч ЧасовойПояс = ЧасовойПояс.Текущий() + знч Генератор = новый СлучайныйГенератор() + знч СекундВСутках = 86400 + + для ДанныеСделки из ДанныеСделок + знч ДатаСделки = ДанныеСделки.ДатаСоздания.ВДатаВремя(ЧасовойПояс) + + Задачи.Добавить(СоздатьЗадачу(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(1).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "Отправить предложение", "", + ДатаСделки.ДобавитьДни(8).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + СтатусМероприятия.Завершено, ПриоритетЗадачи.Высокий)) + + Задачи.Добавить(СоздатьЗадачу(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(2).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "Договориться о встрече", "", + ДатаСделки.ДобавитьДни(3).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + СтатусМероприятия.ВПроцессе, ПриоритетЗадачи.Высокий)) + + Задачи.Добавить(СоздатьЗадачу(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(2).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "Проинформировать о готовности", "", + ДатаСделки.ДобавитьДни(9).ДобавитьСекунды(Генератор.СлучайноеЦелое(До = СекундВСутках)).ВМомент(ЧасовойПояс), + СтатусМероприятия.Запланировано, ПриоритетЗадачи.Обычный)) + ; + + возврат Задачи +; + +метод СоздатьЗадачу(Сделка: Сделки.Ссылка, + ДатаСоздания: Момент, + Ответственный: Сотрудники.Ссылка, + Наименование: Строка, + Описание: Строка, + ДатаЗавершения: Момент, + Статус: СтатусМероприятия, + Приоритет: ПриоритетЗадачи = ПриоритетЗадачи.Обычный): Задачи.Ссылка + + знч Задача = новый Задачи.Объект( + Владелец = Сделка, + ДатаСоздания = ДатаСоздания, + Ответственный = Ответственный, + Наименование = Наименование, + Описание = Описание, + ДатаЗавершения = ДатаЗавершения, + Статус = Статус, + Приоритет = Приоритет + ) + + Задача.Записать() + + возврат Задача.Ссылка +; + +метод СоздатьСобытия(Сделки: ЧитаемыйМассив<Сделки.Ссылка>): ЧитаемыйМассив<События.Ссылка> + знч События = <События.Ссылка>[] + + знч ДанныеСделок = Пресейл::Сделки.ПолучитьДанныеСделок(Сделки) + + знч ЧасовойПояс = ЧасовойПояс.Текущий() + знч Генератор = новый СлучайныйГенератор() + знч МинутВЧасе = 60 + + для ДанныеСделки из ДанныеСделок + знч ДатаСделки = ДанныеСделки.ДатаСоздания.ВДатаВремя(ЧасовойПояс) + + События.Добавить(СоздатьСобытие(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(2).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "Звонок от клиента", "", + ДатаСделки.ДобавитьДни(3).ВМомент(ЧасовойПояс), + ДатаСделки.ДобавитьДни(3).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс))) + + События.Добавить(СоздатьСобытие(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(2).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "E-mail от клиента", "", + ДатаСделки.ДобавитьДни(2).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс), + Момент{})) + + События.Добавить(СоздатьСобытие(ДанныеСделки.Ссылка, + ДатаСделки.ДобавитьДни(2).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс), + ДанныеСделки.Ответственный, "Звонок клиенту", "", + ДатаСделки.ДобавитьДни(7).ВМомент(ЧасовойПояс), + ДатаСделки.ДобавитьДни(7).ДобавитьМинуты(Генератор.СлучайноеЦелое(До = МинутВЧасе)).ВМомент(ЧасовойПояс))) + ; + + возврат События +; + +метод СоздатьСобытие(Сделка: Сделки.Ссылка, + ДатаСоздания: Момент, + Ответственный: Сотрудники.Ссылка, + Наименование: Строка, + Описание: Строка, + ДатаНачала: Момент, + ДатаЗавершения: Момент): События.Ссылка + + знч Событие = новый События.Объект( + Владелец = Сделка, + ДатаСоздания = ДатаСоздания, + Ответственный = Ответственный, + Наименование = Наименование, + Описание = Описание, + ДатаНачала = ДатаНачала, + ДатаЗавершения = ДатаЗавершения + ) + + Событие.Записать() + + возврат Событие.Ссылка +; diff --git a/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.yaml b/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.yaml new file mode 100644 index 0000000..60a9f00 --- /dev/null +++ b/Koncept/Testovoe/Основное/ЗаполнениеДемоДанными.yaml @@ -0,0 +1,5 @@ +ВидЭлемента: ОбщийМодуль +Ид: 8a9e7e88-e542-41b3-9146-d24aa45d5762 +ОбластьВидимости: ВПроекте +Имя: ЗаполнениеДемоДанными +Окружение: Сервер diff --git a/Koncept/Testovoe/Основное/КлючДоступаМенеджера.xbsl b/Koncept/Testovoe/Основное/КлючДоступаМенеджера.xbsl new file mode 100644 index 0000000..21c680f --- /dev/null +++ b/Koncept/Testovoe/Основное/КлючДоступаМенеджера.xbsl @@ -0,0 +1,40 @@ +импорт Общие + +@Обработчик +метод ПроверитьНаличиеКлючейДоступа(Ключи: ЧитаемыйМассив<КлючДоступаМенеджера.Объект>, Пользователи: ЧитаемыйМассив<Пользователи.Объект>): ЧитаемоеСоответствие<КлючДоступаМенеджера.Объект, ЧитаемаяКоллекция<Пользователи.Объект|Пользователи.Ссылка>> + знч Регионы = Ключи.Преобразовать(Ключ -> Ключ.Владелец) + + знч ПользователиСсылки = Пользователи.Преобразовать(Пользователь -> Пользователь.Ссылка) + + знч Запрос = Запрос{ + ВЫБРАТЬ + Пользователь, + Регион + ИЗ + Сотрудники + ГДЕ + Регион В (%Регионы) + И Пользователь В (%ПользователиСсылки) + И Роль == РольСотрудника.Менеджер + } + + знч МенеджерыРегионов = <Регионы.Ссылка, Массив<Пользователи.Ссылка>>{:} + + исп РезультатЗапроса = Запрос.Выполнить() + + для СтрокаРезультата из РезультатЗапроса + МенеджерыРегионов.ВставитьЕслиОтсутствует(СтрокаРезультата.Регион, <Пользователи.Ссылка>[]) + МенеджерыРегионов.Получить(СтрокаРезультата.Регион).Добавить(СтрокаРезультата.Пользователь) + ; + + знч Результат = <КлючДоступаМенеджера.Объект, Массив<Пользователи.Ссылка>>{:} + + для Ключ из Ключи + знч МенеджерыРегиона = МенеджерыРегионов.ПолучитьИлиУмолчание(Ключ.Владелец) + если МенеджерыРегиона != Неопределено + Результат.Вставить(Ключ, МенеджерыРегиона) + ; + ; + + возврат Результат +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/КлючДоступаМенеджера.yaml b/Koncept/Testovoe/Основное/КлючДоступаМенеджера.yaml new file mode 100644 index 0000000..7a0cca6 --- /dev/null +++ b/Koncept/Testovoe/Основное/КлючДоступаМенеджера.yaml @@ -0,0 +1,10 @@ +ВидЭлемента: КлючДоступа +Ид: c84679a3-ec99-42d6-bf77-19d114eaf53e +Имя: КлючДоступаМенеджера +ОбластьВидимости: ВПроекте +Импорт: + - Общие +Параметры: + - + Имя: Владелец + Тип: Регионы.Ссылка? diff --git a/Koncept/Testovoe/Основное/КлючДоступаРуководителя.xbsl b/Koncept/Testovoe/Основное/КлючДоступаРуководителя.xbsl new file mode 100644 index 0000000..2c135a5 --- /dev/null +++ b/Koncept/Testovoe/Основное/КлючДоступаРуководителя.xbsl @@ -0,0 +1,26 @@ +@Обработчик +метод ПроверитьНаличиеКлючейДоступа(Ключи: ЧитаемыйМассив<КлючДоступаРуководителя.Объект>, Пользователи: ЧитаемыйМассив<Пользователи.Объект>): ЧитаемоеСоответствие<КлючДоступаРуководителя.Объект, ЧитаемаяКоллекция<Пользователи.Объект|Пользователи.Ссылка>> + знч ПользователиСсылки = Пользователи.Преобразовать(Пользователь -> Пользователь.Ссылка) + + знч Запрос = Запрос{ + ВЫБРАТЬ + Пользователь + ИЗ + Сотрудники + ГДЕ + Пользователь В (%ПользователиСсылки) + И Роль == РольСотрудника.Руководитель + } + + исп РезультатЗапроса = Запрос.Выполнить() + + знч Руководители = РезультатЗапроса.Преобразовать(СтрокаРезультата -> СтрокаРезультата.Пользователь!) + + знч Результат = <КлючДоступаРуководителя.Объект, Массив<Пользователи.Ссылка>>{:} + + для Ключ из Ключи + Результат.Вставить(Ключ, Руководители) + ; + + возврат Результат +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/КлючДоступаРуководителя.yaml b/Koncept/Testovoe/Основное/КлючДоступаРуководителя.yaml new file mode 100644 index 0000000..7b097c3 --- /dev/null +++ b/Koncept/Testovoe/Основное/КлючДоступаРуководителя.yaml @@ -0,0 +1,4 @@ +ВидЭлемента: КлючДоступа +Ид: cd399756-435a-4b77-a1d9-d3d3de3ef01c +Имя: КлючДоступаРуководителя +ОбластьВидимости: ВПодсистеме diff --git a/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.xbsl b/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.xbsl new file mode 100644 index 0000000..4e68c15 --- /dev/null +++ b/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.xbsl @@ -0,0 +1,4 @@ +@Обработчик +метод Обработчик() + Аутентификация.ЗавершитьТекущийСеанс() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.yaml b/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.yaml new file mode 100644 index 0000000..6ec9b6f --- /dev/null +++ b/Koncept/Testovoe/Основное/КомандаЗавершитьРаботу.yaml @@ -0,0 +1,6 @@ +ВидЭлемента: ОбычнаяКоманда +Ид: ca2b3d8c-837e-459b-8333-e964e448c716 +Имя: КомандаЗавершитьРаботу +ОбластьВидимости: ВПодсистеме +Представление: $ЛокализованныеСтроки.ЗавершитьРаботу +Изображение: Выход.svg diff --git a/Koncept/Testovoe/Основное/Локализация/En/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Основное/Локализация/En/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..33369d5 --- /dev/null +++ b/Koncept/Testovoe/Основное/Локализация/En/ЛокализованныеСтроки.yaml @@ -0,0 +1,26 @@ +Строки: + ЗаголовокСтраницыВхода: Demo 1C:Enterprise.Element + ПриветственныйТекстСтраницыВхода: If you don't have an account yet, click "Sign up" + Главная: Home + Настройки: Setup + ЗавершитьРаботу: Exit + Сотрудники: Employees + Сотрудник: Employee + Имя: Name + Пользователь: User + Роль: Role + Сохранить: Save + Создать: Create + Удалить: Delete + Добавить: Add + Менеджер: Manager + Руководитель: Supervisor + Администратор: Administrator + БотСистемыВзаимодействия: Collaboration system bot + СоздатьНовогоПользователя: Create new user + ЛогинНовогоПользователя: New user login + ВведитеЛогинНовогоПользователя: Enter new user login + Сервис: Service + КонсольЗапросов: Query console + Путеводитель: Guide + ПутеводительПоДемо: Demo guide \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Основное/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..12706b4 --- /dev/null +++ b/Koncept/Testovoe/Основное/ЛокализованныеСтроки.yaml @@ -0,0 +1,30 @@ +ВидЭлемента: ЛокализованныеСтроки +Ид: dd236276-3de6-4b0e-b5e9-d9469c55d820 +Имя: ЛокализованныеСтроки +ОбластьВидимости: ВПодсистеме +Строки: + ЗаголовокСтраницыВхода: Демо 1С:Предприятие.Элемент + ПриветственныйТекстСтраницыВхода: Если у Вас ещё нет учетной записи, нажмите "Зарегистрироваться" + Главная: Главная + Настройки: Настройки + ЗавершитьРаботу: Завершить работу + Сотрудники: Сотрудники + Сотрудник: Сотрудник + Имя: Имя + Пользователь: Пользователь + Роль: Роль + Сохранить: Сохранить + Создать: Создать + Удалить: Удалить + Добавить: Добавить + Менеджер: Менеджер + Руководитель: Руководитель + Администратор: Администратор + БотСистемыВзаимодействия: Бот системы взаимодействия + СоздатьНовогоПользователя: Создать нового пользователя + ЛогинНовогоПользователя: Логин нового пользователя + ВведитеЛогинНовогоПользователя: Введите логин нового пользователя + Сервис: Сервис + КонсольЗапросов: Консоль запросов + Путеводитель: Путеводитель + ПутеводительПоДемо: Путеводитель по демо diff --git a/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДанными.yaml b/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДанными.yaml new file mode 100644 index 0000000..5aa021a --- /dev/null +++ b/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДанными.yaml @@ -0,0 +1,10 @@ +ВидЭлемента: СобытиеЖурналаСобытий +Ид: 1236e63d-e14e-4f6f-8222-e5351232e824 +Имя: ОперацияЗаполненияДемоДанными +ОбластьВидимости: ВПодсистеме +Описание: Операция заполнения демо данными +Важность: Высокая +ВидСобытия: Операция +ШаблонПредставленияНачала: Начало заполнения демо данными +ШаблонПредставленияКонца: Завершение заполнения демо данными +ШаблонПредставленияОшибки: Не удалось выполнить заполнения демо данными diff --git a/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДаннымиДляПользователя.yaml b/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДаннымиДляПользователя.yaml new file mode 100644 index 0000000..324b8c9 --- /dev/null +++ b/Koncept/Testovoe/Основное/ОперацияЗаполненияДемоДаннымиДляПользователя.yaml @@ -0,0 +1,17 @@ +ВидЭлемента: СобытиеЖурналаСобытий +ОбластьВидимости: ВПодсистеме +Ид: 4fb288f1-45cc-4929-b09e-0ad0fbb10d14 +Имя: ОперацияЗаполненияДемоДаннымиДляПользователя +Описание: Операция заполнения демо данными для пользователя +Важность: Высокая +ВидСобытия: Операция +ШаблонПредставленияНачала: Начало заполнения демо данными для пользователя %{Пользователь} +ШаблонПредставленияКонца: Завершение заполнения демо данными для пользователя %{Пользователь} +ШаблонПредставленияОшибки: Не удалось выполнить заполнение демо данными для пользователя %{Пользователь} +Свойства: + - + Ид: 38268dab-c6ab-42ad-acf2-b64200447846 + Имя: Пользователь + Описание: Пользователь, для которого выполняется заполнение данными + Тип: Строка + Обязательно: Истина diff --git a/Koncept/Testovoe/Основное/ПанельНавигации.yaml b/Koncept/Testovoe/Основное/ПанельНавигации.yaml new file mode 100644 index 0000000..440d1cb --- /dev/null +++ b/Koncept/Testovoe/Основное/ПанельНавигации.yaml @@ -0,0 +1,67 @@ +ВидЭлемента: ФрагментКомандногоИнтерфейса +Ид: 9804578c-5b06-4c6b-a698-15232bd8841e +Имя: ПанельНавигации +ОбластьВидимости: ВПодсистеме +Импорт: + - Пресейл + - Мероприятия + - Общие + - Общие::КурсыВалют +Элементы: + - + Тип: НавигационнаяКоманда + Представление: $ЛокализованныеСтроки.Главная + Изображение: РазделГлавнаяСтраница.svg + ТипФормы: ГлавнаяСтраница + - + Тип: ГруппаКомандногоИнтерфейса<Команда> + Представление: $Пресейл::ЛокализованныеСтроки.Пресейл + Изображение: РазделПресейл.svg + Элементы: + - + Тип: НавигационнаяКоманда + Представление: $Пресейл::ЛокализованныеСтроки.Сделки + ТипФормы: СделкиФормаСписка + - + Тип: НавигационнаяКоманда + Представление: $Пресейл::ЛокализованныеСтроки.ОтчетОПродажах + ТипФормы: ОтчетОПродажахФорма + - =Клиенты.ОткрытьСписок + - =КонтактныеЛица.ОткрытьСписок + - =Услуги.ОткрытьСписок + - + Тип: ГруппаКомандногоИнтерфейса<Команда> + Представление: $Мероприятия::ЛокализованныеСтроки.Мероприятия + Изображение: РазделМероприятия.svg + Элементы: + - + Тип: НавигационнаяКоманда + Представление: $Мероприятия::ЛокализованныеСтроки.Задачи + ТипФормы: ЗадачиФормаСписка + - =События.ОткрытьСписок + - + Тип: ГруппаКомандногоИнтерфейса<Команда> + Представление: $ЛокализованныеСтроки.Настройки + Изображение: РазделНастройки.svg + Элементы: + - =Направления.ОткрытьСписок + - =Сотрудники.ОткрытьСписок + - =Регионы.ОткрытьСписок + - =СтадииСделок.ОткрытьСписок + - =Валюты.ОткрытьСписок + - =КурсыВалют.ОткрытьСписок + - + Тип: ГруппаКомандногоИнтерфейса<Команда> + Представление: $ЛокализованныеСтроки.Сервис + Изображение: РазделСервис.svg + Видимость: =ПользователиКлиентИСервер.ЭтоАдминистраторПриложения() + Элементы: + - + Тип: НавигационнаяКоманда + Представление: $ЛокализованныеСтроки.КонсольЗапросов + ТипФормы: QueryConsoleForm + - + Тип: НавигационнаяКоманда + Представление: $ЛокализованныеСтроки.Путеводитель + Изображение: РазделПутеводитель.svg + ТипФормы: ПутеводительПоПроекту diff --git a/Koncept/Testovoe/Основное/Подсистема.yaml b/Koncept/Testovoe/Основное/Подсистема.yaml new file mode 100644 index 0000000..c3747b0 --- /dev/null +++ b/Koncept/Testovoe/Основное/Подсистема.yaml @@ -0,0 +1,5 @@ +Использование: + - Пресейл + - Мероприятия + - Общие + - Основное diff --git a/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.xbsl b/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.xbsl new file mode 100644 index 0000000..b3085d2 --- /dev/null +++ b/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.xbsl @@ -0,0 +1,127 @@ +@ВПроекте +@НаСервере +метод ПолныеПраваНаСправочникДляАутентифицированных(): РазрешениеДоступа + возврат новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) +; + +@ВПроекте +@НаСервере +метод ПолныеПраваНаСправочникДляРуководителя(): РазрешениеДоступа + возврат новый РазрешениеДоступа( + [новый КлючДоступаРуководителя.Объект()], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) +; + +@ВПроекте +@НаСервере +метод ПолныеПраваНаРегистрСведенийДляРуководителя(): РазрешениеДоступа + возврат новый РазрешениеДоступа( + [новый КлючДоступаРуководителя.Объект()], + [Сущность.Право.Чтение, Сущность.Право.Изменение]) +; + +@ВПроекте +@НаСервере @ДоступноСКлиента +метод ЭтоАдминистраторПриложения(): Булево + знч ТекущийПользователь = Пользователи.ТекущийПользователь + если ТекущийПользователь == Неопределено + возврат Ложь + ; + + знч Запрос = Запрос{ + ВЫБРАТЬ + Администратор + ИЗ + Пользователи + ГДЕ + Ссылка == %ТекущийПользователь + } + + возврат Запрос.Выполнить().Единственный().Администратор +; + +@ВПроекте +@НаСервере @ДоступноСКлиента +метод ПолучитьТекущегоСотрудника(): Сотрудники.Ссылка? + знч ТекущийПользователь = Пользователи.ТекущийПользователь + если ТекущийПользователь == Неопределено + возврат Неопределено + ; + + знч Запрос = Запрос{ + ВЫБРАТЬ ПЕРВЫЕ 1 + Ссылка + ИЗ + Сотрудники + ГДЕ + Пользователь == %ТекущийПользователь + } + + возврат Запрос.Выполнить().ЕдинственныйИлиУмолчание()?.Ссылка +; + +@ВПроекте +@НаСервере @ДоступноСКлиента +метод ПолучитьДанныеТекущегоПользователя(): ДанныеПользователя + знч Запрос = Запрос{ + ВЫБРАТЬ + Пользователи.Ссылка КАК Пользователь, + Пользователи.Администратор КАК ЭтоАдминистраторПриложения, + Сотрудники.Ссылка.ЗаменитьNull(Неопределено) КАК Сотрудник, + Сотрудники.Роль.ЗаменитьNull(Неопределено) КАК Роль, + Сотрудники.Регион.ЗаменитьNull(Неопределено) КАК Регион + ЗАПОЛНИТЬ ДанныеПользователя + ИЗ + Пользователи КАК Пользователи + ЛЕВОЕ СОЕДИНЕНИЕ Сотрудники КАК Сотрудники + ПО Пользователи.Ссылка == Сотрудники.Пользователь + ГДЕ + Пользователи.Ссылка == %{Пользователи.ТекущийПользователь} + УПОРЯДОЧИТЬ ПО + Пользователи.Ссылка + } + + возврат Запрос.Выполнить().ЕдинственныйИлиУмолчание() ?? новый ДанныеПользователя() +; + +@ВПодсистеме +@НаСервере +метод СоздатьПользователя( + Представление: Строка, + Логин: Строка, + ЗапретитьВход: Булево = Ложь): Пользователи.Ссылка + + если Представление.Пусто() + выбросить новый ИсключениеНедопустимыйАргумент("Представление не может быть пустым") + ; + если Логин.Пусто() + выбросить новый ИсключениеНедопустимыйАргумент("Логин не может быть пустым") + ; + + знч СписокПользователей = СпискиПользователей.ПолучитьСписокПоУмолчанию() + + // Проверим, что пользователь с этим логином ещё не существует + знч МассивОписанийПользователей = СпискиПользователей.ПолучитьПользователей(СписокПользователей.Ид) + для Описание из МассивОписанийПользователей + если Описание.Логин == Логин + выбросить новый ИсключениеВыполнения("Пользователь с логином %Логин уже существует") + ; + ; + + знч Описание = новый ОписаниеПользователя(СписокПользователей.Ид, Представление, Логин) + + // Создаём пользователя + ПользователиСервиса.Создать(Описание) + + // Подключение созданного пользователя к приложению + знч СсылкаНаПользователя = Пользователи.Подключить(Описание.Ид).Ссылка + + // Запретим пользователю вход, если нужно + если ЗапретитьВход + Пользователи.ЗапретитьВход(СсылкаНаПользователя, Истина) + ; + + возврат СсылкаНаПользователя +; diff --git a/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.yaml b/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.yaml new file mode 100644 index 0000000..9c32bb0 --- /dev/null +++ b/Koncept/Testovoe/Основное/ПользователиКлиентИСервер.yaml @@ -0,0 +1,5 @@ +ВидЭлемента: ОбщийМодуль +Ид: 41e04fce-c023-44ba-b638-3edec37378d3 +Имя: ПользователиКлиентИСервер +ОбластьВидимости: ВПроекте +Окружение: КлиентИСервер diff --git a/Koncept/Testovoe/Основное/ПутеводительПоПроекту.xbsl b/Koncept/Testovoe/Основное/ПутеводительПоПроекту.xbsl new file mode 100644 index 0000000..ad6c1a8 --- /dev/null +++ b/Koncept/Testovoe/Основное/ПутеводительПоПроекту.xbsl @@ -0,0 +1,67 @@ +@Обработчик +метод ПослеСоздания() + ИсточникДанныхСпискаРазделов().Данные.ДобавитьВсе(ПолучитьДанныеПутеводителя()) +; + +метод ИсточникДанныхСпискаРазделов(): ИсточникДанныхМассив<Раздел> + возврат Компоненты.СписокРазделов.Источник +; + +метод ИсточникДанныхСпискаПодразделов(): ИсточникДанныхМассив<Раздел> + возврат Компоненты.СписокПодразделов.Источник +; + +метод СписокРазделовПриНажатииСтроки(Источник: Список<ИсточникДанныхМассив<Раздел>>, Событие: СобытиеСДанными<СтрокаСписка<Раздел>>) + знч Раздел = Событие.Данные.ДанныеСтроки + + Компоненты.ЗаголовокРаздела.Значение = Раздел.Заголовок + ИсточникДанныхСпискаПодразделов().Данные.Очистить() + ИсточникДанныхСпискаПодразделов().Данные.ДобавитьВсе(Раздел.Подразделы) + Компоненты.СписокПодразделов.ВыделитьСтроку(ИсточникДанныхСпискаПодразделов().Данные[0]) + ПерейтиКСпискуПодразделов() +; + +метод РазделыПриНажатии(Источник: Надпись, Событие: СобытиеПриНажатии) + ПерейтиКСпискуРазделов() +; + +метод ПерейтиКСпискуРазделов() + ИсточникДанныхСпискаПодразделов().Данные.Очистить() + Компоненты.СписокРазделов.Видимость = Истина + Компоненты.ГруппаПодразделов.Видимость = Ложь +; + +метод ПерейтиКСпискуПодразделов() + Компоненты.СписокРазделов.Видимость = Ложь + Компоненты.ГруппаПодразделов.Видимость = Истина +; + +@ВПодсистеме +@НаСервере @НаКлиенте +структура Раздел + обз знч Заголовок: Строка + знч Содержимое: Строка + знч Подразделы: Массив<Раздел> +; + +@НаСервере @ДоступноСКлиента +статический метод ПолучитьДанныеПутеводителя(): ЧитаемыйМассив<Раздел> + знч ДанныеПутеводителя = <Раздел>[] + + знч ПутеводительВывод = Ресурс{Путеводитель.json}.ОткрытьПотокЧтения() + знч ПутеводительСоответствие = СериализацияJson.ПрочитатьСоответствие(ПутеводительВывод) + ПутеводительВывод.Закрыть() + + для Уровень1 из ПутеводительСоответствие + знч Раздел = новый Раздел(Уровень1.Ключ) + + для Уровень2 из Уровень1.Значение как Соответствие<Строка, Объект?> + знч Подраздел = новый Раздел(Уровень2.Ключ, Уровень2.Значение как Строка) + Раздел.Подразделы.Добавить(Подраздел) + ; + + ДанныеПутеводителя.Добавить(Раздел) + ; + + возврат ДанныеПутеводителя +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/ПутеводительПоПроекту.yaml b/Koncept/Testovoe/Основное/ПутеводительПоПроекту.yaml new file mode 100644 index 0000000..52cfa02 --- /dev/null +++ b/Koncept/Testovoe/Основное/ПутеводительПоПроекту.yaml @@ -0,0 +1,104 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 5826731a-d110-410b-94c2-1ffef248d7fd +Имя: ПутеводительПоПроекту +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: Форма + Заголовок: Путеводитель по проекту + ПовторноеИспользованиеФормы: Истина + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: Таблица<ИсточникДанныхМассив<ПутеводительПоПроекту.Раздел>> + Имя: СписокРазделов + ТолькоЧтение: Истина + ВесПриРастягивании: 1 + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + ОтображатьШапку: Ложь + ИспользованиеПоиска: Ложь + РазмерСтраницы: 20 + ПриНажатииСтроки: СписокРазделовПриНажатииСтроки + Колонки: + - + Тип: ПроизвольнаяКолонкаТаблицы<ПутеводительПоПроекту.Раздел> + ШиринаВКолонках: Одинарная + ОтключитьСортировку: Истина + Содержимое: + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Надпись + Значение: =ДанныеСтроки.Заголовок + - + Тип: Картинка + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Конец + Изображение: ШевронВправо.svg + Цвет: =Цвета.Стилевые.ФонВторичный + - + Тип: ГруппаСписокСДеталями<ИсточникДанныхМассив<ПутеводительПоПроекту.Раздел>> + Имя: ГруппаПодразделов + Видимость: Ложь + КомпонентСписка: =Компоненты.СписокПодразделов + СодержимоеОсновное: + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Полуторный + Содержимое: + - + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоГоризонтали: Половинный + Ориентация: Горизонтальная + Содержимое: + - + Тип: Надпись + ОбрабатыватьНажатие: Истина + РазрешитьСжатие: Ложь + ПриНажатии: РазделыПриНажатии + Значение: + Тип: Строка + Значение: Разделы / + - + Тип: Надпись + Имя: ЗаголовокРаздела + Важность: Высокая + РазрешитьСжатие: Истина + МаксимальнаяВысотаВСтроках: 1 + - + Тип: Таблица<ИсточникДанныхМассив<ПутеводительПоПроекту.Раздел>> + Имя: СписокПодразделов + ТолькоЧтение: Истина + ВесПриРастягивании: 1 + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + ОтображатьШапку: Ложь + ИспользоватьВыделениеСтроки: Истина + РазмерСтраницы: 20 + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<ПутеводительПоПроекту.Раздел> + ПолеЗначения: Заголовок + ШиринаВКолонках: Одинарная + ОтключитьСортировку: Истина + СодержимоеДетали: + Тип: АвтоматическаяГруппа + Имя: ГруппаСодержимогоПодраздела + ШиринаВКолонках: Тройная + Ориентация: Вертикальная + Содержимое: + - + Тип: Надпись + Имя: ЗаголовокПодраздела + Значение: =ДанныеСтроки.Заголовок + Важность: Высокая + Шрифт: =СтилевыеШрифты.ЗаголовокКрупный + - + Тип: Надпись + Имя: СодержимоеПодраздела + Значение: =ДанныеСтроки.Содержимое + Важность: Высокая diff --git a/Koncept/Testovoe/Основное/Ресурсы/Валюты.svg b/Koncept/Testovoe/Основное/Ресурсы/Валюты.svg new file mode 100644 index 0000000..078879b --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/Валюты.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/Логотип.svg b/Koncept/Testovoe/Основное/Ресурсы/Логотип.svg new file mode 100644 index 0000000..da9aaf8 --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/Логотип.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/Путеводитель.json b/Koncept/Testovoe/Основное/Ресурсы/Путеводитель.json new file mode 100644 index 0000000..4dcbcfd --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/Путеводитель.json @@ -0,0 +1,66 @@ +{ + "Демонстрационное приложение" : { + "Общее описание" : "В приложении демонстрируются основные возможности и концепции технологии «1С:Предприятие.Элемент» на примере упрощённой CRM-системы.\n\nПроект не является законченным прикладным решением и не предназначен для автоматизации настоящих бизнес-процессов.\n\nДля того чтобы акцентировать внимание на отдельных механизмах и упростить их поиск в проекте, функции приложения, где они демонстрируются, реализованы лаконично.", + "Функциональность" : "Демонстрационное приложение ориентировано на управление сделками и клиентами условной компании, которая предоставляет услуги по двум направлениям: «Разработка и продвижение сайтов» и «Разработка мобильных приложений». Каждая сделка компании относится к одному из этих направлений.\n\nСделка отражает процесс оказания услуги клиенту компании на каждой стадии этого процесса.\n\nСделки регистрируются в одноименном справочнике. В сделке указывается клиент, контактное лицо, содержание, сумма и валюта сделки. Курсы валют загружаются автоматически.\n\nПроцесс оказания услуги описывается набором стадий в справочнике «Стадии сделок». Каждая сделка должна находиться в одной из этих стадий, что отражается в соответствующем реквизите справочника сделки.\n\nВ разрезе сделок можно вести учёт мероприятий – задач и событий, относящихся к сделке. Задача – это запланированная на определенное время работа, которая имеет статус выполнения. События предназначены для регистрации встреч, звонков и им подобных мероприятий. В отличие от задач, события имеют дату начала и завершения.\n\nПользователю в приложении может быть назначена роль сотрудника и регион. Роли сотрудников предопределены и делятся и Менеджеров и Руководителей. Сотрудник с ролью менеджера имеет доступ к сделкам только по своему региону.\n\nСотрудник с ролью руководителя имеет доступ ко всем сделкам, может создавать новых пользователей, управлять направлениями и стадиями сделок и выполнять другие настройки.\n\nАдминистратору приложения доступен раздел «Сервис», в котором расположена консоль запросов.\n\nПри первоначальной настройке приложения и при регистрации нового пользователя в приложении оно автоматически заполняется демонстрационными данными." + }, + "Структура проекта" : { + "Описание и модуль проекта" : "В файле описания проекта «Проект.yaml» установлены значения его основных свойств, таких как Представление и Версия.\n\nВ модуле проекта демонстрируется использование аннотаций @НастройкаПриложения и @ОбновлениеПроекта. Методы, помеченные этими аннотациями, выполняются при первоначальной настройке и при обновлении проекта приложения соответственно.", + "Подсистемы" : "В приложении определено 4 подсистемы: «Основное», «Общие», «Пресейл» и «Мероприятия». Элементы в них объединены по функциональному признаку. Подсистемы образуют пространства имён.\n\nДля каждого элемента подсистемы определена область видимости. Например, справочник «Общие::Направления» имеет область видимости «ВПроекте» и виден во всех подсистемах проекта, а форма «Общие::НаправленияФормаОбъекта» с областью видимости «Подсистема» видима только внутри своей подсистемы и её пакетов.", + "Пакеты" : "В подсистеме «Общие» создан пакет «КурсыВалют», в котором сгруппированы элементы, относящиеся к загрузке, хранению и пересчету курсов валют. Пакет образует вложенное пространство имён внутри подсистемы. Для обращения к элементам пакета выполняется импорт пространства имён пакета «Общие::КурсыВалют», либо используются квалифицированные имена самих элементов: «Общие::КурсыВалют::Валюты».", + "Ресурсы" : "Подсистемы и пакеты приложения содержат каталог «Ресурсы».\n\nСсылки на файлы изображений из каталогов ресурсов используются в компонентах интерфейса (там, где не используются стандартные иконки). Например, в панели навигации приложения навигационные команды и группы командного интерфейса содержат ссылку на двоичные данные иконки раздела.\n\nВ методе ПолучитьИконкуМероприятия() формы «Пресейл::СделкиФормаОбъекта» демонстрируется получение ссылки на ресурс с помощью литерала." + }, + "Элементы проекта и прикладные объекты" : { + "Справочники" : "Во всех подсистемах приложения представлены элементы вида «Справочник».\n\nДля каждого справочника определена форма объекта и форма списка, описаны права доступа.\n\nВ справочнике «Сделки» используется стандартный реквизит «Код» с автонумерацией, включающей префикс.\n\nВ справочниках «Задачи» и «События» используется стандартный реквизит «Владелец». При удалении сделки - владельца задачи или события, они также автоматически удаляются.\n\nВ модуле объекта справочника «Сделки» реализованы обработчики событий ПриЗаполнении, ПередЗаписью и ПослеЗаписи. \n\nДля справочника «Сделки» заданы параметры записи, значения которых проверяются в обработчиках события записи.", + "Регистры сведений" : "В пакете «Общие::КурсыВалют» определен периодический регистр сведений «КурсыВалют».\n\nВ общем модуле «КурсыВалютСервер» демонстрируется добавление записей в регистр сведений (метод «ЗагрузитьКурсыВалюты()») и запрос к виртуальной таблице среза последних (метод «ПолучитьКурсВалюты()»).\n\nДля регистра установлена форма объекта (относящаяся к записи регистра) и форма списка – «КурсыВалютФормаОбъекта» и «КурсыВалютФормаСписка», соответственно.\n\nТаблицы регистра сведений могут быть использованы в динамическом списке в качестве основных или присоединенных таблиц. Например, в форме «КурсыВалютФормаСписка» в динамическом списке выводятся данные основной таблицы регистра, а форме «ВалютыФормаСписка» к основной таблице динамического списка присоединяется виртуальная таблица «КурсыВалют.СрезПоследних».", + "Структуры" : "Структуры «Основное::ДанныеПользователя» и «Общие::КурсыВалют::КурсВалюты» объединяют группы полей с разными типами под именем объекта структуры. Эти структуры имеют область видимости «ВПроекте» и могут использоваться во всех подсистемах.", + "Хранимые структуры": "В подсистеме «Мероприятия» представлена хранимая структура «Участники мероприятия». Она описывает элементы множественного реквизита «Участники» справочника «Мероприятия::События».", + "Перечисления" : "Реквизит «Приоритет» справочника «Мероприятия::Задачи» имеет тип перечисления «ПриоритетЗадачи». В модуле этого перечисления описан метод «ПолучитьЦвет()», который используется для определения цвета бейджа статуса в форме списка задач.\n\nПеречисление «Мероприятия::СтатусМероприятия» порождает тип, который используется в справочнике «Задачи». В методе ПолучитьДанныеСделок() модуля менеджера справочника Сделок демонстрируется использование значений перечисления в литерале запроса.\n\nРеквизит «Роль» справочника «Основное::Сотрудники» имеет тип перечисления «РольСотрудника». Значение этого реквизита используется в методах проверки наличия ключей доступа у пользователей.", + "Общие модули" : "В приложении используются общие модули «Общие::КурсыВалют::КурсыВалютСервер», «Основное::ПользователиКлиентИСервер». Методы этих модулей выполняются на клиенте или на сервере в зависимости от значения свойства «Окружение» модуля и доступны в соответствии с их областью видимости через поле глобального контекста с именем модуля.", + "Отчеты" : "На примере отчета «ОтчетОПродажах» в подсистеме «Пресейл» показана возможность встраивания отчета 1С:Аналитики в интерфейс приложения.\n\nЭтот отчет выводит данные о выигранных сделках по каждому из направлений в виде стековой диаграммы.\n\nВ качестве источника данных отчет использует виртуальную таблицу «ОтчетОПродажахТаблица».\n\nНа форму отчета выведено поле установки значения параметра «Ответственный» виртуальной таблицы и помещена команда открытия отчета в интерфейсе 1С:Аналитики.", + "Виртуальные таблицы" : "Источником данных отчета «ОтчетОПродажах» является виртуальная таблица «ОтчетОПродажахТаблица».\n\nВиртуальная таблица имеет параметр «Ответственный», значение которого передается из Отчета.", + "Диаграммы" : "На главной странице приложения размещены диаграммы двух типов – Воронкообразная диаграмма и Круговая диаграмма. В проекте приложения это произвольные компоненты интерфейса «ДиаграммаВоронкаПродаж» и «ДиаграммаПродажиПоНаправлениям» соответственно." + }, + "Пользовательский интерфейс" : { + "Командный интерфейс" : "Панель навигации демонстрационного приложения, расположенная в подсистеме «Основное» – это фрагмент командного интерфейса, в котором представлены навигационные команды, команды справочников и группы командного интерфейса.\n\nС помощью навигационных команд панели навигации открываются некоторые формы приложения (например, «СделкиФормаСписка»). \n\nУ навигационных команд открытия форм списков справочников Клиентов, Контактных лиц и других не требуется изменять значения свойств по умолчанию, поэтому для открытия этих форм используются команды автоматически порождаемого командного интерфейса: Клиенты.ОткрытьСписок.\n\nЧасть команд панели навигации демонстрационного приложения объединены в группы командного интерфейса.\n\nНавигационные команды и группы командного интерфейса на верхнем уровне панели навигации образуют разделы клиентского приложения. Для этих элементов установлены изображения, которые становятся иконками разделов.\n\nВ дополнительный командный интерфейс приложения помещена команда завершения сеанса, а в командный интерфейс панели действий – команда поиска.\n\nВ форме «Пресейл::КлиентыФормаСписка» используется команда создания. При её выполнении будет открыта форма нового объекта, соответствующего основной таблице списка. На форме команда создания располагается справа от заголовка.\n\nПрименение главной и основных команд формы показано в форме «Мероприятия::ЗадачиФормаОбъекта», где главной командой назначена команда «СохранитьИЗакрыть», а в состав основных добавлены команды «Сохранить» и «Удалить».\n\nДополнительные команды формы используются в формах «ВалютыФормаСписка» и «ЗадачиФормаСписка». На формах дополнительные команды располагаются в верхнем правом углу.", + "Формы" : "В описаниях таких элементов проекта как Справочники определены их формы объектов и формы списков. Это компоненты интерфейса, которые наследуют тип «ФормаОбъекта» и «ФормаСписка», соответственно. Эти формы открываются при выполнении команд автоматически порождаемого командного интерфейса (таких как «ОткрытьСписок»).\n\nФормаОбъекта – это обобщенный тип. Он параметризуется типом объекта, который редактируется в форме, и, если при закрытии формы возвращается параметр – типом этого параметра. Пример возвращения значения при закрытии формы можно увидеть в компоненте «КлиентыФормаОбъекта».\n\nДля размещения компонентов на форме «СделкиФормаОбъекта» используется «ШаблонФормыСРазделами». Этот шаблон разбивает контент формы Сделки на несколько разделов – основной раздел (слева), в котором расположены основные поля Сделки, и дополнительные разделы (в виде страниц), в которые помещена табличная часть Услуг, списки Задач и Событий. ШаблонФормыСРазделами автоматически трансформируется в мобильный форм фактор.", + "Автоматическая группа" : "Для компоновки элементов интерфейса в приложении используются разные виды групп.\n\nВ формах «Основное::ГлавнаяСтраница» и «Мероприятия::ЗадачиФормаОбъекта» можно увидеть примеры использования Автоматической группы, предназначенной для автоматического расположения компонентов внутри своей области с выравниванием по направляющим колонкам.\n\nАвтоматическая группа адаптируется к мобильным устройствам.", + "Поле ввода" : "Поля ввода представлены в формах объектов справочников и в других формах, например, в форме «Общие::КурсыВалют::ФормаЗагрузкиКурсовВалют».\n\nКомпонент поля ввода является обобщенным. При его описании указывается параметр типа, и в зависимости от его значения изменяется элемент управления поля ввода. Например, тип поля ввода на форме «ФормаЗагрузкиКурсовВалют» – «ЗакрытыйДиапазон», и поле ввода имеет соответствующий вид.\n\nПараметры типа полей вода, предназначенных для выбора элементов справочников, – это ссылки справочников. В поле ввода контактного лица на форме «Пресейл::ФормаСозданияСделки» и в поле ввода сделки на форме «Мероприятия::ЗадачиФормаОбъекта» демонстрируется использование свойства «НастройкиВводаСсылок» для установки отбора на список элементов справочника, доступных для выбора.\n\nДля поля ввода может быть установлено описание, как для поля ввода даты закрытия на форме «СделкиФормаОбъекта».\n\nДля поля ввода может быть установлен текст сообщения об ошибке. При нажатии кнопки «Добавить» в форме «ФормаДобавленияУчастника» проверяются значения обязательного поля и, если оно не заполнено, этому полю устанавливается соответствующее значение свойства «РезультатПроверкиДанных». При этом под полем ввода появляется сообщение «Выберите участника». Текст этого сообщения задается свойством «СообщениеОшибка» поля ввода.", + "Таблица" : "Для вывода данных Сделок, Клиентов, Контактных лиц в формах списков этих справочников используется компонент Таблица.\n\nДля Таблицы определяется массив колонок, каждая из которых может быть либо стандартной (тип «СтандартнаяКолонкаТаблицы»), либо иметь произвольное содержимое (тип «ПроизвольнаяКолонкаТаблицы»).\n\nКолонки большинства таблиц приложения – стандартные. Стандартная колонка может быть разных видов. Например, статус задачи в форме списка Задач имеет вид значка. В ячейке стандартной колонки может выводиться изображение, как в колонке наименования таблицы Стадий сделок. Для данных типа «Сущность.Ссылка» надпись в ячейке стандартной колонки по умолчанию принимает вид гиперссылки, как в колонке «Клиент» списка Сделок. Для колонки «Направление» этого же списка вывод гиперссылки отключен.\n\nИсточником данных для Таблицы может быть как Динамический список (как в формах списков Клиентов, Контактных лиц и др.), так и Источник данных массив (как в таблице участников на форме объекта События).\n\nВ модуле формы «ЗадачиФормаСписка» демонстрируется программное создание сохраненной настройки таблицы с помощью обработчика «ПриЧтенииНастроекТаблицы». В этом примере сохраненная настройка с названием «Мои задачи» содержит фильтр по задачам текущего сотрудника. Эта настройка применяется автоматически и её также можно выбрать в меню фильтров таблицы.", + "Стандартный список" : "На форме «Пресейл::СделкиФормаОбъекта» списки Задач и Событий выводятся с помощью стандартного списка. Для строки такого списка можно установить изображение, описание и другое стандартное наполнение.", + "Источник данных массив" : "Источник данных списка участников в форме «Мероприятия::СобытияФормаОбъекта» имеет тип «ИсточникДанныхМассив».\n\nВ отличие от динамического списка, данные источника этого типа могут быть заполнены программно, например, с помощью произвольного запроса.", + "Динамический список" : "Источником данных для таблиц большинства форм списков (списки справочников Клиентов, Контактных лиц и др.) является динамический список.\n\nДля динамических списков указывается основная таблица и выражения полей, в которых можно использовать разыменования, как для поля «Владелец.Клиент» в формах списков Задач и Событий. Также может быть определен порядок сортировки записей (например, сортировка по полю «Дата создания» в формах списков Задач и Событий).\n\nВ форме списка Валют демонстрируются присоединенные таблицы динамического списка. Основная таблица справочника Валют соединяется с виртуальной таблицей среза последних регистра сведений Курсы валют. И для основной и для присоединенной таблиц указываются псевдонимы, которые используются в выражении соединения таблиц и в выражениях полей динамического списка.", + "Уведомления" : "При создании нового Клиента или Контактного лица пользователь получает оповещение о записи нового объекта с помощью механизма уведомлений. Уведомления создаются в формах этих объектов в обработчиках команды сохранения.\n\nНа эти уведомления добавлена кнопка, при нажатии на которую открывается форма созданного объекта.\n\nПосле закрытия уведомления оно может оставааться в Центре уведомлений, за что отвечает свойство «СохранитьВЦентреУведомлений» объекта уведомления.\n\nУведомления создаются также при загрузке курсов валют, при создании новых Сделок, Задач и Событий и при завершении мероприятий.", + "Модальные диалоги" : "В модуле формы «Пресейл::СделкиФормаОбъекта» показан пример использования модальных диалоговых окон для подтверждения удаления задач и событий.", + "Стандартные карточки" : "В качестве главной страницы приложения установлена форма «Основное::ГлавнаяСтраница». На этой форме расположена группа стандартных карточек.\n\nСтандартные карточки имеют предопределенный вид. Для них устанавливаются значения свойств «Заголовок», «Картинка», «Команды».\n\nКарточки на главной странице содержат важную для пользователя информацию и могут вести к разделам приложения.", + "Стандартная библиотека картинок" : "В компонентах интерфейса проекта используются иконки из стандартной библиотеки картинок. Например, в форме «ЗадачиФормаСписка» используются стандартные иконки «Галочка.svg», «Скачать.svg».", + "Обучающие подсказки" : "В приложении используется механизм обучающих подсказок, который можно увидеть в форме «Пресейл::СделкиФормаОбъекта». Эти подсказки помогают пользователю ознакомиться с интерфейсом формы Сделки." + }, + "Синтаксис и концепции языка" : { + "Объект языка Структура" : "В модуле элемента проекта «Пресейл::ДиаграммаПродажиПоНаправлениям» объявлена структура с именем «ДанныеПродаж», которая объединяет группу полей под именем структуры.\n\nВсе поля этой структуры объявлены с использованием ключевого слова «знч», а значит, состояние объекта структуры не может быть изменено после создания.\n\nДля создания объектов структуры используется автоматически генерируемый конструктор, содержащий все поля в порядке их объявления.\n\nТак как все поля структуры имеют признак обязательности «обз», значения каждого из них должно быть установлено при создании объекта.", + "Константы" : "В модуле объекта справочника «Общие::КурсыВалют::Валюты» объявлена константа «КОД_БАЗОВОЙ_ВАЛЮТЫ», которая имеет модификатор видимости @ВПроекте и используется в модуле и за его пределами.\n\nВ общем модуле «КурсыВалютСервер» объявлена константа «КЛЮЧ_ЗАДАНИЯ_ЗАГРУЗКИ_КУРСОВ». Она не имеет явных модификаторов видимости и по умолчанию видима только в пределах модуля.", + "Исключения" : "В общем модуле «Общие::КурсыВалют::КурсыВалютСервер» объявлено исключение с именем «ИсключениеЗагрузкиКурсовВалют».\n\nЭто исключение выбрасывается при перехвате исключений «ИсключениеHttp», «ИсключениеЧтенияXml» и при других ошибках загрузки курсов валют. В вызывающем методе «ИсключениеЗагрузкиКурсовВалют» обрабатывается (регистрируется в журнале событий).\n\nК стандартным свойствам исключения добавлено обязательное поле «Валюта». При создании объекта исключения «ИсключениеЗагрузкиКурсовВалют» используется автоматически генерируемый конструктор, принимающий в качестве параметров строковое описание исключения, значение поля «Валюта» и первоначальное исключение-причину.", + "Составные типы": "Поле «Участник» хранимой структуры «Мероприятия::УчастникиМероприятия» имеет составной тип Сотрудники.Ссылка|КонтактныеЛица.Ссылка|Неопределено", + "Функциональные типы" : "При создании объектов уведомлений в формах Клиентов и Контактных лиц в качестве обработчиков событий нажатия кнопок действия используются лямбда-выражения.\n\nВ модуле формы «Основное::ГлавнаяСтраница» в методе ПослеСоздания() в параметр процедуры ПодключитьОбработчикТаймера() передается ссылка на метод, расположенный в этом же модуле.", + "Интерполяция строк" : "Интерполяция строк, т.е. включение в строковой литерал вычисляемых выражений, демонстрируется в методе «ПолучитьЗаголовокДатыМероприятия» модуля формы «Пресейл::СделкиФормаОбъекта».\n\nДля дат в этих литералах установлен формат представления.", + "Работа с коллекциями" : "В модулях проекта приложения демонстрируются некоторые методы работы с коллекциями, позволяющие выполнять над ними определенные операции в функциональном стиле.\n\nК примеру, в обработчике «ВычислитьРазрешенияДоступаДляОбъектов()» модуля объекта справочника Задачи к массиву объектов применяются операции «Фильтровать» и «Преобразовать».\n\nВ методе «ПолучитьВсе()» модуля менеджера справочника «Валюты» результат запроса преобразуется к массиву одной строкой кода.", + "Заполнение структур в запросах" : "В методе «ПолучитьКурсВалюты()» модуля «КурсыВалютСервер» в качестве типа строк результата типизированного запроса используется определенная в проекте структура «КурсВалюты». Для этого используется ключевое слово «ЗАПОЛНИТЬ» языка запросов.\n\nВ методе «ПолучитьСтатистикуАктивныхСделок» модуля менеджера справочника «Сделки» структура «СтатистикаСделок» порождается самим запросом. Для этого используется ключевое слово «ПОРОДИТЬ» языка запросов.\n\nВидимость порождаемой структуры соответствует типу, которому принадлежит модуль. Имя типа порождаемой структуры имеет вид «ИмяТипа.ИмяСтруктуры». В данном случае, «Сделки.СтатистикаСделок»." + }, + "Инструменты интеграции" : { + "HTTP-сервисы" : "С помощью HTTP-сервиса «Пресейл::СделкиHttpСервис» можно получить данные сделок по HTTP. Для этого определено два шаблона URL и обработчики GET-запросов, соответствующих этим шаблонам.\n\nС помощью запроса по первому адресу можно получить данные всех сделок с отбором по стадии сделки. Значение отбора по стадии передается в параметрах URL. Тело ответа записывается в поток записи по мере получения объектов из базы данных.\n\nС помощью запроса по второму адресу можно получить данные конкретной сделки. Код сделки передается как часть пути к ресурсу. Тело ответа устанавливается из строки.\n\nДля сериализации данных сделок используется глобальный объект «СериализацияJson».", + "Работа с внешними ресурсами по HTTP" : "В общем модуле «Общие::КурсыВалют::КурсыВалютСервер» демонстрируется использование объекта КлиентHttp для получения данных о курсах валют с сайта ЦБ.\n\nДля создания объекта КлиентHttp с нужными значениями параметров используются фабричные методы «СБазовымUrl()» и «СМаксимумомПеренаправлений()».\n\nС помощью фабричного метода «ЗапросGet()» объекта КлиентHttp создается объект ЗапросHttp. Результатом выполнения запроса является объект ОтветHttp. В модуле демонстрируется обработка тела ответа в формате XML.", + "Объект СериализацияJson" : "В модуле HTTP-сервиса «Пресейл::СделкиHttpСервис» демонстрируется сериализация объектов соответствий с помощью метода ЗаписатьОбъект() объекта СериализацияJson.", + "Объект ЧтениеXml" : "В методе ЗагрузитьКурсыВалюты() модуля «Общие::КурсыВалют::КурсыВалютСервер» демонстрируется разбор XML-документа с помощью объекта ЧтениеXml." + }, + "Системные механизмы" : { + "Контроль прав доступа" : "Для каждого из справочников приложения, регистра сведений и HTTP-сервиса определены настройки прав доступа.\n\nДля справочников «СтадииСделок» и «Валюты» разрешения вычисляются на уровне всего справочника. Для остальных справочников разрешения вычисляются на уровне всего справочника и на уровне отдельных записей (RLS).\n\nДля управления доступом к справочникам в подсистеме «Основное» создано два ключа доступа: «КлючДоступаРуководителя» и «КлючДоступаМенеджера». Эти ключи выдаются пользователям в соответствии с ролью сотрудника и регионом, которые ему назначены в справочнике «Сотрудники».\n\nВ обработчике «ПослеЗаписи()» объекта справочника «Сотрудники» ключи доступа соответствующего пользователя приложения пересчитываются.\n\nРазрешения доступа для объектов справочника «Контактные лица» зависят от значения реквизита «Регион» справочника «Клиенты», который является владельцем справочника Контактных лиц. При изменении значения Региона у некоторого Клиента нужно явно пересчитывать разрешения доступа тех объектов Контактных лиц, которые связаны с измененным Клиентом. Метод пересчета вызывается в обработчике «ПослеЗаписи()» объекта справочника Клиентов.\n\nДля объектов, разрешения которых, в свою очередь, зависят от Контактных лиц, также по цепочке выполняется пересчет разрешений.\n\nВызов HTTP-сервиса «СделкиHttpСервис» разрешен всем авторизованным пользователям с помощью предопределенного ключа «КлючДоступаДляАутентифицированных».\n\nВ модуле формы «ФормаЗагрузкиКурсовВалют» в методе «ЗагрузитьКурсыВалют()» показан пример дополнения контекста прав пользователя правом на изменение регистра сведений «КурсыВалют».", + "Запланированные задания" : "Курсы валют в приложении загружаются при помощи запланированного задания. Задание загрузки курсов создается при создании приложения из проекта и выполняется по расписанию. Выполнение задания можно приостановить или возобновить из формы загрузки курсов валют.", + "Работа с двоичными данными" : "Реквизит «Иконка» справочника Стадии сделок имеет тип ДвоичныйОбъект.Ссылка.\n\nВ форме объекта Стадии сделки демонстрируется загрузка двоичных данных на примере загрузки файла иконки стадии и запись ссылки на загруженный файл в реквизит справочника.\n\nДля загрузки файла используется стандартный менеджер загрузки файлов и компонент интерфейса «ВыборФайлов». После загрузки значение реквизита выводится в колонке формы списка Стадий сделок.\n\nНа форме объекта Стадии сделки выводится гиперссылка, при нажатии на которую происходит выгрузка файла иконки с помощью стандартного менеджера выгрузки файлов.\n\nЗагрузка и выгрузка двоичных данных демонстрируется также в справочнике и в форме объекта Сделки на примере файла договора.", + "Журнал событий" : "Регистрация событий в Журнале событий демонстрируется в общем модуле «Общие::КурсыВалют::КурсыВалютСервер».\n\nВ подсистеме «Общие::КурсыВалют» добавлено два элемента проекта – События журнала событий: «ОперацияЗагрузкиКурсовВалют» и «ОшибкаЗагрузкиКурсовВалюты». Первое из них записывается при начале и завершении операции загрузки курсов валют, а второе используется для регистрации ошибок.\n\nСтандартные свойства событий дополнены пользовательскими свойствами, которые используются в шаблонах представления событий.", + "Консоль запросов" : "Панель навигации приложения включает группу командного интерфейса «Сервис», которая содержит команду вызова консоли запросов.\n\nИсполнение запросов в консоли доступно либо администраторам, либо пользователям, обладающим системным правом «КонсольЗапросов» (проверка выполняется непосредственно при попытке выполнения запроса).\n\nРадел «Сервис» скрыт для пользователей, не являющихся администраторами.", + "Выгрузка данных в XLS" : "В форме списка Задач продемонстрирована возможность формирования табличного документа и его выгрузки в XLS.\n\nПользователь может выгрузить в файл свои задачи или те, которые он отметил в таблице задач.", + "Создание пользователей" : "В методе СоздатьПользователя() общего модуля «ПользователиСервер» показан пример программного создания и подключения нового пользователя к приложению.", + "Локализация" : "Приложение поддерживает русский и английский языки локализации. По умолчанию используется русский язык. Настройки локализации устанавливаются в файле «Проект.yaml».\n\nКаждая из подсистем приложения содержит элемент проекта вида «ЛокализованныеСтроки», в котором приводятся строки на языке по умолчанию, а также каталог «Локализация/En», содержащий файл с переводом этих же строк на английский язык.\n\nДля проверки английской локализации можно открыть приложение, добавив в адресной строке параметр «locale» со значением, соответствующим языку локализации: ?locale=en_EN", + "Стандартное хранилище настроек" : "В форме «Пресейл::СделкиФормаОбъекта» для сохранения информации о том, что пользователь прошел обучение созданию сделки, используется Стандартное хранилище настроек.", + "Полнотекстовый поиск" : "Пример использования полнотекстового поиска показан в модуле формы «ОкноПолнотекстовогоПоиска». Эта форма открывается при выполнении команды «Поиск», расположенной в панели действий приложения." + } +} \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/Ресурсы/РазделГлавнаяСтраница.svg b/Koncept/Testovoe/Основное/Ресурсы/РазделГлавнаяСтраница.svg new file mode 100644 index 0000000..d521642 --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/РазделГлавнаяСтраница.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/РазделНастройки.svg b/Koncept/Testovoe/Основное/Ресурсы/РазделНастройки.svg new file mode 100644 index 0000000..1e3cd51 --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/РазделНастройки.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/РазделПутеводитель.svg b/Koncept/Testovoe/Основное/Ресурсы/РазделПутеводитель.svg new file mode 100644 index 0000000..139cfda --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/РазделПутеводитель.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/РазделСервис.svg b/Koncept/Testovoe/Основное/Ресурсы/РазделСервис.svg new file mode 100644 index 0000000..4b6ab3f --- /dev/null +++ b/Koncept/Testovoe/Основное/Ресурсы/РазделСервис.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияЗаключенДоговор.png b/Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияЗаключенДоговор.png new file mode 100644 index 0000000000000000000000000000000000000000..25e7d0615654ee94845b196317c1fce1aa0bccd2 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+o!3HFmxV|j}Qqi6+jv*GOlef(H_urnG@x$y+ z$5%O4kBdtR)!396ZrigZ=RE2;a-)aaz%YQp&Gd4xF?Ua)(&UMPv6qT|)zAOW!!!Hj xrl05S+l*aq_VCU*msWG|z<~o6QlT6S3|1#a_>|nGspk{ literal 0 HcmV?d00001 diff --git a/Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияОтказано.png b/Koncept/Testovoe/Основное/Ресурсы/РесурсыДемо/СтадияОтказано.png new file mode 100644 index 0000000000000000000000000000000000000000..d401a0fb8154387fc6da8911a9d5263999e3e04f GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+o!3HFmxV|j}QsJI1jv*GOlmE=0`D1>gz>m{f zM=i3i6_+Hcu_ZBF&QH!c)Z=oq=d=$S*MSvjRat3`?mxc#?0GTizp+rQgoLEo@De`soKY%DZcCBVR7`BR8X{jLu6uJ{EB52iW z8isz*x}a6myiua962rU4Mf2b}&K(DQc9!3B_`dJ`-upcdQm9;Yesrvw&nB_1G>EN4 z1;JQgGREYrq}f`2(5QT9d}64a+5B=UajrT)Dnwf9D^{9&emHv@%o1=1@M7_(yaoHT ztraSESuvVCVkaedhfc*~Kj&^*Prm_}NN$y`uYYef=kEo>SStU#){#nY@iTyNs`c!H zM&DRZ@4M#8*ET*X`Ud26OzI@g)n%NZbvIpz3>RQ+tk_? zsXu(*`}}ujKF40|FWexCmVjB{l4Jfauw$?*rOf8nw#1HSb805yXI1VizH4dES;8TB zhyUM-bHBV~4gFfYdePK>0GAukfk=J8Me2uvZ&YnE`Yk>F)c@=cu$9R6i*`yyC|Hp~ zN0(s96&tO=3sZpS@5_L_@0p0000r5p+H0U4D+@*`7i$737a8OX}VigyW4y`>DR5~c8 zLqJf$q>2bmoeJt8icN!HtueXR!6cq?xn}U$o`;9e``-7yd__#vG25mLM-2`Mwi|2( zYQUly^NN`A?&=dMQWxgial~a{Fr~i=oby6m?^SRBDuG=^Od`G;Od@Krk+oR10l2mh z*p;5ZYSHq7696)%_k}uX#!Q!&kQtn@V7yL&-D^248qBp}kAYIG((ySNa|?m((u=?jIxwFEG}wtql#-k>}K@gE!R^QHK@BWh*Wg~B1M;8dSP>Ewc zasVfBK+#^YfN$EM`QNRYT{6DGryqfML9{Fdw+CQiVE`H5F!3eYljc#{p_T)fSXThl zb95%(r;nIs=scIy9|ltmi8bIySr58FrC z`xO;Gm%XmRN6KlEIwj4=m8L6um*B zR}NsDhCS?yn}-3& k0__HSQn`_$TZzj10(Y}}4n>F@<^TWy07*qoM6N<$f<&#Z=>Px# literal 0 HcmV?d00001 diff --git a/Koncept/Testovoe/Основное/РольСотрудника.yaml b/Koncept/Testovoe/Основное/РольСотрудника.yaml new file mode 100644 index 0000000..32175bf --- /dev/null +++ b/Koncept/Testovoe/Основное/РольСотрудника.yaml @@ -0,0 +1,14 @@ +ВидЭлемента: Перечисление +Ид: 44b3e8e3-eae0-4b2f-9a5c-214f1a3eef00 +Имя: РольСотрудника +ОбластьВидимости: ВПроекте +Элементы: + - + Ид: c5995dd7-2332-4e9a-9975-eeb922b2db5a + Имя: Менеджер + Представление: $ЛокализованныеСтроки.Менеджер + ПоУмолчанию: Истина + - + Ид: 0d847d77-d337-42bf-a6ed-c95de5076180 + Имя: Руководитель + Представление: $ЛокализованныеСтроки.Руководитель \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/Сотрудники.xbsl b/Koncept/Testovoe/Основное/Сотрудники.xbsl new file mode 100644 index 0000000..71747d9 --- /dev/null +++ b/Koncept/Testovoe/Основное/Сотрудники.xbsl @@ -0,0 +1,22 @@ +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<Сотрудники.ДанныеРасчетаРазрешений>): Соответствие<Сотрудники.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>> + знч Результат = <Сотрудники.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Объект.Регион)], + [Сущность.Право.Чтение]) + ] + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/Сотрудники.yaml b/Koncept/Testovoe/Основное/Сотрудники.yaml new file mode 100644 index 0000000..2a4c23f --- /dev/null +++ b/Koncept/Testovoe/Основное/Сотрудники.yaml @@ -0,0 +1,41 @@ +ВидЭлемента: Справочник +ОбластьВидимости: ВПроекте +Ид: b866af06-5f70-4365-af3c-0d953e2c56a4 +Имя: Сотрудники +Импорт: + - Общие +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Регион +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.Сотрудники + Форма: СотрудникиФормаСписка + Объект: + Форма: СотрудникиФормаОбъекта +Представление: Наименование +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Наименование + Длина: 200 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: e1c854a4-ea79-4ce2-95bd-53e6dac56012 + Имя: Пользователь + Тип: Пользователи.Ссылка? + - + Ид: f5bbfbbe-4297-49b7-821b-e7edde0c414b + Имя: Регион + Тип: Регионы.Ссылка? + - + Ид: 02308a07-1690-4f7b-a413-1783dcf960a5 + Имя: Роль + Тип: РольСотрудника +Индексы: + - + Имя: Пользователь + Поля: + - Пользователь \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/Сотрудники.Объект.xbsl b/Koncept/Testovoe/Основное/Сотрудники.Объект.xbsl new file mode 100644 index 0000000..e5bc612 --- /dev/null +++ b/Koncept/Testovoe/Основное/Сотрудники.Объект.xbsl @@ -0,0 +1,15 @@ +@Обработчик +метод ПослеЗаписи(До: Сотрудники.Данные, ПараметрыЗаписи: Сотрудники.ПараметрыЗаписи) + // Пересчет ключей доступа пользователей + знч ПользователиКПересчету = <Пользователи.Объект>[] + если Пользователь != Неопределено + ПользователиКПересчету.Добавить(Пользователь.ЗагрузитьОбъект()) + ; + если До.Пользователь != Неопределено и Пользователь != До.Пользователь + ПользователиКПересчету.Добавить(До.Пользователь.ЗагрузитьОбъект()) + ; + если не ПользователиКПересчету.Пусто() + исп КонтекстДоступа.Привилегированный() + Пользователи.ПересчитатьКлючиДоступа(ПользователиКПересчету) + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.xbsl b/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.xbsl new file mode 100644 index 0000000..eba858b --- /dev/null +++ b/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.xbsl @@ -0,0 +1,40 @@ +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Компоненты.ПолеВводаИмя.Значение.Пусто() + Компоненты.ПолеВводаИмя.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаИмя.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Компоненты.ПолеВводаРегион.Значение == Неопределено + Компоненты.ПолеВводаРегион.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаРегион.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ЭтоНовый() и не СоздатьНовогоПользователя и Компоненты.ПолеВводаПользователь.Значение == Неопределено + Компоненты.ПолеВводаПользователь.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаПользователь.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ЭтоНовый() и СоздатьНовогоПользователя и Компоненты.ПолеВводаЛогин.Значение.Пусто() + Компоненты.ПолеВводаЛогин.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаЛогин.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; + если ЭтоНовый() и СоздатьНовогоПользователя + знч Пользователь = СоздатьПользователя(ЛогинНовогоПользователя, ЛогинНовогоПользователя) + Объект.Пользователь = Пользователь + ; +; + +@НаСервере @ДоступноСКлиента +статический метод СоздатьПользователя(Представление: Строка, Логин: Строка): Пользователи.Ссылка + возврат ПользователиКлиентИСервер.СоздатьПользователя(Представление, Логин) +; diff --git a/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.yaml b/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.yaml new file mode 100644 index 0000000..23720b6 --- /dev/null +++ b/Koncept/Testovoe/Основное/СотрудникиФормаОбъекта.yaml @@ -0,0 +1,68 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: a8fe429f-8fb2-4346-a6e7-9c9ce6a9f7a8 +Имя: СотрудникиФормаОбъекта +ОбластьВидимости: ВПодсистеме +Импорт: + - Общие + - Пресейл +Свойства: + - + Имя: СоздатьНовогоПользователя + Тип: Булево + - + Имя: ЛогинНовогоПользователя + Тип: Строка +Наследует: + Тип: ФормаОбъекта<Сотрудники.Объект> + Заголовок: $ЛокализованныеСтроки.Сотрудник + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Записать + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаИмя + Заголовок: $ЛокализованныеСтроки.Имя + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: Введите имя сотрудника + - + Тип: Флажок + Заголовок: $ЛокализованныеСтроки.СоздатьНовогоПользователя + Видимость: =ЭтоНовый() + Значение: =СоздатьНовогоПользователя + Вид: Переключатель + - + Тип: ПолеВвода<Пользователи.Ссылка?> + Имя: ПолеВводаПользователь + Заголовок: $ЛокализованныеСтроки.Пользователь + Видимость: =(не ЭтоНовый() или не СоздатьНовогоПользователя) + Значение: =Объект.Пользователь + Обязательное: Истина + СообщениеОшибка: Выберите пользователя + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаЛогин + Заголовок: $ЛокализованныеСтроки.ЛогинНовогоПользователя + Видимость: =(ЭтоНовый() и СоздатьНовогоПользователя) + Значение: =ЛогинНовогоПользователя + Обязательное: Истина + СообщениеОшибка: $ЛокализованныеСтроки.ВведитеЛогинНовогоПользователя + - + Тип: ПолеВвода<РольСотрудника> + Заголовок: $ЛокализованныеСтроки.Роль + Значение: =Объект.Роль + Обязательное: Истина + - + Тип: ПолеВвода<Регионы.Ссылка?> + Имя: ПолеВводаРегион + Заголовок: $Общие::ЛокализованныеСтроки.Регион + Значение: =Объект.Регион + Обязательное: Истина diff --git a/Koncept/Testovoe/Основное/СотрудникиФормаСписка.yaml b/Koncept/Testovoe/Основное/СотрудникиФормаСписка.yaml new file mode 100644 index 0000000..88de04d --- /dev/null +++ b/Koncept/Testovoe/Основное/СотрудникиФормаСписка.yaml @@ -0,0 +1,51 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 3a17d119-2335-4b26-a12a-63a2804212c6 +Имя: СотрудникиФормаСписка +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: ФиксированнаяГруппа + Содержимое: + - + Тип: Таблица<ДинамическийСписок> + ИспользованиеПоиска: Ложь + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Сотрудники + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Пользователь + - + Тип: ПолеДинамическогоСписка + Выражение: Роль + - + Тип: ПолеДинамическогоСписка + Выражение: Регион + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Имя + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Пользователь + ПолеЗначения: Пользователь + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Роль + ПолеЗначения: Роль + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Общие::ЛокализованныеСтроки.Регион + ПолеЗначения: Регион \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ВидСтадииСделки.yaml b/Koncept/Testovoe/Пресейл/ВидСтадииСделки.yaml new file mode 100644 index 0000000..fdb769c --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ВидСтадииСделки.yaml @@ -0,0 +1,18 @@ +ВидЭлемента: Перечисление +ОбластьВидимости: ВПроекте +Ид: a3ed8c6c-3ca3-486b-ac7d-faba17538261 +Имя: ВидСтадииСделки +Элементы: + - + Ид: 629b9fd8-6e8c-4245-ae1a-61d96e98af31 + Имя: Активна + Представление: $ЛокализованныеСтроки.Активна + ПоУмолчанию: Истина + - + Ид: 379482b3-61d1-4af0-9356-3849fd17a38b + Имя: ЗакрытаВыиграна + Представление: $ЛокализованныеСтроки.ЗакрытаВыиграна + - + Ид: a0841963-02e6-4443-a45f-57a57fa60a6b + Имя: ЗакрытаПроиграна + Представление: $ЛокализованныеСтроки.ЗакрытаПроиграна diff --git a/Koncept/Testovoe/Пресейл/ДанныеСделки.yaml b/Koncept/Testovoe/Пресейл/ДанныеСделки.yaml new file mode 100644 index 0000000..a24dbbe --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ДанныеСделки.yaml @@ -0,0 +1,44 @@ +ВидЭлемента: Структура +Ид: c030d6b5-6649-449a-b84b-94cd0d83695b +Имя: ДанныеСделки +ОбластьВидимости: ВПодсистеме +Импорт: + - Основное +Окружение: КлиентИСервер +Поля: + - + Имя: Ссылка + Тип: Сделки.Ссылка? + - + Имя: Код + Тип: Строка + - + Имя: ДатаСоздания + Тип: Момент? + - + Имя: ДатаЗакрытия + Тип: Дата? + - + Имя: Клиент + Тип: Клиенты.Ссылка? + - + Имя: Наименование + Тип: Строка + - + Имя: Ответственный + Тип: Сотрудники.Ссылка? + - + Имя: Стадия + Тип: СтадииСделок.Ссылка? + - + Имя: СуммаВВалютеСделки + Тип: Число + - + Имя: СуммаВВалютеУчета + Тип: Число + - + Имя: КодВалютыСделки + Тип: Строка + - + Имя: КоличествоОткрытыхЗадач + Тип: Число diff --git a/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.xbsl b/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.xbsl new file mode 100644 index 0000000..d036503 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.xbsl @@ -0,0 +1,57 @@ +@Обработчик +метод ПослеСоздания() + ОбновитьДиаграмму() +; + +@ВПодсистеме +структура ДанныеСтадий + обз знч Стадия: Строка + обз знч КоличествоСделок: Число + обз знч ЦветОбласти: Цвет | Авто +; + +@ВПроекте +метод ОбновитьДиаграмму() + знч Диаграмма = Компоненты.Диаграмма + + Диаграмма.ОтображатьВнутренниеМаркеры = Истина + Диаграмма.ОтображатьВнешниеМаркеры = Истина + Диаграмма.ОтображатьОтносительныеДоли = Истина + Диаграмма.ОтображатьАбсолютныеДоли = Истина + + знч ДанныеДиаграммы = Диаграмма.Источник.Данные + ДанныеДиаграммы.Очистить() + + знч ПалитраЦветов = новый Массив<Цвет>() + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(86, 180, 233)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(204, 121, 167)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(230, 159, 0)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(0, 158, 115)) + + знч КоличествоПоСтадиям = ПолучитьКоличествоПоСтадиям() + + пер Счетчик: Число + для Элемент из КоличествоПоСтадиям + знч Цвет = Счетчик > ПалитраЦветов.Граница() ? ПалитраЦветов[0] : ПалитраЦветов[Счетчик] + Счетчик += 1 + + ДанныеДиаграммы.Добавить(новый ДанныеСтадий( + Стадия = Элемент.Ключ.Представление(), + КоличествоСделок = Элемент.Значение, + ЦветОбласти = Цвет)) + ; + + пер Серия: ВоронкообразнаяСерияДиаграммы = новый ВоронкообразнаяСерияДиаграммы() + Серия.ПоляДанных.Ключ.ПолеЗначения = "Стадия" + Серия.ПоляДанных.Ключ.ОтображаемоеЗначение = "Стадия" + Серия.ПоляДанных.Значение.ПолеЗначения = "КоличествоСделок" + Серия.ПоляДанных.Значение.ОтображаемоеЗначение = "КоличествоСделок" + Серия.ПоляДанных.Цвет = "ЦветОбласти" + + Диаграмма.Серии.Добавить(Серия) +; + +@НаСервере @ДоступноСКлиента +статический метод ПолучитьКоличествоПоСтадиям(): Соответствие<СтадииСделок.Ссылка, Число> + возврат Сделки.КоличествоСделокПоАктивнымСтадиям() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.yaml b/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.yaml new file mode 100644 index 0000000..c0ad1fe --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ДиаграммаВоронкаПродаж.yaml @@ -0,0 +1,15 @@ +ВидЭлемента: КомпонентИнтерфейса +ОбластьВидимости: ВПроекте +Ид: fb444c93-0fd7-41b2-a1d6-db95cbeb4ffa +Имя: ДиаграммаВоронкаПродаж +Наследует: + Тип: ПроизвольныйКомпонент + ВыравниваниеВГруппеПоГоризонтали: Центр + Содержимое: + Тип: ФиксированнаяГруппа + Высота: 280 + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: ВоронкообразнаяДиаграмма<ДиаграммаВоронкаПродаж.ДанныеСтадий> + Имя: Диаграмма diff --git a/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.xbsl b/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.xbsl new file mode 100644 index 0000000..379b271 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.xbsl @@ -0,0 +1,60 @@ +импорт Общие + +@Обработчик +метод ПослеСоздания() + ОбновитьДиаграмму() +; + +@ВПодсистеме +структура ДанныеПродаж + обз знч Направление: Строка + обз знч СуммаПродаж: Число + обз знч СуммаПродажОтображаемоеЗначение: Строка + обз знч ЦветСегмента: Цвет | Авто +; + +@ВПроекте +метод ОбновитьДиаграмму() + знч Диаграмма = Компоненты.Диаграмма + + знч ДанныеДиаграммы = Диаграмма.Источник.Данные + ДанныеДиаграммы.Очистить() + + знч ПалитраЦветов = новый Массив<Цвет>() + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(0, 158, 115)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(86, 180, 233)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(230, 159, 0)) + ПалитраЦветов.Добавить(новый АбсолютныйЦвет(204, 121, 167)) + + знч Продажи = ПолучитьДанныеПродаж() + + пер Счетчик: Число + для Элемент из Продажи + знч Цвет = Счетчик > ПалитраЦветов.Граница() ? ПалитраЦветов[0] : ПалитраЦветов[Счетчик] + Счетчик += 1 + + ДанныеДиаграммы.Добавить(новый ДанныеПродаж(Направление = Элемент.Ключ.Представление(), + СуммаПродаж = Элемент.Значение, + СуммаПродажОтображаемоеЗначение = "${Элемент.Ключ}: ${Элемент.Значение}", + ЦветСегмента = Цвет)) + ; + + знч Серия = новый КруговаяСерияДиаграммы() + Серия.ПоляДанных.Ключ.ПолеЗначения = "Направление" + Серия.ПоляДанных.Ключ.ОтображаемоеЗначение = "Направление" + Серия.ПоляДанных.Значение.ПолеЗначения = "СуммаПродаж" + Серия.ПоляДанных.Значение.ОтображаемоеЗначение = "СуммаПродажОтображаемоеЗначение" + Серия.ПоляДанных.Цвет = "ЦветСегмента" + + Диаграмма.Серии.Добавить(Серия) + + знч Легенда = новый ЛегендаДиаграммы() + Легенда.Расположение = РасположениеЛегендыДиаграммы.Снизу + + Диаграмма.Легенда = Легенда +; + +@НаСервере @ДоступноСКлиента +статический метод ПолучитьДанныеПродаж(): Соответствие<Направления.Ссылка, Число> + возврат Сделки.СуммаВыигранныхСделокПоНаправлениям() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.yaml b/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.yaml new file mode 100644 index 0000000..a45660a --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ДиаграммаПродажиПоНаправлениям.yaml @@ -0,0 +1,16 @@ +ВидЭлемента: КомпонентИнтерфейса +ОбластьВидимости: ВПроекте +Ид: 9574fee9-900c-439f-89d2-1ddf35c3c849 +Имя: ДиаграммаПродажиПоНаправлениям +Наследует: + Тип: ПроизвольныйКомпонент + ВыравниваниеВГруппеПоГоризонтали: Центр + Содержимое: + Тип: ФиксированнаяГруппа + Высота: 280 + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: КруговаяДиаграмма<ДиаграммаПродажиПоНаправлениям.ДанныеПродаж> + Имя: Диаграмма + ВнутреннийРадиус: 0 \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ЗаписанаСделка.yaml b/Koncept/Testovoe/Пресейл/ЗаписанаСделка.yaml new file mode 100644 index 0000000..ae1fcf3 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ЗаписанаСделка.yaml @@ -0,0 +1,8 @@ +ВидЭлемента: ГлобальноеКлиентскоеСобытие +Ид: 12bbfab9-c3e8-49e4-b6ef-21cdfbbe291e +Имя: ЗаписанаСделка +ОбластьВидимости: ВПроекте +Параметры: + - + Имя: Сделка + Тип: Сделки.Ссылка? diff --git a/Koncept/Testovoe/Пресейл/Клиенты.xbsl b/Koncept/Testovoe/Пресейл/Клиенты.xbsl new file mode 100644 index 0000000..69beb8c --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Клиенты.xbsl @@ -0,0 +1,68 @@ +импорт Общие +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных() ] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<Клиенты.ДанныеРасчетаРазрешений>): Соответствие<Клиенты.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>> + знч Результат = <Клиенты.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Объект.Регион)], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) + ] + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; + +@ВПодсистеме +метод ПолучитьКонтактныеЛицаКлиента(Клиент: Клиенты.Ссылка): ЧитаемаяКоллекция<КонтактныеЛица.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + КонтактныеЛица + ГДЕ + Владелец == %Клиент + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; + +@ВПодсистеме +метод ПолучитьСделкиКлиента(Клиент: Клиенты.Ссылка): ЧитаемаяКоллекция<Сделки.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Сделки + ГДЕ + Клиент == %Клиент + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; + +@ВПроекте +метод ПолучитьРегионыКлиентов(Клиенты: Обходимое<Клиенты.Ссылка>): ЧитаемоеСоответствие<Клиенты.Ссылка, Регионы.Ссылка?> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка КАК Клиент, + Регион КАК Регион + ИЗ + Клиенты + ГДЕ + Ссылка В (%Клиенты) + } + + возврат Запрос.Выполнить().ВСоответствие(Строка -> Строка.Клиент, Строка -> Строка.Регион) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/Клиенты.yaml b/Koncept/Testovoe/Пресейл/Клиенты.yaml new file mode 100644 index 0000000..b0d96d1 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Клиенты.yaml @@ -0,0 +1,39 @@ +ВидЭлемента: Справочник +Ид: 9b3c44a2-2fa7-4c47-88b9-13150815f570 +Имя: Клиенты +ОбластьВидимости: ВПроекте +Импорт: + - Общие + - Основное +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Регион +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.Клиенты + Форма: КлиентыФормаСписка + Объект: + Представление: $ЛокализованныеСтроки.Клиент + Форма: КлиентыФормаОбъекта +Представление: Наименование +Реквизиты: + - + Имя: Наименование + Длина: 200 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: 04fcc6a8-1967-4aa7-98bc-36a08f7c4848 + Имя: Регион + Тип: Регионы.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 554eee4e-2a52-4bee-ab4d-00ead7935b85 + Имя: Адрес + Тип: Строка + - + Ид: 36437aad-e02e-4f10-891d-59738bed40b5 + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь diff --git a/Koncept/Testovoe/Пресейл/Клиенты.Объект.xbsl b/Koncept/Testovoe/Пресейл/Клиенты.Объект.xbsl new file mode 100644 index 0000000..a2945dc --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Клиенты.Объект.xbsl @@ -0,0 +1,35 @@ +импорт Основное +импорт Мероприятия + +@Обработчик +метод ПриЗаполнении() + Ответственный = ПользователиКлиентИСервер.ПолучитьДанныеТекущегоПользователя().Сотрудник +; + +@Обработчик +метод ПослеЗаписи(До: Клиенты.Данные, ПараметрыЗаписи: Клиенты.ПараметрыЗаписи) + если Регион != До.Регион + ПересчитатьРазрешенияДоступаСвязанныхОбъектов() + ; +; + +метод ПересчитатьРазрешенияДоступаСвязанныхОбъектов() + исп КонтекстДоступа.Привилегированный() + + // Разрешения Контактных лиц зависят от их Клиентов + знч ДанныеРасчетаРазрешенийКонтактныхЛиц = новый КонтактныеЛица.ДанныеРасчетаРазрешений(Ссылка) + КонтактныеЛица.ПересчитатьРазрешенияДоступаДляОбъектов([ДанныеРасчетаРазрешенийКонтактныхЛиц]) + + // Разрешения Сделок зависят от их Клиентов + знч ДанныеРасчетаРазрешенийСделок = новый Сделки.ДанныеРасчетаРазрешений(Ссылка) + Сделки.ПересчитатьРазрешенияДоступаДляОбъектов([ДанныеРасчетаРазрешенийСделок]) + + // Разрешения Задач и Событий зависят от их Сделок + знч СделкиКлиента = Клиенты.ПолучитьСделкиКлиента(Ссылка) + + знч ЗадачиСделок = Сделки.ПолучитьЗадачиСделок(СделкиКлиента).Преобразовать(ЗадачаСсылка -> ЗадачаСсылка.ЗагрузитьОбъект()!) + Задачи.ПересчитатьРазрешенияДоступаДляОбъектов(ЗадачиСделок) + + знч СобытияСделок = Сделки.ПолучитьСобытияСделок(СделкиКлиента).Преобразовать(СобытиеСсылка -> СобытиеСсылка.ЗагрузитьОбъект()!) + События.ПересчитатьРазрешенияДоступаДляОбъектов(СобытияСделок) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.xbsl b/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.xbsl new file mode 100644 index 0000000..6a24e99 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.xbsl @@ -0,0 +1,49 @@ +импорт Общие +импорт Основное + +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Регион == Неопределено + Компоненты.ПолеВводаРегион.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаРегион.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; + +метод СохранитьПриНажатии(КомандаСохранить: ОбычнаяКоманда) + знч ЭтоНовый = ЭтоНовый() + + Записать() + Закрыть(КлючОбъекта) + + если ЭтоНовый + знч УведомлениеОКлиенте = новый Уведомление( + ЛокализованныеСтроки.НовыйКлиент(), + ЛокализованныеСтроки.УведомлениеОСозданииКлиента(Объект.Наименование) + ) + + УведомлениеОКлиенте.Данные = КлючОбъекта + УведомлениеОКлиенте.СохранитьВЦентреУведомлений = Истина + УведомлениеОКлиенте.ОценкаИнформации = ОценкаИнформации.Положительная + + пер КомандаОткрытия = новый КомандаСПараметром<Уведомление>( + (Команда, Уведомление) -> КлиентыФормаОбъекта.ОткрытьВМодальномОкне(КлючОбъекта = Уведомление.Данные), + ЛокализованныеСтроки.Открыть() + ) + + пер Команды = новый ФрагментКомандногоИнтерфейса<КомандаСПараметром<Уведомление>>([КомандаОткрытия]) + УведомлениеОКлиенте.Команды = Команды + УведомлениеОКлиенте.Показать() + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.yaml b/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.yaml new file mode 100644 index 0000000..5961b42 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КлиентыФормаОбъекта.yaml @@ -0,0 +1,43 @@ +ВидЭлемента: КомпонентИнтерфейса +ОбластьВидимости: ВПроекте +Ид: 1c0546bc-ce5d-4f00-96fc-62e10fae3d95 +Имя: КлиентыФормаОбъекта +Импорт: + - Общие + - Основное +Наследует: + Тип: ФормаОбъекта<Клиенты.Объект, Клиенты.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Клиент + ОсновнаяКоманда: + Тип: ОбычнаяКоманда + Представление: Сохранить и закрыть + Изображение: СохранитьКонтур.svg + Обработчик: СохранитьПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Адрес + Значение: =Объект.Адрес + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Ответственный + Значение: =Объект.Ответственный + - + Тип: ПолеВвода<Регионы.Ссылка?> + Имя: ПолеВводаРегион + Заголовок: $Общие::ЛокализованныеСтроки.Регион + Значение: =Объект.Регион + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле diff --git a/Koncept/Testovoe/Пресейл/КлиентыФормаСписка.yaml b/Koncept/Testovoe/Пресейл/КлиентыФормаСписка.yaml new file mode 100644 index 0000000..7dfd7c1 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КлиентыФормаСписка.yaml @@ -0,0 +1,59 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: fe8a2a42-9018-4d5c-918e-bf8948c546ea +Имя: КлиентыФормаСписка +ОбластьВидимости: ВПодсистеме +Импорт: + - Общие +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + ЗамещающийТекстПоляПоиска: '=ЛокализованныеСтроки.ПодсказкаПоляПоискаКлиента()' + ОтображатьНастройки: Истина + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Клиенты + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Регион + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + Представление: $Общие::ЛокализованныеСтроки.Регион + ИспользованиеВПоиске: Ложь + - + Тип: ПолеДинамическогоСписка + Выражение: Адрес + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + Представление: $ЛокализованныеСтроки.Ответственный + ИспользованиеВПоиске: Ложь + ПрокруткаПоВертикали: Истина + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + ПолеЗначения: Регион + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Адрес + ПолеЗначения: Адрес + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛица.xbsl b/Koncept/Testovoe/Пресейл/КонтактныеЛица.xbsl new file mode 100644 index 0000000..142ce33 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛица.xbsl @@ -0,0 +1,41 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<КонтактныеЛица.ДанныеРасчетаРазрешений>): Соответствие<КонтактныеЛица.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>> + знч КлиентыКонтактныхЛиц = Объекты + .Фильтровать(Объект -> Объект.Владелец != Неопределено) + .Преобразовать(Объект -> Объект.Владелец!) + + знч РегионыКлиентов = Клиенты.ПолучитьРегионыКлиентов(КлиентыКонтактныхЛиц) + + знч Результат = <КонтактныеЛица.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[] + + Разрешения.Добавить(ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя()) + + если Объект.Владелец == Неопределено + продолжить + ; + + знч Регион = РегионыКлиентов.ПолучитьИлиУмолчание(Объект.Владелец) + + если Регион != Неопределено + Разрешения.Добавить( + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = Регион)], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) + ) + ; + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛица.yaml b/Koncept/Testovoe/Пресейл/КонтактныеЛица.yaml new file mode 100644 index 0000000..c1a1cc1 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛица.yaml @@ -0,0 +1,45 @@ +ВидЭлемента: Справочник +Ид: 6cf1c056-751d-4c74-8628-d91758169f6b +Имя: КонтактныеЛица +ОбластьВидимости: ВПроекте +Импорт: + - Основное +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Владелец +Интерфейс: + Список: + Форма: КонтактныеЛицаФормаСписка + Представление: $ЛокализованныеСтроки.КонтактныеЛица + Объект: + Форма: КонтактныеЛицаФормаОбъекта + Представление: $ЛокализованныеСтроки.КонтактноеЛицо +Представление: Наименование +Реквизиты: + - + Имя: Владелец + Тип: Клиенты.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Имя: Наименование + Длина: 200 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: 84f37865-9bdf-4fad-90ac-9fbdb964f338 + Имя: Должность + Тип: Строка + - + Ид: b390431d-aeef-4340-b539-cf51a3b6726b + Имя: Телефон + Тип: Строка + - + Ид: bb900dbd-26e2-4464-8271-1c84ff33ba7c + Имя: ЭлектроннаяПочта + Тип: Строка + - + Ид: b24d5a10-f54e-4782-9bfd-282b8fe3804c + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛица.Объект.xbsl b/Koncept/Testovoe/Пресейл/КонтактныеЛица.Объект.xbsl new file mode 100644 index 0000000..862d093 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛица.Объект.xbsl @@ -0,0 +1,6 @@ +импорт Основное + +@Обработчик +метод ПриЗаполнении() + Ответственный = ПользователиКлиентИСервер.ПолучитьДанныеТекущегоПользователя().Сотрудник +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.xbsl b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.xbsl new file mode 100644 index 0000000..952b300 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.xbsl @@ -0,0 +1,56 @@ +импорт Основное + +@Обработчик +метод ПослеЧтения() + если Клиент != Неопределено + Объект.Владелец = Клиент + Компоненты.ПолеВводаКлиента.Доступность = Ложь + ; +; + +@Обработчик +метод ПередЗаписьюОбъекта() + пер ПоляНеЗаполнены: Булево + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаИмя.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаИмя.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Владелец == Неопределено + Компоненты.ПолеВводаКлиента.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаКлиента.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; + +метод СохранитьПриНажатии(КомандаСохранить: ОбычнаяКоманда) + знч ЭтоНовый = ЭтоНовый() + + Записать() + Закрыть(КлючОбъекта) + + если ЭтоНовый + знч УведомлениеОКонтактномЛице = новый Уведомление( + ЛокализованныеСтроки.НовоеКонтактноеЛицо(), + ЛокализованныеСтроки.УведомлениеОСозданииКонтактногоЛица(Объект.Наименование) + ) + + УведомлениеОКонтактномЛице.Данные = КлючОбъекта + УведомлениеОКонтактномЛице.СохранитьВЦентреУведомлений = Истина + УведомлениеОКонтактномЛице.ОценкаИнформации = ОценкаИнформации.Положительная + + пер КомандаОткрытия = новый КомандаСПараметром<Уведомление>( + (Команда, Уведомление) -> КонтактныеЛицаФормаОбъекта.ОткрытьВМодальномОкне(КлючОбъекта = Уведомление.Данные), + ЛокализованныеСтроки.Открыть() + ) + + пер Команды = новый ФрагментКомандногоИнтерфейса<КомандаСПараметром<Уведомление>>([КомандаОткрытия]) + УведомлениеОКонтактномЛице.Команды = Команды + УведомлениеОКонтактномЛице.Показать() + ; +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.yaml b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.yaml new file mode 100644 index 0000000..0183d02 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаОбъекта.yaml @@ -0,0 +1,54 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 5d1778bb-4433-4bed-be4f-e22e2a1b4dec +Имя: КонтактныеЛицаФормаОбъекта +ОбластьВидимости: ВПодсистеме +Импорт: + - Основное +Свойства: + - + Имя: Клиент + Тип: Клиенты.Ссылка? +Наследует: + Тип: ФормаОбъекта<КонтактныеЛица.Объект, КонтактныеЛица.Ссылка?> + Заголовок: $ЛокализованныеСтроки.КонтактноеЛицо + ОсновнаяКоманда: + Тип: ОбычнаяКоманда + Представление: Сохранить и закрыть + Изображение: СохранитьКонтур.svg + Обработчик: СохранитьПриНажатии + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Двойная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаИмя + Заголовок: $ЛокализованныеСтроки.Имя + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Клиенты.Ссылка?> + Имя: ПолеВводаКлиента + Заголовок: $ЛокализованныеСтроки.Клиент + Значение: =Объект.Владелец + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Должность + Значение: =Объект.Должность + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.Телефон + Значение: =Объект.Телефон + - + Тип: ПолеВвода<Строка> + Заголовок: $ЛокализованныеСтроки.ЭлектроннаяПочта + Значение: =Объект.ЭлектроннаяПочта + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Ответственный + Значение: =Объект.Ответственный diff --git a/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаСписка.yaml b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаСписка.yaml new file mode 100644 index 0000000..8471359 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/КонтактныеЛицаФормаСписка.yaml @@ -0,0 +1,72 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 518ec584-a818-423e-be9f-520b6cf7d237 +Имя: КонтактныеЛицаФормаСписка +ОбластьВидимости: ВПодсистеме +Импорт: + - Общие +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: КонтактныеЛица + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + Представление: Клиент + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Должность + - + Тип: ПолеДинамическогоСписка + Выражение: Телефон + - + Тип: ПолеДинамическогоСписка + Выражение: ЭлектроннаяПочта + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + ПрокруткаПоВертикали: Истина + ОтображатьНастройки: Истина + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Клиент + ПолеЗначения: Владелец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Имя + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Должность + ПолеЗначения: Должность + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Телефон + ПолеЗначения: Телефон + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ЭлектроннаяПочта + ПолеЗначения: ЭлектроннаяПочта + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Ответственный + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь diff --git a/Koncept/Testovoe/Пресейл/Локализация/En/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Пресейл/Локализация/En/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..2cc15c1 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Локализация/En/ЛокализованныеСтроки.yaml @@ -0,0 +1,68 @@ +Строки: + Пресейл: Presales + Сделки: Deals + Сделка: Deal + АктивныеСделки: Active deals + СоздатьСделку: Create deal + СозданиеСделки: Deal creation + Клиенты: Accounts + СоздатьКлиента: Create account + КонтактныеЛица: Contacts + Клиент: Account + КонтактноеЛицо: Contact + СоздатьКонтактноеЛицо: Create contact + СтадииСделок: Deal stages + СтадияСделки: Deal stage + Активна: Active + ЗакрытаВыиграна: Closed-won + ЗакрытаПроиграна: Closed-lost + НоваяСделка: New deal + НовыйКлиент: New account + НовоеКонтактноеЛицо: New contact + НоваяСтадияСделок: New stage of deal + Сделок: Deals + НезавершенныеЗадачи: Incomplete tasks + ДатаСоздания: Creation date + ДатаЗакрытия: Close date + Содержание: Subject + Ответственный: Owner + Стадия: Stage + Вид: Kind + Сумма: Amount + Договор: Contract + Код: Code + Порядок: Order + ВоронкаПродаж: Sales funnel + Имя: Name + Должность: Position + Телефон: Phone + ЭлектроннаяПочта: E-mail + Направления: Lines of business + Направление: Line of business + Наименование: Name + Адрес: Address + Мероприятия: Activities + Основное: Main + Фильтр: Filter + ПодсказкаПоляПоискаСделок: Code, subject or account + ПодсказкаПоляПоискаКлиента: Name or address + ПодсказкаПоляПоискаКонтактногоЛица: Name or position + ЗаголовокВыбораФайлаДоговора: Drop contract file or add it manually + ЗаголовокВыбораФайлаИконки: Drop icon file or add it manually + ПредполагаемаяИлиФактическая: Estimated or actual + Сохранить: Save + СохранитьИОткрыть: Save and open + Создать: Create + Удалить: Delete + Открыть: Open + Обновить: Refresh + Иконка: Icon + НеУказаныНаправления: Lines of business not specified + ОтчетОПродажах: Sales report + ПродажиПоНаправлениям: Line of business sales +Шаблоны: + УведомлениеОСозданииСделки: "Deal \"$0\" has been created" + УведомлениеОСозданииКлиента: "Account \"$0\" has been created. You can open it for editing" + УведомлениеОСозданииКонтактногоЛица: "Contact \"$0\" has been created. You can open it for editing" + ПоказыватьЧислоСделок: "Show %0 deals" + ЧислоСделок: "%0 deals" \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ЛокализованныеСтроки.yaml b/Koncept/Testovoe/Пресейл/ЛокализованныеСтроки.yaml new file mode 100644 index 0000000..029a110 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ЛокализованныеСтроки.yaml @@ -0,0 +1,72 @@ +ВидЭлемента: ЛокализованныеСтроки +Ид: c60a7d2f-0f8e-4a51-8115-20e7a51c9ebd +Имя: ЛокализованныеСтроки +ОбластьВидимости: ВПроекте +Строки: + Пресейл: Пресейл + Сделки: Сделки + Сделка: Сделка + АктивныеСделки: Активные сделки + СоздатьСделку: Создать сделку + СозданиеСделки: Создание сделки + Клиенты: Клиенты + СоздатьКлиента: Создать клиента + КонтактныеЛица: Контактные лица + Клиент: Клиент + КонтактноеЛицо: Контактное лицо + СоздатьКонтактноеЛицо: Создать контактное лицо + СтадииСделок: Стадии сделок + СтадияСделки: Стадия сделки + Активна: Активна + ЗакрытаВыиграна: Закрыта-выиграна + ЗакрытаПроиграна: Закрыта-проиграна + НоваяСделка: Новая сделка + НовыйКлиент: Новый клиент + НовоеКонтактноеЛицо: Новое контактное лицо + НоваяСтадияСделок: Новая стадия сделок + Сделок: Сделок + НезавершенныеЗадачи: Незавершенные задачи + ДатаСоздания: Дата создания + ДатаЗакрытия: Дата закрытия + Содержание: Содержание + Ответственный: Ответственный + Стадия: Стадия + Вид: Вид + Сумма: Сумма + Договор: Договор + Код: Код + Порядок: Порядок + ВоронкаПродаж: Воронка продаж + Имя: Имя + Должность: Должность + Телефон: Телефон + ЭлектроннаяПочта: Электронная почта + Направления: Направления + Направление: Направление + Наименование: Наименование + Адрес: Адрес + Мероприятия: Мероприятия + Основное: Основное + Фильтр: Фильтр + ПодсказкаПоляПоискаСделок: Код, содержание или клиент + ПодсказкаПоляПоискаКлиента: Наименование или адрес + ПодсказкаПоляПоискаКонтактногоЛица: Имя или должность + ЗаголовокВыбораФайлаДоговора: Перетащите или выберите файл договора + ЗаголовокВыбораФайлаИконки: Перетащите или выберите файл иконки + ПредполагаемаяИлиФактическая: Предполагаемая или фактическая + Сохранить: Сохранить + СохранитьИОткрыть: Сохранить и открыть + Создать: Создать + Удалить: Удалить + Открыть: Открыть + Обновить: Обновить + Иконка: Иконка + НеУказаныНаправления: Не указаны направления + ОтчетОПродажах: Отчет о продажах + ПродажиПоНаправлениям: Продажи по направлениям +Шаблоны: + УведомлениеОСозданииСделки: "Создана сделка \"$0\"" + УведомлениеОСозданииКлиента: "Создан клиент \"$0\". Вы можете открыть его для изменения" + УведомлениеОСозданииКонтактногоЛица: "Создано контактное лицо \"$0\". Вы можете открыть его для изменения" + ПоказыватьЧислоСделок: Показывать %0 сделок + ЧислоСделок: "%0 сделок" diff --git a/Koncept/Testovoe/Пресейл/ОтчетОПродажах.yaml b/Koncept/Testovoe/Пресейл/ОтчетОПродажах.yaml new file mode 100644 index 0000000..8048eac --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОтчетОПродажах.yaml @@ -0,0 +1,78 @@ +ВидЭлемента: Отчет +Ид: 602b62e8-8848-4bac-9cbc-037b0616c71b +Имя: ОтчетОПродажах +ОбластьВидимости: ВПроекте +Представление: Отчет о продажах +Интерфейс: + Форма: ОтчетОПродажахФорма +ИсточникДанных: ОтчетОПродажахТаблица +Макет: + ВидОтображения: СтекВертикальный + Выражения: + - + Выражение: СРЕДНЕЕ(СуммаВВалютеУчета) + ТипВыражения: number + Имя: Средняя_Сумма_Сделки + Представление: Средняя сумма сделки + Вид: Мера + - + Выражение: КОЛ(1) + ТипВыражения: number + Имя: Количество_Сделок + Представление: Количество сделок + Вид: Мера + Поля: + - + Ид: fe6f8a07bed2419a848b642fdb80799a + Выражение: Направление + Вид: Измерение + ВизуальныеРоли: + - Группы + - Цвет + Активность: Истина + РолиДляВидовОтображения: + СводнаяТаблица: + - Строки + - + Ид: 2e4d2b5f8f1d4e268a77ffc866591f2d + Выражение: ИЗВЛЕЧЬ(ДатаЗакрытия, ГОД, МЕСЯЦ) + Вид: Измерение + ВизуальныеРоли: + - ОсьX + Активность: Истина + НаправлениеСортировки: ПоВозрастанию + Представление: Период + РолиДляВидовОтображения: + СводнаяТаблица: + - Строки + - + Ид: 7e5660267450480090feb328d439b9bd + Выражение: СУММА(СуммаВВалютеУчета) + Вид: Мера + ВизуальныеРоли: + - ЛеваяОсьY + - Маркеры + Активность: Истина + Представление: Сумма сделок + РолиДляВидовОтображения: + СводнаяТаблица: + - Строки + - + Ид: 3748c6fb91a446459a6de82b77e40eff + Выражение: Средняя_Сумма_Сделки + Вид: Мера + ВизуальныеРоли: + - ЛинииЛевойОсиY + - МаркерыЛиний + Активность: Истина + - + Ид: 3bfb88e07c8945c9924d78eee5f8ec8a + Выражение: Количество_Сделок + Вид: Мера + ВизуальныеРоли: + - ЛинииПравойОсиY + - МаркерыЛиний + Активность: Истина + НастройкиОтображения: + Легенда: + ОтображатьПриОткрытии: Истина diff --git a/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.xbql b/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.xbql new file mode 100644 index 0000000..605912f --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.xbql @@ -0,0 +1,10 @@ +ВЫБРАТЬ + Стадия, + Направление, + СуммаВВалютеУчета, + ДатаЗакрытия +ИЗ + Сделки +ГДЕ + Стадия.Вид == ВидСтадииСделки.ЗакрытаВыиграна + И (&Ответственный == Неопределено ИЛИ Ответственный == &Ответственный) \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.yaml b/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.yaml new file mode 100644 index 0000000..10a249d --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОтчетОПродажахТаблица.yaml @@ -0,0 +1,11 @@ +ВидЭлемента: ВиртуальнаяТаблица +ОбластьВидимости: ВПодсистеме +Ид: f6d08ce4-814e-448b-a726-53710f6b3215 +Имя: ОтчетОПродажахТаблица +Импорт: + - Основное +Параметры: + - + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ЗначениеПоУмолчанию: Неопределено \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.xbsl b/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.xbsl new file mode 100644 index 0000000..a4f1472 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.xbsl @@ -0,0 +1,11 @@ +импорт Основное + +метод ОткрытьОтчет(Команда: ОбычнаяКоманда) + Отчеты.ОткрытьОтчет(Компоненты.ПросмотрОтчета.Отчет) +; + +метод ОтветственныйПриИзменении(Источник: ПолеВвода<Сотрудники.Ссылка?>, Событие: СобытиеПриИзменении<Сотрудники.Ссылка?>) + знч Отчет = Компоненты.ПросмотрОтчета.Отчет как ОтчетОПродажах + Отчет.УстановитьЗначениеПараметра("Ответственный", Компоненты.ПолеВводаОтветственный.Значение) + Компоненты.ПросмотрОтчета.Обновить() +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.yaml b/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.yaml new file mode 100644 index 0000000..2e6f311 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОтчетОПродажахФорма.yaml @@ -0,0 +1,37 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: cd222839-9a18-4f79-a2a4-3422cfbaba15 +Имя: ОтчетОПродажахФорма +ОбластьВидимости: ВПроекте +Импорт: + - Основное +Наследует: + Тип: ФормаОтчета + Заголовок: Отчет о продажах + ДополнительныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Представление: Открыть отчет + Обработчик: ОткрытьОтчет + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: ФиксированнаяГруппа + Содержимое: + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Имя: ПолеВводаОтветственный + Заголовок: Ответственный + ВидОтображенияКнопкиОчистки: Всегда + Значение: + Тип: Неопределено + Значение: Неопределено + ПриИзменении: ОтветственныйПриИзменении + - + Тип: ПросмотрОтчета + Имя: ПросмотрОтчета + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + Отчет: + Тип: ОтчетОПродажах diff --git a/Koncept/Testovoe/Пресейл/ОшибкаНастроекПользователя.yaml b/Koncept/Testovoe/Пресейл/ОшибкаНастроекПользователя.yaml new file mode 100644 index 0000000..d9c8b27 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/ОшибкаНастроекПользователя.yaml @@ -0,0 +1,26 @@ +ВидЭлемента: СобытиеЖурналаСобытий +Ид: 98ab2189-46d2-44d8-874f-83f55e88de28 +Имя: ОшибкаНастроекПользователя +ОбластьВидимости: ВПодсистеме +Описание: Событие регистрируется при ошибках установки и получения настроек пользователя +ВидСобытия: Ошибка +ХарактерОшибки: ВнутренняяОшибка +ШаблонПредставления: Ошибка настройки %{КлючНастройки} для %{КлючОбъекта} +Свойства: + - + Ид: a20f5be7-9176-47f6-a385-ff2426201382 + Имя: КлючОбъекта + Описание: Ключ объекта настроек + Тип: Строка + Обязательно: Истина + - + Ид: 869d6371-6c76-4b1c-ad34-d4a9bc83bad6 + Имя: КлючНастройки + Описание: Ключ настроек + Тип: Строка + Обязательно: Истина + - + Ид: b2cd2f96-3f9f-4bd5-946c-6986b28d3f1d + Имя: Информация + Описание: Информация об ошибке + Тип: Строка diff --git a/Koncept/Testovoe/Пресейл/Подсистема.yaml b/Koncept/Testovoe/Пресейл/Подсистема.yaml new file mode 100644 index 0000000..5a69510 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Подсистема.yaml @@ -0,0 +1,4 @@ +Использование: + - Основное + - Мероприятия + - Общие \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/Ресурсы/ОбучающиеПодсказки/Приветствие.png b/Koncept/Testovoe/Пресейл/Ресурсы/ОбучающиеПодсказки/Приветствие.png new file mode 100644 index 0000000000000000000000000000000000000000..13438b5863636efaf31f169ab0be461904f8748c GIT binary patch literal 16303 zcmb7LV|yk|)4pQcwry-|dt+^E+qP}nwy_)A#>N|5vGe5q2k-k~rf25po}*P=byl4f zsiYu@0E-I?000oArNmSK01(6P=P_u=@B50@5AW{+#z9KU832Go`|kn)WaVIge*|$> zkrV;c&ETJXzkr(y%L@Yljqz~rzaRhrK{07DVKons%Uo|4T@BxB|F@jP_XvvEipw?1 zNJ(%RqsawmP;#0PGD3u{om8pPkc5pD=*_L6E^!t6YwdQS^b$B*tls+xtFHpOw&KJ~ z$`o|+le#nj9D5i$4Dy_&UxEl~ytI^DPEq2&kv8^|e{XM>&SvavS&7GA!q?axA$2%v{Lv67lGt#S_xHui`CRdOZo z@yymd%Xxjd583X;9z21YqK0gQ3Eyp?2B>`Xl`eR1%;@xcs1vr~bTo>O&p&85jnSEW zJ^MQ*dY=8k;Orq|pY5qV-L0T{?U5YZKwbE!HWb1KK}!I#Xy3)iBlkHy?jH&+TiUwunYSd8!yl3JV1%K!DcUF1_& z_f|1u(obWcTze*Ray(6+nhf^8IS`L9%+mfr^4`dYgYL{e#6PqTzH?tVYY44~FRDaY zg0yBfb!rFo+Dd&BAjte$q1GB~o6U!WD&0ylg7xH#h%%R|Kphm9XnB2JUENElxK)1V z@o!&|gYu*EDPHc)>QIK+F`tg!%f;T8+O=C!^@IA8g@DO^X-e`>H=eOav{!~Iab2yZym{6$e06)t@npBA~W9g9zv=cH{mhp_qc!G&4udG*lNS6 zrO1Dd$Z$wWjn$1f?N&hj$SflX)<}G*fMFOpNeqWMnoL@u zE9NK8D?49*#I|5cj_OWgM4&}H*!@+#Xt@~#RSuRJzdp$Ljz1VP+xT|#4_XgZ3q^@^ z0kjPu&^aA%O;Vrg8H*aJDwPJ~%sr!Bo>Xb>Ey4H@JOjlYd^4}O(jGia@)S{5y~tJT zi`dt}FNKuY-GCw^^cp}1c=6WKVed3CvNgYR;!<*Pzw|+XgmEEa4D6{Yiq&boPm-by zD|(*RnI92_0b;nb`{C;X2%@Qn(BA!ML znHKD#^Q`&Ag%3y%Fv3Hq@wZ8_YhU7@*QyFMsfLIVm?u_R&j*6dQ)KM~4C`eKwt+ZG z{*(@A*6uSot6N+eX!LzJjQn#NzU}NmNvj`jY?3Z4r&?cjf_Lu41lx=hjQ&xt>q*?^ z`B2}3T>kpFrEFT>e3ljvzZ{USs-_*T{{GgpHTHaS;BJWDp}S=O&&EJ&r_0u}f|Fy8 zPGF8a?-HTMhsQ|0MpFrZ^%%7u>3C+4o3|n*x@i1}{pEmjDseWdIR&V*k=4&t--5C! zF{mvbIjNhvr-4@py+Ly+<@-?^ngjgWRt{#M*I#C{+zJ$UPsGe!miD+9Tnv_FN<=B7 z);8`lS7PIbB5O%G9P{C-{h;u%I4ll!?>z&8*-1-pHZbfx8M@%Ocd4UG^-I+rN?%kY zi7BO!QQuNYXE5a;h6|HA0x-}F6Z_BSy%!ei?;r0WvHZ{(rjc+N}B0b?w?yc`LgdJ*+?DobiUSSisJGuFO^id+(fLXY@4I0YAEZ+MUc zgEm%(;7ZR@7S|A{y4E9Zo*Ab#7=;B&Iii}{<4H%v=|m$Zapvc z&F5Hxy75mZgq|cb=p5ctRrehe)WEBZRDZVSJKNr`^+~My%vKmLy#>NcyCf=bP!KAb zh|gV;d0#{?EKIxxaO}vZ+0vY8Sja<;?~>NYq8e@YRyr%RYetW@xL}E;`;j1Cf%s0H zW);j5ZuO8Mi?R?(8r)X6{7gY|5*I*uyX}QCc*gIVN8b?DB^h{kxq$A14<-hU;G4c- z(+x7>zzZX#$p+w2dcBKTO<-96_?gDEUh^tKvcsZZw@Q!oe$Odrt)F8i!EwaVwc-DL z$chI?!SpwQ0)Nq|u8eKybt8Hyb$IE~ban2LLSv5zhL3PhaA1!l`#lde?^8=fN!I53 zTwlLuUx#A}g3iu7Z#Ta#K6~yrEr>l>zMfD9Cq!Q;Qztb+JFvdidlgyKwqcx`6_nvc zRe56kPL^F+g2ac(q3i?QW($)=XZA0k<|pT6J*zr>4G}0xPL*q}JUqvKNRPNE($mML zh1cqa4QJG?b9Z1Y+FXXy{w)`XBD1p9#E-n798-#n1@pS8T;XL`n;()t`>cn;PDz~? zoR!8gSIb(fvzoe7{Dv!{L{4!660O!Gc8(D~e>CzG2*vcqMpRv!iHH1B51WsS^>em* zmy*Fc^ z$j^U)&i4d!?jT7+bFRPmK0Y4|pg8J&tb7Qq%VqMsce2N-NXGxOJ`F{s{-`Kjar%Ah z%&c>tuPN1E^w)a3{b>$kci-0<^K~1SCrEh)EjKzvTo%2mzwF|L$M(iLatcIu1^R2- z=!Uu!Ga7RY{wkB6{|7WNc_RkD`;O&IWTWY93R=~y^gpkPGlQ2~=bG&GKOT=Ap zoT9)oZ=ZUnPgBMe5#3(74)t#_NLBh(nY1=v8u=SbQiU&qMiy=E zX3i}1qyMRep(C{V04gHX1Ieo`9CU&q)}mzfz?Cm-zfb~?YP7G7qa=S6nu)qg%TlS*duFsT&rp_b2j@s{>m&6rO=l3j=tB z*m2@RKO2c^*i~>LP4&jFc|B-|aXVGD8BU5%y`V*KsJj8G04t8Ho7AYWWMpS~0wXh& zVC9)938&mv@|Wh96(K0z(lDpAPnoo^z_F|j2TpuYX>~V#c4t6v#}gu_f77hSo6nkb z7+kB@^s>44?0%-RTA;Q9kRs|91h1E$zfZ2;n)J0EXZ|^=#31nyuO8D(+LD&xff^GdoJj2%l`}#5*Emvgme(luQ*@jprqGaVI%4z= z6W)Eh^PXA~H);#e868Zk*ZMr*{epm)29DIY2$GW177koEDeiZ?pf?T6Q0zk*Ye9kL zGmR71lET7-XXTS3f7wU~rzqNT-BHpqOc(m^6_T@u7mv6ejgM|%@>fLHX&#d*o{ zfh0xLX;1!pZx|7F9nwsEcd0*U@-na!cFW=N_BOznCEPEsNJ8mNMc$Vhy!NCgx=qN$SlHTcR&lOP!1oDcm40c==I9uZY&VNWsINcaK6? zjPX>a1=Av9xQ_+UvgsiMF^3TXOreP73>f<-%PD2L9B>?6;gsobqcS_7#tW^nwycGP z=`Pz3heU|!+PO(j-jpgDP4_Hrq&it(AFRDo`qX-tM~lBS-0rH`(Xr{=yR}?+lxz-n ze4zLvx*+6v3M#znG3Z{BX!j@dFjNp->`XJsUgJAvLc>Q9s;Ki+*AJj_W8xAnY|hQLhpi9`Iw*E*Ix&mnMc3u6X#Hg#H^F76@E2 zs#H^PokHIx))bTOB|dj)HJ%k^OYTOL|3MjKcNBq^7&y=CIxxN%H;vv5L(_){`Z1K9 z4Mw-aq>HA(iyaC%<76{ILXrzd;5&qV})b58<3MRo#J8MC2F=;^9ULtnH^-HX33lh&bkWibC;_~$^ z|IGvOdjt}7U%DSjM%cun(eeJN%@hwwV&y3>oKfD1g)qkZFbfxeN4*9S*r!hW5$h`G zT%@-eD*(bSKwvWxW3q7^{1c-$zo_h)Y~iHgp=25&C=@xC7W^y-55j_HcOE3 z3A#E;r9LO^P39wXkn}Ws_bII(*z5k$zwbBfy9X$F?uvjwc^rfdVI@VEw^mGfQgIV0 z}%=ONj|oRoq(Ks~1WI zwtD#Ql`KUvPvuWMsg^R zuVA)xoyE8?6p&An$0scU^G}@*@GbJDu3r?J$vWX~PVn?dy&Duyf6gM^I zRT(KCnmm%Z?2ONX~={v~75ar(p=O0Qo;cI&t(+uyMuD3PJOfByG4k;utUu z6*FL{B9r^C)UCtdcWja*;XYqXXuL-8Gf(Im;2GskH;nrbMtD5Dz5R)Srs4I?7rD zLmO5WQ}}kQHDu+K_bKmusv*zIB>HLAVzs$K0&B(9%_&fXc|s55sE1(Cb8kI;4>+}k zvuN9n&>Xz6KPID!IFwy$(C|z#2r5{E^Z=5ND?f^IGV^V4gaqeSbZ5Nih`*N4tM^(L z{)l}*jQrJ?UKXZWhBF_c&jxgqC?bl;hZ!;ABaVR?yOyi$2iI`Nv6Ti}91G@|N3a$^PGR%TyTR`mybgIa?i zlp-55feoaitIg-U9hH}a9+Q{($g6m}UO$#>J>b-E^x4>kc={Ww9%MV{lo?Y=rOrj}7j2awys<>`mknv!Srmi|!CZ!IGO21)c@Ipc7wK7N^;3 z(zpg$(25ZZ|#gpnhx0K`fFGVIlx6>c}owF*t?5`6dOIU|{aQRdqVYvE-KYHw^Ju8qG zuHkM9`~KW|5k>+h&HIp;@;?YWa3OQ+b713xMUi`P)fjBcHblHvM!?R{!o=sn8z3gr zUfI#-kTQZkJ(N_#B5sgor!BRdz2v``agF#=ZjgdSD~s4$mRph$w|zfWM|*q2>ueyR zU+S|(e97N2Fbr*E^yOrkhX$tq$0YlNcndd4yTHQUq>7 z!kwdjhWutF#Ze_doau8B@*N9glWaYC; ziP)H8N*1cc!UefO-^-4!)OYQb>h8UGkZDdI|723{Dbp1O9yP6j=6T-VHS8Zhk$?2L z;$<1ie@IkpW^5zLZAwMp+1rGj?8*1=q7amS1dgx&hVF#uUi=JK^^(l6gE`DlS{q2b>T0nhLnoJepo+GE)4X(z z(kbc!_i&PgsyHPQ3GdVE97q*mSFcZQ-hvIR(Vs|KYvS*|*q>?--#)=JL+&jKy8Iv& z;|!V!#wX?zEJsMAd)k&e5i@Aa+%CQw{13Z2@#iZbc9q?O8uK53%%tN>OC(PLtHAWW zy)el8Rj7vD>%IB;t3~z?c zZUAf0FCpU$i5>Odc%3BGY>9P6mF?ObzNa$np)Polog^5R-YDQt;=w%9-@C3dpYfi}t5m0D*oL2X=PFPzS3K-!Lu`&%s|9bT<(O_&DkyAkjM)4ric@-_sn2z_RdI`d|hHd+F`3@G7IjJV~yPt}-Nl)Kpqa<3ha zL^MwBGT+CYGjLxGE;rwXCtyMn^N!j&6E-MTO^=ZIC4#Stx3lw6<1bZ}k0Nxd8)!O5 zipt{pgK7md=?!F(is$~B+`HvR493%isI=P3iZDEz#Qr zJ4)HW*5V&8V!umQ2RIKEJ4p>OY<$?#T2DTqbZU-ukZ6`|RInD>(zj<{*K+Lxg#ubV zWGugTgBiX4SBm_zLm1&ud9*_fS4`0r~uV>PNOR_`=S8C^Bo6U+-62EL4=u$Tj&8 zfmmC@hu%YC2l|bmLG2XCjH{BCH&<0j;+^!=|0OG|{OxMzR)a=$Mc*NAJr9Nr zJm@B+-ML!BG*I!0`~uF?9VCsb46-%FT(5D^>msf{k4B0PJ!S8uvh6~(H>x})I*BB6 zqC<)n)sO72H|D>eKvBDMOT-4SX7_4jRZRzt$ql&S**$zDad_{}be0qdxUMvpAf$+h>RSjG4i3?aa~B9!Od2x*Q_zV=0*O$Y#)EEJcU$LZ<0w_Oqz>|ALgi2u1xeIi|FNh4?Iwp{W_OL-$zJm3;jT&&DYf|S^BWkV zWW@j&jRYa*#$=}N5Bofn1LOS~5%s;~r(eGi-^VW;cJ)??4bpC5l9#=WH~B5=AcDLk z`3_m1MEVT(xbAN=9k`@mNi%=cTx_#vt|J!LR^0_$9LON^O{|c8x+4UayTw$Qz#>fG z#1>t6-%Lp%`jGWXsAj29foG^{guawaS<06}?rm9oBn2cT92?P~%pB=!MwN_Y=V&=bp!*!pFUIgUT5d|~i5;o)D6phZRCS~Kc?L!)MUy%7 znmOa`&+7aH4O_8`f67H#lo#5gqT*xu9tnLeu9~l0TrH7o5ul{iM1=li%Ac_Li^fhY zJp{U?Fq$+ucvl;t*&f{tj-F~G z0X^8eZs4(YBk9`x$yPSs;veYKAYnoZ_(S`R-qU2{nxcDL=G_gg!ZIwguZ(F#Pg*rDY^X4SqBaQ?>~1cDj_o zBzK+bV$XAj)#)xYf4`T3(p}UlZR92Yqd%u!lqvz~grv^@%8*X;-;boCeXsX-?O6(o zip(;(2=77ADgkK8d4+h`{Zdfl@v!NvuoYX|rI~*)T#&mF=1B793`Jw&jQI{MpN2*> z`OK!$N|Yli`~h&DyY5dO`=!xwEqY-FJOpWV5vb4ClEuabc76rHUQxx}jg1T1O3Rqc zjy48|&rVt}=ox6~ZOw^3eGaf)%Cj&P0P4Q9W0Ewu+e1tdMp=)}J#EIc=8$yj0sRP! z{P^xs$}W74fyGeWIIjC%!g^VY03=$uWjF^)H4srh9cs{t8stSSSJ#E&D&x^U1xC(m z=!EC4TL38t;}UI)N=Ul#@xwb-up0M)5;e94%CKRn5I-HKhu@-^c0Wo5Go4I;G#>_} zF)yq|;k-hV*9Fb8+zFTv>A2^5^}h_e*xgE0CF09sgDUr0=zRYAc>EE`iBuT35SN_zO{#$*ppDmvGQ5h zib5>Ei0KvAlwO8kTGY)&ms*H1M9E-c{aYBQE+*z8L{gKGgm$TJER1>zVDa`~YzH#2 zQAp%pq^kA?Xlv`;315|fG+SB5P#CKoJnbTHCD5hwHMQ*a*cPN8uZgHaY5&k&4=vrM zPpLiXX8kU-^|xCC27NP$Oh{Dy=O>==pesi@rCK~MI7Z1iZqrFHkFk{@5L03M%@|*- z`1H=<=d*FLx?M#O8mG&#&qX?T>_n_;Gl7(YG_h*+2rB7&EYlRG2@RzfH`@N63OyIGx0 zRCs7?;*-_Dn}M(S0irL@GdvdddIC=m3T*rrmHDgWL}YM4VEzhhzU7DO3zil8o^z%6 z(c$dUo;5wR$3g2gJu?RVrupPw0{i8?T>Hr{*Ktrci{QLv>y@{-en%EB5ON5%o6Okk z(^rP-S-%&guf183ME?(`QQi0jP&Yu?>`WuN%KovL?6XZErbDwL-D!6tYCN0~timY$ z)cMr1UqOx(+#1M|{rv~m{U(okh_uCRV*pym3hM9p)|23uCkp*gCg9d2Z4S?Mj}q)B z4Hlz8jJgeJObOqA?Hr(@nSirYum)z`^QeBn)}hNp5!`Vd80Tk!BS>l_kEi{0lq$FY z*zbTQ4)?1e$wjNK$cYI`S%34~Z0cB;1F=8?I{b79n^zbY6#5(uCz=WGlW=GPs0~{Y zU>G7r^)!cmDAY^@nP~S+if*m@W#!2pLi!i;dG%CK0jsQ6lN3lBj=ZDd9YJ~YO|rRl zffB3WW;7NYmLctg11avQE%7*B7EJi(KtM-vB?`K6zQ?!Oqy|khzi&J(R%aL@N^tZ#jH$c&kk1NYft@LGZO;Ar5Wcw@aBUW6 zVz+sO=DD&w;d2l?bvyIlQ*Nf@qlZWB7(}5b2;~0l5cb5Rm$0$~YW)5< z9dTQr{(PfY6G5qoRt50YEgy2T&5HSrcc4ALQV+d`*1UVnNJr}!42B8DftI|7e4tdM z4$euG@23f|q7fQ;aAAJ_d;uiD88$5bHCV&wS%g+4;PUsrDl?>eeV$!#43y=7IP2`E7(f=xZH5*#KikgAtdHQ#O&y@o={CiWjX|{PK#BT=bm)oh~;k z+>jY37gWx=0$kdxQ$bau;H%L`QQ2RG={Vwxbd?#E&O1zkoi3OONMEe$&ze=1*p2_x z#-C@_8|nV|I+`aedWqKn3a!GUdneM37{*Bdm&tW;EwH0U7$Tn@zGDBp{)V+zhVp0B zdp+(BHfjSWPCqo+cE9>3b#>xWyrE9$`J*|wrEu|D z7;?h$ErTvIOofy*P#Z4zqCKIR_X$-8_eQ5^2cFIZ%uF$v9|E zuH*$5EUql<O_dIz@arHR$99Y-exW$1;-5|xV>O{?;{oN)1Qjp)rqeX zU>n9_t}_5bOELu2Z<>f|=CEG0bH=5;w#iL5^+M%Nhg=-y0=;LsLt zACwmf;;TXjAxi+8@Xj4b+{sQ+H}aU;5t#x8v{MysTP{xZ>@}B59ngKH{1$RW`vZ`4 zJZ=^=|5eX-e-v)&@;fa0BZIPk{W%?TiY)2tp(@gUMa-Dp1VYPrl@ zx%%DSM|E-0As#aREr4Gn%{<n?pr_aB^cB<+XRFeuLh&Z z0u7T<&%Wd3vE{Nq%ZL8b?-1dKA)WTM9Enq5%*CJFL|+{IK^R-J>P?Qa>|g2tJ2 zBU9L&1lL~l#^57HmCA_wPm!eq1)|B3s;bmd*pM;hZ zNuyagskZFgz2x{Ab456mVaTl`3wqYQ=RZk%pA3yMezO45y-}w{i_e+w7D$eZYXSdc zcqYTp4NnX!N1e`$yk^f_u`MQ#q2l-+H7w&3yAR^@hU;7<6EJ)(5Tf-^jvk=|T~`F2 zz!cZhpDT|8ECd8vjf2EEFC(MMgR6$8Cb4&r%6e!1G6;xf_&W9Yek;g-=-l{Fa3qeo zerIYM#$3I|jTH+0F1UIA=ZP(Uq$>Qm8j$SX)(l{F9VivBel-QL-39rpnq{8?&8-F* zGdh`o$qc;%sW4mZkT>&yR|-%ZMX|zTk~`M8r(w&@)QtjUvsORe>Ht}p@5vQy7&d=8 zcNUcC&SzMTA=VHpgGM9oBOhwN=54UZP8QE#CEdvG#Gc693uEQ9_&On~X?nPhqcVc+ zVnzJBallM3{fc0KrQ$A<|Pyp=)MR)E3;(MI21O{$yHG z@ImSWJ!5VnM84K^`QdO!fMoIjBIsLVo~RS-;M53t1fq%w4s%<^>UTl(p+e9_T=N97 z2;aL}-*l?F`}T`fMJCol#cvpO}A2 z(+`$-Dv7>k5Ku}*QL?6LYV}O{8;))W707wOtqFhhW@g6w?Z!#Id(kj62xZ&F38O;1 zMiY5IcUByhhF_XL>~v5a)vfe7%3et)q#8+A$BA79qOGvw8RTXhAE4P1vdlpx1tl^< zL+#%|^{gHUU3kd)+N!y|yTMnL-rlZX4`$jUiSjtAUPl-a@7nJQ>O-kFUk_{S`(Jy4 znK3qJJk2D>cIHW%c3iM?6kKTE|3^VHM)XFUfe#pZtz;;EnLADFeTh9D6xsz;N%dPi zWUSlDHPJsFO-Ny)#D*B3LQ!&wA!$Nu4Z7lGF9bP6ZXTiUhfwIolFF_0>czSv^7m=? zd^Iz9HPsamdN^#=$Ac^=I*wZm{gp6c;tWPZ{ii_5Z3YV>%&y|EoHPOfr}`OvF!JM$dXz%cC1Z(5ttY+>g8rHW6q zL>DoBgx)31Y6b&!GYn&C(Fd+?pGNx41EvT^CmEujHO4(r>&`<0WcVqa`H*}k=d}R$ zVzt-3QsYmgZ&A=Nyu03eAX5%ixBCkGUy#W)nF z5b2iJ?1>oMgdFvp#3)`0nl2(q9VALw9um=OG^7r_*Xxcz-yLpFWYx{Jxm6ca4np`T zux_}SjMvLN{>rvN4B#%v{$mguj_9lo553Z|ij{=Z0?4`Irv6x>2}(17I8tY*OKacx zf%Yu{`D2~AAc7zV}H3ebh>Oe{Q8+m;H5z z7VEzY$g7@A8$~SQ^Vzi9Pll_5XMiql%BgN;mtQS{PA4<^YM3#`H~+Ca5tDMHK-{Ra z+n_|IaVd zuoBQpBX6U1RmDUS6CNhcx8+_IoJ;(SD{GM^aS})EWRdvkPYZBef07A+8C@0 zP6y?U|3la|hwF}~5c~&pO^cacng{v zJf4bhz15ZawVmPV&9Az*6N_Bydv`fZ9hqXQW0MbEUjc^(?bo>k5`%(1Bv(bQ1?!x3 z1CWDlNo0N$Q*wW~yv;LDS`2fE5xgx;7foufB^;z$IxA$qNcY%UOL4_gX6g~9Pp?VU(W``ZCTXy%* zM8LY8sAMjENO3pJ9vO#cI(b^|6!`3Fo9Q@I4jXXO6w*DDi8$Mm zk%P~6s7QMaCIv7Y5_mT5j|Fl zIUXPPwx?&`On2X-NC3TJ16=GMp-@Nkfx~0-=miW-dEHA$@oU4{a*;hH6U>mw^%e$X z6IkvtsDKimv6SXpQMLLmk5Eqa@j9 zNF|^;0Iqx(tRoEvLb{ci-fxk#Fr{TX-29Ip9}uS>86WRskexCz%R$#%G5Q|uuT)w$#`WioOT)eM)W!WI@Z`!KBHw6&evgk_bfTO6anG@;C3aMA z_@Vtb+dDiW$S&+~fN_qwx_1V{@lW^-zi*mQB@L3`yl@B~j{D%p`4@)D<0IHQv=?+d?k*KEYpJ}Njw zI}Ycyhy}HAQd%)CT)&4fyX1EkH&9mJL5`afr8pB7G6;KuAIn62h7iWMhXwR)p8UnPdDg@kmo0a#&Lla0YZmfFk=3px9#P zO$YboPbUJZ@~s#ra>N zUG{%(9~VTWy9M>AR|7tc9MDwYa+22du2t=O%?V{;z)80BTQxgPv;dhRx@R(=-IgUD z@D4FW)dyz9jZ@@@NYyj!$Zn`V5eH}H2FtG+*jrJ#g#j>p6St7NJ>q)r)*h6wnGK>|d8Yyq z8-zV@>W!pdP+NrX1YRm}1}8;~t@Ko4S*3ZM8%aU!|zRWaxk``AsRmq0UMq81f`r zi#TG0&N`sA8#$47kErY}cV{#2B;`FIJ<0>+*27O}H%P+LeDifzR%AK{&zRHSINt4aa0t0&v zehMDp6bsdX5yu=2lC>uy6hzBuuBfugP0gA&`_1<5?{|CQ;AjWO_|*Dn{DwEY$Lz;9 zf8oD+?Nbk>=cn9u*kYSnvSKdmkT|_J+%5o;kk>3DGKqaX&(X_tDQP?xTIK~H>uxx? zu~D0MfYO%f7?VL4=0{nBE%;hdv_l*_Iiwg#_vv*s9q;QV?>MCS!78!V!^qr~>^t*L788A%S_KMG);NDJDa5(wcw~^LGJS7K8q*Yd_ ztfE|bJNFMfY5_WzA43VW@+;o*9b9|h&N}5lLwSkTHxr3hx9eF$9rI$-t?swqW=x%Un?8=TM}QmNckeM5YN<0?_b}JKDFNv;HWA>M5B3g~RXC`d z^}b%eB#TUYi*8_0TfRxe%&s~!vnc6`e)b<>jF5}|w&(9qn zlHzi84Jro?Ox^`OjW&vo(;vd?BKVM(Q;cI+=gNcVt>M-i1q5}dvJ8f8hiX48e3StJ zIS1I8|5T6fACF`(*&x!=9u9D~bz57{JHPc-nhOVZ8ku%kjH&}&(3j(UV51r$B^3nkd_;ddZuXw-p>tkrfondspa2Mj&`;+j z=KyU&8S4(x5usp(*SK8Dz7SR>c;u*`DO{?73v97+B$ClgdDPU^7XRcqs0Z-3v*j8o zG&M0k0>lG^RjC!-sUkg27mx0oO|^5~NZtOZ**n-N*5_fd1 z6)`~E{wceXyC>w(B_N4z&oCoy3HDNJl>4DHW2)Ua7b&s041jU$RAdjaxKfyu)ap>i zC*1+~*1z-dA=2T?2o_t8rGTEW2XYxv(nqAvT@mrK(CTJ%RE;j1|ImyvWrRk#m$5{Y zACi(i*ZWS(QKDq^KgC6*vkDD2=Z3YySV(54>HA9;cM+#aql6r)Kz{maA&X%ETSg9= zn1Z8hGi(WqT3Z#!xxUxyaQdTo2$rS~^4ez+?IV{40>yK_!(i+CiFy>Pe)=%$JnWsCZT6Sl*54Be@k&1+0W=Z<>t(A<1xPZ zrL%M7yeZ0j|MO4h0id^fD*zqlC5%Q7q4-fgXYwHSXyAiRZWqJXT)~}369Na&YyV;J z8OK1@aMp!2d11^5rZ!GX>oBQ1tqs4TIgnyIC8it#jb2$rOM1Oj#;Eq|i#C!OqE#w_ zZ5#Qai?{QnFjE@V=8~{8g>ypZUTyhhFVPo4*nvCd4yWh#^H!xkrolf5gH+J~+i&Q&nf;01b9a5&#|cor&18&98*N zf47o}E^lhzj<6XXVsm`FQC>dtHoVv4D)*QEh*z?kH#(WIVTk-R5l#W^6h)^cP##+hAdX`xRXTJ=P`)@E@e&UNuaq+7(hkIi2#e)+?!Yz6%a+@4ME-rZ>5Z6M|YT1aq&+ zWo(K`E{a~U6VvWK8q_?XL&LLT^5|c9l|-3)F3?M6t*|jri!&4Y6O{`l%79^*m?OVE z#4YG&Vi3$w>Q5J#cql14SoS3h<&D&wg2Jf63T2wnV^>OXPine1zmtVXVdt5)Fu`JfhLr_$$~fF+=ev)JtpS`#bR) zat9S*|NNIua`l3{ePFuay1(@Y`IZWo5-*Z_qL!wT5O7V`yq*>9kgQHPkb9(`WsYNkGubjw+gy zQYDXj%Hd~(ZOm-3E1k28?Woj~8s%=^m3eV~cWJn~>7U75(#!$;5us6i0p#g~5x;!5 zrqXqff{R|>)z`R7>y}Q1%C*m^#zZ2#wO^)|7xk%>nQ0@I^Y=P zYD;-eYK;Xs>p7v=2>gaxVG=veb1{+QyhKu$y*<<pqA}Z!DYmB_vVKP*L}BP60!wY6tXdR`Cr}rE z=SH{)*8ot3!+m@Vj6A96;T6f3rw!TF3;QO{;$_K0Me3kA>f)J}VNmo;p@jBp$Dt0a z%=_L5aB!nY!)O95Xf7K3c2Fbd!|LS{D9F5MiSh`*B1b?H=J!n|xdK}PG>9V^m4q;i z0KuilqPQ=q6WAy8RvH>Kk=}*R;8)>0FV(<(qpU|I(@kD^1pG}6d+%T3g;GQ}up!P2 zY50pFBD&|g0=FFBp@O>evVJYnaWr1f;_QNSQ0H%rFIK2d2eDz%gz%6-bK)aioq%}* zOUaT+zHH_Dp9%hR`3+dWJt!RM!3UJuC^@Uw2YOl^f5bHA>c$fZw)L~Xqe{cfwb<)v zRQ&3yPXOM~(D4-H^_c)d=CA=+ByS+~hH|T-)DJB2MG!!tQ$VOIvzob89{8~w_n}ZG zSM?4za~X5O-2pj;$U2J0vRF{nl;!@CtzNjfB=@1;)}~R1pjW(4Qz1j6{LdCg^eex* z;Rc<}O&O51lER8t5P1!(&7qYbs~mA{{zmLRfzxq literal 0 HcmV?d00001 diff --git a/Koncept/Testovoe/Пресейл/Ресурсы/РазделПресейл.svg b/Koncept/Testovoe/Пресейл/Ресурсы/РазделПресейл.svg new file mode 100644 index 0000000..d25fa4b --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Ресурсы/РазделПресейл.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Пресейл/Ресурсы/Справочник.svg b/Koncept/Testovoe/Пресейл/Ресурсы/Справочник.svg new file mode 100644 index 0000000..139cfda --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Ресурсы/Справочник.svg @@ -0,0 +1,3 @@ + + + diff --git a/Koncept/Testovoe/Пресейл/Сделки.xbsl b/Koncept/Testovoe/Пресейл/Сделки.xbsl new file mode 100644 index 0000000..21b4b72 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Сделки.xbsl @@ -0,0 +1,245 @@ +импорт Основное +импорт Мероприятия +импорт Общие + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляАутентифицированных()] +; + +@Обработчик +метод ВычислитьРазрешенияДоступаДляОбъектов(Объекты: ЧитаемыйМассив<Сделки.ДанныеРасчетаРазрешений>): Соответствие<Сделки.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>> + знч Результат = <Сделки.ДанныеРасчетаРазрешений, Массив<РазрешениеДоступа>>{:} + + знч КлиентыСделок = Объекты.Преобразовать(Объект -> Объект.Клиент!).Уникальные() + + знч РегионыКлиентов = Клиенты.ПолучитьРегионыКлиентов(КлиентыСделок) + + для Объект из Объекты + знч Разрешения = <РазрешениеДоступа>[ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаМенеджера.Объект(Владелец = РегионыКлиентов.Получить(Объект.Клиент))], + [Сущность.Право.Создание, Сущность.Право.Чтение, Сущность.Право.Изменение, Сущность.Право.Удаление]) + ] + + Результат.Вставить(Объект, Разрешения) + ; + + возврат Результат +; + +@ВПроекте +метод ПолучитьСтатистикуАктивныхСделок(): СтатистикаСделок + знч Запрос = Запрос{ + ВЫБРАТЬ + КОЛИЧЕСТВО(*) КАК ОбщееКоличество, + СУММА(СуммаВВалютеУчета).ЗаменитьNull(0) КАК ОбщаяСумма + ПОРОДИТЬ СтатистикаСделок + ИЗ + Сделки + ГДЕ + Стадия.Вид == ВидСтадииСделки.Активна + } + + возврат Запрос.Выполнить().Единственный() +; + +@ВПроекте +метод СуммаВыигранныхСделокПоНаправлениям(): Соответствие<Направления.Ссылка, Число> + знч Запрос = Запрос{ + ВЫБРАТЬ + Направление, + СУММА(СуммаВВалютеУчета) КАК Сумма + ИЗ + Сделки + ГДЕ + Стадия.Вид == ВидСтадииСделки.ЗакрытаВыиграна + СГРУППИРОВАТЬ ПО + Направление + } + + исп РезультатЗапроса = Запрос.Выполнить() + + знч СуммаСделок = новый Соответствие<Направления.Ссылка, Число>() + + для СтрокаРезультата из РезультатЗапроса + СуммаСделок.Вставить(СтрокаРезультата.Направление, СтрокаРезультата.Сумма) + ; + + возврат СуммаСделок +; + +@ВПроекте +метод КоличествоСделокПоАктивнымСтадиям(): Соответствие<СтадииСделок.Ссылка, Число> + знч Запрос = Запрос{ + ВЫБРАТЬ + Стадия, + КОЛИЧЕСТВО(*) КАК Количество + ИЗ + Сделки + ГДЕ + Стадия.Вид == ВидСтадииСделки.Активна + СГРУППИРОВАТЬ ПО + Стадия + } + + исп РезультатЗапроса = Запрос.Выполнить() + + знч КоличествоСделок = новый Соответствие<СтадииСделок.Ссылка, Число>() + + для СтрокаРезультата из РезультатЗапроса + КоличествоСделок.Вставить(СтрокаРезультата.Стадия, СтрокаРезультата.Количество) + ; + + возврат КоличествоСделок +; + +@ВПроекте +метод ПолучитьДанныеСделок(Сделки: ЧитаемыйМассив<Сделки.Ссылка>): ЧитаемыйМассив<ДанныеСделки> + знч Запрос = Запрос{ + ВЫБРАТЬ + Сделки.Ссылка КАК Ссылка, + Сделки.Код КАК Код, + Сделки.Наименование КАК Наименование, + Сделки.Ответственный КАК Ответственный, + Сделки.ДатаСоздания КАК ДатаСоздания, + Сделки.ДатаЗакрытия КАК ДатаЗакрытия, + Сделки.Клиент КАК Клиент, + Сделки.Стадия КАК Стадия, + Сделки.СуммаВВалютеСделки КАК СуммаВВалютеСделки, + Сделки.СуммаВВалютеУчета КАК СуммаВВалютеУчета, + Сделки.ВалютаСделки.Код.ЗаменитьNull(Неопределено) КАК КодВалютыСделки, + КОЛИЧЕСТВО(Задачи.Ссылка) КАК КоличествоОткрытыхЗадач + ЗАПОЛНИТЬ ДанныеСделки + ИЗ + Сделки КАК Сделки + ЛЕВОЕ СОЕДИНЕНИЕ Задачи КАК Задачи + ПО Сделки.Ссылка == Задачи.Владелец + И Задачи.Статус В (СтатусМероприятия.Запланировано, СтатусМероприятия.ВПроцессе) + ГДЕ + Сделки.Ссылка В (%Сделки) + СГРУППИРОВАТЬ ПО + Сделки.Ссылка, + Сделки.Код, + Сделки.Наименование, + Сделки.Ответственный, + Сделки.ДатаСоздания, + Сделки.ДатаЗакрытия, + Сделки.Клиент, + Сделки.Стадия, + Сделки.СуммаВВалютеСделки, + Сделки.СуммаВВалютеУчета, + Сделки.ВалютаСделки.Код + УПОРЯДОЧИТЬ ПО + ДатаСоздания УБЫВ + } + + возврат Запрос.Выполнить().ВМассив() +; + +@ВПроекте +метод ПолучитьКлиентаСделки(Сделка: Сделки.Ссылка): Клиенты.Ссылка? + знч Запрос = Запрос{ + ВЫБРАТЬ + Сделки.Клиент + ИЗ + Сделки КАК Сделки + ГДЕ + Ссылка == %Сделка + } + + возврат Запрос.Выполнить().Единственный().Клиент +; + +@ВПроекте +метод ПолучитьРегионыСделок(Сделки: Коллекция<Сделки.Ссылка>): ЧитаемоеСоответствие<Сделки.Ссылка, Регионы.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка КАК Сделка, + Клиент.Регион.ЗаменитьNull(Неопределено) КАК Регион + ИЗ + Сделки + Где + Ссылка В (%Сделки) + } + + знч РегионыСделок = <Сделки.Ссылка, Регионы.Ссылка>{:} + + исп РезультатЗапроса = Запрос.Выполнить() + для СтрокаРезультата из РезультатЗапроса + РегионыСделок.Вставить(СтрокаРезультата.Сделка, СтрокаРезультата.Регион) + ; + + возврат РегионыСделок +; + +@ВПроекте +метод ПолучитьЗадачиСделки(Сделка: Сделки.Ссылка): ЧитаемыйМассив<Задачи.Ссылка> + возврат ПолучитьЗадачиСделок([Сделка]) +; + +@ВПроекте +метод ПолучитьЗадачиСделок(Сделки: Обходимое<Сделки.Ссылка>): ЧитаемыйМассив<Задачи.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Задачи + ГДЕ + Владелец В (%Сделки) + } + + возврат Запрос.Выполнить().Преобразовать(СтрокаРезультатаЗапроса -> СтрокаРезультатаЗапроса.Ссылка) +; + +@ВПроекте +метод ПолучитьСобытияСделки(Сделка: Сделки.Ссылка): ЧитаемыйМассив<События.Ссылка> + возврат ПолучитьСобытияСделок([Сделка]) +; + +@ВПроекте +метод ПолучитьСобытияСделок(Сделки: Обходимое<Сделки.Ссылка>): ЧитаемыйМассив<События.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + События + ГДЕ + Владелец В (%Сделки) + } + + возврат Запрос.Выполнить().Преобразовать(СтрокаРезультатаЗапроса -> СтрокаРезультатаЗапроса.Ссылка) +; + +@ВПодсистеме +@НаСервере @ДоступноСКлиента +метод ЕстьЗадачиПоСделке(Сделка: Сделки.Ссылка): Булево + знч Запрос = Запрос{ + ВЫБРАТЬ ПЕРВЫЕ 1 + Ссылка + ИЗ + Задачи + ГДЕ + Владелец == %Сделка + } + + исп РезультатЗапроса = Запрос.Выполнить() + возврат не РезультатЗапроса.Пусто() +; + +@ВПодсистеме +@НаСервере @ДоступноСКлиента +метод ЕстьСобытияПоСделке(Сделка: Сделки.Ссылка): Булево + знч Запрос = Запрос{ + ВЫБРАТЬ ПЕРВЫЕ 1 + Ссылка + ИЗ + События + ГДЕ + Владелец == %Сделка + } + + исп РезультатЗапроса = Запрос.Выполнить() + возврат не РезультатЗапроса.Пусто() +; diff --git a/Koncept/Testovoe/Пресейл/Сделки.yaml b/Koncept/Testovoe/Пресейл/Сделки.yaml new file mode 100644 index 0000000..5dbbaca --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Сделки.yaml @@ -0,0 +1,126 @@ +ВидЭлемента: Справочник +Ид: c1c67dc6-4fe3-44ef-98d5-ec8929cdabe5 +Имя: Сделки +ОбластьВидимости: ВПроекте +Импорт: + - Основное + - Общие + - Общие::КурсыВалют +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляютсяДляКаждогоОбъекта + РасчетРазрешенийПо: + - Клиент +Интерфейс: + Список: + Форма: СделкиФормаСписка + Объект: + Форма: СделкиФормаОбъекта +Представление: Наименование +Реквизиты: + - + Имя: Код + Тип: Строка + Длина: 20 + Автонумерация: + Формат: + РазделительПрефикса: "-" + ДлинаПрефикса: -1 + Префикс: ДЕМО + - + Имя: Наименование + Длина: 300 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: 89700ede-99e4-4621-8a86-9c7b8340171e + Имя: Ответственный + Тип: Сотрудники.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 75b6f590-119c-4b92-9bc7-6f6995aba78e + Имя: ДатаСоздания + Тип: Момент + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 3261051d-6837-4c4e-996b-824fe3034bb7 + Имя: ДатаЗакрытия + Тип: Дата + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 1a01abd5-99d8-4421-93af-e8df05fb7f2b + Имя: Направление + Тип: Направления.Ссылка? + НезаполненноеЗначение: ЗапретитьВсегда + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 71c47377-e168-455b-af95-ba9b5bd36763 + Имя: Клиент + Тип: Клиенты.Ссылка? + НезаполненноеЗначение: ЗапретитьВсегда + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 6c4c8ae1-2c06-4537-a028-1179f2533842 + Имя: КонтактноеЛицо + Тип: КонтактныеЛица.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 6813b13e-0823-4e9a-8cb3-9b03d08542fe + Имя: Стадия + Тип: СтадииСделок.Ссылка? + НезаполненноеЗначение: ЗапретитьВсегда + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 455ec0a5-4bcd-4dfc-8e15-55030807588b + Имя: ВалютаСделки + Тип: Валюты.Ссылка? + НезаполненноеЗначение: ЗапретитьВсегда + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: 65d337a1-b3f6-4e59-8bfa-afccd9ed68c1 + Имя: СуммаВВалютеСделки + Тип: Число + ДлинаЦелойЧасти: 12 + ДлинаДробнойЧасти: 2 + - + Ид: 6b75e368-547d-43bb-8818-2575eb9d4583 + Имя: СуммаВВалютеУчета + Тип: Число + ДлинаЦелойЧасти: 12 + ДлинаДробнойЧасти: 2 + - + Ид: 9b08f96a-af6e-4f0d-948b-d10ab34dc3d9 + Имя: ФайлДоговора + Тип: ДвоичныйОбъект.Ссылка? + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: b243e96a-3039-4dbb-919c-5ceebba31c54 + Имя: ИмяФайлаДоговора + Тип: Строка +ТабличныеЧасти: + - + Ид: 64c80cbc-d528-42a1-a1bb-df0109efd312 + Имя: Услуги + Реквизиты: + - + Ид: cfe10697-1ad0-4a32-8c37-8eb627c0e830 + Имя: Услуга + Тип: Услуги.Ссылка? + - + Ид: 979b531a-9d64-443b-bfc7-c1f9810353b8 + Имя: Количество + Тип: Число + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: da0c8fd8-c66d-4aa2-bfb0-9bc2b0f6b8d0 + Имя: Цена + Тип: Число + ИспользоватьВПолнотекстовомПоиске: Ложь + - + Ид: db4de1b8-6714-4df4-8514-fb6c283cd693 + Имя: Сумма + Тип: Число + ИспользоватьВПолнотекстовомПоиске: Ложь +ПараметрыЗаписи: + - + Имя: ПересчитатьСуммуВВалютеУчета + Тип: Булево? diff --git a/Koncept/Testovoe/Пресейл/Сделки.Объект.xbsl b/Koncept/Testovoe/Пресейл/Сделки.Объект.xbsl new file mode 100644 index 0000000..094a07f --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Сделки.Объект.xbsl @@ -0,0 +1,48 @@ +импорт Основное +импорт Мероприятия +импорт Общие::КурсыВалют + +@Обработчик +метод ПриЗаполнении() + Стадия = СтадииСделок.ПолучитьНачальнуюСтадию() + ВалютаСделки = Валюты.ПолучитьБазовуюВалюту() + Ответственный = ПользователиКлиентИСервер.ПолучитьДанныеТекущегоПользователя().Сотрудник +; + +@Обработчик +метод ПередЗаписью(ПредыдущееЗначение: Сделки.Данные, ПараметрыЗаписи: Сделки.ПараметрыЗаписи) + если не Услуги.Пусто() + СуммаВВалютеСделки = Услуги.Преобразовать(Услуга -> Услуга.Сумма).Свернуть((Сумма1, Сумма2) -> (Сумма1 + Сумма2)) + ; + + если ПараметрыЗаписи.ПересчитатьСуммуВВалютеУчета != Ложь + знч ВалютаУчета = Валюты.ПолучитьБазовуюВалюту() + если ВалютаСделки != ВалютаУчета + СуммаВВалютеУчета = КурсыВалютСервер.ПересчитатьПоКурсу(СуммаВВалютеСделки, ВалютаСделки) + иначе + СуммаВВалютеУчета = СуммаВВалютеСделки + ; + ; + + если ДатаСоздания == Момент{} + ДатаСоздания = Момент.Сейчас() + ; +; + +@Обработчик +метод ПослеЗаписи(До: Сделки.Данные, ПараметрыЗаписи: Сделки.ПараметрыЗаписи) + если Клиент != До.Клиент + ПересчитатьРазрешенияДоступаСвязанныхОбъектов() + ; +; + +метод ПересчитатьРазрешенияДоступаСвязанныхОбъектов() + исп КонтекстДоступа.Привилегированный() + + // Разрешения Задач и Событий зависят от их Сделок + знч ЗадачиСделки = Сделки.ПолучитьЗадачиСделки(Ссылка).Преобразовать(ЗадачаСсылка -> ЗадачаСсылка.ЗагрузитьОбъект()!) + Задачи.ПересчитатьРазрешенияДоступаДляОбъектов(ЗадачиСделки) + + знч СобытияСделки = Сделки.ПолучитьСобытияСделки(Ссылка).Преобразовать(СобытиеСсылка -> СобытиеСсылка.ЗагрузитьОбъект()!) + События.ПересчитатьРазрешенияДоступаДляОбъектов(СобытияСделки) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/СделкиHttpСервис.xbsl b/Koncept/Testovoe/Пресейл/СделкиHttpСервис.xbsl new file mode 100644 index 0000000..999f478 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиHttpСервис.xbsl @@ -0,0 +1,98 @@ +// Метод будет вызван для GET-запроса вида {Адрес приложения}/api/deals?stage={Стадия1}&stage={Стадия2} +метод ПолучитьСделки(Запрос: HttpСервисЗапрос) + знч Стадии = Запрос.Параметры.ПолучитьВсе("stage") + + Запрос.Ответ.Заголовки.Установить("Content-Type", "application/json") + + исп ПотокЗаписиТела = Запрос.Ответ.ОткрытьПотокЗаписиТела() + ЗаписатьДанныеСделокВПоток(ПотокЗаписиТела, Стадии) +; + +// Метод будет вызван для GET-запроса вида {Адрес приложения}/api/deals/{deal} +метод ПолучитьСделку(Запрос: HttpСервисЗапрос) + знч КодСделки = Запрос.Параметры.ПолучитьПервый("deal") + + если КодСделки != Неопределено + знч ДанныеСделки = ПолучитьДанныеСделки(КодСделки) + если ДанныеСделки != Неопределено + знч ТелоОтвета = СериализацияJson.ЗаписатьОбъект(ДанныеСделки) + + Запрос.Ответ.Заголовки.Установить("Content-Type", "application/json") + Запрос.Ответ.УстановитьТело(ТелоОтвета) + возврат + ; + ; + + Запрос.Ответ.УстановитьКодСтатуса(404) + Запрос.Ответ.УстановитьТело("Сделка не найдена") +; + +метод ЗаписатьДанныеСделокВПоток(ПотокЗаписи: ПотокЗаписи, Стадии: ЧитаемыйМассив<Строка>) + знч Запрос = Запрос{ + ВЫБРАТЬ + Сделки.Код КАК Код, + Сделки.ДатаСоздания КАК ДатаСоздания, + Сделки.Клиент КАК Клиент, + Сделки.Наименование КАК Наименование, + Сделки.Стадия КАК Стадия, + Сделки.СуммаВВалютеСделки КАК Сумма, + Сделки.ВалютаСделки.Код КАК Валюта + ИЗ + Сделки КАК Сделки + ГДЕ + Сделки.Стадия.Наименование В (%Стадии) ИЛИ %{Стадии.Пусто()} + } + + ПотокЗаписи.Записать("[") + + пер Первый = Истина + для СтрокаРезультата из Запрос.Выполнить() + если не Первый + ПотокЗаписи.Записать(",\n") + ; + Первый = Ложь + + знч СделкаСоответствие: Соответствие<Строка, Объект?> = { + "Код" : СтрокаРезультата.Код, + "ДатаСоздания" : СтрокаРезультата.ДатаСоздания, + "Клиент" : СтрокаРезультата.Клиент.Представление(), + "Наименование" : СтрокаРезультата.Наименование, + "Стадия" : СтрокаРезультата.Стадия.Представление(), + "Сумма" : СтрокаРезультата.Сумма, + "Валюта" : СтрокаРезультата.Валюта + } + + ПотокЗаписи.Записать(СериализацияJson.ЗаписатьОбъект(СделкаСоответствие)) + ; + + ПотокЗаписи.Записать("]") +; + +метод ПолучитьДанныеСделки(КодСделки: Строка): ЧитаемоеСоответствие<Строка, Объект?>? + знч Запрос = Запрос{ + ВЫБРАТЬ + Сделки.Код КАК Код, + Сделки.ДатаСоздания КАК ДатаСоздания, + Сделки.Клиент КАК Клиент, + Сделки.Наименование КАК Наименование, + Сделки.Стадия КАК Стадия, + Сделки.СуммаВВалютеСделки КАК Сумма, + Сделки.ВалютаСделки.Код КАК Валюта + ИЗ + Сделки КАК Сделки + ГДЕ + Сделки.Код == %КодСделки + } + + возврат Запрос.Выполнить().Преобразовать(СтрокаРезультата -> + { + "Код" : СтрокаРезультата.Код, + "ДатаСоздания" : СтрокаРезультата.ДатаСоздания, + "Клиент" : СтрокаРезультата.Клиент.Представление(), + "Наименование" : СтрокаРезультата.Наименование, + "Стадия" : СтрокаРезультата.Стадия.Представление(), + "Сумма" : СтрокаРезультата.Сумма, + "Валюта" : СтрокаРезультата.Валюта + } + ).ЕдинственныйИлиУмолчание() +; diff --git a/Koncept/Testovoe/Пресейл/СделкиHttpСервис.yaml b/Koncept/Testovoe/Пресейл/СделкиHttpСервис.yaml new file mode 100644 index 0000000..1d015c0 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиHttpСервис.yaml @@ -0,0 +1,24 @@ +ВидЭлемента: HttpСервис +Ид: a565661f-f458-465b-8f71-1f90cd490890 +Имя: СделкиHttpСервис +ОбластьВидимости: ВПодсистеме +КонтрольДоступа: + Разрешения: + Вызов: РазрешеноАутентифицированным + ПоУмолчанию: РазрешеноАутентифицированным +КорневойUrl: /deals +ШаблоныUrl: + - + Имя: ПолучитьСделки + Шаблон: / + Методы: + - + Метод: GET + Обработчик: ПолучитьСделки + - + Имя: ПолучитьСделку + Шаблон: /{deal} + Методы: + - + Метод: GET + Обработчик: ПолучитьСделку diff --git a/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.xbsl b/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.xbsl new file mode 100644 index 0000000..6b81218 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.xbsl @@ -0,0 +1,366 @@ +импорт Основное +импорт Мероприятия + +@НаСервере +конст КЛЮЧ_ОБЪЕКТА_НАСТРОЕК = "ФормаСделки" + +@НаСервере +конст КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ = "ОбучениеСозданияСделки" + +@Обработчик +метод ПослеЧтения() + если не ЭтоНовый() + ЕстьЗадачиПоСделке = Сделки.ЕстьЗадачиПоСделке(Объект.Ссылка) + ЕстьСобытияПоСделке = Сделки.ЕстьСобытияПоСделке(Объект.Ссылка) + ; + ЗаписанаЗадача.ПодключитьОбработчик(&ОбновитьСписокЗадач) + ЗаписаноСобытие.ПодключитьОбработчик(&ОбновитьСписокСобытий) +; + +@Обработчик +метод ПослеСоздания() + // Запустим обучение созданию сделки, если пользователь ещё не прошёл его + если ЭтоНовый() и не ОбучениеСозданиюСделкиПройдено() + ЗапуститьОбучающиеПодсказки(ОбучающиеПодсказки) + УстановитьОтметкуОПройденномОбучении() + ; +; + +метод КлиентПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + если Объект.Клиент != Неопределено + КлиентыФормаОбъекта.ОткрытьВМодальномОкне(КлючОбъекта = Объект.Клиент) + ; +; + +метод КонтактноеЛицоПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + если Объект.КонтактноеЛицо != Неопределено + КонтактныеЛицаФормаОбъекта.ОткрытьВМодальномОкне(КлючОбъекта = Объект.КонтактноеЛицо) + ; +; + +метод СписокУслугКоличествоПриИзменении(Источник: ПолеВвода<Объект?>, Событие: СобытиеПриИзменении<Объект?>, ДанныеСтроки: Сделки.Услуги) + ДанныеСтроки.Сумма = ДанныеСтроки.Количество * ДанныеСтроки.Цена +; + +метод СписокУслугЦенаПриИзменении(Источник: ПолеВвода<Объект?>, Событие: СобытиеПриИзменении<Объект?>, ДанныеСтроки: Сделки.Услуги) + ДанныеСтроки.Сумма = ДанныеСтроки.Количество * ДанныеСтроки.Цена +; + +@Обработчик +метод ПередЗаписьюОбъекта() + ПроверитьЗаполнениеПолей() + ПоказыватьУведомление = ЭтоНовый() +; + +метод ПроверитьЗаполнениеПолей() + пер ПоляНеЗаполнены: Булево + если Объект.Клиент == Неопределено + Компоненты.ПолеВводаКлиент.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаКлиент.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Направление == Неопределено + Компоненты.ПолеВводаНаправление.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаНаправление.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Наименование.Пусто() + Компоненты.ПолеВводаСодержание.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаСодержание.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.Стадия == Неопределено + Компоненты.ПолеВводаСтадия.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаСтадия.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если Объект.ВалютаСделки == Неопределено + Компоненты.ПолеВводаВалюта.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + ПоляНеЗаполнены = Истина + иначе + Компоненты.ПолеВводаВалюта.РезультатПроверкиДанных = РезультатПроверкиДанных.Отсутствует + ; + если ПоляНеЗаполнены + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; + +метод СоздатьКлиентаПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + знч Клиент = КлиентыФормаОбъекта.ОткрытьВМодальномОкне() + если Клиент != Неопределено + Объект.Клиент = Клиент + ; +; + +метод СоздатьКонтактноеЛицоПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + знч КонтактноеЛицо = КонтактныеЛицаФормаОбъекта.ОткрытьВМодальномОкне(Клиент = Объект.Клиент) + если КонтактноеЛицо != Неопределено + Объект.КонтактноеЛицо = КонтактноеЛицо + ; +; + +@Обработчик +метод ПослеЗаписиОбъекта() + если ПоказыватьУведомление + знч УведомлениеОСделке = новый Уведомление( + ЛокализованныеСтроки.НоваяСделка(), + ЛокализованныеСтроки.УведомлениеОСозданииСделки(Объект.Код) + ) + + УведомлениеОСделке.ОценкаИнформации = ОценкаИнформации.Положительная + УведомлениеОСделке.Показать() + ; + + ЗаписанаСделка.Оповестить(КлючОбъекта) +; + +@Обработчик +метод ПослеУдаленияОбъекта(ПараметрыУдаления: Объект) + ЗаписанаСделка.Оповестить() +; + +метод ПолучитьОписаниеСтрокиСпискаМероприятий(ДанныеСтроки: СтрокаДинамическогоСписка): Строка + возврат ПолучитьЗаголовокДатыМероприятия(ДанныеСтроки.Данные["ДатаНачала"] как Момент, ДанныеСтроки.Данные["ДатаЗавершения"] как Момент) +; + +метод ПолучитьИконкуМероприятия(ДанныеСтроки: СтрокаДинамическогоСписка): ДвоичныйОбъект.Ссылка + знч Мероприятие = ДанныеСтроки.Данные["Ссылка"] + если Мероприятие это Задачи.Ссылка + возврат Ресурс{ЗадачаВРамке.svg}.Ссылка + иначе + возврат Ресурс{СобытиеВРамке.svg}.Ссылка + ; +; + +метод СоздатьЗадачуПриНажатии(Команда: ОбычнаяКоманда) + ЗадачиФормаОбъекта.ОткрытьВМодальномОкне(Сделка = КлючОбъекта) +; + +метод СоздатьЗадачуПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + ЗадачиФормаОбъекта.ОткрытьВМодальномОкне(Сделка = КлючОбъекта) +; + +метод СоздатьСобытиеПриНажатии(Команда: ОбычнаяКоманда) + СобытияФормаОбъекта.ОткрытьВМодальномОкне(Сделка = КлючОбъекта) +; + +метод СоздатьСобытиеПриНажатии(Источник: Кнопка, Событие: СобытиеПриНажатии) + СобытияФормаОбъекта.ОткрытьВМодальномОкне(Сделка = КлючОбъекта) +; + +метод ПолучитьИконкуВыбраннойСтадии(): ДвоичныйОбъект.Ссылка? + знч Стадия = Объект.Стадия + если Стадия != Неопределено + возврат ПолучитьИконкуСтадии(Стадия) + ; + возврат Неопределено +; + +метод ПриВыбореФайлаДоговора(Источник: ВыборФайлов, Событие: СобытиеПриИзменении<ЧитаемыйМассив<ВыбранныйФайл>>) + знч Файл = Событие.НовоеЗначение[0] + Объект.ФайлДоговора = ЗагрузкаФайлов.НачатьЗагрузку(Файл).ПолучитьРезультат() + Объект.ИмяФайлаДоговора = Файл.Имя +; + +метод УдалитьФайлДоговораПриНажатии(Источник: Картинка, Событие: СобытиеПриНажатии) + Объект.ФайлДоговора = Неопределено + Объект.ИмяФайлаДоговора = "" +; + +метод ИмяФайлаДоговораПриНажатии(Источник: Надпись, Событие: СобытиеПриНажатии) + ВыгрузкаФайлов.НачатьВыгрузку(Объект.ФайлДоговора, Объект.ИмяФайлаДоговора) +; + +метод ПолучитьЗаголовокДатыМероприятия(ДатаНачала: Момент, ДатаЗавершения: Момент): Строка + знч ДатаВремяНачала = ДатаНачала.ВДатаВремя(ЧасовойПояс.Текущий()) + знч ДатаВремяЗавершения = ДатаЗавершения.ВДатаВремя(ЧасовойПояс.Текущий()) + + // Даты начала и завершения установлены + если ДатаНачала != Момент{} и ДатаЗавершения != Момент{} + + // Мероприятие начинается и завершается в один день + если ДатаВремяНачала.Дата == ДатаВремяЗавершения.Дата + возврат "%{ПредставлениеДаты(ДатаВремяНачала)} ${ДатаВремяНачала|ЧЧ:мм} – ${ДатаВремяЗавершения|ЧЧ:мм}" + + // Мероприятие начинается и завершается в разные дни + иначе + возврат "%{ПредставлениеДатыИВремени(ДатаВремяНачала)} – %{ПредставлениеДатыИВремени(ДатаВремяЗавершения)}" + ; + + // Установлена только дата начала + иначе если ДатаНачала != Момент{} + возврат "%{ПредставлениеДатыИВремени(ДатаВремяНачала)}" + + // Установлена только дата завершения + иначе если ДатаЗавершения != Момент{} + возврат "%{ПредставлениеДатыИВремени(ДатаВремяЗавершения)}" + ; + + возврат "Дата не установлена" +; + +метод ПредставлениеДаты(ДатаМероприятия: ДатаВремя): Строка + знч Сейчас = ДатаВремя.Сейчас() + + если ДатаМероприятия.Дата == Сейчас.Дата + возврат ЛокализованныеСтроки.Сегодня() + иначе + если ДатаМероприятия.Год == Сейчас.Год + возврат "${ДатаМероприятия|дд МММ}" + иначе + возврат "${ДатаМероприятия|дд МММ гггг}" + ; + ; +; + +метод ПредставлениеДатыИВремени(ДатаМероприятия: ДатаВремя): Строка + знч Сейчас = ДатаВремя.Сейчас() + + если ДатаМероприятия.Дата == Сейчас.Дата + возврат "%{ЛокализованныеСтроки.Сегодня()} ${ДатаМероприятия|ЧЧ:мм}" + иначе + если ДатаМероприятия.Год == Сейчас.Год + возврат "${ДатаМероприятия|дд МММ ЧЧ:мм}" + иначе + возврат "${ДатаМероприятия|дд МММ гггг ЧЧ:мм}" + ; + ; +; + +метод ЗавершитьЗадачуПриНажатии(Команда: КомандаСПараметром<Сущность.Ключ>, Параметр: Сущность.Ключ) + знч Задача = Параметр как Задачи.Ссылка + ЗавершитьЗадачу(Задача) + + ОбновитьСписокЗадач() + + знч Уведомление = новый Уведомление(ЛокализованныеСтроки.ЗавершениеМероприятия(), ЛокализованныеСтроки.МероприятиеЗавершено(Задача)) + Уведомление.ОценкаИнформации = ОценкаИнформации.Положительная + Уведомление.Показать() +; + +метод УдалитьЗадачуПриНажатии(Команда: КомандаСПараметром<Сущность.Ключ>, Параметр: Сущность.Ключ) + знч Задача = Параметр как Задачи.Ссылка + + знч Ответ = Диалог.Вопрос( + ЛокализованныеСтроки.ПодтвеждениеУдаленияЗадачи(Задача), + [КнопкаДиалога.Ок, КнопкаДиалога.Отмена], + ЛокализованныеСтроки.УдалениеМероприятия() + ) + + если Ответ == КнопкаДиалога.Ок + УдалитьЗадачу(Параметр как Задачи.Ссылка) + ОбновитьСписокЗадач() + ; +; + +метод УдалитьСобытиеПриНажатии(Команда: КомандаСПараметром<Сущность.Ключ>, Параметр: Сущность.Ключ) + знч Событие = Параметр как События.Ссылка + + знч Ответ = Диалог.Вопрос( + ЛокализованныеСтроки.ПодтвеждениеУдаленияСобытия(Событие), + [КнопкаДиалога.Ок, КнопкаДиалога.Отмена], + ЛокализованныеСтроки.УдалениеМероприятия() + ) + + если Ответ == КнопкаДиалога.Ок + УдалитьСобытие(Параметр как События.Ссылка) + ОбновитьСписокСобытий() + ; +; + +метод ОбновитьСписокЗадач() + ЕстьЗадачиПоСделке = Сделки.ЕстьЗадачиПоСделке(Объект.Ссылка) + + если ЕстьЗадачиПоСделке + Компоненты.СписокЗадач.Обновить() + ; +; + +метод ОбновитьСписокСобытий() + ЕстьСобытияПоСделке = Сделки.ЕстьСобытияПоСделке(Объект.Ссылка) + + если ЕстьСобытияПоСделке + Компоненты.СписокСобытий.Обновить() + ; +; + +@НаСервере @ДоступноСКлиента +статический метод ПолучитьИконкуСтадии(Стадия: СтадииСделок.Ссылка): ДвоичныйОбъект.Ссылка? + возврат СтадииСделок.ПолучитьИконкуСтадии(Стадия) +; + +@НаСервере @ДоступноСКлиента +статический метод ЗавершитьЗадачу(Задача: Задачи.Ссылка) + исп Транзакции.Начать() + знч ЗадачаОбъект = Задача.ЗагрузитьОбъект(Истина) + ЗадачаОбъект.Завершить() +; + +@НаСервере @ДоступноСКлиента +статический метод УдалитьЗадачу(Задача: Задачи.Ссылка) + исп Транзакции.Начать() + знч ЗадачаОбъект = Задача.ЗагрузитьОбъект(Истина) + ЗадачаОбъект.Удалить() +; + +@НаСервере @ДоступноСКлиента +статический метод УдалитьСобытие(Событие: События.Ссылка) + исп Транзакции.Начать() + знч СобытиеОбъект = Событие.ЗагрузитьОбъект(Истина) + СобытиеОбъект.Удалить() +; + +@НаСервере @ДоступноСКлиента +статический метод УстановитьОтметкуОПройденномОбучении() + попытка + знч Настройка = СтандартноеХранилищеНастроек.НайтиПоКлючам( + КлючОбъекта = КЛЮЧ_ОБЪЕКТА_НАСТРОЕК, + КлючНастройки = КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ + ) + + + если Настройка == Неопределено + знч НоваяНастройка = новый СтандартноеХранилищеНастроек.Объект( + КлючОбъекта = КЛЮЧ_ОБЪЕКТА_НАСТРОЕК, + КлючНастройки = КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ, + Значение = "Истина" + ) + + НоваяНастройка.Записать() + ; + + поймать Исключение: ИсключениеПоискаСущности + новый ОшибкаНастроекПользователя( + КлючОбъекта = КЛЮЧ_ОБЪЕКТА_НАСТРОЕК, + КлючНастройки = КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ, + Важность = ВажностьСобытияЖурналаСобытий.Высокая, + Информация = Исключение.Информация() + ).Записать() + ; +; + +@НаСервере @ДоступноСКлиента +статический метод ОбучениеСозданиюСделкиПройдено(): Булево + попытка + знч Настройка = СтандартноеХранилищеНастроек.НайтиПоКлючам( + КлючОбъекта = КЛЮЧ_ОБЪЕКТА_НАСТРОЕК, + КлючНастройки = КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ + ) + + возврат Настройка != Неопределено + + поймать Исключение: ИсключениеПоискаСущности + новый ОшибкаНастроекПользователя( + КлючОбъекта = КЛЮЧ_ОБЪЕКТА_НАСТРОЕК, + КлючНастройки = КЛЮЧ_НАСТРОЙКИ_ПРОЙДЕННОГО_ОБУЧЕНИЯ, + Важность = ВажностьСобытияЖурналаСобытий.Высокая, + Информация = Исключение.Информация() + ).Записать() + ; + + возврат Истина +; diff --git a/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.yaml b/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.yaml new file mode 100644 index 0000000..05cecd0 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиФормаОбъекта.yaml @@ -0,0 +1,520 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 63ddc157-05cd-4187-8d86-546634e011d6 +Имя: СделкиФормаОбъекта +ОбластьВидимости: ВПроекте +Импорт: + - Мероприятия + - Основное + - Общие + - Общие::КурсыВалют +Свойства: + - + Имя: ОбучающиеПодсказки + Тип: ПоследовательностьОбучающихПодсказок + ЗначениеПоУмолчанию: + Элементы: + - + ОпорныйЭлемент: =Компоненты.ПолеВводаКлиент + Заголовок: Приветствую! + Описание: Позвольте помочь вам создать новую сделку! Сделка отражает процесс оказания услуги клиенту нашей компании на каждой стадии этого процесса. Для начала нужно выбрать клиента. + Изображение: ОбучающиеПодсказки/Приветствие.png + - + ОпорныйЭлемент: =Компоненты.ПолеВводаНаправление + Заголовок: Выбор направления + Описание: Сделка может относиться к одному из нескольких направлений, по которым наша компания предоставляет услуги. + - + ОпорныйЭлемент: =Компоненты.ПолеВводаСодержание + Заголовок: Описание сделки + Описание: Пожалуйста, опишите в этом поле содержание новой сделки. + - + ОпорныйЭлемент: =Компоненты.ПолеВводаСтадия + Заголовок: Указание стадии сделки + Описание: Каждая сделка находится в одной из стадий, которая определяет этап её заключения. + - + Имя: ЕстьЗадачиПоСделке + Тип: Булево + - + Имя: ЕстьСобытияПоСделке + Тип: Булево + - + Имя: ПоказыватьУведомление + Тип: Булево + ЗначениеПоУмолчанию: Истина +Наследует: + Тип: ФормаОбъекта<Сделки.Объект> + Заголовок: $ЛокализованныеСтроки.Сделка + РастягиватьПоВертикали: Истина + ОсновнаяКоманда: =ЗаписатьИЗакрыть + ОбычныеКоманды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Записать + - =Удалить + Содержимое: + Тип: ШаблонФормыСРазделами + ОсновнойРаздел: + Тип: ОбластьРазделаФормы + Заголовок: Основное + ШиринаВКолонках: Одинарная + Содержимое: + - + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Отсутствует + Содержимое: + - + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + Содержимое: + - + Тип: ПолеВвода<Клиенты.Ссылка?> + Имя: ПолеВводаКлиент + Заголовок: $ЛокализованныеСтроки.Клиент + Значение: =Объект.Клиент + РастягиватьПоГоризонтали: Истина + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: Кнопка + Доступность: =Объект.Клиент != Неопределено + Подсказка: $ЛокализованныеСтроки.Открыть + Вид: ИконкаДействия + ВыравниваниеВГруппеПоВертикали: Низ + ВыравниваниеВГруппеПоГоризонтали: Конец + Изображение: ОткрытьСсылку.svg + ПриНажатии: КлиентПриНажатии + - + Тип: Кнопка + Заголовок: $ЛокализованныеСтроки.СоздатьКлиента + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Начало + Изображение: Плюс.svg + ПриНажатии: СоздатьКлиентаПриНажатии + - + Тип: ФиксированнаяГруппа + ИнтервалМеждуЭлементамиПоВертикали: Отсутствует + Содержимое: + - + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + Содержимое: + - + Тип: ПолеВвода<КонтактныеЛица.Ссылка?> + Имя: ПолеВводаКонтактноеЛицо + Заголовок: $ЛокализованныеСтроки.КонтактноеЛицо + Значение: =Объект.КонтактноеЛицо + НастройкиВводаСсылок: + НастройкиПоТипу: + - + Ключ: КонтактныеЛица.Ссылка + Значение: + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Владелец + ВидСравнения: Равно + Значение: =Объект.Клиент + РастягиватьПоГоризонтали: Истина + - + Тип: Кнопка + Доступность: =Объект.КонтактноеЛицо != Неопределено + Подсказка: $ЛокализованныеСтроки.Открыть + Вид: ИконкаДействия + ВыравниваниеВГруппеПоВертикали: Низ + ВыравниваниеВГруппеПоГоризонтали: Конец + Изображение: ОткрытьСсылку.svg + ПриНажатии: КонтактноеЛицоПриНажатии + - + Тип: Кнопка + Заголовок: $ЛокализованныеСтроки.СоздатьКонтактноеЛицо + Доступность: =Объект.Клиент != Неопределено + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Начало + Изображение: Плюс.svg + ПриНажатии: СоздатьКонтактноеЛицоПриНажатии + - + Тип: ПолеВвода<Направления.Ссылка?> + Имя: ПолеВводаНаправление + Заголовок: $ЛокализованныеСтроки.Направление + Значение: =Объект.Направление + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаСодержание + Заголовок: $ЛокализованныеСтроки.Содержание + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<СтадииСделок.Ссылка?> + Имя: ПолеВводаСтадия + Заголовок: $ЛокализованныеСтроки.Стадия + Значение: =Объект.Стадия + Изображение: =ПолучитьИконкуВыбраннойСтадии() + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Валюты.Ссылка?> + Имя: ПолеВводаВалюта + Заголовок: $Общие::ЛокализованныеСтроки.Валюта + Значение: =Объект.ВалютаСделки + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<Число> + Имя: ПолеВводаСумма + Заголовок: $ЛокализованныеСтроки.Сумма + Значение: =Объект.СуммаВВалютеСделки + ДополнительныеРазделы: + - + Тип: ОбластьРазделаФормы + Заголовок: Содержание + ШиринаВКолонках: Двойная + Содержимое: + - + Тип: СворачиваемыйКомпонент + Заголовок: Услуги + ШиринаВКолонках: Четверная + РастягиватьПоГоризонтали: Истина + Содержимое: + Тип: Таблица<ИсточникДанныхМассив<Сделки.Услуги>> + Имя: СписокУслуг + Источник: + Данные: =Объект.Услуги + ШиринаВКолонках: Четверная + РастягиватьПоВертикали: Ложь + ОтображаемоеКоличествоКомандСтроки: 2 + ОтображатьНастройки: Истина + ОтображатьНумерациюСтрок: Ложь + КомандыСтроки: + Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сделки.Услуги>>|КомандаСПараметром<Сделки.Услуги>> + Элементы: + - =Компоненты.СписокУслуг.Удалить + Команды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - =Компоненты.СписокУслуг.ДобавитьСтроку + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<Сделки.Услуги> + ПолеЗначения: Услуга + НастройкиРедактирования: + Тип: НастройкиРедактированияПоляВвода + НастройкиВводаСсылок: + НастройкиПоТипу: + - + Ключ: Услуги.Ссылка + Значение: + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Владелец + ВидСравнения: Равно + Значение: =Объект.Направление + - + Тип: СтандартнаяКолонкаТаблицы<Сделки.Услуги> + ПолеЗначения: Количество + НастройкиРедактирования: + Тип: НастройкиРедактированияПоляВвода + ПриИзменении: СписокУслугКоличествоПриИзменении + - + Тип: СтандартнаяКолонкаТаблицы<Сделки.Услуги> + ПолеЗначения: Цена + НастройкиРедактирования: + Тип: НастройкиРедактированияПоляВвода + ПриИзменении: СписокУслугЦенаПриИзменении + - + Тип: СтандартнаяКолонкаТаблицы<Сделки.Услуги> + ПолеЗначения: Сумма + - + Тип: СворачиваемыйКомпонент + Заголовок: Дополнительно + ШиринаВКолонках: Четверная + РастягиватьПоГоризонтали: Истина + Содержимое: + Тип: АвтоматическаяГруппа + ШиринаВКолонках: Четверная + Содержимое: + - + Тип: АвтоматическаяГруппа + ШиринаВКолонках: Двойная + Содержимое: + - + Тип: ПолеВвода<Сотрудники.Ссылка?> + Заголовок: $ЛокализованныеСтроки.Ответственный + Значение: =Объект.Ответственный + - + Тип: ПолеВвода<Дата> + Имя: ПолеВводаДатаЗакрытия + Заголовок: $ЛокализованныеСтроки.ДатаЗакрытия + Значение: =Объект.ДатаЗакрытия + СправочнаяПодсказка: $ЛокализованныеСтроки.ПредполагаемаяИлиФактическая + - + Тип: ФиксированнаяГруппа + Заголовок: $ЛокализованныеСтроки.Договор + ШиринаВКолонках: Четверная + ШрифтЗаголовка: =СтилевыеШрифты.Обычный + Содержимое: + - + Тип: ВыборФайлов + Имя: ВыборФайлаДоговора + Заголовок: $ЛокализованныеСтроки.ЗаголовокВыбораФайлаДоговора + Видимость: =(Объект.ФайлДоговора == Неопределено) + РастягиватьПоГоризонтали: Истина + МножественныйВыбор: Ложь + ПриИзменении: ПриВыбореФайлаДоговора + - + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Надпись + Значение: =Объект.ИмяФайлаДоговора + ОбрабатыватьНажатие: Истина + ПриНажатии: ИмяФайлаДоговораПриНажатии + - + Тип: Картинка + Видимость: =(Объект.ФайлДоговора != Неопределено) + ОбрабатыватьНажатие: Истина + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Конец + Изображение: МусорнаяКорзинаКонтур.svg + Подсказка: Удалить файл договора + Цвет: =Цвета.Стилевые.ФонВторичный + ПриНажатии: УдалитьФайлДоговораПриНажатии + - + Тип: ОбластьРазделаФормы + Заголовок: Задачи + ШиринаВКолонках: Двойная + Команды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Представление: $Мероприятия::ЛокализованныеСтроки.НоваяЗадача + Изображение: Плюс.svg + Видимость: =ЕстьЗадачиПоСделке + Обработчик: СоздатьЗадачуПриНажатии + Содержимое: + - + Тип: СтандартныйСписок<ДинамическийСписок> + Имя: СписокЗадач + Видимость: =ЕстьЗадачиПоСделке + Источник: + ОсновнаяТаблица: + Таблица: Задачи + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Ссылка + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаНачала + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаЗавершения + - + Тип: ПолеДинамическогоСписка + Выражение: Статус + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Владелец + ВидСравнения: Равно + Значение: =КлючОбъекта + - + Тип: ЭлементФильтра + Поле: Ссылка + ВидСравнения: Равно + Использовать: Ложь + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + РастягиватьПоГоризонтали: Истина + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + КомандыСтроки: + Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сущность.Ключ>>|КомандаСПараметром<Сущность.Ключ>> + Элементы: + - + Тип: КомандаСПараметром<Сущность.Ключ> + Представление: $Мероприятия::ЛокализованныеСтроки.Завершить + Изображение: Задачи.svg + Обработчик: ЗавершитьЗадачуПриНажатии + Доступность: =ДанныеСтроки.Данные["Статус"] != СтатусМероприятия.Завершено + - + Тип: КомандаСПараметром<Сущность.Ключ> + Представление: $Мероприятия::ЛокализованныеСтроки.Удалить + Изображение: МусорнаяКорзина.svg + Обработчик: УдалитьЗадачуПриНажатии + ОписаниеСтроки: =ПолучитьОписаниеСтрокиСпискаМероприятий(ДанныеСтроки) + ЗначениеСтроки: =ДанныеСтроки.Данные["Наименование"] + ДополнительноеЗначениеСтроки: =(ДанныеСтроки.Данные["Статус"] как СтатусМероприятия).Представление() + ОписаниеЗначкаДополнительногоЗначенияСтроки: + Тип: ОписаниеЗначка + Цвет: =(ДанныеСтроки.Данные["Статус"] как СтатусМероприятия).ПолучитьЦвет() + ИзображениеСтроки: =ПолучитьИконкуМероприятия(ДанныеСтроки) + - + Тип: ФиксированнаяГруппа + Видимость: =не ЕстьЗадачиПоСделке + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Картинка + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Изображение: ПустойСписокМероприятий.svg + - + Тип: Надпись + Видимость: =ЭтоНовый() + Значение: ="Для создания задач сохраните сделку" + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Важность: Низкая + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: ФиксированнаяГруппа + Видимость: =не ЭтоНовый() + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + ИнтервалМеждуЭлементамиПоВертикали: Половинный + Содержимое: + - + Тип: Надпись + Значение: ="Нет задач по сделке" + ВыравниваниеВГруппеПоГоризонтали: Центр + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: Кнопка + Заголовок: Добавить задачу + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Центр + ПриНажатии: СоздатьЗадачуПриНажатии + - + Тип: ОбластьРазделаФормы + Заголовок: События + ШиринаВКолонках: Двойная + Команды: + Тип: ФрагментКомандногоИнтерфейса<Команда> + Элементы: + - + Тип: ОбычнаяКоманда + Представление: $Мероприятия::ЛокализованныеСтроки.НовоеСобытие + Изображение: Плюс.svg + Видимость: =ЕстьСобытияПоСделке + Обработчик: СоздатьСобытиеПриНажатии + Содержимое: + - + Тип: СтандартныйСписок<ДинамическийСписок> + Имя: СписокСобытий + Видимость: =ЕстьСобытияПоСделке + Источник: + ОсновнаяТаблица: + Таблица: События + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Ссылка + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаНачала + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаЗавершения + Фильтр: + Элементы: + - + Тип: ЭлементФильтра + Поле: Владелец + ВидСравнения: Равно + Значение: =КлючОбъекта + - + Тип: ЭлементФильтра + Поле: Ссылка + ВидСравнения: Равно + Использовать: Ложь + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + РастягиватьПоГоризонтали: Истина + ИспользованиеПоиска: Ложь + Навигация: ПодгрузкаПриПрокрутке + КомандыСтроки: + Тип: ФрагментКомандногоИнтерфейса<КомандаСПараметром<Массив<Сущность.Ключ>>|КомандаСПараметром<Сущность.Ключ>> + Элементы: + - + Тип: КомандаСПараметром<Сущность.Ключ> + Представление: $Мероприятия::ЛокализованныеСтроки.Удалить + Изображение: МусорнаяКорзина.svg + Обработчик: УдалитьСобытиеПриНажатии + ОписаниеСтроки: =ПолучитьОписаниеСтрокиСпискаМероприятий(ДанныеСтроки) + ЗначениеСтроки: =ДанныеСтроки.Данные["Наименование"] + ИзображениеСтроки: =ПолучитьИконкуМероприятия(ДанныеСтроки) + - + Тип: ФиксированнаяГруппа + Видимость: =не ЕстьСобытияПоСделке + РастягиватьПоВертикали: Истина + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Картинка + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Изображение: ПустойСписокМероприятий.svg + - + Тип: Надпись + Видимость: =ЭтоНовый() + Значение: ="Для создания событий сохраните сделку" + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + Важность: Низкая + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: ФиксированнаяГруппа + Видимость: =не ЭтоНовый() + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Центр + ИнтервалМеждуЭлементамиПоВертикали: Половинный + Содержимое: + - + Тип: Надпись + Значение: ="Нет событий по сделке" + ВыравниваниеВГруппеПоГоризонтали: Центр + Шрифт: =СтилевыеШрифты.Крупный + - + Тип: Кнопка + Заголовок: Добавить событие + Вид: Дополнительная + ВыравниваниеВГруппеПоГоризонтали: Центр + ПриНажатии: СоздатьСобытиеПриНажатии diff --git a/Koncept/Testovoe/Пресейл/СделкиФормаСписка.xbsl b/Koncept/Testovoe/Пресейл/СделкиФормаСписка.xbsl new file mode 100644 index 0000000..fb133fd --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиФормаСписка.xbsl @@ -0,0 +1,19 @@ +метод ПриЧтенииНастроекТаблицы(Источник: Таблица<ДинамическийСписок>, Событие: СобытиеСДанными<Массив<СохраненнаяНастройкаТаблицы>>) + знч НастройкаОткрытыеСделки = новый СохраненнаяНастройкаТаблицы("Активные сделки") + + НастройкаОткрытыеСделки.Фильтр.Элементы.Добавить( + новый ЭлементФильтра( + Поле = "Стадия.Вид", + ВидСравнения = ВидСравнения.Равно, + Значение = ВидСтадииСделки.Активна, + Использовать = Истина + ) + ) + + НастройкаОткрытыеСделки.Сортировка.Добавить(новый ЭлементСортировки( + Поле = "ДатаСоздания", + НаправлениеСортировки = НаправлениеСортировки.ПоУбыванию + )) + + Событие.Данные.Добавить(НастройкаОткрытыеСделки) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/СделкиФормаСписка.yaml b/Koncept/Testovoe/Пресейл/СделкиФормаСписка.yaml new file mode 100644 index 0000000..4c3962a --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СделкиФормаСписка.yaml @@ -0,0 +1,116 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 736f6bff-cbc8-4d3b-b21e-70c8b321f8c3 +Имя: СделкиФормаСписка +ОбластьВидимости: ВПроекте +Импорт: + - Общие +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: Сделки + Псевдоним: Сделки + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: ДатаСоздания + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Клиент + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Направление + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Ответственный + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Стадия + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Стадия.Вид + Псевдоним: ВидСтадии + ОтображатьВНастройкахФильтров: Истина + ОтображатьВПростыхФильтрах: Истина + - + Тип: ПолеДинамическогоСписка + Выражение: Стадия.Иконка + Псевдоним: Стадия_Иконка + - + Тип: ПолеДинамическогоСписка + Выражение: СуммаВВалютеСделки + - + Тип: ПолеДинамическогоСписка + Выражение: ВалютаСделки + Сортировка: + - + Поле: ДатаСоздания + НаправлениеСортировки: ПоУбыванию + ПрокруткаПоВертикали: Истина + ОтображатьНастройки: Истина + Навигация: ПодгрузкаПриПрокрутке + ПриЧтенииНастроекТаблицы: ПриЧтенииНастроекТаблицы + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.ДатаСоздания + ПолеЗначения: ДатаСоздания + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Клиент + ПолеЗначения: Клиент + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Содержание + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Направление + ПолеЗначения: Направление + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Ответственный + ПолеЗначения: Ответственный + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Стадия + ПолеЗначения: Стадия_Иконка + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Сумма + ПолеЗначения: СуммаВВалютеСделки + ВыравниваниеВГруппеПоГоризонтали: Конец + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $Общие::ЛокализованныеСтроки.Валюта + ПолеЗначения: ВалютаСделки + ОбрабатыватьНажатие: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код diff --git a/Koncept/Testovoe/Пресейл/СтадииСделок.xbsl b/Koncept/Testovoe/Пресейл/СтадииСделок.xbsl new file mode 100644 index 0000000..c8ca748 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СтадииСделок.xbsl @@ -0,0 +1,53 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Чтение]) + ] +; + +@ВПроекте +метод ПолучитьНачальнуюСтадию(): СтадииСделок.Ссылка? + знч Запрос = Запрос{ + ВЫБРАТЬ ПЕРВЫЕ 1 + Ссылка КАК Стадия + ИЗ + СтадииСделок + УПОРЯДОЧИТЬ ПО + Порядок + } + + возврат Запрос.Выполнить().ЕдинственныйИлиУмолчание()?.Стадия +; + +@ВПроекте +метод ПолучитьСтадииСделок(): ЧитаемыйМассив<СтадииСделок.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка КАК Стадия + ИЗ + СтадииСделок + УПОРЯДОЧИТЬ ПО + Порядок + } + + возврат Запрос.Выполнить().Преобразовать(СтрокаРезультата -> СтрокаРезультата.Стадия) +; + +@ВПроекте +метод ПолучитьИконкуСтадии(Стадия: СтадииСделок.Ссылка?): ДвоичныйОбъект.Ссылка? + знч Запрос = Запрос{ + ВЫБРАТЬ + Иконка + ИЗ + СтадииСделок + Где + Ссылка == %Стадия + } + + возврат Запрос.Выполнить().Единственный().Иконка +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/СтадииСделок.yaml b/Koncept/Testovoe/Пресейл/СтадииСделок.yaml new file mode 100644 index 0000000..c7e8c95 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СтадииСделок.yaml @@ -0,0 +1,36 @@ +ВидЭлемента: Справочник +Ид: 79b1136f-dd27-45e2-ac22-b4a11f217f51 +Имя: СтадииСделок +ОбластьВидимости: ВПроекте +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляются +Интерфейс: + Список: + Представление: $ЛокализованныеСтроки.СтадииСделок + Форма: СтадииСделокФормаСписка + Объект: + Форма: СтадииСделокФормаОбъекта +Представление: Наименование +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Наименование + Длина: 100 + НезаполненноеЗначение: ЗапретитьВсегда + - + Ид: e08ee261-2ec3-41ac-a856-d324573c6ece + Имя: Вид + Тип: ВидСтадииСделки + - + Ид: eaeccb47-0717-45a5-81ce-696bc6ea115e + Имя: Порядок + Тип: Число + - + Ид: e731715a-71b9-4950-9973-c9771c489e4a + Имя: Иконка + Тип: ДвоичныйОбъект.Ссылка? + - + Ид: 6cbcfe48-cd5c-4688-bead-2c5775286c40 + Имя: ИмяФайлаИконки + Тип: Строка diff --git a/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.xbsl b/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.xbsl new file mode 100644 index 0000000..aad256b --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.xbsl @@ -0,0 +1,22 @@ +@Обработчик +метод ПередЗаписьюОбъекта() + если Объект.Наименование.Сократить().Пусто() + Компоненты.ПолеВводаНаименование.РезультатПроверкиДанных = РезультатПроверкиДанных.Ошибка + выбросить новый ИсключениеВалидации("Не заполнены обязательные поля", ОтображатьСообщениеОбОшибке = Ложь) + ; +; + +метод ВыборИконкиПриИзменении(Источник: ВыборФайлов, Событие: СобытиеПриИзменении<ЧитаемыйМассив<ВыбранныйФайл>>) + знч Файл = Событие.НовоеЗначение[0] + Объект.Иконка = ЗагрузкаФайлов.НачатьЗагрузку(Файл).ПолучитьРезультат() + Объект.ИмяФайлаИконки = Файл.Имя +; + +метод ОчиститьИконкуПриНажатии(Источник: Картинка, Событие: СобытиеПриНажатии) + Объект.Иконка = Неопределено + Объект.ИмяФайлаИконки = "" +; + +метод ИмяФайлаИконкиПриНажатии(Источник: Надпись, Событие: СобытиеПриНажатии) + ВыгрузкаФайлов.НачатьВыгрузку(Объект.Иконка, Объект.ИмяФайлаИконки) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.yaml b/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.yaml new file mode 100644 index 0000000..1b15fe4 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СтадииСделокФормаОбъекта.yaml @@ -0,0 +1,64 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: d1264869-3e4e-4483-a50b-9183e5962b2a +Имя: СтадииСделокФормаОбъекта +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаОбъекта<СтадииСделок.Объект> + Заголовок: $ЛокализованныеСтроки.СтадияСделки + ОсновнаяКоманда: =ЗаписатьИЗакрыть + Содержимое: + Тип: ПроизвольныйШаблонФормы + ШиринаВКолонках: Одинарная + Содержимое: + Тип: АвтоматическаяГруппа + Содержимое: + - + Тип: ПолеВвода<Строка> + Имя: ПолеВводаНаименование + Заголовок: $ЛокализованныеСтроки.Наименование + Значение: =Объект.Наименование + Обязательное: Истина + СообщениеОшибка: $Общие::ЛокализованныеСтроки.ОбязательноеПоле + - + Тип: ПолеВвода<ВидСтадииСделки> + Заголовок: $ЛокализованныеСтроки.Вид + Значение: =Объект.Вид + Обязательное: Истина + - + Тип: ПолеВвода<Число> + Заголовок: $ЛокализованныеСтроки.Порядок + Значение: =Объект.Порядок + - + Тип: ФиксированнаяГруппа + ШрифтЗаголовка: =СтилевыеШрифты.Обычный + Заголовок: $ЛокализованныеСтроки.Иконка + Содержимое: + - + Тип: ВыборФайлов + Имя: ВыборИконки + Заголовок: $ЛокализованныеСтроки.ЗаголовокВыбораФайлаИконки + Видимость: =(Объект.Иконка == Неопределено) + Фильтр: image/* + РастягиватьПоГоризонтали: Истина + МножественныйВыбор: Ложь + ПриИзменении: ВыборИконкиПриИзменении + - + Тип: ФиксированнаяГруппа + Ориентация: Горизонтальная + РастягиватьПоГоризонтали: Истина + Содержимое: + - + Тип: Надпись + Значение: =Объект.ИмяФайлаИконки + ОбрабатыватьНажатие: Истина + ПриНажатии: ИмяФайлаИконкиПриНажатии + - + Тип: Картинка + Видимость: =(Объект.Иконка != Неопределено) + ОбрабатыватьНажатие: Истина + ВыравниваниеВГруппеПоВертикали: Центр + ВыравниваниеВГруппеПоГоризонтали: Конец + Изображение: МусорнаяКорзинаКонтур.svg + Подсказка: $ЛокализованныеСтроки.Удалить + Цвет: =Цвета.Стилевые.ФонВторичный + ПриНажатии: ОчиститьИконкуПриНажатии diff --git a/Koncept/Testovoe/Пресейл/СтадииСделокФормаСписка.yaml b/Koncept/Testovoe/Пресейл/СтадииСделокФормаСписка.yaml new file mode 100644 index 0000000..8886e9a --- /dev/null +++ b/Koncept/Testovoe/Пресейл/СтадииСделокФормаСписка.yaml @@ -0,0 +1,52 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 67465753-bf4f-4460-afa1-d6e5b9c6f6d4 +Имя: СтадииСделокФормаСписка +ОбластьВидимости: ВПодсистеме +Наследует: + Тип: ФормаСписка + КомпонентТаблицы: =Компоненты.ТаблицаСписка + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: ФиксированнаяГруппа + Содержимое: + - + Тип: Таблица<ДинамическийСписок> + Имя: ТаблицаСписка + Источник: + ОсновнаяТаблица: + Таблица: СтадииСделок + Псевдоним: СтадииСделок + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Вид + - + Тип: ПолеДинамическогоСписка + Выражение: Иконка + - + Тип: ПолеДинамическогоСписка + Выражение: Порядок + Сортировка: + - + Поле: Порядок + НаправлениеСортировки: ПоВозрастанию + ИспользованиеПоиска: Ложь + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + Изображение: =ДанныеСтроки.Данные["Иконка"] как ДвоичныйОбъект.Ссылка? + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Вид + ПолеЗначения: Вид + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Порядок + ПолеЗначения: Порядок diff --git a/Koncept/Testovoe/Пресейл/Услуги.xbsl b/Koncept/Testovoe/Пресейл/Услуги.xbsl new file mode 100644 index 0000000..7d81a55 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Услуги.xbsl @@ -0,0 +1,25 @@ +импорт Основное + +@Обработчик +метод ВычислитьРазрешенияДоступа(): Массив<РазрешениеДоступа> + возврат [ + ПользователиКлиентИСервер.ПолныеПраваНаСправочникДляРуководителя(), + новый РазрешениеДоступа( + [новый КлючДоступаДляАутентифицированных.Объект()], + [Сущность.Право.Чтение]) + ] +; + +@ВПроекте +метод ПолучитьУслуги(): ЧитаемыйМассив<Услуги.Ссылка> + знч Запрос = Запрос{ + ВЫБРАТЬ + Ссылка + ИЗ + Услуги + УПОРЯДОЧИТЬ ПО + Код + } + + возврат Запрос.Выполнить().Преобразовать(Строка -> Строка.Ссылка) +; \ No newline at end of file diff --git a/Koncept/Testovoe/Пресейл/Услуги.yaml b/Koncept/Testovoe/Пресейл/Услуги.yaml new file mode 100644 index 0000000..bb686d9 --- /dev/null +++ b/Koncept/Testovoe/Пресейл/Услуги.yaml @@ -0,0 +1,24 @@ +ВидЭлемента: Справочник +Ид: b7053eaa-0516-4225-b600-b7babab3a98e +Имя: Услуги +ОбластьВидимости: ВПроекте +Импорт: + - Общие +КонтрольДоступа: + Разрешения: + ПоУмолчанию: РазрешенияВычисляются +Интерфейс: + Список: + Форма: УслугиФормаСписка +ИспользоватьВПолнотекстовомПоиске: Ложь +Реквизиты: + - + Имя: Код + Тип: Число + - + Имя: Наименование + Длина: 200 + НезаполненноеЗначение: ЗапретитьВсегда + - + Имя: Владелец + Тип: Направления.Ссылка? diff --git a/Koncept/Testovoe/Пресейл/УслугиФормаСписка.yaml b/Koncept/Testovoe/Пресейл/УслугиФормаСписка.yaml new file mode 100644 index 0000000..8c7ec3f --- /dev/null +++ b/Koncept/Testovoe/Пресейл/УслугиФормаСписка.yaml @@ -0,0 +1,44 @@ +ВидЭлемента: КомпонентИнтерфейса +Ид: 7b13ecdc-551d-4843-8d5a-e2c740383461 +Имя: УслугиФормаСписка +ОбластьВидимости: ВПодсистеме +Импорт: + - Общие +Наследует: + Тип: ФормаСписка + Заголовок: Услуги + КомпонентТаблицы: =Компоненты.ОсновнаяТаблица + КомандыСоздания: =Создать + Содержимое: + Тип: ПроизвольныйШаблонФормы + Содержимое: + Тип: Таблица<ДинамическийСписок> + Имя: ОсновнаяТаблица + Источник: + ОсновнаяТаблица: + Таблица: Услуги + Поля: + - + Тип: ПолеДинамическогоСписка + Выражение: Код + - + Тип: ПолеДинамическогоСписка + Выражение: Наименование + - + Тип: ПолеДинамическогоСписка + Выражение: Владелец + Колонки: + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Код + ПолеЗначения: Код + РастягиватьПоГоризонтали: Ложь + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Наименование + ПолеЗначения: Наименование + - + Тип: СтандартнаяКолонкаТаблицы<СтрокаДинамическогоСписка> + Заголовок: $ЛокализованныеСтроки.Направление + ОбрабатыватьНажатие: Ложь + ПолеЗначения: Владелец diff --git a/Koncept/Testovoe/Проект.xbsl b/Koncept/Testovoe/Проект.xbsl new file mode 100644 index 0000000..f08a2de --- /dev/null +++ b/Koncept/Testovoe/Проект.xbsl @@ -0,0 +1,41 @@ +импорт Основное +импорт Пресейл +импорт Общие::КурсыВалют + +@НастройкаПриложения(Ид = "ЗаполнениеДемоДанными", Номер = 1) +метод ЗаполнениеДемоДанными(НоваяВерсия: Версия) + ЗаполнениеДемоДанными.Заполнить() + КурсыВалютСервер.ЗапланироватьЗагрузкуКурсовВалют() + ПересчитатьКлючиИРазрешенияДоступа() +; + +@ОбновлениеПроекта(Ид = "ДобавленСправочникУслуги", Номер = 1) +метод ДобавленСправочникУслуги() + Услуги.ПересчитатьРазрешенияДоступа() + Услуги.ПересчитатьРазрешенияДоступаДляОбъектов() +; + +@ОбновлениеПроекта(Ид = "ИзмененСоставПолейПолнотекстовогоПоиска", Номер = 2) +метод ИзмененСоставПолейПолнотекстовогоПоиска() + ПолнотекстовыйПоиск.ПерестроитьИндекс() +; + +метод ПересчитатьКлючиИРазрешенияДоступа() + для Справочник из Справочники + Справочник.ПересчитатьРазрешенияДоступа() + Справочник.ПересчитатьРазрешенияДоступаДляОбъектов() + ; + для РегистрСведений из РегистрыСведений + РегистрСведений.ПересчитатьРазрешенияДоступа() + РегистрСведений.ПересчитатьРазрешенияДоступаДляОбъектов() + ; + для Хранилище из ХранилищаНастроек + Хранилище.ПересчитатьРазрешенияДоступа() + Хранилище.ПересчитатьРазрешенияДоступаДляОбъектов() + ; + для Сервис из HttpСервисы + Сервис.ПересчитатьРазрешенияДоступа() + ; + + Пользователи.ПересчитатьКлючиДоступа() +; diff --git a/Koncept/Testovoe/Проект.yaml b/Koncept/Testovoe/Проект.yaml new file mode 100644 index 0000000..fb3527e --- /dev/null +++ b/Koncept/Testovoe/Проект.yaml @@ -0,0 +1,10 @@ +Ид: 019523e0-6844-7997-ac70-8a8a0db20ded +РежимСовместимости: 5.0 +Поставщик: Koncept +Имя: Testovoe +Версия: 1.0 +Представление: "Testovoe" +ПредставлениеПоставщика: "Koncept" +ЯзыкиЛокализации: [Русский, Английский] +ЯзыкПоУмолчанию: Русский +ЯзыкРазработки: Русский diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 298aa21..0000000 --- a/LICENSE +++ /dev/null @@ -1,232 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for software and other kinds of works. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on the Program. - -To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. - -A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. - - c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - - a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - - d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - - e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - - Element_Test_V2 - Copyright (C) 2025 Vladislav_k0ncept - - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - - Element_Test_V2 Copyright (C) 2025 Vladislav_k0ncept - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/README.md b/README.md deleted file mode 100644 index 7b79d51..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Element_Test_V2 -