Как программно изменить значение реквизита в форме 1с

   bambucho

22.10.15 — 07:48

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

Получаю объект документа по ссылке,но как обратится с этому реквизиту не пойму?

  

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

   kosts

1 — 22.10.15 — 07:51

(0) Если конечно он так называется

Объект.СчетАвансов = СчетСсылка;

Только надо не забыть установить субконто в соответствии с новым счетом.

   bambucho

2 — 22.10.15 — 07:54

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

   bambucho

3 — 22.10.15 — 07:56

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

   asady

4 — 22.10.15 — 07:57

(0) ты это хочешь сделать где?

в модуле этой самой формы? или где.

   bambucho

5 — 22.10.15 — 07:59

суть:вн.обработка,которая изменяет значение «Счер расчетов» и «Счет авансов» у всех или выбранных доков.

   asady

6 — 22.10.15 — 07:59

(5) тогда причем здесь реквизит формы?

   bambucho

7 — 22.10.15 — 07:59

Запросом все легко читается:



«ВЫБРАТЬ

          |     ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетУчетаРасчетовСКонтрагентом КАК СчетУчетаРасчетовСКонтрагентом,

          |     ПоступлениеНаРасчетныйСчетРасшифровкаПлатежа.СчетУчетаРасчетовПоАвансам КАК СчетУчетаРасчетовПоАвансам,

   bambucho

8 — 22.10.15 — 08:00

(6) ок,тогда ка изменить содержимое этого реквизита дока?))

   kosts

9 — 22.10.15 — 08:01

(5) Возможно счет находится в ТЧ.

Тогда так как-то

Для каждого т из Объект.РасшифровкаПлатежа Цикл
    т.СчетУчетаРасчетовПоАвансам = СчетСсылка;
   bambucho

10 — 22.10.15 — 08:04

(9) Попробую еще раз,но таким способом обращения не получилось…

   asady

11 — 22.10.15 — 08:10

(8) надо узнать идентификаторы реквизитов этого дока

(как они точно называются допустим СчетРасчетовСКонтрагентом и СчетРасчетовПоАвансам) и

выполнить следующий код:

тОбъект = СсылкаНаОбъект.ПолучитьОбъект();

тОбъект.СчетРасчетовСКонтрагентом = СсылкаНаТвойСчетРасчетовСКонтрагентом;

тОбъект.СчетРасчетовПоАвансам = СсылкаНаТвойСчетРасчетовПоАвансам;

Если тОбъект.Проведен Тогда

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

Иначе

РежимЗаписи = РежимЗаписиДокумента.Запись;

КонецЕсли;

тОбъект.Записать(РежимЗаписи);

   asady

12 — 22.10.15 — 08:13

(11)+

судя по (7) у тебя эти реквизиты в ТЧ тогда

так:

тОбъект = СсылкаНаОбъект.ПолучитьОбъект();

Для каждого стр из тОбъект.РасшифровкаПлатежа Цикл

стр.СчетРасчетовСКонтрагентом = СсылкаНаТвойСчетРасчетовСКонтрагентом;

стр.СчетРасчетовПоАвансам = СсылкаНаТвойСчетРасчетовПоАвансам;

КонецЦикла;

Если тОбъект.Проведен Тогда

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

Иначе

РежимЗаписи = РежимЗаписиДокумента.Запись;

КонецЕсли;

тОбъект.Записать(РежимЗаписи);

   bambucho

13 — 22.10.15 — 08:16

Я пробовал так,не хочет:

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    
     Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

          Ссылка = ВыборкаДетальныеЗаписи.Ссылка;

          ДокОбъект = Ссылка.ПолучитьОбъект();

          ДокОбъект.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.01»);

          ДокОбъект.Записать();

     КонецЦикла;

   bambucho

14 — 22.10.15 — 08:18

Я пробовал так,не хочет:

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    
     Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

          Ссылка = ВыборкаДетальныеЗаписи.Ссылка;

          ДокОбъект = Ссылка.ПолучитьОбъект();

          ДокОбъект.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

          ДокОбъект.Записать();

     КонецЦикла;

   asady

15 — 22.10.15 — 08:19

(13)-(14) см (12)

   bambucho

16 — 22.10.15 — 08:28

Не догоняю)

1)ссылку на —  «СсылкаНаТвойСчетРасчетовСКонтрагентом» сформировал запрос?

   asady

17 — 22.10.15 — 08:31

(16) в твоем случае это ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

   bambucho

18 — 22.10.15 — 08:55

)))

лучше так:

1.Есть у.форма вн.обработки,в элементах/реквизитах которой я задаю «Счет расчетов» и «Счет авансов» по средством обращения к «ПлануСчетовСсылка»-т.е. выбирая нужный счет/субсчет,(минуя нюансы деректив препроцессора) далее передаю их в цикл,который может обратиться к доку  по ссылке ну и еще получить сами СчетУчетаРасчетовСКонтрагентом и СчетУчетаРасчетовПоАвансам  (полученные запросом),подскажите как должен выглядеть код цикла:

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    
     Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

          Ссылка = ВыборкаДетальныеЗаписи.Ссылка;

          ДокОбъект = Ссылка.ПолучитьОбъект();

          ДокОбъект.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

          ДокОбъект.Записать();

     КонецЦикла;

зы:сложно пока я ориентируюсь в нюансах)

   asady

19 — 22.10.15 — 08:58

(18) в (12) код практически уже тебе написан ….

   bambucho

20 — 22.10.15 — 08:59

(19)

))

   bambucho

21 — 22.10.15 — 08:59

пойду в метро втыкать)

   asady

22 — 22.10.15 — 09:00

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

          Ссылка = ВыборкаДетальныеЗаписи.Ссылка;

          ДокОбъект = Ссылка.ПолучитьОбъект();

Для каждого стр из ДокОбъект.РасшифровкаПлатежа Цикл

стр.СчетРасчетовСКонтрагентом = СсылкаНаТвойСчетРасчетовСКонтрагентом;

стр.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

КонецЦикла;

Если тОбъект.Проведен Тогда

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

Иначе

РежимЗаписи = РежимЗаписиДокумента.Запись;

КонецЕсли;

          ДокОбъект.Записать(РежимЗаписи);

     КонецЦикла;

   ibreiter

23 — 22.10.15 — 09:04

(18) А вы на форме счета задаете и их же ищете потом еще по коду?

   vladko

24 — 22.10.15 — 09:09

(18) тебе же пишут, что надо не только реквизит документа, но ещё поправить табличную часть РасшифровкаПлатежа. Только тогда всё изменится

   bambucho

25 — 22.10.15 — 09:23

(23) нет,это для теста я искал в коде,а задавать через ф. Буду

   bambucho

26 — 22.10.15 — 09:25

(24) именно на расшифровке я и забуксавал…

   bambucho

27 — 22.10.15 — 09:29

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

   bambucho

28 — 22.10.15 — 09:30

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

   asady

29 — 22.10.15 — 09:32

(27) потому что это табличная часть и она может содержать несколько строк.

   Kiks

30 — 22.10.15 — 09:32

Проще воспользоваться общей процедурой СчетаУчетаПоУмолчанию.

   bambucho

31 — 22.10.15 — 09:32

Простите с телефона пишу…дебильный браузер…

   ibreiter

32 — 22.10.15 — 09:33

(27) Нету у вас формы, тем более ее реквизитов, забудьте про нее…об объекте речь идет

   bambucho

33 — 22.10.15 — 09:37

(32) ок,буду пробовать

   bambucho

34 — 22.10.15 — 10:52

ругается бп3:

{Форма.Форма.Форма(44)}: Поле объекта не обнаружено (СчетРасчетовСКонтрагентом)                стр.СчетРасчетовСКонтрагентом = СчетАвансов;

   bambucho

35 — 22.10.15 — 10:55

в цикл ТЧ «ДокОбъект.РасшифровкаПлатежа» в табло нормально раскрываетм реквизиты,но по следующим строчкам:

Так:

стр.СчетРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.01»);

стр.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

или так:

стр.СчетРасчетовСКонтрагентом = СчетАвансов; //выб.счета с формы обраб.                стр.СчетУчетаРасчетовПоАвансам = СчетРасчетов; //выб.счета с формы обраб.

не идет…

   bambucho

36 — 22.10.15 — 10:57

точнее,в табло «СчетРасчетовСКонтрагентом» выглядит как группа (плисик,раскрывающий дерево),может в этом дереве нужно выбрать что то?

   bambucho

37 — 22.10.15 — 10:58

точнее,в табло «СчетРасчетовСКонтрагентом» выглядит как группа (плюсик,раскрывающий дерево),может в этом дереве нужно выбрать что то?

   bambucho

38 — 22.10.15 — 11:11

как я зол..))

ребяты где опять я буксую?

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

          Ссылка = ВыборкаДетальныеЗаписи.Ссылка;

          ДокОбъект = Ссылка.ПолучитьОбъект();

          
              Для каждого стр из ДокОбъект.РасшифровкаПлатежа Цикл

                стр.СчетРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.01»);

                стр.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.02»);

            КонецЦикла;

            
        Если ДокОбъект.Проведен Тогда

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

        Иначе

            РежимЗаписи = РежимЗаписиДокумента.Запись;

        КонецЕсли;

          ДокОбъект.Записать(РежимЗаписи);

          
     КонецЦикла;

   bambucho

39 — 22.10.15 — 11:25

Подскажите кто,почему не записывается значение в:

стр.СчетРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.01»);

бьет ошибку:

{Форма.Форма.Форма(40)}: Поле объекта не обнаружено (СчетРасчетовСКонтрагентом)

                стр.СчетРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду(«62.01»);

   bambucho

40 — 22.10.15 — 11:32

вроде поехало…

   asady

41 — 22.10.15 — 11:34

(40) я тебе специально оставил некоторые несоответствия имен реквизитов чтобы ты не просто так коопипастил а чуточку хоть подумал

  

bambucho

42 — 22.10.15 — 11:38

все ок получилось)

СПАСИБО ВАМ!)

(41) имеенооо))) в них и нашел косяк)

На чтение 4 мин Просмотров 6.8к. Опубликовано 27.12.2017

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

Программная модификация формы может потребоваться в нескольких случаях:

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

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

  • реквизиты;
  • локальные команды;
  • элементы.

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Содержание

  1. Изменение команд формы
  2. Изменение реквизитов формы
  3. Изменение элементов формы

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды. У коллекции есть несколько методов:

  • Добавить(<ИмяКоманды>)

  • Количество()

  • Найти(<ИмяКоманды>)

  • Удалить(<Команда>)

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию(). Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды.Добавить(«ИсторияИзменений»);
Команда.Действие = «Подключаемый_ОтобразитьИсторию»;
Команда.Заголовок = «История изменений…»;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию(Команда)
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте.

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты(<Путь>), возвращающей массив типа РеквизитФормы. Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

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


Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.


Создадим новый реквизит формы с именем Покупатель:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));

// Изменения состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы. У коллекции есть несколько методов:

  • Вставить(<Имя>, <ТипЭлемента>, <Родитель>, <Элемент>)

  • Добавить(<Имя>, <ТипЭлемента>, <Родитель>)

  • Количество()

  • Найти(<Имя>)

  • Переместить(<Элемент>, <Родитель>, <МестоРасположения>)

  • Удалить(<Элемент>)

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить(), Добавить(), Переместить() и Удалить()) можно только на сервере. Искать и получать количество элементов (методы Найти() и Количество()) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

  • ГруппаФормы;
  • ТаблицаФормы;
  • ПолеФормы;
  • КнопкаФормы.

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие(<ИмяСобытия>, <Действие>).

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

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

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(«Покупатель», Новый ОписаниеТипов(«СправочникСсылка.Контрагенты»), , «Клиент»));
// Изменение состава реквизитов
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// Создание поля ввода и связь с реквизитом
Элемент = Элементы.Добавить(«Покупатель», Тип(«ПолеФормы»));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = «Покупатель»;

Назначение элементу формы обработчика события:

ЭлементПокупатель.УстановитьДействие(«ПриИзменении», «Подключаемый_ПокупательПриИзменении»);

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении(Элемент)
// Действия события
КонецПроцедуры


Внимание!

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



Внимание!

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


Содержание:

1.     Добавление реквизитов на 1С управляемые формы

2.     Добавить элементы на форму

3.     Установка событий элементам формы

При адаптации типовых конфигураций 1С часто приходится изменять в 1С 8 управляемые формы. Такие адаптации сложно потом поддерживать при обновлении. Такие изменения приходится вносить вручную заново, перепроверять корректность изменений в каждом обновлении. И если таких изменений множество, то каждое обновление может представлять серьезные трудозатраты. Есть несколько решений, которые позволяют упростить поддержку и обновление измененных систем 1С. Одно из них – это программное изменение форм.

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

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

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

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

Рассмотрим на примерах, как делать доработку управляемых форм кодом в 1С. 

1.          Добавление реквизитов на 1С управляемые формы

Если в ходе разработки изменилась типовая структура объекта, то добавлять новые реквизиты на форму нет необходимости. Эти реквизиты будут доступны по пути «Объект.НовыйРеквизит».

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

«ДобавляемыеРеквизиты» и «УдаляемыеРеквизиты» – это массивы с элементами типа «РеквизитФормы». Тут все просто – «Добавляемые» добавляются, «Удаляемые» – удаляются.

Функция РеквизитФормы («ИмяРеквизита», «ТипРеквизита», «Путь», «Заголовок») создает объект типа «РеквизитФормы».

Тут важно понимать, что «ИмяРеквизита» содержит имя без точек. То есть имя без пути реквизита. Если нужно добавить реквизит, например, табличной части объекта, то уже в реквизите «Путь» указать путь к ТЧ реквизита – «Объект.Товары». «ТипРеквизита» задается через объект «ОписаниеТипов».

В примере ниже я добавил два реквизита «ЭтоСборка» для табличной части «Товары» у объекта и «СтатусОбработки» на форму документа. 

2.          Добавить элементы на форму

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

Для добавления новых элементов на форму есть два метода:

­-Элементы.Добавить(«ИмяЭлемента», «ТипЭлемента», «Родитель»).

-Элементы.Вставить(«ИмяЭлемента», «ТипЭлемента», «Родитель», «Элемент»).

«ИмяЭлемента» должно быть уникальным в рамках элементов формы. Лучше добавить какой-то префикс, чтобы не возникло пересечений с типовыми элементами формы.

«ТипЭлемента» имеет не так уж много вариантов. Это «ПолеФормы», «ГруппаФормы», «ДекорацияФормы», «КнопкаФормы» и «ТаблицаФормы». Все остальные свойства назначаются через «Вид» создаваемого элемента. Например, поле с типом булево лучше сделать «флажком», установив вид элементу «ВидПоляФормы.ПолеФлажка».

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

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

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

3.          Установка событий элементам формы

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

Для установки событий элементам нужно использовать процедуру УстановитьДействие («ИмяСобытия», «Действие»).

«ИмяСобытия» — имя события, которое нужно отработать. Например, «ПриИзменении», «Очистка», «ОбработкаВыбора» и т.п.

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

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

НовыйЭлемент.КнопкаОчистки = Истина;

Получилась вот такая процедура программного заполнения управляемой формы:

Код для копирования:

&НаСервере

Процедура КЛ_ДополнитьФормуПрограммно()

МассивРеквизитовФормы = Новый Массив;

//Новый реквизит Товары.КЛ_ЭтоСборка

НовыйРеквизитФормы = Новый РеквизитФормы(«КЛ_ЭтоСборка»,

           Новый ОписаниеТипов(«Булево»)

           ,»Объект.Товары»

           ,»Это сборка»);

МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);

//Новый реквизит КЛ_СтатусОбработки

НовыйРеквизитФормы = Новый РеквизитФормы(«КЛ_СтатусОбработки»,

           Новый ОписаниеТипов(«ПеречислениеСсылка.СтатусыДокументовРеализации»)

           ,

           ,»Статус обработки»);

МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);

ИзменитьРеквизиты(МассивРеквизитовФормы);

НовыйЭлемент = Элементы.Добавить(«КЛ_СтатусОбработки», Тип(«ПолеФормы»), Элементы.ГруппаШапкаЛевая);

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.КнопкаОчистки = Истина;

НовыйЭлемент.УстановитьДействие(«ПриИзменении»,»КЛ_ПриИзмененииСтатусаОбработки»);

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

НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;

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

Специалист компании ООО «Кодерлайн»

Кирилл Карцев.

&НаСервере
Процедура Изменение_значения_реквизита_объекта(ДокСсылка, Новое_значение_реквизита)// Процедура программно меняет значение реквизита объекта (документа)
    // ДокСсылка — документ в котором необходимо изменить реквизит
    // Новое_значение_реквизита — новое значение реквизита «Реквизит_для_корректировки»

    // или так: ДокументССылка=Документы.ТТН.НайтиПоНомеру(СокрЛП(Ном),Дата(‘2021-05-16’));

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

        Попытка

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
           
Сообщить(ОписаниеОшибки());
        КонецПопытки

    Иначе

Сообщить(Новое_значение_реквизита+» не записано в «+ДокСсылка+«! Документ не определен»);
    КонецЕсли

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

17 правил для составления оптимального ЗАПРОСа к данным базы 1С 47
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ


1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш


1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.


Google maps : вывод точек на карту и режим панорамы 8
В отличие от яндекс карт в GMaps можно использовать панорамы — за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора


Google maps, поиск оптимального маршрута 5
В данном посте хочу коснуться основных аспектов построения оптимального маршрута с использованием API Google maps. Исходные данные для построения маршрута:
* Географические координаты объектов, которые хранятся в базе;
* Координаты начальной и коне


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

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

Содержание

  1. Изменение команд формы
  2. Изменение реквизитов формы
  3. Изменение элементов формы
  4. Комментарии

Платформа 1С:Предприятие позволяет программно добавлять и изменять элементы управляемой формы. Разберемся для чего это может потребоваться.

Программная модификация формы может потребоваться в нескольких случаях:

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

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

Все указанные операции возможны только на сервере.

Программное изменение формы имеет ограничения:

  • Удалить можно только программно добавленные реквизиты/команды/элементы. Нельзя программно удалить объекты, созданные в конфигураторе.
  • Нельзя назначить реквизит основным.

Изменение команд формы

Для управления составом команд у объекта УправляемаяФорма есть коллекция Команды . У коллекции есть несколько методов:

Коллекция Команды доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Добавить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере.

В качестве примера работы с командами формы создадим новую команду ИсторияИзменений с заголовком «История изменений…», которая будет вызвать обработчик ОтобразитьИсторию () . Создание выполняется при открытии формы.

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Команда = Команды . Добавить ( «ИсторияИзменений» );
Команда . Действие = «Подключаемый_ОтобразитьИсторию» ;
Команда . Заголовок = «История изменений…» ;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОтобразитьИсторию ( Команда )
// действия команды
КонецПроцедуры

Обработчик команды должен располагаться в форме и иметь директиву компиляции &НаКлиенте .

Изменение реквизитов формы

Чтение состава реквизитов формы выполняется функцией ПолучитьРеквизиты ( Путь >) , возвращающей массив типа РеквизитФормы . Параметр функции указывает путь к родительскому реквизиту (в виде строки). Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.

Изменение реквизитов выполняется методом ИзменитьРеквизиты ( ДобавляемыеРеквизиты >, УдаляемыеРеквизиты >) объекта УправляемаяФорма . В параметры ДобавляемыеРеквизиты и УдаляемыеРеквизиты передаются массивы с элементами типа РеквизитФормы .

Внимание!

Процесс изменения состава реквизитов является достаточно ресурсоемким. Фактически выполняется пересоздание формы. В связи с этим работа с реквизитами формы выполняется в пакетном режиме.

Создадим новый реквизит формы с именем Покупатель:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив ;
ДобавляемыеРеквизиты . Добавить(Новый РеквизитФормы («Покупатель», Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));

// Изменения состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );

Изменение элементов формы

Для управления составом элементов у объекта УправляемаяФорма есть коллекция Элементы . У коллекции есть несколько методов:

Коллекция Элементы доступна как на клиенте, так и на сервере. Изменять коллекцию (методы Вставить () , Добавить () , Переместить () и Удалить () ) можно только на сервере. Искать и получать количество элементов (методы Найти () и Количество () ) можно как на клиенте, так и на сервере. Элементами коллекции могут быть:

Элементам формы можно программно назначить обработчики событий. Для этих целей предназначен метод УстановитьДействие ( ИмяСобытия >, Действие >) .

Рассмотрим несколько наиболее распространенных на практике примеров работы с командами, реквизитами и элементами формы.

Добавление команды и связанной с ней кнопки:

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

Добавление реквизита и связанного с ним поля ввода:

// Описание добавляемых реквизитов
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты . Добавить (Новый РеквизитФормы ( «Покупатель» , Новый ОписаниеТипов ( «СправочникСсылка.Контрагенты» ), , «Клиент» ));
// Изменение состава реквизитов
ИзменитьРеквизиты ( ДобавляемыеРеквизиты );
// Создание поля ввода и связь с реквизитом
Элемент = Элементы . Добавить ( «Покупатель» , Тип ( «ПолеФормы» ));
Элемент . Вид = ВидПоляФормы . ПолеВвода ;
Элемент . ПутьКДанным = «Покупатель» ;

Назначение элементу формы обработчика события:

ЭлементПокупатель . УстановитьДействие ( «ПриИзменении» , «Подключаемый_ПокупательПриИзменении» );

&НаКлиенте
Процедура Подключаемый_ПокупательПриИзменении ( Элемент )
// Действия события
КонецПроцедуры

Внимание!

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

Внимание!

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

Остались вопросы?
Спросите в комментариях к статье.

Примеры работы с дополнительными реквизитами.

Как получить значение дополнительного реквизита:

Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».

Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».

Получается вот такой запрос:

Также можно использовать метод НайтиПоНаименованию ( «***» ) .

Переменная Ссылка – это ссылка на «Договор контрагента».

Проверка на предмет того, что дополнительный реквизит заполнен:

Как изменить значения дополнительных реквизитов:

Задействуем общий модуль УправлениеСвойствами , который входит в состав БСП.

Комментарии

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

Не хватает закрывающей скобки.

У вас ошибка в коде:
МассивСтруктур.Добавить(Новый Структура(«Свойство, Значение», ДопРеквизитДатаОтправки, ТекущаяДата());

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

Сейчас форма имеет следующий вид:

После добавления новых элементов она будет иметь вид:

Итак, добавляем реквизиты:

  • ЕдиницаИзмерения , тип СправочникСсылка.ЕдиницыИзмерения ;
  • ТекущийОстаток , тип Число .

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

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

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

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

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

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

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

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