Вывод номеров договоров в список контрагентов. УНФ3

Клиент попросил выводить номера договоров в форму справочника договоров. Выглядит так:

Пример работы с событием получения данных динамического списка есть на сайте от самой 1С. И конечно же, там демонстрируется неуважение к разработчикам — код представлен в виде картинки. Перепечатают, чай не сеньоры:

Простая задача, но пришлось немного повозиться, было несколько нюансов.

Длина поля определяется длиной строки в запросе, поэтому она длинная.

Немного пришлось поработать с запросами с итогами, уже забыл как с ними работать.

Также не нашел, как указать для формы событие, назначил его программно, но сразу не заработало, потому что не было нужной директивы &НаСервереБезКонтекста.

В итоге получился такой код расширения формы списка контрагентов:


&НаСервере
Процедура мл_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	Маркер = "Контрагенты.ИНН КАК ИНН";
	Замена = " ""                                                                                                 "" Как мл_Договора, Контрагенты.ИНН КАК ИНН ";

	//Защита от многократного открытия
	Если Найти(Список.ТекстЗапроса, Замена) = 0 Тогда
		
		Список.ТекстЗапроса = СтрЗаменить(Список.ТекстЗапроса, Маркер, Замена);

		//ДобавляемыеРеквизиты = Новый Массив;
		//ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("мл_Договора", Новый ОписаниеТипов("Строка"), "Список" ,"Договора", ложь));
		//ИзменитьРеквизиты(ДобавляемыеРеквизиты);
		
		Привязка = Элементы.КодПоОКПО;
		Элемент = Элементы.Вставить("мл_Договора", Тип("ПолеФормы"), Привязка.Родитель, Привязка);
	    Элемент.Вид = ВидПоляФормы.ПолеВвода;
	    Элемент.ПутьКДанным = "Список.мл_Договора";
		Элемент.Заголовок = "Договора";
		Элемент.АвтомаксимальнаяШирина = ложь;
		Элемент.РастягиватьПоГоризонтали = ложь;
		Элемент.Ширина = 12;
		
		
	КонецЕсли;  
	
	Элементы.Список.УстановитьДействие("ПриПолученииДанныхНаСервере", "мл_Список_ПриПолученииДанныхНаСервере");
	
КонецПроцедуры                                   

&НаСервереБезКонтекста
Процедура мл_Список_ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) Экспорт
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.Владелец КАК Владелец,
	|	Т.Ссылка КАК Ссылка,
	|	Т.НомерДоговора КАК НомерДоговора
	|ИЗ
	|	Справочник.ДоговорыКонтрагентов КАК Т
	|ГДЕ
	|	Т.Владелец В(&Контрагенты) И НЕ Т.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерДоговора
	|ИТОГИ ПО
	|	Т.Владелец"); 
	З.УстановитьПараметр("Контрагенты", Строки.ПолучитьКлючи());
	
	ВыборкаКонтрагенты = З.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	Пока ВыборкаКонтрагенты.Следующий() Цикл                           
		
		//Если ВыборкаКонтрагенты.Ссылка = NULL Тогда
		//	Продолжить;
		//КонецЕсли;
		
		МассивНомеров = Новый Массив();
		
		ВыборкаНомера = ВыборкаКонтрагенты.Выбрать();
		Пока ВыборкаНомера.Следующий() Цикл                         
			ТекНомер = СокрЛП(ВыборкаНомера.НомерДоговора);
			Если ТекНомер <> "" Тогда
				мл_КлиентСервер.ДобавитьВМассивУникально(МассивНомеров, ТекНомер); //Только уникальные
			КонецЕсли;
		КонецЦикла;
		
		СтрокаСписка = Строки[ВыборкаКонтрагенты.Владелец];
		СтрокаСписка.Данные["мл_Договора"] = СтрСоединить(МассивНомеров, ",");
		
	КонецЦикла;
	
КонецПроцедуры 

В очередной раз пожалел, что не веду библиотеку работы с коллекциями, вот эту функцию написал заново с нуля (уже не в первый раз):

Функция ДобавитьВМассивУникально(М, Зн) Экспорт
	Если М.Найти(Зн) = Неопределено Тогда
		М.Добавить(Зн);
		Возврат истина;
	КонецЕсли;         
	Возврат ложь;
КонецФункции

Среда: УНФ 3.0.6.160 Объем: 1.5 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *