Имя: Пароль:
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 Цикл
       Элемент = Коллекция[-й];
       Усл = Вычислить(Условие);
       Если Усл Тогда
           Коллекция.Удалить(-й);    
       КонецЕсли;    
   КонецЦикла;
КонецПроцедуры
1 КМ155
 
10.12.10
10:51
(0) лавры Г1С покоя не дают ?

Автор, пишите ещё!
2 Ненавижу 1С
 
гуру
10.12.10
10:53
(1) угадал ))
3 Defender aka LINN
 
10.12.10
10:53
Тебя Г1С покусал?

Что это вообще?
4 ДенисЧ
 
10.12.10
10:53
Поздравляю, ты прочитал Банду четырёх...

Автор, пишите ещё!
5 КМ155
 
10.12.10
10:55
(2) ступай на дубовый форум и ипи ему(форуму и Г1С) мозги
6 Ненавижу 1С
 
гуру
10.12.10
11:02
хочу как в C#
к сожалению разные коллекции 1С даже не придерживаются единых именований методов
7 Ненавижу 1С
 
гуру
10.12.10
11:04
(1)(3)(5) а что это вы его вспомнили?
8 budanila
 
10.12.10
11:06
(0)неплохо))

Автор, пишите ещё!
9 Лефмихалыч
 
10.12.10
11:07
(7) не только они
10 Wingless
 
10.12.10
11:09
Ага, и в духе типовых от 1С сделать хрень из (0) формируемой из 8 вложенных вызовов.

Не надо нам этого
11 Defender aka LINN
 
10.12.10
11:10
(7) Та тоже велокаты всяческие изобретал...
12 Jolly Roger
 
10.12.10
11:19
делегаты, конечно, не помешали бы, но примеры в (0), действительно в духе Г1С...

Автор, пишите ещё!
13 Ненавижу 1С
 
гуру
10.12.10
11:23
(12) ну а как по другому реализовать делегаты в 1С?
14 Ненавижу 1С
 
гуру
10.12.10
11:40
Почему не во всех коллекциях есть Скопировать()?
трудно было сделать единоообразно?
15 Defender aka LINN
 
10.12.10
11:46
(14) Что этот метод должен сделать с табличной частью, например?
16 Ненавижу 1С
 
гуру
10.12.10
11:51
(15) C# например в самую универсальную - массив
ну тут можно или в массив, или в ТЗ
это не проблема
17 Defender aka LINN
 
10.12.10
11:58
(16) Вообще-то, "скопировать" подразумевает получение копии объекта. Ну, хотя бы из названия это следует. А у тебя получится совсем другой объект. ВНЕЗАПНО как-то.
18 Ненавижу 1С
 
гуру
10.12.10
12:19
(17) это лучше чем ничего
кстати, о ТЧ, почему они этот тип изобрели просто загадка какая то, нельзя было объявить что объект имеет ТЗ согласно ТЧ
то есть когда пишешь
Объект = Документы.Татата.СоздатьДокумент();
Товары = Объект.Товары; //почему не ТЗ? неужели не могли упростить?
насоздавали понимаешь 9000 типов

опять почему вместо вот этих

Документы.Татата.СоздатьДокумент()
Справочники.Прапрапра.СоздатьЭлемент()
Справочники.Прапрапра.СоздатьГруппу()

не писать единообразно:
Новый Документы.Татата() //новый документ
Новый Справочники.Прапрапра() //новый элемент
Новый Справочники.Прапрапра(Ложь) //новый элемент
Новый Справочники.Прапрапра(Истина) //новая группа
19 Defender aka LINN
 
10.12.10
12:24
(18) В ТЗ, знаете ли, можно состав колонок, например, менять...
Вообще говоря, меня почему-то жутко раздражают люди, которые начинают ныть, что "в 1С все не так, как в C/C++/C#/MSSQL/Oracle/php...". Не нравится - звиздуйте кодить на те языки, где все это есть.
20 Ненавижу 1С
 
гуру
10.12.10
12:36
(19) кстати собираюсь

по теме:
все верно, но ведь можно выделить и общие вещи, наконец тупо в параметре передавать параметр КолонкиРидОнли, объявить просто что будет исключение и т.д. и т.п.
масса вариантов!
21 Defender aka LINN
 
10.12.10
12:37
(20) Угу. Вот потом весело - получаешь ТЗ и хрен угадаешь, что это - то ли обычная таблица, то ли табличная часть... Тип-то один и тот же.
22 Ненавижу 1С
 
гуру
10.12.10
12:43
(21) и тут легко обходится, достаточно параметра Владелец, которого как это ни странно нет у ТЧ, а должно бы быть
23 Defender aka LINN
 
10.12.10
12:48
(22) Какой, нахрен, _параметр_ у ТЗ? Ты какое-то монстроподобное угробище хочешь.
Учитесь пользоваться тем, что есть.
24 Ненавижу 1С
 
гуру
10.12.10
12:52
обычный атрибут )) какой уж тут монстр
вот почему у ТЧ его нет? а ведь он как private есть (иил через события), но мы его не видим - ведь если ТЧ изменить меняется модифицированность объекта
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший