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

Публикация № 636444

Программирование - Практика программирования

основание основании создать на основании

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. premier 175 22.06.17 18:16 Сейчас в теме
2. premier 175 22.06.17 18:22 Сейчас в теме
(0) Ничего личного. Просто не не понравилось оформление кода. Не было желания оскорбить, обидеть, задеть за живое и т.д .
3. premier 175 22.06.17 18:24 Сейчас в теме
(2) не-не=НЕ! Бывают опечатки :)))
4. cheiser1982 76 23.06.17 03:42 Сейчас в теме
(3) Ну возможно ты и прав, можно было по другому эту процедуру обозвать. Просто в наших терминах такое название более понятно... Ну а на критику я всегда адекватно реагирую, так что все нормально... :))
5. Артано 655 23.06.17 03:54 Сейчас в теме
Если на первом скрине данные реального абонента, то рекомендую закрасить, иначе нарушение 152-ФЗ

Насчет кода, то глаз резанули только лишние отступы внутри структур, передача на сервер ссылочных типов по ссылке, а не по значению и заремаренный старый код. В остальном всё норм.
6. cheiser1982 76 23.06.17 04:39 Сейчас в теме
(5) Насчет абонента - все вымышленное, в том числе и адрес. По поводу ссылочных типов - немного не понял... По ссылке передаю документ, после чего ставлю пометку. Подскажи как по значению передать и выполнить то-же действие...
Насчет отступов - ну у каждого свои нюансы в написании. Мне просто так удобнее. А старый код сейчас уберу. Когда писал - искал команды по подсказке...
7. Артано 655 23.06.17 04:50 Сейчас в теме
(6)
По ссылке передаю документ, после чего ставлю пометку. Подскажи как по значению передать и выполнить то-же действие...


Пометку же не в СправочникСсылка ставите, а в СправочникОбъект, который является отдельным объектом другого типа связанным с со ссылкой лишь общим родителем и ID.
Когда ссылочный тип передается на сервер, происходит его сериализация (поэтому мутабельные типы не передаются), если передавать не по значению, то при завершении работы серверного метода, будет произведена обратная операция для возврата объекта на клиент. Т.е. двойная работа никому не нужная.
8. cheiser1982 76 23.06.17 04:55 Сейчас в теме
(7)
Т.е. двойная работа никому не нужная.

Я это уже понял при отладке, что не все правильно делаю. Можешь привести пример, как грамотно все организовать? Возможно у меня немного опыта не хватает...
9. Артано 655 23.06.17 05:01 Сейчас в теме
(8) Передавай данные на сервер только по значению. Если нужно намеренно "испортить" передаваемый параметр, то передавай по ссылке. По неизвестной мне причине для 1С стандартом по умолчанию является передача по ссылке, что и приводит к таким казусам. Бывает и сам забудешь поставить заветную "Знач", но в целом это дело привычки и такие ошибки случаются редко.
cheiser1982; +1 Ответить
10. cheiser1982 76 23.06.17 05:22 Сейчас в теме
(9) Исправил - так правильно?
11. Артано 655 23.06.17 05:53 Сейчас в теме
(10) Похоже. Но всё же почитай на ИТС про передачу по ссылке и по значению
12. Alexey-Alyosha 24.06.17 11:03 Сейчас в теме
Спасибо, очень помогло... Сэкономил кучу времени, опираясь на Вашу статью...
13. Altair777 640 11.07.17 10:20 Сейчас в теме
(0)
На данный момент занимаюсь разработкой системы "Водосбыт"

А что это за конфигурация такая, совсем с нуля?
Оставьте свое сообщение