INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Лисенков Владимир | Руководитель отдела разработки | АО МФК "Городская Сберкасса"

«Имитационное моделирование в среде 1С:Предприятие»

- суть имитационного моделирования, как способа определения наиболее оптимального решения - алгоритмы получения случайных значений по заданному закону распределения - построение имитационной модели и проведение имитационных испытаний в среде 1С:Предприятие В основу доклада будет положена выпускная работа по теме "Имитационное моделирование". Теория и практическая часть на платформе 1С. В качестве примера - расчет оценки кредитного риска по методу VAR в финансовых организациях. Платформа 1С будет рассмотрена в качестве аналога такому пакету как Oracle Cristal Ball.

Расширение для 1С:Управление торговлей 11.3, 11.4, позволяющее автоматически формировать задачи контроля задолженности покупателей

Обработки - Рабочее место

6
Для ответственного менеджера автоматически создаются задачи контроля просроченной задолженности покупателя.

Для ответственного менеджера автоматически создаются бизнес-процессы Задание "Организовать погашение задолженности" партнера (покупателя). Заданию (задаче) дополнительно может быть назначен проверяющий.

Если по документу, формирующему задолженность, есть невыполненное Задание для исполнителя-ответственного менеджера, то Задание не создается.

Алгоритм аналогичен штатному для формирования уведомлений по почте.

Задолженность фиксируется после отгрузки товаров клиенту. Состояние просроченной задолженности фиксируется в соответствии с указанной датой оплаты плюс 7 календ. дней.

Если отгрузка была оформлена по заказу клиента, то дата задолженности соответствует дате, указанной в этапе оплаты "Кредит (после отгрузки)"; если накладная оформляется без заказа, то в соответствии с той датой оплаты, которая указана в накладной.

Если расчеты ведутся по договорам, то 7 дней не добавляется, задание стартует сразу.

Данные берутся из регистра накопления РасчетыСКлиентами.

Если ответственный менеджер выполнит задачу, а задолженность при этом не будет погашена, то для него будет создана новая задача "Организовать погашение задолженности". Так будет до момента погашения задолженности. То есть кнопку Выполнена в задаче имеет смысл нажимать, когда задолженность действительно погашена.

Задаче может быть назначен проверяющий. Для этого нужно создать элемент справочника "Роли исполнителей" с наименованием «Проверяющий» (Все функции / Роли исполнителей) и этой роли назначить пользователя-исполнителя (в форме элемента справочника или в НСИ и администрирование / Органайзер / Бизнес процессы и задачи / Роли и исполнители задач).

Для расширения безопасный режим должен быть отключен. Следует также отключить безопасный режим для всех "нижележащих" расширений, если они есть.

Расширение тестировалось на "1С:Управление торговлей" 11.3.1.115, 11.3.2.193, 11.4.1.261, 11.4.5.24.

 
 Рекомендации по подключению расширения

Открываем конфигуратор. Выделяем корень конфигурации и в свойствах смотрим  и запоминаем режим совместимости:

Открываем форму "Расширения конфигурации", нажимаем кнопку Добавить, ничего не меняем и нажимаем ОК:

В форме "Расширения конфигурации" в меню Конфигурация выбираем пункт Загрузить конфигурацию из файла:

На все вопросы отвечаем ДА.

Если будет выведено сообщение "Расширение1: Значение контролируемого свойства РежимСовместимости у объекта  не совпадает со значением в расширяемой конфигурации", то в свойствах расширения устанавливаем такой же режим совместимости, как у основной конфигурации:

В форме "Расширения конфигурации" снимаем флаги Безопасный режим и Защита от опасных действий:

Ничего опасного в расширении нет, код открыт, его немного, можно посмотреть. Если флаги не снять, то под пользователем без административных прав будет возникать ошибка "Недостаточно прав!", так как задачи формируются в привилегированном режиме.

Все. Можно пользоваться.

 
 Реализация и код расширения 

 В расширении создана обработка ПМВ и захвачена форма МоиЗадачиДляРабочегоСтола задачи ЗадачаИсполнителя.

Код модуля формы:

&НаКлиенте
Процедура РасшКЗ_ОбновитьСписокЗадачПеред(Команда)
	СоздатьЗаданияКонтроляЗадолженностиНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СоздатьЗаданияКонтроляЗадолженностиНаСервере()
	Обработки.ПМВ.СоздатьЗаданияКонтроляЗадолженности();
КонецПроцедуры

&НаКлиенте
Процедура РасшКЗ_ОбработкаОповещенияПеред(ИмяСобытия, Параметр, Источник)
	//Привязался к этим событиям для автоматизации запуска. Можно привязаться к другим
	Если ИмяСобытия = "Запись_ЗаказКлиента" 
		ИЛИ ИмяСобытия = "Запись_СделкиСКлиентами" 
		ИЛИ ИмяСобытия = "Запись_РеализацияТоваровУслуг" 
		Тогда
		СоздатьЗаданияКонтроляЗадолженностиНаСервере();
	КонецЕсли;	
КонецПроцедуры

Код модуля менеджера обработки:

//Создает бизнес-процессы Задание "Проконтролировать задолженность" партнера для ответственного
//менеджера по партнеру и предмету
//если есть невыполненное задание по предмету для исполнителя - ответственного менеджера, то Задание не создается
Процедура СоздатьЗаданияКонтроляЗадолженности() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЗаказКлиентаЭтапыГрафикаОплаты.Ссылка,
		|	ЗаказКлиентаЭтапыГрафикаОплаты.ДатаПлатежа
		|ПОМЕСТИТЬ втДатыЗаказа
		|ИЗ
		|	Документ.ЗаказКлиента.ЭтапыГрафикаОплаты КАК ЗаказКлиентаЭтапыГрафикаОплаты
		|ГДЕ
		|	ЗаказКлиентаЭтапыГрафикаОплаты.ВариантОплаты = ЗНАЧЕНИЕ(Перечисление.ВариантыОплатыКлиентом.КредитПослеОтгрузки)
		|	И НЕ ЗаказКлиентаЭтапыГрафикаОплаты.Ссылка.ПометкаУдаления
		|	И ЗаказКлиентаЭтапыГрафикаОплаты.Ссылка.Проведен
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Задание.Ссылка,
		|	Задание.Автор,
		|	Задание.Исполнитель,
		|	Задание.Предмет
		|ПОМЕСТИТЬ втЗадания
		|ИЗ
		|	БизнесПроцесс.Задание КАК Задание
		|ГДЕ
		|	НЕ Задание.ПометкаУдаления
		|	И Задание.Наименование ПОДОБНО ""Организовать погашение задолженности%""
		|	И НЕ Задание.Завершен
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер КАК Партнер,
		|	РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер КАК ОсновнойМенеджер,
		|	СУММА(РасчетыСКлиентамиОстатки.СуммаОстаток) КАК СуммаОстаток,
		|	СУММА(РасчетыСКлиентамиОстатки.КОплатеОстаток) КАК КОплатеОстаток,
		|	РасчетыСКлиентамиОстатки.ЗаказКлиента КАК Предмет
		|ПОМЕСТИТЬ втЗадолженность
		|ИЗ
		|	РегистрНакопления.РасчетыСКлиентами.Остатки(&ТекущаяДата, ) КАК РасчетыСКлиентамиОстатки
		|ГДЕ
		|	РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
		|
		|СГРУППИРОВАТЬ ПО
		|	РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер,
		|	РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Партнер.ОсновнойМенеджер,
		|	РасчетыСКлиентамиОстатки.ЗаказКлиента
		|
		|ИМЕЮЩИЕ
		|	ВЫБОР
		|		КОГДА СУММА(РасчетыСКлиентамиОстатки.СуммаОстаток) >= СУММА(РасчетыСКлиентамиОстатки.КОплатеОстаток)
		|			ТОГДА СУММА(РасчетыСКлиентамиОстатки.КОплатеОстаток)
		|		ИНАЧЕ СУММА(РасчетыСКлиентамиОстатки.СуммаОстаток)
		|	КОНЕЦ > 0
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	втЗадолженность.Партнер,
		|	втЗадолженность.ОсновнойМенеджер,
		|	втЗадолженность.Предмет КАК Предмет,
		|	втЗадолженность.СуммаОстаток,
		|	втЗадолженность.КОплатеОстаток
		|ПОМЕСТИТЬ втДанные
		|ИЗ
		|	втЗадолженность КАК втЗадолженность
		|		ЛЕВОЕ СОЕДИНЕНИЕ втЗадания КАК втЗадания
		|		ПО втЗадолженность.ОсновнойМенеджер = втЗадания.Исполнитель
		|			И втЗадолженность.Предмет = втЗадания.Предмет
		|ГДЕ
		|	втЗадания.Исполнитель ЕСТЬ NULL
		|	И втЗадания.Предмет ЕСТЬ NULL
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	втДанные.Партнер,
		|	втДанные.ОсновнойМенеджер,
		|	втДанные.Предмет,
		|	втДанные.СуммаОстаток,
		|	втДанные.КОплатеОстаток,
		|	ВЫБОР
		|		КОГДА ТИПЗНАЧЕНИЯ(втДанные.Предмет) = ТИП(Документ.ЗаказКлиента)
		|			ТОГДА втДатыЗаказа.ДатаПлатежа
		|		КОГДА ТИПЗНАЧЕНИЯ(втДанные.Предмет) = ТИП(Документ.РеализацияТоваровУслуг)
		|			ТОГДА втДанные.Предмет.ДатаПлатежа
		|		ИНАЧЕ ДАТАВРЕМЯ(2001, 1, 1)
		|	КОНЕЦ КАК ДатаПлатежа
		|ИЗ
		|	втДанные КАК втДанные
		|		ЛЕВОЕ СОЕДИНЕНИЕ втДатыЗаказа КАК втДатыЗаказа
		|		ПО втДанные.Предмет = втДатыЗаказа.Ссылка";
	
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	РольИсполнителя = Справочники.РолиИсполнителей.НайтиПоНаименованию("Проверяющий");
	
	Пока Выборка.Следующий() Цикл
		
		Если ТекущаяДатаСеанса() < НачалоДня(Выборка.ДатаПлатежа) + 3600*24*7  Тогда
			Продолжить;
		КонецЕсли;	
		
		Задание = БизнесПроцессы.Задание.СоздатьБизнесПроцесс();
		Задание.Дата = ТекущаяДатаСеанса(); 
		Задание.Автор = Выборка.ОсновнойМенеджер;
		Задание.Исполнитель = Выборка.ОсновнойМенеджер;
		Задание.Предмет = Выборка.Предмет;
		Задание.Наименование = "Организовать погашение задолженности " + СокрЛП(Выборка.Партнер) + " по " + СокрЛП(Выборка.Предмет);
		Задание.СрокИсполнения = КонецДня(Задание.Дата) + 3600*24*7;
		Задание.Содержание = "Имеет место задолженность " +  
		СокрЛП(Выборка.Партнер) + 
		" по " + СокрЛП(Выборка.Предмет) + Символы.ВК +
		"- сумма остатка: " + Выборка.СуммаОстаток + ";" + Символы.ВК +
		"- сумма к оплате: " + Выборка.КОплатеОстаток + Символы.ВК +
		?(Выборка.ДатаПлатежа<>Дата(2001,1,1), "Срок оплаты " + Формат(Выборка.ДатаПлатежа,"ДФ=dd.MM.yyyy"),"");
		
		//Проверяющий
		Если ЗначениеЗаполнено(РольИсполнителя) 
			И БизнесПроцессыИЗадачиСервер.ЕстьИсполнителиРоли(РольИсполнителя)Тогда
			
			Задание.Проверяющий = ВыбратьИсполнителя(РольИсполнителя);
			Задание.НаПроверке = Истина;
			Задание.СрокПроверки = Задание.СрокИсполнения + 3600*24*1;
			
		КонецЕсли;
		//
		
		Задание.Записать();
		Задание.Старт();
		
	КонецЦикла;
	
	УстановитьПривилегированныйРежим(Ложь);

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

// Выбрать одного любого исполнителя, назначенного на РольИсполнителя
// 
Функция ВыбратьИсполнителя(РольИсполнителя) Экспорт
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
		|	ИсполнителиЗадач.Исполнитель КАК Исполнитель
		|ИЗ
		|	РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач
		|ГДЕ
		|	ИсполнителиЗадач.РольИсполнителя = &РольИсполнителя");
	
	Запрос.Параметры.Вставить("РольИсполнителя", РольИсполнителя);
	ВыборкаЗапроса = Запрос.Выполнить().Выгрузить();
	Возврат ?(ВыборкаЗапроса.Количество() > 0, ВыборкаЗапроса[0].Исполнитель, Справочники.Пользователи.ПустаяСсылка());
	
КонецФункции

 

 

6

Скачать файлы

Наименование Файл Версия Размер
КонтрольЗадолженности (режим совместимости 8.3.8)
.cfe 20,33Kb
03.08.18
19
.cfe 25.05.17 20,33Kb 19 Скачать
КонтрольЗадолженности (режим совместимости 8.3.10)
.cfe 20,43Kb
23.06.18
3
.cfe 23.06.18 20,43Kb 3 Скачать

См. также

Комментарии
Сортировка: Древо
1. user909652 14.06.18 17:26 Сейчас в теме
Добрый день! А до 11.4 не будет доработано? а то я что-то скачала, не посмотрев, при установке расширения пишет "(Критичная) : Значение контролируемого свойства РежимСовместимости у объекта не совпадает со значением в расширяемой конфигурации"
2. mvxyz 77 14.06.18 20:36 Сейчас в теме
(1) Поставьте у расширения такой же режим совместимости, как у основной конфигурации.
3. user909652 15.06.18 13:12 Сейчас в теме
4. mvxyz 77 24.06.18 12:13 Сейчас в теме
Оставьте свое сообщение