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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

Здравствуйте, как автоматически заполнить реквизит формы при программном создании документа (У Т П, обычные формы)

Вот код для создания нового документа

Док = Документы.ПлатежноеПоручениеВходящее.СоздатьДокумент();

Док.Дата = ТекущаяДата() ;

……….

……….

……….

Док.Записать() ;

В этом документе есть реквизиты формы ссылочного типа — ссылаются на Перечисления в основном

Ставка НДС,

Счет расчетов,

Счет авансов,

Счет НДС (неподтвержденный)

КАК при создании документа заполнить значениями эти ЭлементыФормы

Вроде писал

ФормаДок = Док.ПолучитьФорму(Формы.ФормаДокумента) ;

выдает ошибку

{ВнешняяОбработка.СтворенняПП.Форма.Форма.Форма(42,25)}: Неопознанный оператор

ФормаДок.ЭлементыФормы <<?>>??? (Проверка: Толстый клиент (обычное приложение))

ФормаДок.ЭлементыФормы ??? — далее затрудняюсь

Подсобите пожалуйста, благодарю, удачи

Программное создание документов в 1с

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

  1. Создаем документ
  2. Заполняем реквизиты документа
  3. Заполняем табличную часть документа.

Рассмотрим пример создания документа на примере “Приходная накладная” в каркасной конфигурации

Во-первых создаем обработку для заполнения документов. Для этого в обработку добавим 2 подчиненных объекта-реквизита СуммаПоДокументу и Склад.

Программное создание документов в 1с
Реквизиты документа 1с

Во-вторых создаем документ на сервер. Затем заполняем его информацией. Для заполнения Даты используем функцию ТекущаяДата()

Программное создание документов в 1с

Программное заполнение документа 1с

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

Программное заполнение документа 1с
Процедуры создания документа 1с

Выведем поиск по элементу справочника Номенклатура в отдельной функции. Представим код функции ниже.

Программное заполнение документа 1с
Функция поиска номенклатуры

Итого весь код создания выглядит так

Программное создание документов в 1с
Полный код создания и заполнения документа

Количество строк в табличной части документа.

Нахождение количества строк в табличной части документа.

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

Пример создания документа и открытие формы при помощи программирования:

Код создания документа в 1с
Код создания документа в 1с. Открытия формы

Программное создание документов в 1с. Открыть форму документа 1с.

Как создать документ и открыть его форму?

В 1С Предприятии 8.2  для этих целей существует два возможных сценария работы:

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

В первом сценарии проще всего использовать метод глобального контекста ОткрытьФорму(). Это можно сделать на клиенте.

Для открытия формы документа 1с применяется команда ОткрытьФорму.

Приведем код открытия формы документа используя команду ОткрытьФорму():

Открыть форму документа 1с
Открытие формы документа 1с

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

Поле ввода как задать значение по умолчанию

И так для примера я сделал документ с одним реквизитом и типом поле ввода, допустим необходимо что-бы при создании документа данное поле заполнялось автоматически.

1C Значение по умолчанию

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

Как в 1С установить значение по умолчанию для поле ввода

В результате при создании нового документа сразу будет заполняться поле установленным значением.

Как в 1С установить значение по умолчанию

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

установить значение по умолчанию для поле ввода

И написать в нем вот такую строчку кода.

Объект.ПолеВвода = "0001"
Как в  установить значение по умолчанию для поле ввода 1с

Результат будет тот же самый.

1С Поле ввода как установить значение по умолчанию

Как видите все достаточно просто. Вообще ситуации могут быть разные поэтому если что-то не получается обязательно напишите об этом.

Программное заполнение реквизитов документа.

Автор |R|U|D|E|N, 07 мар 2011, 17:36

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

Добрый день.

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

Делаю следующее:

//закрываю тикущую форму
Закрыть(0);
//получаю документ
Документ = Документы.АктПриемаОборудования.СоздатьДокумент();
//заполняю реквизиты
Документ.ТипПриема = Перечисления.ТипПриема.ГарантийныйРемонт;
//открываю форму документа
Документ.ПолучитьФорму("ФормаДокумента").Открыть()

В результате этого форма открывается, но абсолютно пустая…что я делаю не так, или как правильно?

С уважением Александр.


//закрываю тикущую форму
Закрыть(0);
//получаю документ
ДокументОбъект = Документы.АктПриемаОборудования.СоздатьДокумент();
//открываю форму документа
ФормаДокумента = ДокументОбъект.ПолучитьФорму(«ФормаДокумента»);
ФормаДокумента.ТипПриема = Перечисления.ТипПриема.ГарантийныйРемонт;
ФормаДокумента.Открыть();

Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.


Спасибо большее cska-fanat-kz ! Все работает четко.
Только вот предложенный вариант позволяет заполнить реквизиты документа а табличную часть не получается.

У меня в документе есть табличная часть «ПереченьОборудования» а ней есть колонкии SN, Наименование и прочии..Как быть с ними?

Делаю так:

ФормаДокумента.ПереченьОборудования.SN = ЭлементыФормы.Оборудование.SN.Значение;

Ругается, что элемент не найден?

ЭлементыФормы.Оборудование.SN.Значение — Это поле табличного документа, первой формы, значение которого я хочу передать в документ.



НС = ДокументОбъект.ПереченьОборудования.Добавить()
НС.Наименование = ...;


cska-fanat-kz Вы как всегда в точку!
Есть еще одна проблемма. Помните мы вместе с Вами создовали ТаблицуЗначений+ТабличноеПоле+КоманднуюПанель из встроенного языка? Так вот теперь мне необходимо данные из этой ТаблицыЗначений перенести в соответствующее ТабличноеПоле документа.

Вот код ТаблицыЗначений+ТабличногоПоля+КоманднойПанели:

//Создаем табличное поле для ввода оборудования
Если ЭлементыФормы.Найти("Оборудование") = Неопределено Тогда
ТабЗн = Новый ТаблицаЗначений;
ТабЗн.Колонки.Добавить("SN", Новый ОписаниеТипов("СправочникСсылка.СерийныеНомера"));
ТабЗн.Колонки.SN.Ширина = 32;
ТабЗн.Колонки.Добавить("Оборудование", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТабЗн.Колонки.Оборудование.Ширина = 32;
ТабЗн.Колонки.Добавить("Комплектация", Новый ОписаниеТипов("Строка"));
ТабЗн.Колонки.Комплектация.Ширина = 35;
ТабЗн.Колонки.Добавить("ВнешнийВид", Новый ОписаниеТипов("Строка"));
ТабЗн.Колонки.ВнешнийВид.Ширина = 35;
ТабЗн.Колонки.Добавить("Кол", Новый ОписаниеТипов("Строка"));
ТабЗн.Колонки.Кол.Ширина = 10;
ТабЗн.Колонки.Добавить("ОтПоставщика", Новый ОписаниеТипов("ПеречислениеСсылка.ПринятоОтПоставщика"));
ТабЗн.Колонки.ОтПоставщика.Ширина = 20;
ТабЗн.Колонки.Добавить("Диагноз", Новый ОписаниеТипов("Строка"));
ТабЗн.Колонки.Диагноз.Ширина = 35;
ТабЗн.Колонки.Добавить("ПредЦена", Новый ОписаниеТипов("Строка"));
ТабЗн.Колонки.ПредЦена.Ширина = 12;

//НоваяСтрока = ТабЗн.Добавить();
//НоваяСтрока.SN = Справочники.СерийныеНомера.НайтиПоКоду(000002);

ТабПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "Оборудование", Истина);
ТабПоле.Лево = 15; ТабПоле.Верх = 195;
ТабПоле.Ширина = ЭтаФорма.Ширина - 30;
ТабПоле.Высота = 70;
ТабПоле.ТолькоПросмотр = ЛОЖЬ;
ТабПоле.ТипЗначения = Новый ОписаниеТипов("ТаблицаЗначений");
ТабПоле.Значение = ТабЗн;
ТабПоле.СоздатьКолонки();

КПанель = ЭлементыФормы.Добавить(Тип("КоманднаяПанель"), "КоманднаяПанельКТаблице", Истина);
Кпанель.Лево = 15;
Кпанель.Верх = 170;
Кпанель.Ширина = Этаформа.Ширина - 30;
Кпанель.Высота = 20;

КПанель.ИсточникДействий = ЭлементыФормы.Оборудование;
Кпанель.АвтоЗаполнение = Истина;
Иначе
ЭлементыФормы.Оборудование.Видимость = Истина;
ЭлементыФормы.КоманднаяПанельКТаблице.Видимость = Истина;
КонецЕсли;



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


ТП = ДокументОбъект.ПереченьОборудования.Добавить();
ТП.SN = ТабЗн.??????;


Простите progmikon Вам конечно тоже спасибо большее!


Не за что.

1. Если вам нужно из ТЗ загрузить в табличную часть, то можно:


ДокументОбъект.ПереченьОборудования.Загрузить(ТЗ);// если имена колонок совпадают, то это самый быстрый вариант

или


Для Каждого ТекСтрока Из ТЗ Цикл
ТП = ДокументОбъект.ПереченьОборудования.Добавить();
ТП.SN = ТекСтрока.СерийныйНомер;
КонецЦикла;


progmikon спасибо!  :zebzdr:

ДокументОбъект.ПереченьОборудования.Загрузить(ТЗ); — Это самая генеальная, простая и эффективная синтаксическая конструкция из всех что я пока видел в 1с))

Все работает! Тема закрыта.


Понравилась статья? Поделить с друзьями:
  • Как привлечь управляющую компанию за мошенничество
  • Как прикрепить инстаграм к фейсбуку бизнес аккаунт
  • Как проверить время работы компьютера за все время
  • Как проверить время работы приложения в windows 10
  • Как проверить время работы телевизора samsung qled