Как заполнить реквизит формы обработкой в 1с

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

Я
   tatoshka0403

13.09.19 — 09:24

&НаСервере

Функция СоздатьЭлемент()

    
    НовЭл=Справочники.ТестовыйСправочник.СоздатьЭлемент();

    НовЭл.Наименование=»НовыйЭлемент»;

    НовЭл.Записать();

    Возврат НовЭл

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

&НаКлиенте

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

    
    НовЭл=СоздатьЭлемент();

    ПараметрыФормы = Новый Структура(«Ключ», НовЭл.Ссылка);

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

    //Форма.ЭтотОбъект.Реквизит01=»Проверка»;

    Форма.Реквизит01=»Проверка»;

    НовЭл.Записать();    

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

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

  

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

   dka80

1 — 13.09.19 — 09:49

эээ реквизит формы он как бы не реквизит объекта и в базу не записывается. Он существует только пока существует форма

   Nuobu

2 — 13.09.19 — 09:52

Опиши задачу полностью.

   Fish

3 — 13.09.19 — 10:04

«но при открытии документа пусто» — Речь же о справочнике?

   tatoshka0403

4 — 13.09.19 — 10:09

(2) примерно у 1000 элементов справочника необходимо заполнить значение реквизита формы.

(3) Опечатался, да речь про справочник.

   hhhh

5 — 13.09.19 — 10:25

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

   tatoshka0403

6 — 13.09.19 — 10:56

   Fish

7 — 13.09.19 — 11:00

(6) Этот нигде не хранится. Это пятничный троллинг такой?

   piter3

8 — 13.09.19 — 11:01

(6) в космосе же)

   tatoshka0403

9 — 13.09.19 — 11:02

(7) так вот и вопрос как он нигде не хранится, если программа про него помнит))

А суть вопроса как такой реквизит заполнить не открывая форму)

   hhhh

10 — 13.09.19 — 11:03

(9) ну вам же в (0) написали

Форма.Реквизит01=»Проверка»;

так и заполняйте

   tatoshka0403

11 — 13.09.19 — 11:08

(10) это я и писал) не сохраняется значение. При повторном открытии формы, значение реквизита пусто.

   hhhh

12 — 13.09.19 — 11:10

(11) ну на формах не сохраняется, правильно. Оно и не должно сохраняться. Что вас в этом не устраивает?

   tatoshka0403

13 — 13.09.19 — 11:13

(12) мы похоже друг друга не понимаем. Мне нужно обработкой создать элемент справочника и заполнить его реквизит формы.

   МимохожийОднако

14 — 13.09.19 — 11:14

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

(6) Хранится в памяти клиента пока жива форма

   hhhh

15 — 13.09.19 — 11:15

(13) ну тогда (10). Что непонятного? То что не сохраняется — это другой вопрос, это к Нуралиеву.

   МимохожийОднако

16 — 13.09.19 — 11:17

(13) противоречи (4)

Опиши задачу еще раз

   hhhh

17 — 13.09.19 — 11:19

(13) сделай реквизит объекта, а не формы. Чего ты жмотишься по мелочам?

   tatoshka0403

18 — 13.09.19 — 11:21

(17) у части элементов справочника этот реквизит уже заполнен.

(16) верно 4.

   tatoshka0403

19 — 13.09.19 — 11:21

Сейчас для текущих.

   tatoshka0403

20 — 13.09.19 — 11:21

для созданных*

   МимохожийОднако

21 — 13.09.19 — 11:23

(20) Покажи запрос, которым ты отобрал элементы справочника без заполненного реквизита

  

tatoshka0403

22 — 13.09.19 — 11:31

Всем спасибо, разобрался, туплю.

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


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


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


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


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


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

Как записать значение в реквизиты внешней обработки?

Автор k_aleks80, 16 мар 2015, 09:44

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

Следующая ситуация: имеется внешняя обработка с некоторым набором реквизитов (СписокСтатей1, …, СписокСтатей9, ВидРасчета — тип: СписокЗначений). У обработки есть две

управляемые

формы — «Форма» и «ФормаНастройки». Из «Формы» вызывается «ФормаНастройки», затем по кнопке «ВосстановитьПоУмолчанию» происходит заполнение реквизитов формы:

&НаСервере
Процедура ВосстановитьНаСервере()

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

ТекОбработка.СписокСтатей1.Очистить(); //Оплата за сверхурочные часы, включая НДФЛ 13%:
ТекОбработка.СписокСтатей1.Добавить(ПланыВидовРасчета.Начисления.НайтиПоКоду("СВХУР"));
ТекОбработка.СписокСтатей1.Добавить(ПланыВидовРасчета.Начисления.НайтиПоКоду("ПРАЗД"));
ТекОбработка.СписокСтатей1.Добавить(ПланыВидовРасчета.Начисления.НайтиПоКоду("ПРДОП"));

        // и т.д.

ТекОбработка.ВидРасчета.Очистить();
ТекОбработка.ВидРасчета.Добавить(ПланыВидовРасчета.Начисления.НайтиПоКоду("БЛН"));

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

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

&НаКлиенте
Процедура Восстановить(Команда)
ВосстановитьНаСервере();
КонецПроцедуры

Все ясно и понятно. Теперь, при вызове «Формы» и нажатии кнопки «Заполнить» должно выполняться заполнение данных на этой форме, с выполнением запроса к БД. В качестве параметра в запросе используется реквизит обработки ВидРасчета, но он пустой!
    Как я понимаю, проблема при заполнении реквизитов обработки в «ФормеНастройки». Т.е. если бы это был внутренний прикладной объект БД (Справочник, Документ), тогда перед обновлением реквизита на форме (ЗначениеВРеквизитФормы) достаточно было бы записать объект и тогда на «Форме» значение реквизита ВидРасчета было бы с данными. Однако в данном случае у объекта ВнешняяОбработка метода Записать() нет. Как мне заполнить реквизиты обработки, чтобы я мог использовать их в запросе, в другой форме?


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

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


Вы не совсем поняли ситуацию. Запросом данные я выбираю из БД, но в качестве параметра запроса использую реквизит обработки:

&НаСервере
Функция ЗаполнитьНаСервере()

Запрос = Новый Запрос("ВЫБРАТЬ
                      | Начисления.Сотрудник,
                      | СУММА(Начисления.ОтработаноДней) КАК ОплаченоДнейЧасов,
                      | СУММА(Начисления.Результат) КАК СуммаОплаты,
                      | МИНИМУМ(Начисления.ПериодДействияНачало) КАК ПериодДействияНачало,
                      | МАКСИМУМ(Начисления.ПериодДействияКонец) КАК ПериодДействияКонец,
                      | МЕСЯЦ(Начисления.ПериодДействияНачало) КАК Поле1,
                      | ПлановыеНачисленияСрезПоследних.Размер КАК Оклад
                      |ИЗ
                      | РегистрРасчета.Начисления КАК Начисления
                      | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисления.СрезПоследних КАК ПлановыеНачисленияСрезПоследних
                      | ПО Начисления.Сотрудник = ПлановыеНачисленияСрезПоследних.Сотрудник
                      |ГДЕ
                      | Начисления.ПериодРегистрации = &ПериодРегистрации
                      | И Начисления.ВидРасчета В(&ВидРасчета)
                      |
                      |СГРУППИРОВАТЬ ПО
                      | Начисления.Сотрудник,
                      | МЕСЯЦ(Начисления.ПериодДействияНачало),
                      | ПлановыеНачисленияСрезПоследних.Размер");
 
Запрос.УстановитьПараметр("ПериодРегистрации", ОбработкаОбъект.Период);
Запрос.УстановитьПараметр("ВидРасчета", ОбработкаОбъект.ВидРасчета);
Возврат Запрос.Выполнить().Выгрузить();

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

&НаКлиенте
Процедура Заполнить(Команда)

СписокДляРазовыхНачислений.Очистить();

Результат = ЗаполнитьНаСервере();

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


1. пошлите 2 этих значения (период и вид расчета) в функцию в качестве параметра. ваш вопрос конечно не снимается, но думаю так будет лучше.
2. по идее должно ругуться на строке «Возврат Запрос.Выполнить().Выгрузить();» — таблица значений не передается между клиентом и сервером.

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


1) А откуда брать данные? (это модуль формы — «Форма»; И здесь ОбработкаОбъект (Тип: ДанныеФормаСтруктура) на форме не тоже самое, что ОбработкаОбъект (Тип: ВнешняяОбработка) внешней обработки). А из «ФормаНастроек» (там свой реквизит ОбработкаОбъект (Тип: ДанныеФормаСтруктура), который не идентичен аналогичному в «Форме» и ОбработкаОбъект внешней формы) я как раз и пытался заполнять реквизиты обработки (которые являются источниками данных для реквизитов обеих форм);
2) Ругается, но только при запуске приложения в тонком клиенте. В толстом — все проходит (решил отложить данную проблему пока на потом).

Добавлено: 16 мар 2015, 14:47


Решил сделать проще. Сделал одну форму с едиными реквизитами. На форме разместил Группу в виде страницы — функционал тот же, геморрой исчез :ooifh:.


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

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

👉 Смотрите также:   Как заполнить дерево значений на форме в 1С

Рассмотрим на примере. Заполним элемент ДеревоЦен (реквизит формы, не реквизит Объекта!) формы документа Установка цен номенклатуры конфигурации УТ 11.0.7.21:

Заполнение реквизита формы (дерево значений) в 1С: внешняя обработка заполнения объекта

Элемент ДеревоЦен

В элемент ДеревоЦен записываются данные по номенклатуре, а в подчиненные номенклатуре строки – данные по характеристикам номенклатуры. В результате в табличной части Товары документа Установка цен номенклатуры находятся строки по Номенклатуре (без характеристики) и строки по Характеристикам номенклатуры (т.е. получается как развернутый вид дерева значений ДеревоЦен).

Элемент ДеревоЦен будем заполнять товарами из ассортимента выбранного партнера, для этого в конфигурацию добавлен регистр сведений пр_АссортиментТоваров с измерениями Партнер и Характеристика; в документ Установка цен номенклатуры добавлен реквизит пр_Партнер.

Т.к. рассматриваем пример внешней обработки по заполнению объекта, то в модуле внешней обработки прописываем соответствующие процедуры:

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

    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    ДобавитьКоманду(ТаблицаКоманд, "Заполнить по Ассортименту товаров", "_ЗаполнениеУстановкиЦенНоменклатуры", "ВызовКлиентскогоМетода", Истина);
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

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

Далее, т.к. используем ВызовКлиентскогоМетода, добавляем форму обработки. В модуле формы обработки прописываем процедуру ВыполнитьКоманду():

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

Процедура Заполнить(ДеревоЦенДанныеФормы, Документ)
                Запрос = Новый Запрос;
                Запрос.Текст = "ВЫБРАТЬ
                               |             пр_АссортиментТоваров.Характеристика КАК Характеристика,
                               |             пр _АссортиментТоваров.Характеристика.Владелец КАК Номенклатура,
                               |             пр_АссортиментТоваров.Характеристика.Владелец.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
                               |             пр_АссортиментТоваров.Характеристика.Владелец.ЦеноваяГруппа КАК ЦеноваяГруппа,
                               |                пр_АссортиментТоваров.Характеристика.Владелец.ВидНоменклатуры.ИспользованиеХарактеристик КАК ИспользованиеХарактеристик
                               |ИЗ
                               |             РегистрСведений.пр_АссортиментТоваров КАК пр_АссортиментТоваров
                               |ГДЕ
                               |             пр_АссортиментТоваров.Партнер = &Партнер
                               |ИТОГИ
                               |             МАКСИМУМ(Характеристика),
                               |             МАКСИМУМ(ЕдиницаИзмерения),
                               |             МАКСИМУМ(ЦеноваяГруппа),
                               |             МАКСИМУМ(ИспользованиеХарактеристик)
                               |ПО
                               |             Номенклатура";
                Запрос.УстановитьПараметр("Партнер", Документ.пр_Партнер);
                РезультатПоНоменклатуре = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
               
                ДеревоЦенДЗ = ДанныеФормыВЗначение(ДеревоЦенДанныеФормы, Тип("ДеревоЗначений"));
               
                Пока РезультатПоНоменклатуре.Следующий() Цикл
                               СтрокаДерева = ДеревоЦенДЗ.Строки.Добавить();
                               СтрокаДерева.Номенклатура = РезультатПоНоменклатуре.Номенклатура;
                               СтрокаДерева.ЕдиницаИзмерения = РезультатПоНоменклатуре.ЕдиницаИзмерения;
                               СтрокаДерева.ЦеноваяГруппа = РезультатПоНоменклатуре.ЦеноваяГруппа;
                               Если РезультатПоНоменклатуре.ИспользованиеХарактеристик = Перечисления.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать Тогда
                                               СтрокаДерева.ХарактеристикиИспользуются = Ложь;
                               Иначе
                                               СтрокаДерева.ХарактеристикиИспользуются = Истина;
                               КонецЕсли;
                              
                               РезультатПоХарактеристикам = РезультатПоНоменклатуре.Выбрать();
                               Пока РезультатПоХарактеристикам.Следующий() Цикл
                                               ПодСтрокаДерева = СтрокаДерева.Строки.Добавить();
                                               ПодСтрокаДерева.Номенклатура = РезультатПоХарактеристикам.Номенклатура;
                                               ПодСтрокаДерева.Характеристика = РезультатПоХарактеристикам.Характеристика;
                                               ПодСтрокаДерева.ЕдиницаИзмерения = РезультатПоХарактеристикам.ЕдиницаИзмерения;
                                               ПодСтрокаДерева.ЦеноваяГруппа = РезультатПоХарактеристикам.ЦеноваяГруппа;
                                               Если РезультатПоХарактеристикам.ИспользованиеХарактеристик = Перечисления.ВариантыВеденияДополнительныхДанныхПоНоменклатуре.НеИспользовать Тогда
                                                               ПодСтрокаДерева.ХарактеристикиИспользуются = Ложь;
                                               Иначе
                                                               ПодСтрокаДерева.ХарактеристикиИспользуются = Истина;
                                               КонецЕсли;
                               КонецЦикла;
                КонецЦикла;
               
                ЗначениеВДанныеФормы(ДеревоЦенДЗ, ДеревоЦенДанныеФормы);
КонецПроцедуры

После подключения внешней обработки в пользовательском режиме (после добавления в справочник Дополнительные отчеты и обработки), в документе Установка цен номенклатуры появится кнопка Заполнение…, после нажатия на которую появится окно Команды заполнения объектов с названием команды, которую мы прописали в модуле объекта внешней обработки в процедуре СведенияОВнешнейОбработке() в строке «ДобавитьКоманду(ТаблицаКоманд, «Заполнить по Ассортименту товаров»»:

Заполнение реквизита формы (дерево значений) в 1С: внешняя обработка заполнения объекта

Заполнение документа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contents

  • 1 Введение в управляемая форма 1С реквизиты элементы команды
  • 2 Программное переопределение обработчиков событий формы и элементов формы
  • 3 Программное создание групп формы.
  • 4 Программное добавление команды на форму.
  • 5 Программное создание декораций форм.
  • 6 Программное добавление реквизита на форму.
  • 7 Вывод реквизитов на форму.
  • 8 Вызов процедур при создании на сервере 1С
  • 9 Некоторые советы при программном редактировании формы
  • 10 Полезные ссылки

Рекомендуется модифицировать управляемые формы типового решения 1С программно для удобного будущего обновления и исключения конфликтов, а также для удобной работы с изменениями и надежности при использовании механизма расширений.
В некоторых типовых конфигурациях 1С (ЕРП 2, УТ 11) используется механизм упрощенного изменения конфигурации. Статьи о типовом механизме можно найти в разделе полезных ссылок. Данный механизм используется в БСП, и его необходимо знать при модификации типовых конфигураций.
При добавлении элементов на форму программно можно отредактировать практически любое свойство из панель свойств, которое можно установить вручную в конфигураторе.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.

Примеры работы с объектом «ДанныеФормыКоллекция» и созданием дин. списка и таблицы значений программно можно будет посмотреть в части 2.

Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.

Программное переопределение обработчиков событий формы и элементов формы

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЭтаФорма.УстановитьДействие(“ОбработкаВыбора”, “пр_ОбработкаВыбора”)
КонецПроцедуры

В теле модуля формы:

#Если Сервер Тогда
    ЭтаФорма.УстановитьДействие("ПриСозданииНаСервере", "пр_ПриСозданииНаСервере");
#КонецЕсли

А в новой процедуре нужно добавить вызов основной, если такая процедура есть.

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

Аналогично можно поступить и с обработчиками элементов формы:

Элементы.Номенклатура.УстановитьДействие(“ПриИзменении”, “пр_НоменклатураПриИзменении”)

Программное создание групп формы.

&НаСервере
Процедура пр_СоздатьГруппы()
    
    ГруппаСтраницы =  Элементы.Добавить("пр_Страницы", Тип("ГруппаФормы"),ЭтаФорма);
    ГруппаСтраницы.Вид = ВидГруппыФормы.Страницы;
    
    НоваяСтраница = Элементы.Добавить("пр_Страница", Тип("ГруппаФормы"),ГруппаСтраницы);
    НоваяСтраница.Вид = ВидГруппыФормы.Страница;
    НоваяСтраница.Заголовок = "Страница 1";
    
    НоваяГруппа = Элементы.Добавить("пр_Группа1", Тип("ГруппаФормы"),НоваяСтраница);
    НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
    НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
    НоваяГруппа.Заголовок = "Группа 1";
    
КонецПроцедуры

Доступные виды групп формы:

Программное добавление команды на форму.

Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(<Команда>). Удалять можно только те команды, которые были созданы программно.

&НаСервере
Процедура пр_СоздатьНовуюКоманду()
    
    //создать новую команду у формы
    НоваяКоманда    		 = Команды.Добавить("пр_Команда1");
    НоваяКоманда.Действие     = "пр_Команда1";
    НоваяКоманда.Картинка     = БиблиотекаКартинок.Облако;
    НоваяКоманда.Отображение = ОтображениеКнопки.Картинка;
    
    //вывести команду в элементы
    ЭлементКоманда    			 = Элементы.Добавить("пр_Команда1", Тип("КнопкаФормы"), Элементы.ФормаКоманднаяПанель);
    ЭлементКоманда.Заголовок     = "Вывести сообщение";
    ЭлементКоманда.ИмяКоманды     = "пр_Команда1";

    //удалить команду
    //Команды.Удалить(НоваяКоманда);
    
КонецПроцедуры

&НаКлиенте
Процедура пр_Команда1(Команда)
    
    Сообщить("Команда выполнена.");
    
КонецПроцедуры

Программное создание декораций форм.

&НаСервере
Процедура пр_СоздатьДекорацию()
    
    //добавить надпись
    Элемент    			 = Элементы.Добавить("Надпись1", Тип("ДекорацияФормы"), Элементы["пр_Группа1"]);
    Элемент.Вид    		 = ВидДекорацииФормы.Надпись;
    Элемент.Заголовок    	 = "Добавленная надпись";
 
    //для того, чтобы добавить картинку, необходимо выбрать ВидДекорацииФормы.Картинка
    Элемент = Элементы.Добавить("Картинка1", Тип("ДекорацияФормы"), Элементы["пр_Группа1"]);
    Элемент.Вид = ВидДекорацииФормы.Картинка;
    Элемент.Картинка = БиблиотекаКартинок.Бесконечность;  
  
КонецПроцедуры

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

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

&НаСервере
Процедура пр_СоздатьРеквизиты()
    
	// Массив для новых реквизитов
	ДобавляемыеРеквизиты    = Новый Массив;
   	 
	// Опишем ревизиты формы
	Реквизит_Использование = Новый РеквизитФормы("пр_Использование",    Новый ОписаниеТипов("Булево"), "", "Использование");
	Реквизит_Номенклатура = Новый РеквизитФормы("пр_Номенклатура",    Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "", "Номенклатура");
	Реквизит_Характеристика = Новый РеквизитФормы("пр_Характеристика",    Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"), "", "Характеристика");
  	 Реквизит_Количество = Новый РеквизитФормы("пр_Количество",    Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), "", "Количество");
  	 Реквизит_УдалитьКоличество = Новый РеквизитФормы("пр_УдалитьКоличество",    Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)), "", "Удалить_Количество");
       //если используется БСП, то можно для определения описания типов использовать функцию
       //ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки)
       //ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено)
       //ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты)
  	 Реквизит_Информация = Новый РеквизитФормы("пр_Информация",    ОбщегоНазначения.ОписаниеТипаСтрока(100), "", "Информация");
    
       // Для наглядности заполним массив после описания реквизитов формы
	ДобавляемыеРеквизиты.Добавить(Реквизит_Использование);
	ДобавляемыеРеквизиты.Добавить(Реквизит_Номенклатура);
	ДобавляемыеРеквизиты.Добавить(Реквизит_Характеристика);
	ДобавляемыеРеквизиты.Добавить(Реквизит_Количество);
	ДобавляемыеРеквизиты.Добавить(Реквизит_УдалитьКоличество);
	ДобавляемыеРеквизиты.Добавить(Реквизит_Информация);
    
	// Добавим новые реквизиты в форму
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);
   	 
КонецПроцедуры

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

Вывод реквизитов на форму.

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

    НовыйЭлемент = Элементы.Добавить("пр_Характеристика", Тип("ПолеФормы"), Элементы.пр_Страница1);
	НовыйЭлемент.ПутьКДанным              	= "пр_Характеристика";
	НовыйЭлемент.Вид                      	= ВидПоляФормы.ПолеВвода;
	НовыйЭлемент.Заголовок                	= "Характеристика номенклатуры";
    //добавить связь параметров выбора по реквизиту владелец в зависимости от выбранной номенклатуры
    НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "пр_Номенклатура");
    НовыйМассив = Новый Массив();
    НовыйМассив.Добавить(НоваяСвязь);
	НовыйЭлемент.СвязиПараметровВыбора = Новый ФиксированныйМассив(НовыйМассив);    
    НовыйЭлемент.УстановитьДействие("ПриИзменении", "пр_ХарактеристикаПриИзменении");
    
    НовыйЭлемент = Элементы.Добавить("пр_Количество", Тип("ПолеФормы"), Элементы.пр_Страница1);
	НовыйЭлемент.ПутьКДанным              	= "пр_Количество";
	НовыйЭлемент.Вид                      	= ВидПоляФормы.ПолеВвода;
    //установить формат
	НовыйЭлемент.ФорматРедактирования   	   = "ЧДЦ=0; ЧРГ=.; ЧН=Отсутствует";
    
    НовыйЭлемент = Элементы.Добавить("пр_Информация", Тип("ПолеФормы"), Элементы.пр_Страница1);
	НовыйЭлемент.ПутьКДанным              	= "пр_Информация";
	НовыйЭлемент.Вид                      	= ВидПоляФормы.ПолеВвода;
    //установить список выбора
    НовыйЭлемент.РежимВыбораИзСписка    	   = Истина;
    Массив = Новый Массив;
    Массив.Добавить("Необходимо дозаказать");    
    Массив.Добавить("Достаточно");    
    Массив.Добавить("Оформить полный заказ");    
    НовыйЭлемент.СписокВыбора.ЗагрузитьЗначения(Массив);
    
КонецПроцедуры

&НаКлиенте
Процедура пр_ИспользованиеПриИзменении(Элемент)
КонецПроцедуры

Вызов процедур при создании на сервере 1С

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

&НаСервере

&НаСервере
Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	//установим заголовок формы 
	ЭтаФорма.Заголовок 		= "Шаблон для программной работы с реквизитами, командами и элементами формы";
	ЭтаФорма.АвтоЗаголовок 	= Ложь;
	
	пр_СоздатьГруппы();
	пр_СоздатьНовуюКоманду();
	пр_СоздатьДекорацию();
	пр_СоздатьРеквизиты();
	пр_УдалитьРеквизиты();
	пр_ВывестиРеквизитыНаФорму();
	
КонецПроцедуры

Некоторые советы при программном редактировании формы

  • Если вы не используете префиксы при создании новых команд и элементов рекомендуется проверять существование создаваемых объектов по имени с помощью метода Найти(), который вернет Неопределено, если объект в коллекции не найден:
    • Элементы.Найти(«пр_Владелец»);
    • Команды.Найти(«пр_НоваяКоманда»);
  • Чтобы проверить уникальность реквизита на форме можно воспользоваться следующей функцией:
&НаКлиентеНаСервереБезКонтекста
// Функция определяет существует ли реквизит у объекта.
//
Функция ЕстьРеквизитОбъекта(мОбъект, ИмяРеквизита)
    
    КлючУникальности   = Новый УникальныйИдентификатор;
    СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
    ЗаполнитьЗначенияСвойств(СтруктураРеквизита, мОбъект);
    Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
    
КонецФункции // ЕстьРеквизитОбъекта()
  • Свойства, методы и коллекции управляемой формы описаны в синтакс-помощнике в разделе «Интерфейс (управляемый)»;
  • Изучите БСП, если она имеется в вашей конфигурации. Например в общем модуле «ОбщегоНазначения» уже описаны функции для создания объекта ОписаниеТипов, необходимого при создании новых реквизитов на форме:
    • ОбщегоНазначения.ОписаниеТипаСтрока(ДлинаСтроки) — Создает объект ОписаниеТипов, содержащий тип Строка;
    • ОбщегоНазначения.ОписаниеТипаЧисло(Разрядность, РазрядностьДробнойЧасти = 0, ЗнакЧисла = Неопределено) — Создает объект ОписаниеТипов, содержащий тип Число;
    • ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты) — Создает объект ОписаниеТипов, содержащий тип Дата;
    • ОбщегоНазначенияВызовСервера.ЦветСтиля(ИмяЦветаСтиля) — Функция получает цвет стиля по имени элемента стиля;
    • ОбщегоНазначенияВызовСервера.ШрифтСтиля(ИмяШрифтаСтиля) — Функция получает шрифт стиля по имени элемента стиля.

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

Полезные ссылки

1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание таблицы значений и динамического списка (Часть 2)

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

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

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

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


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

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

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

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

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


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

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

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

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

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