Имя: Пароль:
1C
 
А как вы возращаете результат запроса, например из функции.
,
0 toran1
 
01.04.16
08:23
Доброго.
Поделитесь, кому не жалко, своим примером как вы возвращаете результат запроса из функции.
Ну например выделили часть кода с запросом в некую функцию или в процедуру.
Что возвращаете в основную ветку кода?
1 Strogg
 
01.04.16
08:25
Непонятен вопрос.
1) ТекстЗапроса (если динамически формируется)
2) фрагмент текста запроса
3) Выборка
4) ТЗ.
Выбирай на вкус.
2 Asmody
 
01.04.16
08:26
Чаще всего Выполнить()
3 Мэс33
 
01.04.16
08:28
(1) спрашивает не "что возвращаете", а "как".
4 Strogg
 
01.04.16
08:31
(3) хмхм, "Что возвращаете в основную ветку кода?" тогда яннп)))
5 Ёпрст
 
01.04.16
08:34
(0)
return false;
6 Рэйв
 
01.04.16
08:35
(0)Возвращай результат выполнения, а там уж сам решишь что с ним делать - в тз выгружать или обходить выборкой.
7 Fedor-1971
 
01.04.16
08:41
(3) так "как" только один вариант Возврат ХХХХ;
(0) то зачем создал функцию, например, откорректированный текст запроса, результат выполнения запроса, структуру (с некой интерпретацией тог, что выбрал мне запрос, например нужные реквизиты контрагента для печатной формы накладной)
8 Мэс33
 
01.04.16
08:45
(4) ну..."Поделитесь ... как вы возвращаете результат запроса из функции. "
9 Strogg
 
01.04.16
08:53
(8) эмммм, если вопрос "Как", то только с помощью Возврат ХХХ. Других способов я не знаю :)
10 Мэс33
 
01.04.16
08:59
(0)
Автор хочет понять, как выделять (когда это нужно делать) кусок кода в функцию, и что лучше возвращать (то ли голую ТЗ, то ли уже обработанную ТЗ, то ли результат запроса и т.д.).

Сперва-наперво, выделять в функцию нужно тогда, когда ты этой функцией пользуешься больше чем два раза, чтобы хотя бы уменьшить копипасту.

А там потом смотришь. Если частая операция - это сгенерить текст запроса по определенным параметрам, то пишешь функцию, которая умеет генерить текст запроса и возвращает его. Если функция должна что-то рассчитать, то сам понимаешь, что вернешь.
11 Мэс33
 
01.04.16
08:59
(0) + (10)
Почитай "Совершенный код" Макконнелла.
12 Mort
 
01.04.16
09:01
"Сперва-наперво, выделять в функцию нужно тогда, когда ты этой функцией пользуешься больше чем два раза"

Вы наверное какой-то другой совершенный код читали.
13 Mort
 
01.04.16
09:05
А возрвращать стоит результат запроса. А организация выборки и обход лучше читается в одной функции имхо.
14 Mort
 
01.04.16
09:06
Текст запроса тоже стоит в отдельную функцию, если не 3 строки, конечно.
15 Тролль главный
 
01.04.16
09:07
//этот запрос ВСЕГДА содержит ОДНУ строку, такое бывает
Возврат Запрос.Выполнить().Выгрузить()[0].Сумма;
16 Мэс33
 
01.04.16
09:08
(12) обычно бывает, пишешь код, и вдруг возникает необходимость часть кода повторить. Не уверен, что прогер начинает сразу же заниматься рефакторингом, он сделает однозначно копипасту.
А вот если уже в третий раз вызываешь один и тот же кусок кода - надо задуматься.
Читал все правильно, но это всего лишь авторитетное мнение, а есть личный опыт.
17 Smile 8D
 
01.04.16
09:46
(16) Зависит от конкретной ситуации, но по возможности стараюсь сразу вместо копипасты выделять в отдельную сущность, т.к. понимаю, что при копипасте резко вырастает вероятность ошибки, когда в одном куске кода исправят, а в другом нет. И искать косяк в такой ситуации зачастую неудобно.
18 Маратыч
 
01.04.16
09:48
(16) Угу, я тут уже год неспешно за предыдущим кодЫром копипасту подчищаю. Почти все доработки рефакторинга требуют из-за костылей и лютой копипасты.
19 toran1
 
01.04.16
09:51
(2) И какой тип данных тогда перебегает при таком варианте?
20 Маратыч
 
01.04.16
09:52
(19) РезультатЗапроса.
21 Мэс33
 
01.04.16
11:32
(18) у тебя, видимо, есть на это время).
Я работал в жестоком цейтноте. Приходилось не думать о красивом коде.
22 Мэс33
 
01.04.16
11:32
(21) это было три года назад.
23 Мэс33
 
01.04.16
11:33
(17) конечно - все зависит от ситуации. Всегда надо искать некий компромисс между внутренним перфекционизмом и желаниями заказчика.
24 Маратыч
 
01.04.16
11:35
(21) Да, в свободное время допиливаю, благо авралы у нас крайне редки, все делается основательно и не спеша, с удвоенными сроками :)
25 Мэс33
 
01.04.16
11:40
(24) тогда о чем разговор )
если есть время - делаешь красиво под чаек с печеньками.
26 rs_trade
 
01.04.16
11:40
Функция НапримерПолучитьНоменклатуруПоАртикулу(Артикул)

    Результат = Справочник.Номенклатура.ПустаяСсылка();

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
        |Номенклатура.Ссылка
        |    ИЗ
        |Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Артикул = &Артикул";

    Запрос.УстановитьПараметр("Артикул", Артикул);

    Выборка = Запрос.Выполнить().Выбрать();

    Если Выборка.Следующий() тогда
        Результат = Выборка.Ссылка;
    КонецЕсли;

    Возврат Результат;

КонецФункции
27 Мэс33
 
01.04.16
11:41
(24) я правда уже 10 месяцев 1С не открывал. Там наверное - ОЧЕНЬ МНОГО НОВОГО УЖЕ ВЫШЛО?
28 Тролль главный
 
01.04.16
11:48
(26) слишком много кода у тебя, смотри:

Функция НапримерПолучитьНоменклатуруПоАртикулу(Артикул)
    
    ТекстЗапроса = "ВЫБРАТЬ
                   |    ЕСТЬNULL(МАКСИМУМ(Номенклатура.Ссылка),ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура.Артикул = &Артикул";
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Артикул", Артикул);

    Возврат Запрос.Выполнить().Выгрузить()[0].Ссылка;
    
КонецФункции
29 rs_trade
 
01.04.16
11:50
(28) не люблю в одну строку много пихать.
30 Маратыч
 
01.04.16
11:50
(29) Эт разве много.
31 Тролль главный
 
01.04.16
11:51
(29) я просто троллю понемногу
32 Мэс33
 
01.04.16
11:55
(26) косяк - а если по артикулу запрос вернет больше одной строки.

Что будете тогда делать? )))
33 Карупян
 
01.04.16
11:56
(32) там максимум
34 rs_trade
 
01.04.16
11:57
(32) началось мля. это пример оформления кода функции, а не рабочая функция.
35 Мэс33
 
01.04.16
11:57
(33) ну и? если в справочнике два товара с одинаковым артикулом?
36 Мэс33
 
01.04.16
11:58
(34) не матерись, dude
37 Мэс33
 
01.04.16
11:58
(34) давай рабочую функцию)
38 Маратыч
 
01.04.16
11:59
(35) Проблемы негров шерифа не сношают :)

По-хорошему, там не МАКСИМУМ надо, а проверку количества в выборке и злобный мат пользуну, когда количество >1
39 mikecool
 
01.04.16
12:00
(9) через параметры же
40 Мэс33
 
01.04.16
12:04
(38) куда ты проверку вставишь?
- прямо в самой функции проверишь и матернешься?
- или функция вернет результат запроса (неважно, ТЗ это будет или сам результат запроса), а потом уже в основном коде проверишь, что блин - повторяются артикулы?
41 rs_trade
 
01.04.16
12:13
(37) вот рабочая функция

Функция НапримерПолучитьНоменклатуруПоАртикулу(Артикул)

    Результат = Справочники.Номенклатура.ПустаяСсылка();

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |";

    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
        
        Если Выборка.Ссылка.Артикул = Артикул Тогда
            Результат = Артикул;
        КонецЕсли;
        
    КонецЦикла;

    Возврат Результат;

КонецФункции
42 Маратыч
 
01.04.16
12:15
(40) Канеш, не в самой функции. Я все-таки стараюсь соблюдать клиент-серверную архитектуру, нечего клиентскому коду делать в потенциально серверной функции.
43 Мэс33
 
01.04.16
12:21
(41) это профессиональный юмор такой?
44 Маратыч
 
01.04.16
12:23
(41) Бгеге, это прекрасно %)
45 Dotoshin
 
01.04.16
12:47
(41) Уверен, что рабочая?
46 Мыш
 
01.04.16
13:00
(41) Неправильная функция. В выборке надо было в табличный документ писать ссылку и артикул, а потом уже делать по нему поиск. Эх, маладежь!
47 rs_trade
 
01.04.16
13:00
(45) Есть конечно одна маленькая ошибка. Поторопился.

В цикле Результат = Выборка.Ссылка должно быть.

А все остальное хорошо.
48 Мэс33
 
01.04.16
13:02
(46) я так и делаю. Загоняю в ТЗ, потом ее перебираю)))
49 rs_trade
 
01.04.16
13:03
(48) Еще важно поля не в запросе выбирать, а через ссылку к ним обращаться.
50 Мыш
 
01.04.16
13:03
(48) Вы сообразительны, но невнимательны. Именно в "табличный документ" надо.
51 Мэс33
 
01.04.16
13:04
(50) мм, да, пятница же ))).
Ну у вас вариант получше.
52 Dotoshin
 
01.04.16
13:09
(47) Еще одна ошибка есть.
53 Маратыч
 
01.04.16
13:13
(52) Ну логическая уже упоминалась, что если есть номенклатура с одинаковым артикулом, это не будет учтено и результатом будет последняя найденная ссылка. А еще какие?
54 Dotoshin
 
01.04.16
13:17
(53) Извиняюсь, первую строку не увидел...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн