1С: Поиск в списке выбора

Вообще поиск в списке выбора уже в 1С реализован штатно. Но! как всегда со своими нюансами (видимо в угоду универсальности). А именно: поиск ведется только по началу строки. Если же хочется чтоб поиск был более «умный». то можно навесить на событие «АвтоПодбор» свою реализацию. Например такую:

&НаКлиенте
Процедура ШаблонДокументаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	Результат=Новый СписокЗначений();
	для каждого стр из Элементы.ШаблонДокумента.СписокВыбора цикл
		если СтрНайти(ВРег(Строка(стр.Представление)),ВРег(Текст))<>0 тогда
			Результат.Добавить(стр.Значение,стр.Представление,стр.Пометка,стр.Картинка);
		конецесли;
	конеццикла;	
	ДанныеВыбора=Результат;
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

1С: Вычисляемые поля в СКД

Избегаю делать отчеты через СКД, потому что спустя какое-то время, сложный отчет превращается в жуткую абракадабру, в которой потом разобраться очень трудно. Слишком всё запутано, слишком много галочек, настроек и прочего. Да, можно сделать почти всё, но для этого нужно СКД знать досконально, и пользоваться им каждый день, чтобы не забыть все нюансы. Когда же сам пишешь отчет, а не через СКД, то тут и комментарии доложишь, и логику попроще сделаешь (пусть и в ущерб производительности). Вот и сейчас, пришлось покопаться в СКД, чтобы вспомнить, как например сделать трюк, с размещением периода дат в одной ячейке. Типа вот так:

Ну а реализация на самом деле простая вышла:

1C:невозможно применить фиксированные настройки пересекаются элементы отбора

Эта ошибка может появляться, если при открытии формы списка задаётся «жесткий» отбор, который конфликтует с пользовательским отбором (выбран тот-же отбор, что и «принудительный»). Я решил эту проблему следующим образом: при открытии формы читаю пользовательские отборы, и если вижу что его отбор тот же что и назначаемый, назначаемый отключаю и вывожу сообщение о конфликте:

&НаСервере
Функция ПОлучитьОтборы()
	возврат Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();		
КонецФункции

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

	//ПодключитьОбработчикИзмененияДанных("ДокументСписок.Отбор", "ПосчитатьИтогиНаСервере", Истина);	
	ПодключитьОбработчикОжидания("ПосчитатьИтогиНаКлиенте",3,ложь);
	
КонецПроцедуры

1С: Отбор в списке выбора с предустановленным фильтром

Задача: в табличной части на форме документа давай выбирать пользователю только необходимые элементы справочнике при заполнении реквизита.

Решение:

В реквизите установим связь параметров выбора «Очищать» при каждой попытке выбора элемента:

На событие «При изменении» табличной части на форме добавить событие, которое формирует фильтр:

	НовыйПараметр = Новый ПараметрВыбора("Отбор.Суд", ЗначениеРеквизитаОбъекта(Объект.Суд, "ПризнакСуда"));
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НовыйПараметр);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.ДанныеИскаРезультат.ПараметрыВыбора = НовыеПараметры;  

И в параметрах выбора выставим:

1С: Событие по снятию галочки в фильтре формы списка

Столкнулся с интересной особенностью 1С: если на форме списка присутствуют пользовательские фильтры, и пользователь «включил/выключил» этот фильтр, то нет никакого способа это событие отловить

Единственное решение какое я придумал, это подключение обработчика ожидания при событии на открытие формы вида:

ПодключитьОбработчикОжидания("ПосчитатьИтогиНаКлиенте",3,ложь);

Ну и сам обработчик:

&НаКлиенте 
Функция ПосчитатьИтогиНаКлиенте()
	ПосчитатьИтогиНаСервере();
КонецФункции	
Функция ПосчитатьИтогиНаСервере()
	ВсеЭлементы=СписокВКоллекциюЗначений();
	ЗадолженостьПоУведомлению=0;ОстатокЗадолженности=0;ТекущаяЗадолженость=0;	
	для каждого стр из ВсеЭлементы цикл
		ЗадолженостьПоУведомлению=ЗадолженостьПоУведомлению+стр.ЗадолженостьПоУведомлению;
		ОстатокЗадолженности=ОстатокЗадолженности+стр.ОстатокЗадолженности;
		ТекущаяЗадолженость=ТекущаяЗадолженость+стр.ТекущаяЗадолженость;
	КонецЦикла;	
	элементы.Список.ПодчиненныеЭлементы.ЗадолженостьПоУведомлению.ТекстПодвала=ЗадолженостьПоУведомлению;
	элементы.Список.ПодчиненныеЭлементы.ОстатокЗадолженности.ТекстПодвала=ОстатокЗадолженности;
	элементы.Список.ПодчиненныеЭлементы.ТекущаяЗадолженость.ТекстПодвала=ТекущаяЗадолженость;
КонецФункции

1 2 3 39