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

На чтение 6 мин Просмотров 6.3к. Опубликовано 19.08.2021

Программное открытие форм в управляемом и обычном приложении 1С сильно отличается.

Содержание

  1. Программное открытие формы в обычном приложении
  2. Программное открытие формы в управляемом приложении
  3. Как открыть форму объекта в управляемом приложении, если есть ссылка на него?
  4. Как создать документ и открыть его форму?
  5. Как открыть форму выбора и получить потом выбранное значение?
  6. Функция ОткрытьФорму() в управляемом приложении 1С
  7. Как программно открыть форму существующего объекта?
  8. Как программно открыть форму нового объекта и заполнить ее на основании чего-либо?
  9. Как программно открыть форму и задать на ней отбор?
  10. Как программно открыть форму записи регистра сведений?

Программное открытие формы в обычном приложении

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

//Получаем форму документа ПоступлениеТоваровУслуг и открываем ее
ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента").Открыть()

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

//Получаем форму документа ПоступлениеТоваровУслуг
Форма=ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента");
//Тут выполняем действия с формой
Форма.Открыть();

При этом при получении формы будет выполняться процедура события ПриСозданииНаСервере.

Рассмотрим другие методы открытия форм в управляемом приложении 1С.

Программное открытие формы в управляемом приложении

Как открыть форму объекта в управляемом приложении, если есть ссылка на него?

//Получаем ссылку на номенклатуру с кодом КодТовара
СправочникСсылка=Справочники.Номенклатура.НайтиПоКоду(КодТовара);
//Открываем форму номенклатуры с кодом КодТовара
ОткрытьЗначение(СправочникСсылка);

Метод глобально контекста ОткрытьЗначение() показывает в диалоге переданное значение. При этом, вид диалога зависит от типа переданного значения. Поскольку в данном примере мы передаем ссылку на элемент справочника, то метод открывает основную форму справочника Номенклатура.

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

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

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

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

Это можно сделать на клиенте.

//Открываем форму документа ПриходнаяНакладная
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаОбъекта");

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

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

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

Например:

&НаКлиенте
Процедура ПриходнаяНакладная(Команда)

    СсылкаНаДокумент = СоздатьНовыйДокумент();
    ОткрытьЗначение(СсылкаНаДокумент);

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

&НаСервере
Функция СоздатьНовыйДокумент()

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

   Возврат НовыйДокумент.Ссылка;

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

Как открыть форму выбора и получить потом выбранное значение?

Для этого воспользуемся функцией ВвестиЗначение(). 

ВвестиЗначение(<Значение>, <Подсказка>, <Тип>);

  • Значение — переменная, в которую будет помещено выбранное значение;
  • Подсказка — Текст заголовка окна диалога ввода значения. Может использоваться в качестве подсказки пользователю. Значение по умолчанию: Пустая строка.
  • Тип — тип вводимого значения. Если параметр не указан, используется тип параметра <Значение>. Может быть несколько типов, тогда перед выбором конкретного значения будет предложено выбрать тип.

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

Перем Значение;
Массив=новый массив;
Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));
ОписаниеТипов = Новый ОписаниеТипов(Массив);
РезультатВыбора = ВвестиЗначение(Значение, "Выберете контрагента", ОписаниеТипов);

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

Функция ОткрытьФорму() в управляемом приложении 1С

Для открытия произвольной формы предназначена функция ОткрытьФорму(). Рассмотрим как она работает.

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>);

Некоторые параметры функции:

  • ИмяФормы — полный путь к объекту метаданных Форма, тут можно выбрать либо одну из стандартных форм объекта, например, ФормаВыбора или ФормаСписка. Или конкретную, созданную разработчиками форму.
  • Параметры — позволяет передать в форму в виде структуры некоторые параметры перед ее открытием, тем самым определив выводимые данные. Параметры могут представлять собой любые данные, которые можно передавать с клиента на сервер.
  • Владелец — владелец формы — форма или элемент управления другой формы.
  • РежимОткрытияОкна— имеет 3 варианта: независимый, блокировать весь интерфейс, блокировать форму владельца.

Переданные при открытии формы параметры можно обработать в процедуре ПриСозданииНаСервере() у открываемой формы.

Как программно открыть форму существующего объекта?

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

&НаКлиенте
Процедура КомандаОткрытьКонтрагентаПоИНН(Команда)
  Параметр=новый структура;
  Параметр.Вставить("Ключ", ПолучитьКонтрагентаПоИНН(ИннКонтрагента));
  ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта",Параметр);
КонецПроцедуры

&НаСервере
Функция ПолучитьКонтрагентаПоИНН(ИНН);
   Возврат Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
КонецФункции

Как программно открыть форму нового объекта и заполнить ее на основании чего-либо?

В качестве параметра Основание нужно передать ссылку на объект-основание заполнения. При этом будет запущена процедура ОбработкаЗаполнения().

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

В этом примере будет создан документ Реализация товаров и услуг и заполнен на основании счета на оплату покупателю, ссылка на который была передана.

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

Для организации отбора, нужно передать в открываемую форму параметр Отбор структуру, ключ которой — имя поля динамического списка, а значение — искомые данные.
Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура.

&НаКлиенте
Процедура КомандаОткрытьНомераГТДСОтборомПоВладельцу(Команда)
  Параметр=новый структура;
  Отбор=новый Структура;
  Отбор.Вставить("Владелец", СсылкаНаНоменклатуру);
  Параметр.Вставить("Отбор", Отбор);
  ОткрытьФорму("Справочник.НомераГТД.ФормаСписка", Параметр);
КонецПроцедуры

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

Для этого понадобится ключ записи регистра сведений.

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

Алгоритм открытия следующий:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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

Загрузка…

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

ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.ФормаДокумента»).Открыть()

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

Форма=ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.ФормаДокумента»);
//Тут выполняем действия с формой
Форма.Открыть();

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

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

1. Как открыть форму объекта в управляемом приложении, если есть ссылка на него.

В этом случае все предельно просто.

СпрСсылка=Справочники.Номенклатура.НайтиПоКоду(«000000001»);
ОткрытьЗначение(СпрСсылка);

2. Как открыть форму выбора и получить потом выбранное значение.

Для этого существует функция ВвестиЗначение(). У функции 3 параметра:

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

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

Перем Значение;
Массив=новый массив;
Массив.Добавить(Тип(«СправочникСсылка.Номенклатура»));
Массив.Добавить(Тип(«СправочникСсылка.Контрагенты»));

ОписаниеТипов=новый ОписаниеТипов(Массив);

Рез=ВвестиЗначение(Значение, «Подсказка», ОписаниеТипов);

Предыдущие способы позволяли открывать только формы, установленные для объектов по умолчанию (форму объекта или форму выбора). Если нужно открыть произвольную форму, то можно воспользоваться функцией ОткрытьФорму().

Эта функция имеет довольно много параметров. Рассмотрим некоторые из них:

  • Имя формы — тут можно выбрать либо одну из стандартных форм объекта, например, ФормаВыбора или ФормаСписка. Или конкретную, созданную разработчиками форму.
  • Параметры — позволяет передать в форму в виде структуры некоторые параметры перед ее открытием, тем самым определив выводимые данные. Параметры могут представлять собой любые данные, которые можно передавать с клиента на сервер. Переданные при открытии формы параметры можно обработать в процедуре ПриСозданииНаСервере()  у открываемой формы.
  • Режим открытия формы — имеет 3 варианта: независимый, блокировать весь интерфейс, блокировать форму владельца.

Рассмотрим, как применяется функция ОткрытьФорму() в различных ситуациях.

3. Как открыть форму существующего объекта

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

&amp;НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;
Параметр.Вставить(«Ключ», НайтиС());
ОткрытьФорму(«Справочник.Контрагенты.ФормаОбъекта»,Параметр);
КонецПроцедуры

&amp;НаСервере
Функция НайтиС();
Возврат Справочники.Контрагенты.НайтиПоРеквизиту («ИНН», «745107734623»)
КонецФункции

4. Как открыть форму нового объекта

Тут подойдет просто функция ОткрытьФорму() без всяких параметров.

&amp;НаКлиенте
Процедура Команда1(Команда)
ОткрытьФорму(«Справочник.Контрагенты.ФормаОбъекта»);
КонецПроцедуры

5. Как открыть форму нового объекта и заполнить ее на основании чего-либо

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

&amp;НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;
Параметр.Вставить(«Основание», СсылкаНаСчетПокупателю);
ОткрытьФорму(«Документ.РеализацияТоваровУслуг.ФормаОбъекта», Параметр);
КонецПроцедуры

В этом примере будет создан документ Реализация товаров и услуг и заполнен на основании счета на оплату покупателю, ссылка на который была передана.

6. Как открыть форму и задать на ней отбор

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

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

Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура.

&amp;НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;

Отбор=новый Структура;
Отбор.Вставить(«Владелец», СсылкаНаНоменклатуру);

Параметр.Вставить(«Отбор», Отбор);

ОткрытьФорму(«Справочник.НомераГТД.ФормаСписка», Параметр);
КонецПроцедуры

7. Как открыть форму записи регистра сведений

Для этого понадобится ключ записи регистра сведений.

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

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.

&amp;НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;

ПараметрыКлюча=новый Структура;
ПараметрыКлюча.Вставить(«Номенклатура», СсылкаНаНоменклатуру);
ПараметрыКлюча.Вставить(«ТипЦены», СсылкаНаТипЦен);
ПараметрыКлюча.Вставить(«Период», Дата);

МассивКлюча = Новый Массив;
МассивКлюча.Добавить(ПараметрыКлюча);

КлючЗаписи = Новый(«РегистрСведенийКлючЗаписи.ЦеныНоменклатуры», МассивКлюча);

Параметр.Вставить(«Ключ», КлючЗаписи);

ОткрытьФорму(«РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи», Параметр);
КонецПроцедуры

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

Я
   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

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

&НаКлиенте…

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

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

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

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

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

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

КонецЦикла;

&НаСервере…

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

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

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

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

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

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

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

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

В этой статье научимся приемами программного создания и заполнения документов в 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

Skip to content

1С — открыть форму программно, с передачей и возвратом параметра

Открыть форму программно, с передачей и возвратом параметра

Статья решает задачи:

  • Как передать параметр в открываемую программно форму;
  • Как вернуть параметр из открываемой программно формы;

Исходные данные:

  • Имеется общая форма — «НашаФорма», с реквизитами:
    • «МножительА» — заполняется при открытии формы, по значению переданного параметра;
    • «МножительБ» — заполняется вручную;
  • Необходимо:
    • программно открыть форму «НашаФорма».
    • передать в форму параметр, по значению которого заполнить реквизит «МножительА»;
    • вручную заполнить реквизит формы «МножительБ»;
    • умножить «МножительА» на «МножительБ» и результат вернуть в исходную процедуру;

1. Пишем процедуру по открытию «НашаФорма» и передаче в нее параметра «МножительА»

&НаСервере
Процедура ОткрытьФормуИВернутьВведенныеДанные()
	МножительА = 100;
	//в открываемую форму передадим параметр, через структуру
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("МножительА", МножительА);
	//получим форму
	МодальнаяФорма = ПолучитьФорму("ОбщаяФорма.НашаФорма", ПараметрыФормы, ЭтаФорма);
	//откроем форму
	Результат = МодальнаяФорма.ОткрытьМодально();
	//при закрытии формы "Наша форма" нам вернется результат умножения
	РезультатУмножения = Результат;	
КонецПроцедуры

2. Пишем процедуру, которая при открытии «Наша форма» (в обработчике ПриСозданииНаСервере) будет заполнять реквизит «МножительА» по полученному значению

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)	
	МножительА = Параметры.МножительА;	
КонецПроцедуры

3. Пишем процедуру по вычислению результата умножения и возврату значения

&НаКлиенте
Процедура ЗакрытьФорму(Команда)	
	//МножительА - полученный параметр
	//МножительБ - заполненный вручную параметр
	РезультатУмножения = МножительА * МножительБ;
	
	//Вернем результат умножения в исходную процедуру
	Закрыть(РезультатУмножения);	
КонецПроцедуры

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

Понравилась статья? Поделить с друзьями:
  • Как проехать в аэропорт внуково на машине в зону вылета
  • Как узнать об исполнительном производстве по реквизитам
  • Как проехать в екатеринбурге от жд вокзала до аэропорта
  • Как узнать полные реквизиты карты тинькофф в приложении
  • Как проехать в красноярске от автовокзала до онкоцентра