Гиперссылка в табличной части управляемых форм

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

Задача: Управляемые формы. В табличной части документа добавить ссылочный реквизит с гиперссылкой. Если реквизит пустой, то отображать произвольное слово с возможностью выполнить свою процедуру, иначе открытие формы ссылки этого реквизита.

Теперь чуть поточнее задачу. В документе, в табличной части необходимо добавить дополнительный реквизит со ссылкой на другой документ. Если ссылка не заполнена, то отображать слово "Создать", с возможностью создать этот документ и автоматическим помещением в этот реквизит ссылку на этот созданный документ. Добавить ниже еще одну ссылку на выбор документа из базы.

В табличную часть документа был добавлен реквизит "aspect_Поступление", тип ДокументСссылка.ПоступлениеТоваровУслуг

В форме документа в процедуре ПриСозданииНаСервере следующий код:

	// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
	// Маркер: создание докумнета поступление товаров без проведения текущего
	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("aspect_Привязать", Новый ОписаниеТипов("Строка"), "Объект.Затраты", "", Истина));
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
	
	НоваяГруппа                     = Элементы.Вставить("aspect_ГруппаПоступлений", Тип("ГруппаФормы"), Элементы.ПолучаемыеУслуги);
	НоваяГруппа.Вид                 = ВидГруппыФормы.ОбычнаяГруппа;
	НоваяГруппа.ОтображатьЗаголовок = Ложь;
	НоваяГруппа.Группировка         = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
	Элементы.Переместить(НоваяГруппа, Элементы.ПолучаемыеУслуги, Элементы.ПолучаемыеУслугиСтатьяЗатрат);
	
	НовыйРеквизит                   = Элементы.Добавить("aspect_Поступление", Тип("ПолеФормы"), НоваяГруппа);
	НовыйРеквизит.Заголовок         = "Поступление";
	НовыйРеквизит.Вид               = ВидПоляФормы.ПолеНадписи;
	НовыйРеквизит.ПутьКДанным       = "Объект.Затраты.aspect_Поступление";
	НовыйРеквизит.ГиперссылкаЯчейки = Истина;
	НовыйРеквизит.Гиперссылка       = Истина;
	
	НовыйРеквизит                    = Элементы.Добавить("aspect_Привязать", Тип("ПолеФормы"), НоваяГруппа);
	НовыйРеквизит.Вид                = ВидПоляФормы.ПолеНадписи;
	НовыйРеквизит.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
	НовыйРеквизит.ГиперссылкаЯчейки  = Истина;
	НовыйРеквизит.Гиперссылка        = Истина;
	НовыйРеквизит.ПутьКДанным        = "Объект.Затраты.aspect_Привязать";
	
	ЭлементУсловногоОформления  = УсловноеОформление.Элементы.Добавить();
	ПолеЭлемента                = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле           = Новый ПолеКомпоновкиДанных("aspect_Поступление");
	ОтборЭлемента               = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Затраты.aspect_Поступление");
	ОтборЭлемента.ВидСравнения  = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст"                  , "Создать");
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста"             , Новый Цвет(28, 85, 174));
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Центр);
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ВертикальноеПоложение"  , ВертикальноеПоложение.Центр);
	
	ЭлементУсловногоОформления  = УсловноеОформление.Элементы.Добавить();
	ПолеЭлемента                = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле           = Новый ПолеКомпоновкиДанных("aspect_Привязать");
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Текст"                  , "Привязать");
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста"             , Новый Цвет(28, 85, 174));
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ГоризонтальноеПоложение", ГоризонтальноеПоложение.Центр);
	ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ВертикальноеПоложение"  , ВертикальноеПоложение.Центр);
	// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}

В процедуре Выбор нужной табличной части прописать следующее:

	ТекСтрока = Элементы.ПолучаемыеУслуги.ТекущиеДанные;
	
	// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
	Если Поле = Элементы.aspect_Поступление Тогда
		Если ЗначениеЗаполнено(ТекСтрока.aspect_Поступление) Тогда
			ПараметрыНовойФормы = Новый Структура("Ключ", ТекСтрока.aspect_Поступление);
			ФормаДокумента = ПолучитьФорму("Документ.уатПоступлениеТоваровУслуг.Форма.ФормаДокумента", ПараметрыНовойФормы);
			ФормаДокумента.Открыть();
		Иначе
			Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
				Режим = РежимДиалогаВопрос.ДаНет;
				Ответ = Вопрос(НСтр("ru = 'Документ не записан. Записать?'"), Режим, 0);
				Если Ответ = КодВозвратаДиалога.Нет Тогда
					Возврат;
				Иначе
					Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись));
				КонецЕсли;
			КонецЕсли;
			aspect_СоздатьДокументПТиУНаСервере(ТекСтрока.НомерСтроки);
			Модифицированность = Истина;
		КонецЕсли;
	ИначеЕсли Поле = Элементы.aspect_Привязать Тогда
		Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
			Режим = РежимДиалогаВопрос.ДаНет;
			Ответ = Вопрос(НСтр("ru = 'Документ не записан. Записать?'"), Режим, 0);
			Если Ответ = КодВозвратаДиалога.Нет Тогда
				Возврат;
			Иначе
				Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись));
			КонецЕсли;
		КонецЕсли;
		ПараметрыОтбора = Новый Структура();
		ПараметрыОтбора.Вставить("ДокументОснование", Объект.Ссылка);
		Отбор = Новый Структура();
		Отбор.Вставить("Отбор", ПараметрыОтбора);
		aspect_НомерСтрокиПоступления = ТекСтрока.НомерСтроки;
		ОткрытьФорму("Документ.уатПоступлениеТоваровУслуг.ФормаВыбора", Отбор, ЭтаФорма);
		// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
	КонецЕсли;

Серверная процедура по созданию документа:

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

В раздел описания переменных добавить:

// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
&НаКлиенте
Перем aspect_НомерСтрокиПоступления;
// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}

Необходимо для того, чтобы передать номер обрабатываемой строки. Т.к. у надписи нет события ОбработкаВыбора. Поэтому приходится использовать событие формы.

В процедуру ОбработкаВыбора формы добавить:

	// {1c-aspect; rybakov@1c-aspect.ru; Начало 22.05.2018}
	Если ИсточникВыбора.ИмяФормы = "Документ.уатПоступлениеТоваровУслуг.Форма.ФормаВыбора" Тогда
		Если НЕ aspect_НомерСтрокиПоступления = Неопределено Тогда
			Объект.Затраты[aspect_НомерСтрокиПоступления - 1].aspect_Поступление = ВыбранноеЗначение;
			Модифицированность = Истина;
		КонецЕсли;
		// {1c-aspect; rybakov@1c-aspect.ru; Конец 22.05.2018}
	КонецЕсли;

 

Скачать файлы

Наименование Файл Версия Размер
Пример
.dt 42,59Kb
24.05.18
0
.dt 42,59Kb Скачать

См. также

Автор запретил комментарии