Имя: Пароль:
1C
1С v8
Как из функции возвратить несколько значений?
Ø (Волшебник 31.07.2017 11:29)
0 33554432
 
31.07.17
10:41
Как из функции возвратить несколько значений?
1 Amra
 
31.07.17
10:41
Возвращай массив
2 Mankubus
 
31.07.17
10:42
(0) помести их в какую-нибудь сущность. например структуру
3 Жан Пердежон
 
31.07.17
10:42
возвращай коллекцию
4 aleks_default
 
31.07.17
10:44
возвращайся в первую профессию
5 Basilio
 
31.07.17
10:46
инициализируй переменные до вызова функции и передавай их в процедуру. В процедуре присваивай этим параметрам нужные значения.
6 Волшебник
 
модератор
31.07.17
10:48
Зачем?
7 igorPetrov
 
31.07.17
10:52
(0) Переделать алгоритм?
8 Basilio
 
31.07.17
10:53
создай новый справочник по имени функции, добавь реквизиты с названиями значений. Внутри функции создавай новый элемент, присваивай реквизитам значения и возвращай элемент справочника. В базу можно не записывать.
9 33554432
 
31.07.17
10:53
Ладно, сделал 2 функции вместо одной. Криво, но работает )
10 Жан Пердежон
 
31.07.17
10:55
(9) я в тебе не сомневался
11 lodger
 
31.07.17
10:59
(9) https://sc.mogicons.com/share/genius-158.jpg
это еще и серверные контекстные вызовы с клиента небось...
12 Chameleon1980
 
31.07.17
10:59
да уж
13 Гипервизор
 
31.07.17
11:00
И прекрасно масштабируется если чо. Всего лишь добавить n+1 функций.
14 Ц_У
 
31.07.17
11:01
(0) используй процедуру, передавай ей параметры для изменения
15 33554432
 
31.07.17
11:01
(11)
да а что?
16 oslokot
 
31.07.17
11:02
(14) поздно - (9)
17 Basilio
 
31.07.17
11:02
(9) Программирование методом копирования-вставки (copy-paste) — распространённый анти-паттерн (ловушка) при написании кода, под которым обычно понимают многократное копирование (с последующей правкой) существующего кода вместо создания общих решений.
Проверь, у тебя не этот случай?
18 lodger
 
31.07.17
11:05
(15) однажды, я видел как форма клиента шпарила серверные вызовы со скоростью под тысячу в минуту. и это у меня тестовая машина сильная, да канал широкий, хз сколько времени занимала на обычных компах обработка таб.файла на 15-20 тысяч строк.
19 lodger
 
31.07.17
11:07
+(18) и это в конфе 1с:совместимо от франча которому "доверяют более 150 000 клиентов".
20 33554432
 
31.07.17
11:18
(17)
да у меня примерно такая же скорость выходит, но строк не больше 100 в этих местах. 10 сек тоже заказчику не понравится, но главное чтоб работало все таки.
21 33554432
 
31.07.17
11:21
Кстати, вот мой код. Оптимизируйте, кто сколько может...

для каждого стр из этаформа.СтоимостьРейсовДляЗаказчиков цикл
стр.РедактируемаяСтоимость=ДанныеСтроки1(этаформа.ТекРаспределение,стр.заказчик,стр.маршрут);
стр.Формула =ДанныеСтроки2(этаформа.ТекРаспределение,стр.заказчик,стр.маршрут);
конеццикла;

КонецПроцедуры

функция ДанныеСтроки1(ТекРаспределение,заказчик,маршрут)
з=новый запрос;
з.текст="ВЫБРАТЬ
| МаршрутныйЛистЗаказчики.Ссылка,
| МаршрутныйЛистЗаказчики.Заказчик,
| МаршрутныйЛистЗаказчики.НовыйРасчет,
| МаршрутныйЛистЗаказчики.Формула,
| МаршрутныйЛистЗаказчики.Ссылка.Маршрут
|ИЗ
| Документ.МаршрутныйЛист.Заказчики КАК МаршрутныйЛистЗаказчики
|ГДЕ
| МаршрутныйЛистЗаказчики.Ссылка.РаспределениеЗаявокПоМаршрутам = &РаспределениеЗаявокПоМаршрутам
| И МаршрутныйЛистЗаказчики.Заказчик = &Заказчик
| И МаршрутныйЛистЗаказчики.НовыйРасчет > 0
| И МаршрутныйЛистЗаказчики.Ссылка.Маршрут = &Маршрут";
з.установитьпараметр("РаспределениеЗаявокПоМаршрутам",этаформа.ТекРаспределение);
з.установитьпараметр("Заказчик",заказчик);
з.установитьпараметр("маршрут",маршрут);
итогз=з.Выполнить().Выгрузить();
если итогз.Количество()>0 тогда
возврат итогз[0].НовыйРасчет;
иначе
возврат 0;
конецесли;


конецфункции

функция ДанныеСтроки2(ТекРаспределение,заказчик,маршрут)
з=новый запрос;
з.текст="ВЫБРАТЬ
| МаршрутныйЛистЗаказчики.Ссылка,
| МаршрутныйЛистЗаказчики.Заказчик,
| МаршрутныйЛистЗаказчики.НовыйРасчет,
| МаршрутныйЛистЗаказчики.Формула,
| МаршрутныйЛистЗаказчики.Ссылка.Маршрут
|ИЗ
| Документ.МаршрутныйЛист.Заказчики КАК МаршрутныйЛистЗаказчики
|ГДЕ
| МаршрутныйЛистЗаказчики.Ссылка.РаспределениеЗаявокПоМаршрутам = &РаспределениеЗаявокПоМаршрутам
| И МаршрутныйЛистЗаказчики.Заказчик = &Заказчик
| И МаршрутныйЛистЗаказчики.НовыйРасчет > 0
| И МаршрутныйЛистЗаказчики.Ссылка.Маршрут = &Маршрут";
з.установитьпараметр("РаспределениеЗаявокПоМаршрутам",этаформа.ТекРаспределение);
з.установитьпараметр("Заказчик",заказчик);
з.установитьпараметр("маршрут",маршрут);
итогз=з.Выполнить().Выгрузить();
если итогз.Количество()>0 тогда
возврат итогз[0].формула;
иначе
возврат "";
конецесли;


конецфункции
22 lodger
 
31.07.17
11:22
2 запроса в одном цикле. сильно.
23 Ёпрст
 
гуру
31.07.17
11:23
(21) Че тут оптимизировать то ?
Всё в топку.
Запрос должен быть, один, а не для каждой строки свой.
24 Волшебник
 
модератор
31.07.17
11:23
(21) Здесь лучше одной функцией для всей табличной части
25 zvial
 
31.07.17
11:24
(21) ТС постоянный автор омнокод.ру?
26 33554432
 
31.07.17
11:25
(24)
может шаблон есть для похожего случая?
28 33554432
 
31.07.17
11:27
(27)
у меня самописка
Программист всегда исправляет последнюю ошибку.