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

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

Открытие формы с заполнением (передача в параметре открываемой формы и реализация метода «ОбработкаЗаполнения()») выполняется одинаково в управляемом и обычном приложении (проверял на платформе 8.3.5.1146 — управляемое приложение и на платформе 8.2.18.102 — обычное приложение).

В том месте кода, откуда нужно сделать открытие и заполнение формы нужно добавить приблизительно такой код:

ПараметрыЗаполнения = Новый Структура;

ПараметрыЗаполнения.Вставить(«ТестРеквизит», «Тест строка»);

ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», ПараметрыЗаполнения);

фНовыйДокумент = ПолучитьФорму(«Документ.ТестДокумент.Форма.ФормаДокумента», ПараметрыФормы, ЭтаФорма);

фНовыйДокумент.Открыть();

В структуру «ПараметрыЗаполнения» записываются все нужные для заполнения данные, затем эта структура вставляется в другую структуру под названием «ПараметрыФормы».

Причем ключ, под которым структура «ПараметрыЗаполнения» вставляется в структуру «ПараметрыФормы», должен называться именно «ЗначенияЗаполнения» иначе, ничего не работать не будет.

Далее нужно реализовать событие модуля формы заполняемого объекта — «ОбработкаЗаполнения()». Я для этого использую следующую конструкцию, которая, на мой взгляд, изящно выглядит и позволяет избежать всех возможных ошибок (поправьте, если я ошибаюсь):

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип(«Структура») Тогда

ДанныеЗаполнения.Свойство(«ТестРеквизит», ТестРеквизит);

КонецЕсли;

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

Напомню, что метод структуры «Свойство()» проверяет наличие в структуре элементы с именем, указанным в первом параметре и записывает найденное значение во второй параметр — в данном случае это реквизит заполняемого объекта (если элемент с указанным именем в структуре не найден, то во второй параметр записывается «Неопределено»).

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Рассмотрим такую задачу. Есть сложная форма, с большим количеством реквизитов. Для многих из них в конфигураторе установлено свойство ЗаполнятьИзДанныхЗаполнения. В результате при открытии этой формы для нового объекта ее реквизиты могут быть заполнены различными начальными значениями. Это зависит и от точки навигации, в которой расположена команда создания нового объекта, и от программного алгоритма, описанного в модуле самого объекта.

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

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

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

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

Например, программно нужно открыть форму новой накладной точно так, как если бы она открывалась интерактивной командой из списка накладных, отобранного по поставщику и складу. Предположим, что в переменных СсылкаНаПоставщика и СсылкаНаСклад у нас имеются необходимые ссылки. Тогда можно использовать следующий код:

ЭлементыОтбора = Новый Структура("Поставщик, Склад", СсылкаНаПоставщика, СсылкаНаСклад);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ЭлементыОтбора);
ОткрытьФорму("Документ.Накладная.ФормаОбъекта", ПараметрыФормы); 

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

В нашем случае платформа передала бы в данные заполнения ссылку на поставщика и ссылку на склад, по которым отобран список накладных. Поэтому мы в данные заполнения передаем структуру, содержащую два элемента: для реквизита Поставщик — ссылку на поставщика, а для реквизита Склад — ссылку на склад.

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

В этом случае можно создать программно объект, а затем вызвать его метод Заполнить(). В этом случае платформа выполнит все те же действия и вызовет все те же события, которые она бы вызвала в случае интерактивного создания нового объекта. В метод Заполнить() в качестве параметра точно так же можно передать структуру, содержащую данные заполнения:

ЭлементыОтбора = Новый Структура("Поставщик, Склад", СсылкаНаПоставщика, СсылкаНаСклад);
ОбъектНакладной = Документы.Накладная.СоздатьДокумент();
ОбъектНакладной.Заполнить(ЭлементыОтбора);
// Действия, имитирующие интерактивный ввод данных пользователем
...
ОбъектНакладной.Дата = ТекущаяДатаСеанса();
...
ОбъектНакладной.Записать();

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

Свойство ЗначениеЗаполнения

Например, есть документ Накладная с реквизитом Склад. В подавляющем большинстве случаев товары приходуются на главный склад, и лишь в отдельных редких случаях они могут приходоваться на другие склады. Чтобы облегчить работу оператора и не заставлять его каждый раз выбирать один и тот же склад в новых накладных, можно поступить следующим образом.

У реквизитов объектов конфигурации существует свойство ЗначениеЗаполнения. Реквизит Склад имеет тип ссылки на справочник Склады, а в справочнике Склады существует предопределенный элемент ГлавныйСклад. Тогда прямо в конфигураторе можно указать, что в новых документах реквизит Склад будет сразу же заполнен ссылкой на ГлавныйСклад:

Cвойство ЗаполнятьИзДанныхЗаполнения

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

Теперь будет происходить следующее. В режиме 1С:Предприятие пользователь отобрал список накладных по некоторому поставщику и некоторому складу. При вводе новой накладной с помощью команды «Создать» списка, поля Поставщик и Склад будут заполнены именно теми значениями, по которым отобран список накладных:

Собственный алгоритм заполнения реквизитов

Для этого предназначено событие объекта ОбработкаЗаполнения. Первым параметром процедуре ОбработкаЗаполнения() передаются ДанныеЗаполнения. Проанализировав их тип, можно определить, каким именно образом вводится новый объект, и выполнить соответствующий этому варианту алгоритм. Например:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
                
     Если ДанныеЗаполнения = Неопределено Тогда 
          // «Простой» ввод нового объекта
                               
     ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Поставщики") Тогда 
          // Новый объект вводится на основании другого объекта. 
          // В этом случае в данные заполнения передается ссылка на объект, являющийся основанием.
          // В данном случае обрабатывается ввод на основании элемента справочника Поставщики.
                               
     ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
          // Новый объект вводится командой из отобранного списка.
          // В данных заполнения будет структура, содержащая значения отбора:
          // «Поставщик» — СсылкаНаПоставщика
          // «Склад» — СсылкаНаСклад
                               
     КонецЕсли;
                               
КонецПроцедуры

Параметр СтандартнаяОбработка позволяет управлять дальнейшим развитием событий. Если ему присвоить значение Ложь, то никаких других действий по заполнению реквизитов формы платформа предпринимать не будет, а сразу создаст форму и вызовет ее серверное событие ПриСозданииНаСервере.

Если же не менять стандартное значение этого параметра, то после выхода из этого обработчика платформа попытается самостоятельно заполнить реквизиты объекта, подлежащие заполнению. Незаполненными она будет считать те реквизиты, которые имеют стандартное значение своего типа. Например, для типа Число это значение 0, для типа Строка — пустая строка, а для типа Ссылка — пустая ссылка.

Для простоты предположим, что у объекта всего один реквизит, подлежащий заполнению. Тогда платформа будет действовать по следующему алгоритму:

  • Реквизит заполнен — сразу будет вызван обработчик события ПриСозданииНаСервере.
  • Реквизит не заполнен — платформа попытается заполнить его из ДанныеЗаполнения. После этого снова проверит, заполнен реквизит или нет:
    • Реквизит заполнен — сразу будет вызван обработчик события ПриСозданииНаСервере.
    • Реквизит не заполнен — платформа попытается заполнить его из ЗначениеЗаполнения. После этого будет вызван обработчик события ПриСозданииНаСервере.

Поиск:
1С:Предприятие • Документ • Заполнять из данных заполнения • Значение заполнения • Обработка заполнения

Добавить значение в реквизит при открытии формы программо

Я
   Aleks291086

12.05.16 — 11:52

Добрый день! Есть общая форма, кнопка на ней. Открываем форму нового документа при нажатии кнопки. Как добавить в открытую форму программно значений в реквизиты(тип строка)? Проводим вручную открытый документ.

Пока так сделал, но не добавляет Значение реквизита (Иванов):

&НаКлиенте

Процедура Иванов(Команда)

СсылкаНаЭлемент=»Иванов»;

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить(«Иванов», СсылкаНаЭлемент);

Форма=ОткрытьФорму(«Документ.РегестрацияСотрудниковПТО.Форма.ФормаДокумента», ПараметрыФормы);

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

  

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

   Ёпрст

1 — 12.05.16 — 11:54

Форма.Иванов=»Вася»

   aleks_default

2 — 12.05.16 — 11:57

86 год

   Aleks291086

3 — 12.05.16 — 12:00

(1) Поле объекта не обнаружено (ФИО).

Реквизит, в который запихнуть значение — ФИО.

   lodger

4 — 12.05.16 — 12:01

(0) ну начали вы верно, параметр в форму отправился, а что форме с ним делать?

в форме документа ПриСозданииНаСервере надо разбирать входящие параметры и заполнять необходимые реквизиты.

   lodger

5 — 12.05.16 — 12:01

РегестрацияСотрудниковПТО через Е — эпик.

   Aleks291086

6 — 12.05.16 — 12:06

(5) Так надо, РегИстрацияСотрудниковПТО есть уже реквизит. Этот тренировочный. Отмазался)

   Nuobu

7 — 12.05.16 — 12:08

(6) В таких случаях нужно писать: РегИстрацияСотрудниковПТО11ТестовыйВторойИТакДалее.

   Nuobu

8 — 12.05.16 — 12:09

Форма=ОткрытьФорму(«Документ.РегестрацияСотрудниковПТО.Форма.ФормаДокумента», ПараметрыФормы);

Форма=ПолучитьФорму(«Документ.РегестрацияСотрудниковПТО.Форма.ФормаДокумента», ПараметрыФормы);

Форма.ФИО = «Иванов»;

Форма.Открыть()

   Aleks291086

9 — 12.05.16 — 12:17

(4) (8) А в форме самого документа принять параметр и заполнить реквизит как? (ПриСозданииНаСервере)

   lodger

10 — 12.05.16 — 12:52

(9) Как обычно.

Процедура ПриСозданииНаСервере()

Если Параметры.Свойство(«Иванов») Тогда

  ФИО = Параметры.Иванов;

КонецЕсли;

<остальной код>

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

где Иванов — имя переданного параметра.

ФИО — реквизит формы или объекта.

   Sabbath

11 — 12.05.16 — 13:10

(0) в ПриОткрытии переданные параметры уже не видны видны в ПриСозданииНаСервере

   Mort

12 — 12.05.16 — 13:23

Перебрали все возможные варианты г-кода.

И копание в форме, и заполнение реквизитов в при создании…

(0) ОбработкаЗаполнения кури. В модуле или в подписке.

   lodger

13 — 12.05.16 — 13:36

(12) http://v8.1c.ru/metod/faq2/answer.jsp?id=652

мило конечно, но как открыть и передать любой параметр через команду другой формы?

небольшая вытяжка из СП:

«<ДанныеЗаполнения>

Тип: Произвольный.

Значение, которое используется как основание для заполнения.

Если обработчик вызван при выполнении метода Заполнить, параметр равен параметру <ДанныеЗаполнения> метода Заполнить.

При обработке заполнения во время ввода на основании параметр имеет значение основания.

При интерактивном вводе нового из формы списка параметр является структурой, элементы которой соответствуют тем параметрам отбора формы списка, у которых способ сравнения Равно или ВСписке с единственным элементом списка. Если таких элементов отбор списка не содержит, данный параметр равен Неопределено. Если параметр <СтандартнаяОбработка> по окончании работы обработчика равен Истина (установлен по умолчанию), система автоматически произведет заполнение одноименными элементами структуры.»

   Aleks291086

14 — 12.05.16 — 13:56

В общей форме:

СсылкаНаЭлемент=»Иванов»;

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить(«ФИО», СсылкаНаЭлемент);

Форма=ОткрытьФорму(«Документ.РегестрацияСотрудниковПТО.Форма.ФормаДокумента», ПараметрыФормы);

В модуле формы документа при создании на сервере:

Если Параметры.Свойство(«ФИО») Тогда

  Объект.ФИО = Параметры.ФИО;  //Параметры.Свойство(«СсылкаНаЭлемент»);

КонецЕсли;

И не работает. Че не так?

   Ёпрст

15 — 12.05.16 — 14:06

(14) Отладчиком посмотри, че там хоть прилетело

   lodger

16 — 12.05.16 — 14:21

(14) «Форма=» убери.

   Aleks291086

17 — 12.05.16 — 14:29

(15) (16)

«Форма» убрал.

Отладчик молчит, ошибок нет

   Aleks291086

18 — 12.05.16 — 14:32

Не передает параметр

   lodger

19 — 12.05.16 — 14:33

(18) мистика

   Ёпрст

20 — 12.05.16 — 14:36

(18) в каком месте хоть смотришь То ?

   Aleks291086

21 — 12.05.16 — 14:50

(20) Точку останова ставлю на

Объект.ФИО = Параметры.ФИО;

пропускает

   Ёпрст

22 — 12.05.16 — 14:55

Параметры ?

очень интересно, это что у вас ?

   Ёпрст

23 — 12.05.16 — 14:58

Что там у вас в Параметры ?

в отладчике то хоть посмотрите

   Aleks291086

24 — 12.05.16 — 15:27

(23) Всмысле что у меня в Параметры?

   Aleks291086

25 — 12.05.16 — 15:40

А вообще никакие данные не добавляет ПриСозданииНаСервере(), даже любые тестовые

   hhhh

26 — 12.05.16 — 15:41

(24) закладку Параметры открой на форме, не тормози. Проверь есть там Иванов?

   Ёпрст

27 — 12.05.16 — 15:44

В присозданиинасервере вотуни точку останова и смотри, через shift+f9 чего сидит в Параметры.

   Aleks291086

28 — 12.05.16 — 16:02

(26) (27) В параметрах ФИО, тип строка. На точку останова не реагирует. Процедуру не видит. Даже ставлю Объект.ФИО=ПараметрыСеанса.ТекущийПользователь;

Не ставит ничего.

   Nuobu

29 — 12.05.16 — 16:04

(28) Если на точку останова не реагирует, то у Вас — сервер запущен без «-debug».

  

Aleks291086

30 — 12.05.16 — 16:11

Парни, сильно извиняюсь. Саму процедуру ПриСозданииНаСервере() не указал в свойствах формы. Все сработало. Спасибо!

1C
1
2
3
4
5
Процедура ПриОткрытии()
    Если ЭтоНовый() Тогда
        ЭлементыФормы.ТекстовоеПоле=Константы.Константа1.Получить();
    КонецЕсли;
КонецПроцедуры

Спасибо, смешно. Такой метод не будет работать в 8.2 (тонкий клиент, веб-клиент), только обычное приложение.
Такой метод слишком узок в применении, поэтому жизнь его отвергнет (кроме как валюта регламентированного учета и подобные).

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

Начальный опыт, тоже опыт! А мне было бы интересно как открыть управляемую форму с помощью
«ОткрытьФормуМодально(«ИмяФормы», Параметры, ЭтаФорма); при этом в самой открываемой форме мы ничего не хотим изменять (никаких изменений в модуле). В параметрах должно быть что-то, что будет заполнять нужные реквизиты объекта. А для более сложного варианта, изначально открытие списка с отбором по значениям реквизитов, а при создании нового объекта заполнение их нужными. Опять же, ни в какие модули этого документа мы не должны залезать.

Инициализация реквизитов при создании нового объекта

Один из методов упрощения работы пользователя — это заполнение реквизитов нового объекта (элемент справочник, документ) значениями по умолчанию. Реализовать заполнение реквизитов можно двумя способами:

  1. в обработчике события формы элемента — ПриСозданииНаСервере;
  2. в обработчике события объекта — ОбработкаЗаполнения.

Первый способ не рекомендуется использовать, но все-равно его рассмотрим. Создадим в модуле формы обработчик события ПриСозданииНаСервере. В обработчике проверим факт создания нового объекта, если объект новый, то произведем заполнение реквизитов.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Если ссылка у объекта пустая, значит он еще не записан,
// а следовательно он является новым объектом.
ЭтоНовыйОбъект = Объект.Ссылка.Пустая();

// Если объект новый, то выполняем заполнение реквизитов.
Если ЭтоНовыйОбъект Тогда
Объект.Ответственный = Пользователи.ТекущийПользователь();
Объект.Комментарий = "Документ создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
КонецЕсли;

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

Второй способ намного проще, т.к. он предусмотрен платформой и рекомендован к использованию. Создадим в модуле объекта обработчик события ОбработкаЗаполнения и напишем программный код по заполнению реквизитов объекта без каких-либо проверок, потому что данное событие возникает при интерактивном вводе нового объекта. Более подробное описание обработчика события см. в синтакс-помощнике.


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

ЭтотОбъект.Ответственный = Пользователи.ТекущийПользователь();
ЭтотОбъект.Комментарий = "Документ создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");

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

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

Вывод результата запроса на форму УП в таблицу значений (аналог СоздатьКолонки() для УП) 2
при разработке на обычных формах было удобно выводить результат запроса используя метод СоздатьКолоки(): Процедура ПоискНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| ДокументоОборот.Этап,
| ДокументоОборот.Отдел,
| Докуме


Как обновить динамический список или реквизит на форме клиента? 25
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр


Как отобразить дерево значений на управляемой форме 0
Создадим новую внешнюю обработку. Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно. НаСервере
Процедура ПриСозданииНаСервере(Отказ, Станда


Как передать таблицу значений с сервера на клиент? 5
Многие спрашиваю, как передать тз с сервера на клиент — ниже несколько вариантов как это можно реализовать: Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр НаКлиенте
Процедура ПолучитьТаблицу НаСервер(Команд а)
ТЗВСтроке = ПолучитьТЗНаС


Комиссионная торговля 0
Добрый день. УТ11 (11.4.13.46) Наша организация принимает товар на комиссию. В отчете комитенту цена комитента — ставится последняя, а нужно по фактическому поступлению. Подскажите пожалуйста, может кто то сталкивался с подобной проблемой. Спасибо.


Посмотреть все результаты поиска похожих

Понравилась статья? Поделить с друзьями:
  • 1с запрет редактирования реквизита по условию
  • 1с значение реквизита объекта табличная часть
  • 1с значения по умолчанию для реквизитов формы
  • 1с изменить реквизит документа при проведении
  • 1с изменить реквизиты в нескольких документах