Имя: Пароль:
1C
1С v8
Когда правильно выносить функцию в общий модуль
0 Scorp1985
 
06.08.13
11:55
Добрый день!

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

Функция ПосчитатьБаланс(СуммаСписания, СуммаСписанияБыла, Контрагент)
    Фильтр = Новый Структура;
    Фильтр.Вставить("Контрагент", Контрагент);
    Баланс = РегистрыНакопления.БалансКонтрагентов.Остатки( , Фильтр, , "Баланс").Итог("Баланс") - СуммаСписания + СуммаСписанияБыла;
    Возврат(Баланс);
КонецФункции

Вопрос: целесообразно ли выносить её в общий модуль, какие параметры использовать (флажки какие, надо ли "Экспорт")?
А также как обратиться к ней из модуля формы?

Спасибо за помощь!
1 Maxus43
 
06.08.13
11:57
Целесообразно вынести + сделать запросом.
Экспорт надо
2 Fish
 
06.08.13
11:57
(1) +100.
3 exwill
 
06.08.13
11:58
+(1) +ПовторноеИспользование
4 Scorp1985
 
06.08.13
12:00
(1) А как к ней обратиться из модуля формы документа?
Нужно её сделать &НаСервереБезКонтекста ?
5 Maxus43
 
06.08.13
12:01
ну и определится на сервере или клиенте делать
6 Maxus43
 
06.08.13
12:01
(4) да, без контекста, раз не нужны данные формы
7 Sorm
 
06.08.13
12:03
(1) +
8 Maxus43
 
06.08.13
12:03
хм, УФ - там может быть сложней
9 dervishsy
 
06.08.13
12:04
(0)Есть такой принцип в разработке ПО называется Don’t Repeat Yourself (DRY, рус. Не повторяйся).
wiki:Don%27t_repeat_yourself

Говорят помогает.
10 1Сергей
 
06.08.13
12:05
дурацкая какая-то функция... берёт остатки и прибавляет-отнимает переданные параметры.
Тебе не казалось, что функция должна решать более глобальную задачу?
11 Scorp1985
 
06.08.13
12:07
(8) Да, УФ у меня
(10) Я совсем начинающий) Вообще, цель функции выдернуть данные из регистра. Вычитать и прибавлять решил уже на форме.

Остались вопросы по галкам у общего модуля и способу обращения к функции из модуля документа.
12 Maxus43
 
06.08.13
12:07
(10) нести мир и процветание в общество?)
13 Maxus43
 
06.08.13
12:08
(11) Будет запрос - значит модуль серверный, без контекста
14 zak555
 
06.08.13
12:08
что такое баланс контрагента ?
15 Scorp1985
 
06.08.13
12:09
(14) Это регистр накопления, у него есть измерение Контрагент и ресурс Баланс.
16 Maxus43
 
06.08.13
12:10
(14) самописный РН. типа взаиморасчетов с контрагентами видимо
17 Scorp1985
 
06.08.13
12:10
(13) С запросами у меня плоховато) Особенно к регистрам...
18 Cube
 
06.08.13
12:12
(17) Юзай конструктор запросов. Там почти всё мышкой....
19 Maxus43
 
06.08.13
12:12
(17) в любом случае на сервере, ибо Остатки - только тама
20 Scorp1985
 
06.08.13
12:14
Убрал из функции мусор,

&НаСервереБезКонтекста
Функция ПолучитьБаланс(Контрагент) Экспорт
    Фильтр = Новый Структура;
    Фильтр.Вставить("Контрагент", Контрагент);
    Баланс = РегистрыНакопления.БалансКонтрагентов.Остатки( , Фильтр, , "Баланс").Итог("Баланс");
    Возврат(Баланс);
КонецФункции

Кто-нибудь может помочь с заменой на запрос?)
21 1Сергей
 
06.08.13
12:15
(20) оставь как есть. не нужен тут запрос
22 Scorp1985
 
06.08.13
12:16
(21) Осталось разобраться почему у меня

{Документ.СписаниеСРасчетногоСчета.Форма.ФормаДокумента.Форма(23,31)}: Процедура или функция с указанным именем не определена (ПолучитьБаланс)
    ЭтаФорма.БалансКонтрагента = <<?>>ПолучитьБаланс(Объект.Получатель) - Объект.СуммаСписания + ЭтаФорма.СуммаСписанияБыла; (Проверка: Тонкий клиент)
23 Maxus43
 
06.08.13
12:17
ИмяОбщегоМодуля.ПолучитьБаланс
24 1Сергей
 
06.08.13
12:17
(22) Имя общего модуля забыл написать
25 Scorp1985
 
06.08.13
12:20
(23) (24) {Документ.СписаниеСРасчетногоСчета.Форма.ФормаДокумента.Форма(23,31)}: Переменная не определена (РаботаСРегистрами)
    ЭтаФорма.БалансКонтрагента = <<?>>РаботаСРегистрами.ПолучитьБаланс(Объект.Получатель) - Объект.СуммаСписания + ЭтаФорма.СуммаСписанияБыла; (Проверка: Тонкий клиент)
26 Lama12
 
06.08.13
12:21
(3) А я б не стал :)
Остатки штука такая, которую повторным использованием лучше не тянуть.
27 Cube
 
06.08.13
12:21
(20) Как-то так:

&НаСервереБезКонтекста
Функция ПолучитьБаланс(Контрагент) Экспорт
    
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    БалансКонтрагентов.БалансОстаток
                          |ИЗ
                          |    РегистрНакопления.БалансКонтрагентов.Остатки(, Контрагент = &Контрагент) КАК БалансКонтрагентов");
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат (Выборка.Следующий(), Выборка.БалансОстаток, 0);
    
КонецФункции
28 Scorp1985
 
06.08.13
12:22
(25) Я так понимаю дело во флажках в свойствах модуля, может что мне нужно в моём случае?)

(27) И всё же, какие плюсы/минусы использования запроса?
29 Cube
 
06.08.13
12:23
+(27) Очепятка:

Вместо Возврат (Выборка.Следующий(), Выборка.БалансОстаток, 0);

Надо Возврат ?(Выборка.Следующий(), Выборка.БалансОстаток, 0);
30 Maxus43
 
06.08.13
12:23
(25) галка Вызов Сервера стоит у модуля?
31 Maxus43
 
06.08.13
12:23
(28) запрос - по феншую, привыкай к хорошему сразу
32 Cube
 
06.08.13
12:24
(28) "И всё же, какие плюсы/минусы использования запроса?"
v8: Как поставить такое условие? пост 63. Можешь переделать код под свою задачу и сравнить.
33 Scorp1985
 
06.08.13
12:31
(29) Это не опечатка, это моё невежество)) поэтому прошу объяснить почему так?)
34 Cube
 
06.08.13
12:33
(33) Что?
35 Scorp1985
 
06.08.13
12:33
(30) Спасибо, заработало =) пошёл читать факи по галкам)
36 Scorp1985
 
06.08.13
12:45
(34) Зачем там "?" ??
37 Scorp1985
 
06.08.13
12:48
Блин, вернул в общем обратно, без запроса. Нет в нём смысла тут.

теперь новая беда, уже при отладке...:

{Документ.СписаниеСРасчетногоСчета.Форма.ФормаДокумента.Форма(21)}: Метод объекта не обнаружен (ПолучитьБаланс)
    ЭтаФорма.БалансКонтрагента = РаботаСРегистрами.ПолучитьБаланс(Объект.Получатель) - Объект.СуммаСписания + СуммаСписанияБыла;
38 Cube
 
06.08.13
12:48
(36) Это условие:

МояПеременная = ?(Условие, Значение_Истина, Значение_Ложь);

Равнозначно этому

Если Условие Тогда
    МояПеременная = Значение_Истина;
Иначе
    МояПеременная = Значение_Ложь;
КонецЕсли;
39 Cube
 
06.08.13
12:49
(37) "Нет в нём смысла тут"
С умным видом говорил?
40 Scorp1985
 
06.08.13
12:50
(39) Нет, просто конфига настолько банальная, что мне так проще)) С очень глупым видом говорил)
41 GROOVY
 
06.08.13
12:51
В общем модуле директивы компиляции как бы не по феншую.
42 Любопытная
 
06.08.13
12:51
ТС - реинкарнация Товарища ЛивингСтар, или мне только кажется?
43 Cube
 
06.08.13
12:51
(40) "мне так проще"
А, ну сразу бы так и сказал: "Я лентяй, ничего не умею и учиться ничему не хочу"... :)
44 Scorp1985
 
06.08.13
12:53
(43) Исправился, вернул запрос :D Я его просто не понимал. пока не объяснили про условие))

Осталось выпросить у кого-нибудь, почему

{Документ.СписаниеСРасчетногоСчета.Форма.ФормаДокумента.Форма(21)}: Метод объекта не обнаружен (ПолучитьБаланс)
    ЭтаФорма.БалансКонтрагента = РаботаСРегистрами.ПолучитьБаланс(Объект.Получатель) - Объект.СуммаСписания + СуммаСписанияБыла;
45 Cube
 
06.08.13
12:55
(44) Забыл написать слово ЭКСПОРТ у функции?
46 GROOVY
 
06.08.13
12:58
(44) Убери директивы компиляции в общем модуле.
47 1Сергей
 
06.08.13
12:59
(44) и что там с галками общего модуля?
48 Scorp1985
 
06.08.13
13:03
(45) Экспорт написал
(46) Поподробнее, пожалуйста. не владею терминологией)
(47) Стоят только "Сервер", "Вызов сервера"
49 GROOVY
 
06.08.13
13:04
&НаСервереБезКонтекста в общем модуле - это бред.
50 GROOVY
 
06.08.13
13:04
Директивы компиляции имеют смысл только в моделях упр форм и команд.
51 Любопытная
 
06.08.13
13:04
(48) директивы компиляции это те которые #НаКлиенте, #НаСервере и т.д.
Если только модуль выполняется только на сервере, значит в форме надо уйти на сервер, а потом уже вызывать процедуру этого модуля
52 Любопытная
 
06.08.13
13:05
О, соврала)
53 Scorp1985
 
06.08.13
13:05
(51) приятно видеть))
(51) (50) спасибо)
54 Scorp1985
 
06.08.13
13:08
Всё, добил, пошёл приводить в порядок модули форм =)
Всем огромное спасибо, по учебникам учиться скучно, а в режиме диалога приятно и познавательно!
55 GROOVY
 
06.08.13
13:08
(51) Это инструкции препроцессору.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс