Имя: Пароль:
1C
 
Функциональные параметры в 1С
, ,
0 Ненавижу 1С
 
гуру
10.12.10
10:51
1. Это нужная вещь 0% (0)
2. Не надо нам этого 0% (0)
3. Что это вообще? 0% (0)
4. Автор, пишите ещё! 0% (0)
Всего мнений: 0

К сожалению в 1С нет функциональных типов, но можно извратится и написать:


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

фигня скажете? будете правы, но сам цикл и оператор условия писать не нужно! Пример использования:


Параметр = Новый Структура("Сумма,УсловиеСкидки",0,УсловиеСкидки);
ДляКаждогоИзКоллекции(Товары,"Параметр.Сумма=Параметр.Сумма+Элемент.Сумма;","Элемент.ПроцентАвтоматическихСкидок+Элемент.ПроцентСкидкиНаценки>=Параметр.УсловиеСкидки",Параметр);
СуммаСБольшимиСкидками = Параметр.Сумма;

ну и еще подобные процедуры:


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

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