Всем доброго времени суток!
Хочу поделиться некоторыми соображениями по замене штатной функции "Создать на основании". Возникло несколько нюансов при использовании данной опции:
1. Необходимо чтобы в форме документа отражался созданный на его основании документ;
2. Если документ на основании уже создан, чтобы открывался текущий, а не создавался новый.
Вкратце опишу задачу.
На данный момент занимаюсь разработкой системы "Водосбыт". Есть карточка лицевого счета, в которой отражаются все данные об абоненте и объекте водоснабжения. На основании данных из этой карточки заключаются договора на водоснабжение (на первом скриншоте указано стрелкой). Необходимо после создания договора его отображение в карточке. Жмем создать договор (скрин №2). Далее проводим новый договор (скрин №3). После чего, данный договор отобразится в карточке (скрин №4). И теперь после нажатия кнопки "Создать открыть договор" вместо создания нового, откроется текущий.
Теперь перейдем к технической части.
Во-первых, чтобы штатные кнопки не отображались, уберем галочки в закладке "Командный интерфейс" (скрин №5). После этого, создаем действие для команды "СоздатьОткрытьДВСн" (скрин №6)
Ну и далее сам код модуля формы:
#Область ОткрытиеСозданиеДокументов
&НаКлиенте
Процедура СоздатьОткрытьДВСн(Команда)
Если Модифицированность Тогда
Предупреждение("Необходимо сохранить документ!");
Возврат;
КонецЕсли;
Если Объект.ДоговорВодоснабжения.Пустая() Тогда
ОткрытьФорму("Документ.ДоговорВодоснабжения.ФормаОбъекта",
Новый Структура("Основание, РежимВыбора", Объект.Ссылка, Истина), ЭтаФорма);
Иначе
ОткрытьЗначение(Объект.ДоговорВодоснабжения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьОткрытьДЖБО(Команда)
Если Модифицированность Тогда
Предупреждение("Необходимо сохранить документ!");
Возврат;
КонецЕсли;
Если Объект.ДоговорНаВывозЖБО.Пустая() Тогда
ОткрытьФорму("Документ.ДоговорНаВывозЖБО.ФормаОбъекта",
Новый Структура("Основание, РежимВыбора", Объект.Ссылка, Истина), ЭтаФорма);
Иначе
ОткрытьЗначение(Объект.ДоговорНаВывозЖБО);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если Тип("ДокументСсылка.ДоговорНаВывозЖБО") = ТипЗнч(ВыбранноеЗначение) Тогда
Объект.ДоговорНаВывозЖБО = ВыбранноеЗначение;
Иначе
Объект.ДоговорВодоснабжения = ВыбранноеЗначение;
КонецЕсли;
СохранитьИзменения(Объект.Ссылка);
КонецПроцедуры
&НаСервере
Процедура СохранитьИзменения(Знач Ссылка)
ТекущийДокумент = Ссылка.ПолучитьОбъект();
ЗаполнитьЗначенияСвойств(ТекущийДокумент, Объект);
Если Объект.Проведен Тогда
ТекущийДокумент.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ТекущийДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область УдалениеДоговоров
&НаКлиенте
Процедура УдалитьДВСн(Команда)
Если Модифицированность Тогда
Предупреждение("Необходимо сохранить документ!");
Возврат;
КонецЕсли;
ДиалогСВопросом("Удалить договор водоснабжения?", "Удаление данных", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаУдаленияДоговораВСн(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
УдалитьДВСнНаСервере(Объект.ДоговорВодоснабжения);
Объект.ДоговорВодоснабжения = ПолучитьПустуюСсылку("ДоговорВодоснабжения");
СохранитьИзменения(Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПустуюСсылку(НаименованиеДокумента);
Возврат Документы[НаименованиеДокумента].ПустаяСсылка();
КонецФункции
&НаСервереБезКонтекста
Процедура УдалитьДВСнНаСервере(Знач Ссылка)
УдаляемыйДВСн = Ссылка.ПолучитьОбъект();
УдаляемыйДВСн.УстановитьПометкуУдаления(Истина);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьДЖБО(Команда)
Если Модифицированность Тогда
Предупреждение("Необходимо сохранить документ!");
Возврат;
КонецЕсли;
ДиалогСВопросом("Удалить договор на вывоз ЖБО?", "Удаление данных", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаУдаленияДоговораЖБО(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
УдалитьДЖБОНаСервере(Объект.ДоговорНаВывозЖБО);
Объект.ДоговорНаВывозЖБО = ПолучитьПустуюСсылку("ДоговорНаВывозЖБО");
СохранитьИзменения(Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УдалитьДЖБОНаСервере(Знач Ссылка)
УдаляемыйДВСн = Ссылка.ПолучитьОбъект();
УдаляемыйДВСн.УстановитьПометкуУдаления(Истина);
КонецПроцедуры
#КонецОбласти
&НаКлиенте
Процедура ДиалогСВопросом(ТекстВопроса, ЗаголовокВопроса, РежимДиалога)
Если ТекстВопроса = "Удалить договор водоснабжения?" Тогда
Оповещение = Новый ОписаниеОповещения("ПослеВопросаУдаленияДоговораВСн", ЭтотОбъект);
Иначе
Оповещение = Новый ОписаниеОповещения("ПослеВопросаУдаленияДоговораЖБО", ЭтотОбъект);
КонецЕсли;
ПоказатьВопрос(Оповещение,
ТекстВопроса,
РежимДиалога,
0,
КодВозвратаДиалога.Да,
ЗаголовокВопроса
);
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанные(Команда)
Элементы.АбонентКонтактныеДанные.Обновить();
КонецПроцедуры
Так - же реализовал вопрос при удалении договора.
И для того, чтобы ссылка созданного на основании договора передалась в форму карточки лицевого счета, в форме договора необходимо оповестить о выборе. Данную функцию я вставил в процедуру "ПослеЗаписи":
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Если Не Объект.Основание.Пустая() Тогда
ОповеститьОВыборе(Объект.Ссылка);
КонецЕсли;
КонецПроцедуры
Надеюсь данный функционал кому либо поможет. Если возникнут какие либо вопросы или предложения, буду рад выслушать...