Процедуры для работы с ключами связи табличных частей

//Shid

// Процедура добавляет ключ связи в табличную часть.
//
// Параметры:
//  ФормаДокумента - Управляемая Форма, содержит форму документа, реквизиты
//                 которой обрабатываются процедурой
//
Процедура ДобавитьКлючСвязиВСтрокуТабличнойЧасти(ФормаДокумента) Экспорт
	
	СтрокаТабличнойЧасти = ФормаДокумента.Элементы[ФормаДокумента.ИмяТабличнойЧасти].ТекущиеДанные;
	
	СтрокаТабличнойЧасти.КлючСвязи = СоздатьНовыйКлючСвязи(ФормаДокумента);		
	
КонецПроцедуры // ДобавитьКлючСвязиВСтрокуТабличнойЧасти()

// Процедура добавляет ключ связи в подчиненную табличную часть.
//
// Параметры:
//  ФормаДокумента - Управляемая Форма, содержит форму документа, реквизиты
//                 которой обрабатываются процедурой
//	ИмяПодчиненнойТабличнойЧасти - Строка, содержащая имя подчиненной табличной
//                 части.
//
Процедура ДобавитьКлючСвязиВСтрокуПодчиненнойТабличнойЧасти(ФормаДокумента, ИмяПодчиненнойТабличнойЧасти) Экспорт
	
	ПодчиненнаяТабличнаяЧасть = ФормаДокумента.Элементы[ИмяПодчиненнойТабличнойЧасти];
	
	СтрокаПодчиненнойТабличнойЧасти = ПодчиненнаяТабличнаяЧасть.ТекущиеДанные;
	СтрокаПодчиненнойТабличнойЧасти.КлючСвязи = ПодчиненнаяТабличнаяЧасть.ОтборСтрок["КлючСвязи"];
	
	СтрОтбора = Новый ФиксированнаяСтруктура("КлючСвязи", ПодчиненнаяТабличнаяЧасть.ОтборСтрок["КлючСвязи"]);
	ФормаДокумента.Элементы[ИмяПодчиненнойТабличнойЧасти].ОтборСтрок = СтрОтбора;
	
КонецПроцедуры // ДобавитьКлючСвязиВСтрокуПодчиненнойТабличнойЧасти()

// Функция запрещает добавление новой строки, если не выбрана строка в основной табличной части.
//
// Параметры:
//  ФормаДокумента - УправляемаяФорма, содержит форму документа, реквизиты
//                 которой обрабатываются процедурой
//	ИмяПодчиненнойТабличнойЧасти - Строка, содержащая имя подчиненной табличной
//                 части.
//
// Возвращаемое значение:
//  признак.
Функция ПередНачаломДобавленияВПодчиненнуюТабличнуюЧасть(ФормаДокумента, ИмяПодчиненнойТабличнойЧасти) Экспорт
	
	Если ФормаДокумента.Элементы[ФормаДокумента.ИмяТабличнойЧасти].ТекущиеДанные = Неопределено Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = НСтр("ru = 'Не выбрана строка основной табличной части!'");
		Сообщение.Сообщить();
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции // ПередНачаломДобавленияВПодчиненнуюТабличнуюЧасть()

// Процедура удаляет строки из подчиненной табличной части.
//
// Параметры:
//  ФормаДокумента - УправляемаяФорма, содержит форму документа, реквизиты
//                 которой обрабатываются процедурой
//	ИмяПодчиненнойТабличнойЧасти - Строка, содержащая имя подчиненной табличной
//                 части.
//
Процедура УдалитьСтрокиПодчиненнойТабличнойЧасти(ФормаДокумента, ИмяПодчиненнойТабличнойЧасти) Экспорт
	
	СтрокаТабличнойЧасти = ФормаДокумента.Элементы[ФормаДокумента.ИмяТабличнойЧасти].ТекущиеДанные;
	ПодчиненнаяТабличнаяЧасть = ФормаДокумента.Объект[ИмяПодчиненнойТабличнойЧасти];
	
	РезультатПоиска = ПодчиненнаяТабличнаяЧасть.НайтиСтроки(Новый Структура("КлючСвязи", СтрокаТабличнойЧасти.КлючСвязи));
	Для каждого СтрокаПоиска Из  РезультатПоиска Цикл
		ИндексУдаления = ПодчиненнаяТабличнаяЧасть.Индекс(СтрокаПоиска);
		ПодчиненнаяТабличнаяЧасть.Удалить(ИндексУдаления);
	КонецЦикла;
	
КонецПроцедуры // УдалитьСтрокиПодчиненнойТабличнойЧасти()

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

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

// Процедура устанавливает отбор на подчиненную табличную часть.
//
// Параметры:
//  ФормаДокумента - УправляемаяФорма, содержит форму документа, реквизиты
//                 которой обрабатываются процедурой
//	ИмяПодчиненнойТабличнойЧасти - Строка, содержащая имя подчиненной табличной
//                 части.
//
Процедура УстановитьОтборНаПодчиненнуюТабличнуюЧасть(ФормаДокумента, ИмяПодчиненнойТабличнойЧасти) Экспорт
	
	СтрокаТабличнойЧасти = ФормаДокумента.Элементы[ФормаДокумента.ИмяТабличнойЧасти].ТекущиеДанные;
	Если СтрокаТабличнойЧасти = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрОтбора = Новый ФиксированнаяСтруктура("КлючСвязи", 
	ФормаДокумента.Элементы[ФормаДокумента.ИмяТабличнойЧасти].ТекущиеДанные.КлючСвязи);
	ФормаДокумента.Элементы[ИмяПодчиненнойТабличнойЧасти].ОтборСтрок = СтрОтбора;
	
КонецПроцедуры //УстановитьОтборНаПодчиненнуюТабличнуюЧасть()

//Shi e

Last updated on 4th Feb 2023