|
Как правильно реализовать инкапсуляцию в 1С на вот таком примере | ☑ | ||
---|---|---|---|---|
0
jsmith82
06.06.13
✎
15:31
|
Допустим, есть документ "Расходная накладная"
Её нужно заполнить на основании документа "Заказ покупателя" Делаем процедуру "ЗаполнитьПоЗаказу" в модуле объекта В этой процедуре происходит вызов функции "ПолучитьТоварыПоЗаказу", которая находится в модуле менеджера Если действие происходит в форме, то надо выполнить код ДокОбъект = РеквизитФормыВЗначение("Объект"); ДокОбъект.ЗаполнитьПоЗаказу(); ЗначениеВРеквизитФормы(ДокОбъект, "Объект"); Но никак не Объект.Товары.Загрузить(Документы.РасходнаяНакладная.ПолучитьТоварыПоЗаказу(Объект.Заказ)); Чо думаете |
|||
1
acsent
06.06.13
✎
15:32
|
в чем проблема то?
|
|||
2
jsmith82
06.06.13
✎
15:33
|
(1) в модуле менеджера
|
|||
3
acsent
06.06.13
✎
15:33
|
ты хочешь в форме писать
Объект.Товары.Загрузить(Документы.РасходнаяНакладная.ПолучитьТоварыПоЗаказу(Объект.Заказ)); |
|||
4
jsmith82
06.06.13
✎
15:34
|
(3) нет. я спрашиваю, правильно ли вынести функцию получения товаров в модуль менеджера
|
|||
5
acsent
06.06.13
✎
15:34
|
Если нигде не используется кроме заполнения то нет смысла
|
|||
6
acsent
06.06.13
✎
15:35
|
Тогда уж у заказа должна быть такая функция
|
|||
7
jsmith82
06.06.13
✎
15:35
|
Вот код из ут 11 в форме документа
Документы.РеализацияТоваровУслуг.ЗаполнитьПоОстаткамЗаказов( Объект, Объект.Товары, Объект.СкидкиНаценки, Склад, МассивЗаказов, Истина ); |
|||
8
jsmith82
06.06.13
✎
15:36
|
Причём "Объект" это ДанныеФормыКоллекция
|
|||
9
jsmith82
06.06.13
✎
15:38
|
А если я хочу заполнить программно, то мне надо будет открыть форму (как в ветке про жестяную жесть БИТа)
Имхо, реализация в ут 11 не совсем кошерна с точки зрения SOLID |
|||
10
rs_trade
06.06.13
✎
15:42
|
В модуле менеджера по замыслу 1С, должны содержатся методы которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации.
|
|||
11
jsmith82
06.06.13
✎
15:50
|
(10) Имхо, те методы, которые не модифицируют объект
Потому что та же Печать берёт данные экземпляров Модуль менеджера это не совсем статические методы класса, они почти всегда используют данные объекта |
|||
12
Ненавижу 1С
гуру
06.06.13
✎
15:51
|
(11) то бишь те, что у С++ обызваются const-методами?
|
|||
13
jsmith82
06.06.13
✎
15:52
|
(12) да
|
|||
14
jsmith82
06.06.13
✎
15:53
|
например, нужна групповая модификация документа
у каждого документа должен быть метод в модуле объекта МодифицироватьСебяТакТо() а процедура групповой обработки вызывает этот метод в цикле и находится в модуле менеджера |
|||
15
Ненавижу 1С
гуру
06.06.13
✎
15:53
|
(13) странно это все однако, непонятна философия развития языка 1С последнее время
|
|||
16
jsmith82
06.06.13
✎
15:55
|
(15) куда как больший баттхёрт вызывает использование этого языка в типовых конфигурациях
низкая инкапсуляция классов то объект модифицируется в модуле объекта, то в модуле менеджера, то вообще модификация происходит путём отправки реквизита формы в модуль менеджера или общий модуль |
|||
17
Ненавижу 1С
гуру
06.06.13
✎
15:56
|
(16) да с УФ стало жить гораздо веселее
|
|||
18
oleg_km
06.06.13
✎
15:57
|
(13) Для этого случая мне кажется в 1С могли бы предусмотреть модуль ссылки: типа объект, реквизиты когорого нельзя поменять. Собственно объект ссылка уже есть разрешили бы добавить в него методы и переменные пользователя
|
|||
19
jsmith82
06.06.13
✎
15:58
|
(18) согласен. получается модуль менеджера несёт две нагрузки: статические методы и константны методы
|
|||
20
Hmster
06.06.13
✎
16:05
|
просто 1С убрала ОБЪЕКТ из форм и из-за этого получается такое недопонимание
может в будущем что-нибудь подправят |
|||
21
Ненавижу 1С
гуру
06.06.13
✎
16:10
|
(18) в свое время народ сказал "нет" v8: Модуль ссылки
|
|||
22
Defender aka LINN
06.06.13
✎
16:11
|
(0) Все правильно, но только ровно наоборот.
|
|||
23
jsmith82
06.06.13
✎
16:11
|
в принципе если форма имее расширение объекта, то, конечно же, форма является одним из видом существования объекта....
поэтому, видимо, дублирование методов в модуле объекта и в модуле формы оправдано например, ЗаполнитьПоЗаказу() будет и в модуле объекта и в модуле формы |
|||
24
Defender aka LINN
06.06.13
✎
16:13
|
(23) О_о
|
|||
25
Ненавижу 1С
гуру
06.06.13
✎
16:13
|
(23) эзотерика какая-то
ДокументОбъект это тип такой, ну или класс ФормаДокумента - тоже тип, но совсем другой, не продолжение, просто другой |
|||
26
jsmith82
06.06.13
✎
16:15
|
(25) это форма существования объекта, её данные привязаны к объекту
предположим, есть процедура ЗаполнитьРеквизитыПоДоговору() Можно передевать вызов в модуль объекта, а можно разместить прямо в форме но от этого эта процедура не станет чужой модулю объекта код-то будет одинаковый! |
|||
27
jsmith82
06.06.13
✎
16:16
|
кстати, в 8.1 можно было вызвать процедуру модуля объекта без лишних напрягов наотмашь
в 8.2 приходится делать медитативные РеквизитФормыВЗначение и ЗначениеВРеквизитФормы |
|||
28
Ненавижу 1С
гуру
06.06.13
✎
16:17
|
(26) станет чужой, ибо:
1. объект не знает про форму 2. форм может быть несколько у одного объекта 3. форм у объекта может и не быть вовсе |
|||
29
Ненавижу 1С
гуру
06.06.13
✎
16:17
|
(27) это только в Managed режиме
|
|||
30
jsmith82
06.06.13
✎
16:17
|
и вот, предположим, если взять модуль какого-нибудь документа из УТ 10.3 и везде, где есть вызов модуля объекта, вставить эту медитацию РеквизитФормыВЗначение и ЗначениеВРеквизитФормы, то что получится?
|
|||
31
Defender aka LINN
06.06.13
✎
16:18
|
(26) "код-то будет одинаковый!" - особенно когда его поменяют
(27) Вообще-то для этого существует модуль менеджера. Но половина мистюков при виде него начинают орать умные слова и биться в истерике - лишь бы им не пользоваться |
|||
32
jsmith82
06.06.13
✎
16:19
|
вообще в ут 11 РеквизитФормыВЗначение и ЗначениеВРеквизитФормы используются в форме крайне редко
|
|||
33
jsmith82
06.06.13
✎
16:19
|
не более 3-4 вызовов в форме документа ЗаказКлиента И Реализация
|
|||
34
shadowfiend10
06.06.13
✎
16:20
|
я все общие для формы и модуля процедуры и функции запихиваю в менеджер
|
|||
35
Defender aka LINN
06.06.13
✎
16:21
|
(34) Ну хоть кто-то
|
|||
36
Ненавижу 1С
гуру
06.06.13
✎
16:23
|
(34) и там образуется некоторая свалка
|
|||
37
shadowfiend10
06.06.13
✎
16:25
|
(36) это в основном процедуры заполнения на основании, которые относятся к текущему типу объекта, по-моему это логичнее чем в общий модуль совать потом распределять по типам значений
|
|||
38
jsmith82
06.06.13
✎
16:25
|
давайте исходить из того, что мы не пользуемся дружественными классами и считаем, что модификация должна происходить из метода класса
поэтому, если в модуле формы происходит модификация документа, то эта процедура является методом класса... сказал и не могу понять, бред это или правда |
|||
39
jsmith82
06.06.13
✎
16:27
|
вот в 8.1 модуль объекта использовался вовсю
а в 8.2 вовсю используются дружественные классы (общие модули) почему так? непонятно |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |