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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

Загрузка…

Автоматическая установка ширины колонки табличного документа. 0
Процедура, которая » примерно» делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего:
Процедура РасчетШириныКолонок(Табличный


В отчет не попадают данные за последний день… Как исправить? 0
Пользователь выбрал период формирования отчета с 1июля по 31. Почему при формировании отчета в него не попадают данные за 31 число?
На самом деле, это одна из самых распространенных ошибок при разработке отчетов. В 1С 8.х дата содержит время с точно


Ввод записей в журнал расчетов 1
Добавление записи в журнал расчетов:
Метод Новая может быть вызван где угодно, в глобальном модуле, модуле обработок, документов и т.д.
Данный метод проверяет корректность заполненных реквизитов журнала расчетов. При вводе новых записей журнал


Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр


Внешние обработки, печатные формы, обработки по заполнению табличных частей 3
Справочник «Внешние обработки, печатные формы, обработки по заполнению табличных частей» содержит список произвольных обработок, произвольных отчетов, дополнительных печатных форм, обработок для заполнения ТЧ объектов, обработок, подключаемых к отч


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

Заполнение реквизита формы программно

Автор JeremyClarksson, 21 фев 2023, 06:54

0 Пользователей и 1 гость просматривают эту тему.

Доброго дня, господа.
Подскажите советом, пожалуйста.
Сделал обработку: обработка заполняет ТЧ «маршрут», ЗаданиеНаПеревозку (конфига 1С:ERP Агропромышленный комплекс 2(2.5.8.267)). Заполняет их Excel файлика. Победил все, заполняет все, кроме поля «ПолучательОтправитель. Ибо это поле- это реквизит формы. Туда заполняться должен партнер.
Все заполнение у меня идет НаСервере. А как заполнить реквизит формы? На сервере же никак не получится.
В интернетах то ли ищу не правильно, то ли ничего нет. :dfbbdrfb:
В каком направлении двигаться, осталось немного и работу закончу :)


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


JeremyClarksson, вообще технология загрузки (программного создания) документов следующая
НаСервере
1.Получаете данные из внешнего источника, анализируете их правильность при необходимости выводите сообщения об ошибках
2.Создаете Объект документа, заполняете его внешними данными.
3.Записываете Объект документа, и у вас получается Ссылка на новый документ! во ее и возвращаете на Клиента

НаКлиенте
1.с полученной ссылке Открываете форму документа (при открытии, форма сама заполнит свои реквизиты как в ней запрограммировано)

если помогло нажмите: Спасибо!


Кстати,  если поле — реквизит формы тоо зачем его вообще заполнять программно?)

данные в нем не хранятся и скорее всего заполняются налету при открытии формы)

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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

Понравилась статья? Поделить с друзьями:
  • 986к маршрутка химки расписание время работы
  • Ярмарка мытищи на мкаде часы работы сегодня
  • Юридическое сопровождение бизнеса стоимость
  • 1с как найти объект по нескольким реквизитам
  • Account name перевод в банковских реквизитах