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