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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

Создать документ 1С программно

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

Реквизиты документа в 1С 8.3

Для программного создания документов, я сделал обработку. У этой обработки , я разработал форму и создал команду управляемой формы, которую назвал  «Создать документ прихода», поместив её на форму обработки.

Форма обработки для создания документа

Для этой команды, я сделаю обработчики на клиенте и на сервере.

Создание обработчиков команды

В серверном обработчике мы и напишем код, который и будет создавать документ..

&НаСервере
Процедура СоздатьДокументПриходаНаСервере()

    ДокПриход = Документы.ПриходТовара.СоздатьДокумент();

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

&НаКлиенте
Процедура СоздатьДокументПрихода(Команда)
    СоздатьДокументПриходаНаСервере();
КонецПроцедуры

В этом коде я обратился к менеджеру документа ПриходТовара  (строка Документы.ПриходТовара), и использовал функцию менеджера документа СоздатьДокумент, которая и создает документ-объект. Переменная ДокПриход, которую мы создали будет иметь тип ДокументОбъект.ПриходТовара.

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

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

Номер я присваивать не буду, потому что у объекта моего документа включено свойство Автонумерация.

Свойство автонумерация документа

В принципе, этого вполне достаточно, чтобы наш документ существовал. Но создав его при помощи функции СоздатьДокумент, мы не записали его непосредственно в базу. После выполнения кода выше, ни какого документа в базе не появится!

Записать документ 1С программно

Для того, чтобы документ 1С появился в базе, его необходимо записать.  Делается это при помощи метода документа-объекта Записать. Этот метод позволяет и записать, и провести документ. Он имеет два параметра, которые я разберу ниже. Но, метод Записать также можно использовать и без параметров, тогда он будет просто записывать документ. Что мы и сделаем.

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Записать();

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

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

Создание пустого документа

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

Заполнить документ 1С программно

У нашего документа два реквизита «шапки» – Склад и Комментарий. Создадим на форме обработки реквизит управляемой формы Склад с соответствующим типом, для последующей записи его в шапку документа, а реквизит комментарий заполним в ручную.

Создание реквизита управляемой формы

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

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой"
ДокПриход.Записать();

Так мы заполнили реквизиты «шапки», но у нас имеется еще табличная часть документа, необходимо заполнить и её. Для её заполнения, я создам таблицу значений в качестве реквизита формы обработки, и помещу её на эту форму.

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

ДокПриход = Документы.ПриходТовара.СоздатьДокумент();
ДокПриход.Дата = ТекущаяДата();
ДокПриход.Склад = Склад;
ДокПриход.Комментарий = "#Документ создан автоматически обработкой";
Для Каждого стрТЗ Из ТЗ Цикл
    НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить();
    НовСтрТЧДокумента.Номенклатура = стрТЗ.Номенклатура;
    НовСтрТЧДокумента.Количество   = стрТЗ.Количество;
    НовСтрТЧДокумента.Цена         = стрТЗ.Цена;
    НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена;
КонецЦикла;
ДокПриход.Записать();

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

Для Каждого стрТЗ Из ТЗ Цикл
    НовСтрТЧДокумента = ДокПриход.СписокТоваров.Добавить();
    ЗаполнитьЗначенияСвойств(НовСтрТЧДокумента,стрТЗ);
    НовСтрТЧДокумента.Сумма = НовСтрТЧДокумента.Количество*НовСтрТЧДокумента.Цена;
КонецЦикла;


Всё! Мы можем смело создать документ, который будет заполнен.

Создание и заполнение документа 1С

Создание и заполнение документа 1С

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

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

Записать(<РежимЗаписи>,<РежимПроведения>)

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

РежимЗаписиДокумента.Запись
РежимЗаписиДокумента.Проведение
РежимЗаписиДокумента.ОтменаПроведения

Т.е. мы можем записать документ, провести документ и отменить проведение документа.

Во втором параметр РежимПроведения необходимо указывать системное перечисление РежимПроведениеДокумента, которое может принимать следующие значения:

РежимПроведенияДокумента.Неоперативный
РежимПроведенияДокумента.Оперативный

Т.е. мы можем провести документ как в оперативном режиме, так и в неоперативном. Если этот параметр не указан, то документ проводится в неоперативном режиме.

Изменим запись нашего документа: пусть он проводится в оперативном режиме.

ДокПриход.Записать(РежимЗаписиДокумента.Проведение,
                   РежимПроведенияДокумента.Оперативный);

Теперь документ будет сразу проведен при создании.

Изменить документ 1С программно

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

Обработка изменения документа

Как и в прошлый раз, я создам обработчик команды на сервере и на клиенте. И в серверном обработчике напишу код получения объекта из ссылки документа.

&НаСервере
Процедура ИзменитьДокументНаСервере()

    ДокОбъект = ДокументПрихода.ПолучитьОбъект();

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

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
КонецПроцедуры

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

Изменим склад и проведем документ. В этот раз проведем в неоперативном режиме.

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


Открыть документ 1С программно

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

&НаСервере
Процедура ИзменитьДокументНаСервере()
    ДокОбъект = ДокументПрихода.ПолучитьОбъект();
    ДокОбъект.Склад = Склад;
    ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
                       РежимПроведенияДокумента.Неоперативный);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьДокумент(Команда)
    ИзменитьДокументНаСервере();
    ПараметрыОткрытия = Новый Структура("Ключ",ДокументПрихода);
    ОткрытьФорму("Документ.ПриходТовара.ФормаОбъекта",
                 ПараметрыОткрытия,,,,,,
                 РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

Если мы сейчас выполним этот код, то откроется форма документа, с уже измененным реквизитом Склад.

Обработка изменения документа

Более подробно и основательно разработка в 1С дается в моей книге: «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Программное создание документов в 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с

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


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если конфигурация типовая, то, наверное, самый простой способ решения такой задачи – создать внешнюю обработку вида «Заполнение объекта».

Заполнение формы объекта с помощью внешней обработки

Строка с соответствующим параметром в модуле обработки:

ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");

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

  • ВызовСерверногоМетода – обработчик команды располагается в модуле обработки;
  • ВызовКлиентскогоМетода – обработчик команды располагается в модуле формы обработки;
  • ЗаполнениеФормы – обработчик команды располагается в модуле обработки и позволяет работать с данными формы. Также позволяет вызвать серверную процедуру из модуля формы объекта. При этом можно заполнить форму не записывая объект.

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

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

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Наименование", "Заполнение формы документа");
    ПараметрыРегистрации.Вставить("Версия", "1.01");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Заполнение формы документа");
    ПараметрыРегистрации.Вставить("Назначение", "Документ.ПриходнаяНакладная");
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    ДобавитьКоманду(ТаблицаКоманд,
    "Заполнить форму документа", //Представление
    "ЗаполнитьФорму",            //Идентификатор
    "ЗаполнениеФормы",           //Вариант использования
    Ложь,                        //Показывать оповещение
    "");                         //Модификатор
    
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	
    Возврат ПараметрыРегистрации;
	
КонецФункции


Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры


// Обработчик команды
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
	
	 Форма = ПараметрыВыполнения.ЭтаФорма; //Данные формы доступны через ПараметрыВыполнения
	 
	 Форма.Объект.Поставщик = // ... Заполняем нужные реквизиты.
	 
	 Форма.Модифицированность = Истина;
	
КонецПроцедуры

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

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

Заполнение формы объекта посредством обработчика команды в модуле формы

Итак, размещаем команду на форме объекта в том месте, которое нам нравится. В модуле формы добавляем клиентскую процедуру обработчика команды, из которой будем вызывать серверную процедуру. Серверную процедуру тоже создадим, она нам понадобится потому, что по условию задачи данные для заполнения получаются запросом.

Над серверной процедурой нужно подумать. В ней у нас будет объект формы с типом «ДанныеФормыСтуктура». Что-либо менять или заполнять в этом объекте не получится, возникнет ошибка «Объект недоступен для изменения».

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

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

&НаКлиенте
Процедура ЗаполнитьФормуДокумента(Команда)
		
	ЗаполнитьФормуДокументаНаСервере();
	
	ОбновитьОтображениеДанных();
	
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьФормуДокументаНаСервере()
	
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	
	ТЧ_Товары = ДокументОбъект.Товары; // Табличная часть Товары
	ТЧ_Товары.Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = //Текст запроса
	;
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		СтрТЧ = ТЧ_Товары.Добавить();
		ЗаполнитьЗначенияСвойств(СтрТЧ, Выборка);
				
	КонецЦикла;
	
	ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
	
	Модифицированность = Истина;
	
КонецПроцедуры

Вот теперь и форма заполнена, и кнопка команды там, где хочется.

УФ Заполнение и открытие программно созданного документа

Я
   Snork

05.05.14 — 09:44

В обработке нажали кнопку. Нужно создать, заполнить и открыть (НО не записать) новый документ. Как?

Пробовал:

Форма = ПолучитьФорму(«Документ.СчетНаОплатуПокупателю.ФормаОбъекта»);

//Далее через Форма.Объект заполнять реквизиты

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

Но есть проблема. Этот код на клиенте, а чтоб заполнить некоторые реквизиты надо переводить на сервер. Но при переводе обратно с сервера на клиент, ругается, что на сервере нельзя изменять данные Форма.Объект

  

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

   Snork

1 — 05.05.14 — 09:48

В коде самого док ничего менять нельзя

   Рэйв

2 — 05.05.14 — 09:55

(0)Не стой стороны копаешь.

Док=Документы.СчетНаОплатуПокупателю.СоздатьДокумент();

//Заполнить….

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

Ф.Открыть();

   Рэйв

3 — 05.05.14 — 09:57

А если из формы хочешь, то как то так на сервере

Об=РеквизитФормыВЗначение(«Объект»);

//…заполнить Об.

ЗначениеВРеквизитФормы(Об,»Объект»);

   DexterMorgan

4 — 05.05.14 — 10:10

Кури ОткрытьФорму, ПараметрыФормы

   DexterMorgan

5 — 05.05.14 — 10:12

а именно ЗначенияЗаполнения

Расширение управляемой формы для документа (Managed form extension for documents)

ЗначенияЗаполнения (FillingValues)

Описание:

Тип: Структура.

Параметры заполнения нового объекта.

Ключ структуры — имя реквизита формы, значение — заполняемое значение.

   Defender aka LINN

6 — 05.05.14 — 10:30

(0) Дык получи нужные значения на сервере, а на клиенте их просто присвой.

   andreymongol82

7 — 05.05.14 — 11:33

Это если у документа управляемая форма.

КлючУникальности = новый УникальныйИдентификатор;

Док=Документы.СчетНаОплатуПокупателю.СоздатьДокумент();

Форма = Док.ПолучитьФорму(«Документ.СчетНаОплатуПокупателю.ФормаОбъекта»,,КлючУникальности);

ДанныеФормы = Форма.Объект;

//заполняем данные формы

КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);

Форма.Модифицированность  = истина;

Форма.КлючУникальности = КлючУникальности;

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

   Snork

8 — 05.05.14 — 15:07

(7) так не работает, см. (0)

   Snork

9 — 05.05.14 — 15:08

(5) при этом методе не получится использовать общие функции заполнения типа:

ОтветственныеЛицаБП.УстановитьОтветственныхЛиц(ДокОбъект);

   Snork

10 — 05.05.14 — 15:08

(6) табличные части так не перенести

   VRednaia

11 — 05.05.14 — 15:20

(8) в (0) про метод из (7) ни слова. Метод из (7) реально работает.

   Snork

12 — 05.05.14 — 15:23

ап

   Snork

13 — 05.05.14 — 15:31

(11) На клиенте недоступен Документы…

На сервере недоступен ПолучитьФорму()

   Snork

14 — 05.05.14 — 15:32

Аналог (7) я реализовал в (0). При передаче клиент-сервер выдает ошибку

   Snork

15 — 05.05.14 — 16:51

up

   Kamas

16 — 05.05.14 — 16:53

(15) дык на сервере функция для сбора данных  а на клиенте открой форму

   Snork

17 — 05.05.14 — 16:55

(16) ты не разобрался

   DexterMorgan

18 — 05.05.14 — 17:02

(17) тебе чем (4) не подходит?

   DexterMorgan

19 — 05.05.14 — 17:03

кароче

ФормаЗаказа = ПолучитьФорму(«Документ.ЗаказПоставщику.ФормаОбъекта»);

и делай с ней че хочешь

   Snork

20 — 05.05.14 — 17:26

(19) см. (9)

   Snork

21 — 05.05.14 — 17:46

ап

   DexterMorgan

22 — 05.05.14 — 17:46

(20) копируй функции, переписывай под «Форма.объект»

   Snork

23 — 05.05.14 — 17:56

(22) похоже на было код

   DexterMorgan

24 — 05.05.14 — 18:09

(23) Вспомни об этом, когда переименуют функцию заполнения или добавят параметр.

Ты походу быдло кода не видел.

  

Snork

25 — 06.05.14 — 12:12

Финальное решение:

&НаКлиенте…

Форма = ПолучитьФорму(«Документ.СчетНаОплатуПокупателю.ФормаОбъекта»);

СтрПарам = ПолучитьПараметрыСчетаНаСервере();

ЗаполнитьЗначенияСвойств(Форма.Объект, СтрПарам);

    
Для Каждого Стр Из Объект.ТЧДок Цикл

    НовСтр = Форма.Объект.Товары.Добавить();

    ЗаполнитьЗначенияСвойств(НовСтр, Стр);

КонецЦикла;

&НаСервере…

ПолучитьПараметрыСчетаНаСервере():

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

    
ДокОбъект = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();

ДокОбъект.Заполнить(Неопределено);

ДокОбъект.Реквизит = Значение;

ОтветственныеЛицаБП.УстановитьОтветственныхЛиц(ДокОбъект);

    
ЗаполнитьЗначенияСвойств(СтрПарам, ДокОбъект);

    
Возврат СтрПарам;

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

  • 24 поликлиника спецмедосмотров санкнижка время работы врачей
  • Амуртест в благовещенске игнатьевское шоссе 10 4 часы работы
  • Банк ренессанс кредит в новосибирске блюхера 19 время работы
  • Анализ ликвидности бухгалтерского баланса страховой компании
  • 250000 на развитие бизнеса от соцзащиты как получить выплату

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии