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

20.06.17

Разработка - Универсальные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    36413    dimanich70    83    

155

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    5517    6    John_d    11    

57

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    42570    atdonya    29    

64

Универсальные функции Программист 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    7177    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    19512    YA_418728146    8    

174

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    5358    86    progmaster    13    

4

Инструментарий разработчика Универсальные функции 1С v8.3 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 1С:Документооборот Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    21218    208    sapervodichka    117    

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

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


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

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

А что это за конфигурация такая, совсем с нуля?
14. stepan_s 24.07.20 08:12 Сейчас в теме
Если не секрет что заставляет такие сокращения делать? Как жить людям с этим, которые придут потом? Почему принцип самокоментируемости так не вкатывает?
Оставьте свое сообщение