1с получить реквизит формы в модуле менеджера

Доступ к реквизиту формы из модуля менеджера

Я
   user321

29.02.20 — 02:43

Как из модуля менеджера документа узнать значение реквизита(элемента, не связан с объектом) открытой формы. От этого будет зависеть логика процедуры в ММ ?

УНФ, управляемые формы.

  

Партнерская программа EFSOL Oblako

   ДенисЧ

1 — 29.02.20 — 06:08

Никак. ММ работает на сервере.

   MiniMuk

2 — 29.02.20 — 06:34

(1)  Зачем вводите в заблуждение,

его можно передать параметром

   Ненавижу 1С

3 — 29.02.20 — 14:14

(1) форма тоже частично живёт на сервере. Но дело не в этом. Нужен экземпляр формы

   Cthulhu

4 — 29.02.20 — 14:30

для получения в любом модуле данных компонента формы (не связанного с данными объекта данных) — необходимым условием является выполнение следующих требований:

1) форма должна быть создана (в смысле — экземпляр формы а не компонент метаданных).

2) в этом самом «любом модуле» должна быть доступна ссылка на созданный экземпляр формы, или на нужные модулю ее реквизиты (ну или на копии этих значений).

выполнение этих условий «в лоб» — создание/открытие формы и передача из этой формы нужного значения в нужный модуль (например, в параметре вызываемой из модуля формы процедуры/функции этого самого «любого модуля» — при прямом или опосредованном — предопределенно или по подписке вызове этой самой процедуры/функции этого самого «любого модуля»).

как-то так.

   user321

5 — 29.02.20 — 14:52

// Функция проверяет, проведен документ или нет, и вызывает процедуру печати

// документа.

//

Функция ПечатнаяФорма(МассивОбъектов, ОбъектыПечати, ИмяМакета)

Это функция типовой УНФ, в которой мне в зависимости от состояния чекбокса надо менять создание печатной формы.

В этих параметрах ссылка на форму документа?

   Cthulhu

6 — 29.02.20 — 15:47

(5): сказать-то что хотел?

   Cthulhu

7 — 29.02.20 — 15:48

(6)+: в смысле — без указания на то, в каком модуле эта функция — твой комментарий — просто выпуск желудочных газов в мелкий водоем, не более того

   palsergeich

8 — 29.02.20 — 15:50

(7) Это как я понял стандартная подиситема печати.

В модуле команды можно пробросить учто угодно (5) это один из шагов печати же

   palsergeich

9 — 29.02.20 — 15:50

Открывай БСП подсистема Печать и читай мануалы

   palsergeich

10 — 29.02.20 — 15:59

(9) Зависит много отчего,возможно тебе придется стандартную команду убрать или сделать новую командуформы, куда в параметры печати будешь передавать свой реквизит

   palsergeich

11 — 29.02.20 — 16:00

(10) Значение своего реквизита точнее.

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

   D_E_S_131

12 — 29.02.20 — 16:03

+ к (11), там есть прям ПараметрыПечати, куда можно передать нужное значение и уже в ММ его обрабатывать.

   Cthulhu

13 — 29.02.20 — 16:09

(9),(10),(11): попробуй по слогам перечитать то, на что ты отвечаешь. попробуй ответить на вопрос — в каком модуле приведенная тобой процедура. сам изучи мануалы сначала. а потом берись возражать (если такое желание еще останется). если, конечно, ты заинтересован в том, чтобы не выглядеть глупо.

   palsergeich

14 — 29.02.20 — 16:11

(13) И что это меняет?

Если подход неверен в принципе.

Начинать модификацию надо раньше

   palsergeich

15 — 29.02.20 — 16:14

Парень хочет что бы типоавя печать работала по другому, ну и пусть это делает раньше, это вполне себе возможно.

   Cthulhu

16 — 29.02.20 — 16:15

(14): что «это»? какой «подход»? какую «модификацию»? кто на ком стоял?

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

   palsergeich

17 — 29.02.20 — 16:17

(16) Ужас какой.

УправлениеПечатьюКлиент.ВыполнитьКомандуПечати — вот вызов самой печати и там проведен документ или нет по процедуре не проверяется, а идет до непосредственного вызова обработчика печати и на всем пути доступны ПараметрыПечати.

   palsergeich

18 — 29.02.20 — 16:19

А то что у него скорее всего в можуле команды есть вызов УправлениеПечатьюКлиент.ПроверитьДокументыПроведены — такя именно про это.

Зайди в команду и при необходимости на значении каких то реквизитов делай вызов этой функции или нет

   palsergeich

19 — 29.02.20 — 16:21

В конце концов всегда можно под уникальных ход мыслей сделать новую команду печати

   palsergeich

20 — 29.02.20 — 16:23

По факту задача стоит так — есть печ форма, сейчас она формируется так.

А хочу что бы про одном значении реквизита она формировалась так, а по другому — так.

точка входа — модуль команды или обработчик, где идет непосредственный вызов УправлениеПечатьюКлиент.ВыполнитьКомандуПечати

   user321

21 — 29.02.20 — 16:23

Cthulhu

В форме документа изменили чекбокс. Значение чекбокса есть только в реквизите формы. Потом нажали ПЕЧАТЬ.

Вызвалась стандартная функция ПечатнаяФорма(МассивОбъектов, ОбъектыПечати, ИмяМакета)

В отладчике вижу, что в параметре МассивОбъектов[0] есть ссылка на мой документ.

Мне же нужен, как ты пишешь, экземпляр формы, для доступа к значению реквизита.

Вопрос: Как мне здесь экземпляр получить?

   palsergeich

22 — 29.02.20 — 16:24

(21) До вызова ПечатнаяФорма — происходит много интересного

   user321

23 — 29.02.20 — 16:26

(22) Согласен. Но значение реквизита нужно здесь для формирования печатной формы

   user321

24 — 29.02.20 — 16:28

(7) Модуль менеджера

   palsergeich

25 — 29.02.20 — 16:30

(23) Смотри. В этой процедуре происходит проверка проведенности и вызов УправлениеПечатью

ИМХО не зная документа в общем я бы решил это так: вместо вызова команды печать на уровень раньше по стеку написал бы код по проверке и вызвал бы УправлениеПечатью уже оттуда

   vde69

26 — 29.02.20 — 16:32

(21)

1. кто тебе сказал, что печатать не сохраненные данные это гуд? в 1с другая идеология печатать можно только то, что записано в базу…

2. печать — это команда и ее совсем не обязательно захотят вызывать из формы объекта, например все типовые предусматриваюи печать нескольких ссылок сразу (форма списка — выделяем несколько строк и нажимаем печать), в этом случае какую форму ты хочешь получить в принцепе?

   palsergeich

27 — 29.02.20 — 16:41

Даже специально открыл УНФ. Так и есть, печатнаяФорма — делает проверку и потом по условию возвращает табДок.

Нужно уникальное поведение — придется отказаться от Функции Печать в этом документе и написать аналог.

там где вызывается функция Печать — параметры ПечатиДоступны.

   palsergeich

28 — 29.02.20 — 16:41

Причем сама функция печатнаяФорма — очень простая и написать ее аналог не должно вызвать проблем

   palsergeich

29 — 29.02.20 — 16:42

(16) Пока в лужу набздел только ты

   user321

30 — 29.02.20 — 16:43

(26)

Документ сохранен неделю назад. Сегодня пользователь открыл документ, на форме чекбокс не отметил, нажал ПЕЧАТЬ и

распечаталась вся табличная часть документа. После этого отметил чекбокс, нажал ПЕЧАТЬ и распечаталась первая строчка табличного документа. Формирование печатной формы происходит в функции ПечатнаяФорма ММ. Значит там мне требуется значение чекбокса.

   palsergeich

31 — 29.02.20 — 16:48

(30) а я про что.

Модифицируешь или пишешь новую команду печати.

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

В лоб то что ты хочешь сделать нельзя, ибо архитектура по другому сделана, благо модификаций надо минимуи

   vde69

32 — 29.02.20 — 16:50

(30) для этого делается ДВЕ разные печатные формы, полная и краткая…. никакие чекбоксы не нужны

   palsergeich

33 — 29.02.20 — 16:51

   user321

34 — 29.02.20 — 16:52

(31) Буду пробовать. Может через глобальную переменную получится

   palsergeich

35 — 29.02.20 — 16:53

(32) Я об этом еще когда написал)

   user321

36 — 29.02.20 — 16:56

(32) Через три дня пользователь скажет «Вместо чекбокса хочу поле для ввода числа от одного до ста, чтоб указать какие строки печатать!»

   palsergeich

37 — 29.02.20 — 16:58

(36) Ну обычно стандартную и правдане трогают.

А все извращения пишут в доп команду и называют ее соответствующе печать(По чекбокасм и числу) например

   vde69

38 — 29.02.20 — 16:59

(36) тогда сделаешь по технологии внешних обработок вызов ОТДЕЛЬНОЙ формы (не отчет а обработка) и в нее напихаешь и галочек и палочек

   vde69

39 — 29.02.20 — 17:01

(36) если ты для этого будешь модифицировать форму объекта — то тебе надо пальцы линейкой отбить :)))

   user321

40 — 29.02.20 — 17:03

(39) Пользователя не устраивает форма элемента, приходится.

   vde69

41 — 29.02.20 — 17:06

(40) послать пользователя в лес и все, делай правильно или не делай совсем….

   user321

42 — 01.03.20 — 02:32

При трассировке столкнулся с кодом в функции:

// Возвращает описание команды по имени элемента формы.

Команды = ПолучитьИзВременногоХранилища(АдресНастроек);

Думаю хранилище инициализируется при запуске программы.

В каком модуле может происходить инициализация?

   Провинциальный 1сник

43 — 01.03.20 — 06:49

(26) «кто тебе сказал, что печатать не сохраненные данные это гуд? в 1с другая идеология печатать можно только то, что записано в базу…»

Вот только до появления чюда под названием «управляемое приложение» идеология была другая и процедура печати документа была в модуле объекта, и она не требовала наличия ссылки. Новая идеология — попытка объяснить ситуацию «мы ввязались в гонку за веб-технологиями, из-за чего множество фич стало недоступно, и теперь отсутствие возможности мы назовем новой прогрессивной идеологией».

   Провинциальный 1сник

44 — 01.03.20 — 06:59

А по сути, среда 1с стала значительно сложнее и запутаннее, объединив в себе всё худшее из традиционных подходов веб-программирования и 1с-разработки. Все эти костыли РеквизитФормыВЗначение, не имеющие никакого смысла в рамках бизнес-логики, но необходимые для связи контекста клиента с контекстом сервера, а далее — отказ от модальности и синхронных вызовов, в результате то что было реализовано 3 строчками — теперь требует 30.

БСП не облегчила ситуацию ничуть — просто перенесла узлы сложности на другой уровень.

   ProxyInspector

45 — 01.03.20 — 08:17

(44) +

   И если раньше выполнялось за 3 сек, то теперь требуется 30 сек

   palsergeich

46 — 01.03.20 — 08:44

(42) Смотри ПриСозданииНаСервере

Как правило БСП шные вызовы обрамлены. Тебе нужна та часть, которая Управление печатью.

   palsergeich

47 — 01.03.20 — 08:46

Но на самом деле, скорее всего тебе и это не надо — тебе надо найти процедуру обработчик команды, это делается проще.

Отладка->остановить в конфигураторе и тут же жми на кнопку в пользовательском. Так ты быстро попадешь в обработчик

   vde69

48 — 01.03.20 — 11:32

(44) я с тобой согласен, что 1с обосрало все, что можно со своей совершенно тупой реализации разделения контекста на клиентский и серверный…

но это не как не говорит о том, что концепция «печатаю только то, что записано» не верная, лично я считаю ее вполне правильной для компаний где в базе работает не 3 человека а поболее, ибо она не позволяет печатать фиктивные документы…. а на 7.7 я несколько раз ловил пользователей которые печатали складские документы с измененным количеством товара и потом тупо воровали

  

user321

49 — 01.03.20 — 13:22

(47) Точку входа я нашел. Там структура с одной записью едет от начала до конца. Хочу вставить запись для себя. При инициализации Хранилища.

Здравствуйте!
База УТ 11.2, платформа 8.3., Документ «коммерческое предложение клиенту», добавлен в него реквизит Филиал, тип Булево. Он выведен на форму в виде флажка. Планируется, что если истина у флажка, выводится печатная форма с одними данными, если ложь у флажка выводится с другими данными.
Подскажите пожалуйста, как обратиться к нему из модуля менеджера документа? В модуле менеджера прописана процедура печати макета. Она выводит только один вид данных, флажок не работает.
Использовала разные варианты кода:
1.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Функция ПолучитьДанныеОбъектаПоВыборке (Выборка, Товары)
   ДанныеОбъекта = Новый Структура;
  ....................................................
   ДанныеОбъекта.Вставить("Филиал",  Ложь);
  ......................................................
  конец функции
 
Процедура ЗаполнитьТабличныйДокументПоДаннымОбъекта(ТабличныйДокумент, ДанныеОбъекта)
  ......................................................
    Форма = документы.КоммерческоеПредложениеКлиенту.ПолучитьФорму("ФормаДокумента");
     Реквизит = Форма.ЭлементыФормы.Филиал.Значение;
    Если  не реквизит = ложь
         Тогда ОбластьАдресОрганизации.Параметры.АдресОрганизации = ("603024 Нижний Новгород, ул.Ленина, д.8");
     конецесли;
 ТабличныйДокумент.Вывести(ОбластьАдресОрганизации);
  ...........................................................
 конец процедуры

Пишет ошибку, что недоступны интерактивные действия.

2.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
Функция ПолучитьДанныеОбъектаПоВыборке (Выборка, Товары)
   ДанныеОбъекта = Новый Структура;
  ....................................................
   ДанныеОбъекта.Вставить("Филиал",  Ложь);
  ......................................................
  конец функции
 
Процедура ЗаполнитьТабличныйДокументПоДаннымОбъекта(ТабличныйДокумент, ДанныеОбъекта)
  ......................................................
Если ЗначениеЗаполнено(ДанныеОбъекта.Филиал)  Тогда
 
    ОбластьАдресОрганизации.Параметры.АдресОрганизации = ("603024 Нижний Новгород, ул.Ленина, д.8");
 КонецЕсли;

Выводит нужный адрес — потому что объект объявлен выше как Ложь, но ничего не происходит при изменении флажка, т.е он не видит значение реквизита на форме.

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

Часик в радость! Подскажите, пожалуйста имеется ФормаСписка(реал.тов.и услуг) на форме есть ПолеВвода значение которого очень хочется вывести на макет печати в док. Накладная(параметры находятся в мод.менеджера) так вот как получить реквизит в мод. менеджера и его значение?

Подробней, пожалуйста мне нужен вызов Реквизита как объект!?

Источник у поля ввода какой?

В форме списка ни чего не хранится. Ты не можешь получить ни чего ИЗ НЕЕ. Но ты можешь посмотреть в код формы списка, узнать, как и никуда заполняется этот реквизит, и сделать то же самое

Пожалуй, в коде формы мне понятно как тянется реквизит «Ответственный» с типом значения СправочникСсылка.Пользователи

Зайду с другой стороны как в мод. менеджера в параметре на макете вывести на печать автора документа?

Этот вопрос элементарный, но я же учусь)

Запросом получить значение и заполнить им параметр области макета

В макете уже определено место, куда этот автор должен выводиться?

параметр на макете есть уже

Тогда выше правильно подсказали. Запросом получаешь нужное значение, затем получаешь область макета, в которой этот параметр, а потом уже заполняешь его

Теперь научись формировать запрос

спасибо уважаемые, что-как получилось отпишусь)))

что-то не так в запросе может быть!?

«код нужного свойства» — не так.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Доброй ночи! Товарищи — горю! Завтра надо сдавать клиенту работу, а я встал в самом конце работы. Создавал в ручную документ Коммерческое предложение. Всё сделал, всё готово и всё работает. Клиент попросил нарисовать на форме флажок НДС. Если галка стоит — выводить одну шапку ТЧ, если нет — другую. Шапки если, а через «если» обратить не могу, потому что программа меня не понимает! Или я её… но это другой момент. Вся процедура печати лежит в модуле менеджера документа от куда подцепляется в команду «Печать». И следовательно в том же модуле менеджера лежит и «Если «галочка истина» тогда одна шапка иначе другая». Но как обратиться к этой галочке? Я уже пол инета перерыл и безрезультатно…
Ниже, на всякий случай прилагаю саму процедуру Печати

Процедура Печать(ТабДок, Ссылка) Экспорт

Макет = Документы.КоммерческоеПредложение.ПолучитьМакет("Макет_КП");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КоммерческоеПредложение.Товары.(
| НомерСтроки,
| Номенклатура,
| Количество,
| Цена,
| РазмерСкидки,
| Сумма,
| СтавкаНДС
| ),
| Организации.Ссылка КАК Организация,
| Контрагенты.Ссылка КАК Контрагент,
| Пользователи.Ссылка КАК Ответственный
|ИЗ
| Документ.КоммерческоеПредложение КАК КоммерческоеПредложение
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
| ПО КоммерческоеПредложение.Организация = Организации.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО КоммерческоеПредложение.Контрагент = Контрагенты.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО КоммерческоеПредложение.Ответственный = Пользователи.Ссылка
|ГДЕ
| КоммерческоеПредложение.Ссылка В(&Ссылка)";
Запрос.Параметры.Вставить("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Шапка = Макет.ПолучитьОбласть("ШапкаДок");

ШапкаТЧ = Макет.ПолучитьОбласть("ШапкаТЧ");
ШапкаТЧСНДС = Макет.ПолучитьОбласть("ШапкаТЧСНДС");

ОбластьТоварыШапка = Макет.ПолучитьОбласть("ТЧДок");

ОбластьТовары = Макет.ПолучитьОбласть("Итого");
Подвал = Макет.ПолучитьОбласть("Подвал");

ТабДок.Очистить();

Пока Выборка.Следующий() Цикл

Если Выборка.Организация.ИНН = "3906344101" Тогда
ОбластьЗаголовок = Макет.ПолучитьОбласть("ШапкаВоин");
Иначе
ОбластьЗаголовок = Макет.ПолучитьОбласть("Шапка");
КонецЕсли;

СведенияОПоставщике = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Выборка.Организация, ТекущаяДата());
Адрес= ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике,"ЮридическийАдрес");

ОбластьЗаголовок.Параметры.Адрес = Адрес;
ОбластьЗаголовок.Параметры.НаименованиеОрганизации = Выборка.Организация;
ОбластьЗаголовок.Параметры.ИННОрганизации = Выборка.Организация.ИНН;
ОбластьЗаголовок.Параметры.КППОрганизации = Выборка.Организация.КПП;
ОбластьЗаголовок.Параметры.ОГРНОрганизации = Выборка.Организация.ОГРН;
ТабДок.Вывести(ОбластьЗаголовок);

Шапка.Параметры.НаименованиеПокупателя = Выборка.Контрагент;
Шапка.Параметры.Организация = Выборка.Организация;
ТабДок.Вывести(Шапка, Выборка.Уровень());

ВыборкаТовары = Выборка.Товары.Выбрать();

Ном = 0;
ИтогоСумма = 0;
ИтогоКоличество = 0;

//Если ??? = Истина Тогда
// ТабДок.Вывести(ШапкаТЧСНДС);
//Иначе
ТабДок.Вывести(ШапкаТЧ);
//КонецЕсли;

Пока ВыборкаТовары.Следующий() Цикл

ОбластьТоварыШапка.Параметры.НомерСтроки = ВыборкаТовары.НомерСтроки;
ОбластьТоварыШапка.Параметры.Номенклатура = ВыборкаТовары.Номенклатура;
ОбластьТоварыШапка.Параметры.Количество = ВыборкаТовары.Количество;
ОбластьТоварыШапка.Параметры.Цена = ВыборкаТовары.Цена;
ОбластьТоварыШапка.Параметры.РазмерСкидки = ВыборкаТовары.РазмерСкидки;
ОбластьТоварыШапка.Параметры.Сумма = ВыборкаТовары.Сумма;

ТабДок.Вывести(ОбластьТоварыШапка);
Ном = Ном + 1;

ИтогоСумма = ИтогоСумма + ВыборкаТовары.Сумма;
    ИтогоКоличество = ИтогоКоличество + ВыборкаТовары.Количество;

ОбластьТовары.Параметры.ИтогКоличество = ИтогоКоличество;
ОбластьТовары.Параметры.ИтогСумма = ИтогоСумма;

КонецЦикла;
ТабДок.Вывести(ОбластьТовары);

Подвал.Параметры.ИтогСтрок = Ном;
Подвал.Параметры.ИтогСумма = ИтогоСумма;

ФормСтрока = "Л = ru_RU; ДП = Истина";
ПарПредмета="рубль,рубля,рублей,р,копейка,копейки,копеек,к,2";
ПрописьЧисла = ЧислоПрописью(ИтогоСумма, ФормСтрока, ПарПредмета);

Подвал.Параметры.СуммаПрописью = ПрописьЧисла;
Подвал.Параметры.Организация = Выборка.Организация;

ТабДок.Вывести(Подвал);

КонецЦикла;

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

Skip to content

1С, получить из модуля объекта элемент формы

Получить из модуля объекта элемент формы

В разработке иногда возникает следующая ситуация:

  • Из модуля объекта требуется получить реквизит формы элемента;
  • При этом реквизит формы элемента (который необходимо получить) не сохраняется в реквизиты объекта;

План действий для решения задачи

  • Создать реквизит объекта «АдресВХ», тип строка неограниченной длины;

  • В свойствах формы элемента добавим обработчик «Перед записью»:

  • В обработчик добавим следующий программный код:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	Объект.АдресВХ = ПоместитьВоВременноеХранилище(ТабДок);
КонецПроцедуры

В нашем случае во временной хранилище мы помещаем «ТабДок», данный реквизит будем получать в модуле объекта;

  • Переходим в модуль объекта и создаем процедуру «Перед записью», добавляем код:
Процедура ПередЗаписью(Отказ)
	ТабДок = ПолучитьИзВременногоХранилища(АдресВХ);    
КонецПроцедуры

В результате мы передали элемент из формы в модуль объекта, хоть и добавили в дерево метаданных вспомогательный реквизит «АдресВХ»;

Связанные статьи

Рассмотрим работу с Модулем менеджера объектов.

Пожалуй, начнем сразу с практического примера.
В справочник Контрагенты нам необходимо заносить информацию о поставщиках, покупателях, банках, налоговых органах, различных фондах и пр. Для каждого вида контрагента нас интересует разная информация.

Создадим функцию, возвращающую список «важных» реквизитов в зависимости от вида контрагента:

Код 1C v 8.2 УП

 Функция ПолучитьВажныеРеквизиты(ВидКонтрагента)

МассивРеквизитов = Новый Массив;

Если ВидКонтрагента = Перечисления.ВидыКонтрагентов.Поставщик Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("ТипЦен");
МассивРеквизитов.Добавить("ЛимитКледита");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Покупатель Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ФактАдрес");
МассивРеквизитов.Добавить("ПроцентБонусов");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Банк Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("БИК");

ИначеЕсли ВидКонтрагента = Перечисления.ВидыКонтрагентов.Налоговая Тогда
МассивРеквизитов.Добавить("ВидКонтрагента");
МассивРеквизитов.Добавить("ЮрАдрес");
МассивРеквизитов.Добавить("ИНН");
МассивРеквизитов.Добавить("КодИФНС");

КонецЕсли;

КонецФункции

Где же ее правильнее разместить?

Напрашивается вариант — в процедуре Модуля объекта «ПередЗаписью()». Тем самым мы на этапе записи будем контролировать правильность заполнения нужных нам реквизитов. С точки зрения создания, изменения элемента справочника, нас все устраивает. Но если нам необходимо, чтобы некоторые менеджеры заносились контрагентов в ИБ без контроля, а спустя какое-то время мы будем выполнять проверку на корректность заполнения данных в справочнике. Тогда нужно будет написать обработку. И в этой обработке, перебирая элементы, проверять заполнение реквизитов. Т.о. эту функцию придется разместить в коде обработки. А это получается дублирование кода, со всеми вытекающими проблемами. Можно получать объект каждого элемента, обращаться к функции, расположенной в его Модуле объекта. Но это будет дополнительные обращения к БД, тогда как в обработке нам достаточно только ссылок.

Можно выйти из этой ситуации создав Общий модуль «РаботаСКонтрагентами» и разместить в нем функцию возвращающую список реквизитов для проверки. В этом случае будем обращаться так «РаботаСКонтрагентами.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».

Но! На платформе 8.2 как раз для решения подобной задачи и был создан Модуль менежера. Там и разместим нашу функцию. А обращаться мы будем: «Справочники.Контрагенты.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».

Т.о. на ряду с предопределенными методами, мы можем самостоятельно разработать свои процедуры и обращаться к ним как методам Менеджера объекта, через точку. У нас отпадает необходимость создавать «тематические» внешние модули такие как «Работа с Контрагентами», «Процедуры Номенклатуры»…

Обратимся теперь к теории, чтобы «разложить все по полочкам».

Руководство разработчика дает нам следующее описание: «Модуль менеджера существует у всех прикладных объектов и предназначен для управления этим объектом как объектом конфигурации. Модуль менеджера позволяет расширить функциональность менеджеров за счет введения процедур и функций на встроенном языке. Фактически это позволяет описать методы для объекта конфигурации, которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации». Именно это мы и разобрали в нашем практическом примере.

Отобразим иерархию классов прикладных объектов на примере Справочников:
title

Т.е. мы видим, что появление «Модуля менеджера объекта» логично расширяет свойства класса СправочникМенеджер, так же как экспортные процедуры «Модуля объекта» расширяют методы класса СправочникОбъект. Нужно ли было создавать «Модуль прикладного объекта Справочники (Документы, Перечисления)». Наверное нет. Достаточно трудно придумать какие-либо задачи для единой обработки всех видов справочников.

Кроме возможности расширения методов класса, в модуле менеджера существует предопределенная процедура События

Код 1C v 8.2 УП

 «ОбработкаПолученияДанныхВыбора»   

. Она возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе, а также при выполнении метода «ПолучитьДанныеВыбора()».

Так же хочу обратить внимание. При использовании конструктора печати прикладного объекта, платформа расположит процедуру формирования табличного документа непосредственно в Модуле менеджера. И это логично. Теперь, чтобы получить табличный документ элемента справочника нет необходимости получать объект. Достаточно кода:

Код 1C v 8.2 УП

 Справочники.Номенклатура.Печать(ТабДок, Ссылка)   

.

Автор: Шумаев Алексей

Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик. Необходимо получить ИНН этого поставщика:


Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.

Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.

Например, локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом:

&НаКлиенте
Процедура ПолучитьИННПоставщика(Команда)
   ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
КонецПроцедуры 

А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:

&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
   Возврат СсылкаНаПоставщика.ИНН;
КонецФункции   

Таким образом на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки и возвращаем его на клиента.

Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, — это слишком расточительно.

Понравилась статья? Поделить с друзьями:
  • 1с при записи проверить изменился ли реквизит
  • 250 часов обязательных работ это сколько дней
  • 280 часов обязательных работ это сколько дней
  • 1с проверить реквизит справочник или документ
  • 1с проверка заполнения стандартных реквизитов