Каталог решений - Замена штатной функции "Создать на основании"

Замена штатной функции "Создать на основании"

Замена штатной функции "Создать на основании"

В наличии

Модернизация операции «Создать на основании» в документе

Категория:

Описание

Всем доброго времени суток!

Хочу поделиться некоторыми соображениями по замене штатной функции «Создать на основании». Возникло несколько нюансов при использовании данной опции:

1. Необходимо чтобы в форме документа отражался созданный на его основании документ;

2. Если документ на основании уже создан, чтобы открывался текущий, а не создавался новый.

Вкратце опишу задачу.

На данный момент занимаюсь разработкой системы «Водосбыт». Есть карточка лицевого счета, в которой отражаются все данные об абоненте и объекте водоснабжения. На основании данных из этой карточки заключаются договора на водоснабжение (на первом скриншоте указано стрелкой). Необходимо после создания договора его отображение в карточке. Жмем создать договор (скрин №2). Далее проводим новый договор (скрин №3). После чего, данный договор отобразится в карточке (скрин №4). И теперь после нажатия кнопки «Создать открыть договор» вместо создания нового, откроется текущий.

Теперь перейдем к технической части.

Во-первых, чтобы штатные кнопки не отображались, уберем галочки в закладке «Командный интерфейс» (скрин №5). После этого, создаем действие для команды «СоздатьОткрытьДВСн» (скрин №6)

Ну и далее сам код модуля формы:

#Область ОткрытиеСозданиеДокументов

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

&НаКлиенте
Процедура СоздатьОткрытьДЖБО(Команда)
	Если Модифицированность Тогда
		Предупреждение("Необходимо сохранить документ!");
		Возврат;
	КонецЕсли;
	
	Если Объект.ДоговорНаВывозЖБО.Пустая() Тогда
		ОткрытьФорму("Документ.ДоговорНаВывозЖБО.ФормаОбъекта", 
				Новый Структура("Основание, РежимВыбора", Объект.Ссылка, Истина), ЭтаФорма);
	Иначе
		ОткрытьЗначение(Объект.ДоговорНаВывозЖБО);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	Если Тип("ДокументСсылка.ДоговорНаВывозЖБО") = ТипЗнч(ВыбранноеЗначение) Тогда
		Объект.ДоговорНаВывозЖБО = ВыбранноеЗначение;
	Иначе
		Объект.ДоговорВодоснабжения = ВыбранноеЗначение;
	КонецЕсли;
	
	СохранитьИзменения(Объект.Ссылка);
	
КонецПроцедуры

&НаСервере
Процедура СохранитьИзменения(Знач Ссылка)
	ТекущийДокумент = Ссылка.ПолучитьОбъект();
	ЗаполнитьЗначенияСвойств(ТекущийДокумент, Объект);
	Если Объект.Проведен Тогда
		ТекущийДокумент.Записать(РежимЗаписиДокумента.Проведение);
	Иначе
		ТекущийДокумент.Записать(РежимЗаписиДокумента.Запись);
	КонецЕсли;
КонецПроцедуры

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

#Область УдалениеДоговоров

&НаКлиенте
Процедура УдалитьДВСн(Команда)
	
	Если Модифицированность Тогда
		Предупреждение("Необходимо сохранить документ!");
		Возврат;
	КонецЕсли;
		
	ДиалогСВопросом("Удалить договор водоснабжения?", "Удаление данных", РежимДиалогаВопрос.ДаНет);
		
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаУдаленияДоговораВСн(Результат, Параметры) Экспорт		
    Если Результат = КодВозвратаДиалога.Да Тогда
        УдалитьДВСнНаСервере(Объект.ДоговорВодоснабжения);
		Объект.ДоговорВодоснабжения = ПолучитьПустуюСсылку("ДоговорВодоснабжения");
		СохранитьИзменения(Объект.Ссылка);
    КонецЕсли;	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьПустуюСсылку(НаименованиеДокумента);	
	Возврат Документы[НаименованиеДокумента].ПустаяСсылка();
КонецФункции

&НаСервереБезКонтекста
Процедура УдалитьДВСнНаСервере(Знач Ссылка)			
	УдаляемыйДВСн = Ссылка.ПолучитьОбъект();	
	УдаляемыйДВСн.УстановитьПометкуУдаления(Истина);	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьДЖБО(Команда)
	
	Если Модифицированность Тогда
		Предупреждение("Необходимо сохранить документ!");
		Возврат;
	КонецЕсли;
		
	ДиалогСВопросом("Удалить договор на вывоз ЖБО?", "Удаление данных", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаУдаленияДоговораЖБО(Результат, Параметры) Экспорт		
    Если Результат = КодВозвратаДиалога.Да Тогда
        УдалитьДЖБОНаСервере(Объект.ДоговорНаВывозЖБО);
		Объект.ДоговорНаВывозЖБО = ПолучитьПустуюСсылку("ДоговорНаВывозЖБО");
		СохранитьИзменения(Объект.Ссылка);
    КонецЕсли;	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура УдалитьДЖБОНаСервере(Знач Ссылка)	
	УдаляемыйДВСн = Ссылка.ПолучитьОбъект();	
	УдаляемыйДВСн.УстановитьПометкуУдаления(Истина);	
КонецПроцедуры

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

&НаКлиенте
Процедура ДиалогСВопросом(ТекстВопроса, ЗаголовокВопроса, РежимДиалога)
	
	Если ТекстВопроса = "Удалить договор водоснабжения?" Тогда
		Оповещение = Новый ОписаниеОповещения("ПослеВопросаУдаленияДоговораВСн", ЭтотОбъект);
	Иначе
		Оповещение = Новый ОписаниеОповещения("ПослеВопросаУдаленияДоговораЖБО", ЭтотОбъект);
	КонецЕсли;
 
    ПоказатьВопрос(Оповещение,
        ТекстВопроса,
        РежимДиалога,
        0,
        КодВозвратаДиалога.Да,
        ЗаголовокВопроса
		
    );
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанные(Команда)
	Элементы.АбонентКонтактныеДанные.Обновить();
КонецПроцедуры

Так — же реализовал вопрос при удалении договора. 

И для того, чтобы ссылка созданного на основании договора передалась в форму карточки лицевого счета, в форме договора необходимо оповестить о выборе. Данную функцию я вставил в процедуру «ПослеЗаписи»:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	Если Не Объект.Основание.Пустая() Тогда
		ОповеститьОВыборе(Объект.Ссылка);
	КонецЕсли;
КонецПроцедуры

Надеюсь данный функционал кому либо поможет. Если возникнут какие либо вопросы или предложения, буду рад выслушать…

has been added to your cart:
Оформление заказа