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

20.06.17

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4606    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8818    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

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

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

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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


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

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

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