1с программно создать реквизит табличной части

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

Содержание

  1. Задача
  2. Добавление реквизитов
  3. Удаление реквизитов
  4. Добавление реквизита табличной части
  5. Добавление реквизита с типом Произвольный

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

Задача

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

Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:

  • ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
  • ТекущийОстаток, тип Число.

Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:

добавить реквизит формы

Добавление реквизитов

В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:

  1. Описание и создание реквизитов формы;
  2. Создание элементов формы, объединение в группу без отображения;
  3. Заполнение данных.

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

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

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

реквизит программно

Удаление реквизитов

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

    #Область УдалениеРеквизитовФормы
	
    // Массив удаляемых реквизитов
    УдаляемыеРеквизиты = Новый Массив;
    УдаляемыеРеквизиты.Добавить("ЯчейкаХранения");
    УдаляемыеРеквизиты.Добавить("ТекущийОстаток");
	
    // Удалим реквизиты формы
    ИзменитьРеквизиты( , УдаляемыеРеквизиты);
	
    #КонецОбласти

Внимание!!! Удалять можно только реквизиты созданные программно.

Добавление реквизита табличной части

Добавление реквизита и элемента формы для табличной части почти ничем не отличается, необходимо только указать путь «Объект.<ИмяТабличнойЧасти>». Ниже пример добавления реквизита Ячейка в ТЧ Комплектация.

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

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

В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение

ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Реквизит", Новый ОписаниеТипов("")));

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

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

Программное добавление колонок в ТЧ управляемой формы

Что бы на первых порах не запутаться я возьму в качестве примера простенький созданный мной документ «Поступление» у которого есть табличная часть, со следующими реквизитами «Номер», «Наименование», Количество» и «Цена».

1С Добавление колонок в ТЧ

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

Как программно добавить реквизит табличной части управляемой форм

И в эту процедуру добавить следующий код.

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

Программное добавление колонок в ТЧ управляемой формы

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

1С как программно добавить реквизит табличной части

Это программный реквизит который создается в момент создания документа, в конфигураторе вы его не увидите.

1С как программно добавить колонку в табличную часть любого документа

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

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

Файлы материала
Описание

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

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

Для примера, стоит задача в конфигурации ЗУП 3.1 добавить реквизит «Способ отражения зарплаты в БУ» для позиции штатного расписания в группе “Дополнительные данные”.

Способ отражение в позиции штатного расписания

Создадим расширение и выполним следующую последовательность действий:

  1. Добавим в расширение справочник “Штатное расписание” и создадим реквизит “АВ_СпособОтражения” с типом данных “СправочникСсылка.СпособыОтраженияЗарплатыВБухУчете”

добавление реквизита АВ_СпособОтражения в расширение

2. Заберем в расширение процедуру “ПриСозданииНаСервере” из общего модуля “УправлениеСвойствами”, программно добавим поле в форму и свяжем его с реквизитом объекта добавленного на первом шаге.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ШтатноеРасписание.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_СпособОтражения»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы);

//Вместо Добавить() можно использовать метод Вставить()

//в 4-й параметре указывается Элемент перед которым должен быть вставлен новый элемент.

//ЭлементФормы = Форма.Элементы.Вставить(ИмяЭлемента, Тип(«ПолеФормы»), ГруппаФормы, Форма.Элементы.Найти(«ИмяСледующегоЭлементаФормы»));

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

ЭлементФормы.ПутьКДанным = «Объект.АВ_СпособОтражения»;

//ЭлементФормы.МногострочныйРежим = Истина;

//ЭлементФормы.Высота = 3;

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

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

Образец расширения для скачивания в начале описания.

Программное добавление реквизита в табличную часть формы

Например, таким же способом, добавим в табличную часть “Рабочие места” реквизит “Спецжиры” с типом “Булево”.

Результат спецоценки условий труда с  колонкой спецжиры

Добавление реквизита в табличную часть

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Документ.РезультатыСпецоценкиУсловийТруда.Форма.ФормаДокумента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяЭлемента = «АВ_ЕстьСпецжиры»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда

ЭлементФормы = Форма.Элементы.Добавить(«Спецжиры», Тип(«ПолеФормы»), Форма.Элементы.РабочиеМеста);        

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

ЭлементФормы.ПутьКДанным = «Объект.РабочиеМеста.АВ_ЕстьСпецжиры»;

//ЭлементФормы.ТолькоПросмотр = Истина;

КонецЕсли;

#КонецОбласти

КонецЕсли;

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

В результате получим табличную часть с новой колонкой.

Программное добавление табличной части на форму

Аналогично добавим табличную часть “АВ_ВредныеФакторы” на форму справочника “Профессии”.

Табличная часть добавленная через расширение

Добавление табличной части на форму

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

&После(«ПриСозданииНаСервере»)

Процедура АВ_ПриСозданииНаСервере(Форма, ДополнительныеПараметры)

Если Форма.ИмяФормы = «Справочник.ПрофессииРабочих.Форма.ФормаЭлемента» Тогда

#Область ДобавлениеЭлементовФормы

ИмяГруппы = «ГруппаДополнительныеРеквизиты»;

ГруппаФормы = Форма.Элементы.Найти(ИмяГруппы);

Если ГруппаФормы <> Неопределено Тогда

ИмяЭлемента = «АВ_ВредныеФакторы»;

Если Форма.Элементы.Найти(ИмяЭлемента) = Неопределено Тогда   

ЭлементФормыТаблица = Форма.Элементы.Добавить(ИмяЭлемента, Тип(«ТаблицаФормы»), ГруппаФормы);  

ЭлементФормыТаблица.ПутьКДанным = «Объект.АВ_ВредныеФакторы»;

ЭлементФормы = Форма.Элементы.Добавить(«ВредныйФактор», Тип(«ПолеФормы»), ЭлементФормыТаблица);

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

ЭлементФормы.ПутьКДанным = «Объект.АВ_ВредныеФакторы.ВредныйФактор»;    

КонецЕсли;

КонецЕсли;

#КонецОбласти

КонецЕсли;

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

Связь реквизитов формы с элементами формы

Кроме того, реквизиты формы можно создавать программно и связывать их с элементами формы

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#Область ДобавлениеРеквизитовФормы

// Массив для новых реквизитов

ДобавляемыеРеквизиты = Новый Массив;

// Опишем ревизиты формы

Реквизит_РабочееМесто = Новый РеквизитФормы(«АВ_РабочееМесто», Новый ОписаниеТипов(«СправочникСсылка.РабочиеМестаОхраныТруда»), , «Рабочее место»);

// Заполним массив после описания реквизитов формы

ДобавляемыеРеквизиты.Добавить(Реквизит_РабочееМесто);

// Добавим новые реквизиты в форму

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

#КонецОбласти

#Область ДобавлениеЭлементовФормы

...

#КонецОбласти

#Область ЗаполнениеДанных

Форма.АВ_РабочееМесто = Форма.Объект.АВ_РабочееМесто;

#КонецОбласти


Расширения, Типовые приемы, Шаблоны и заготовки

Программное добавление реквизитов в табличную часть.

Я
   НачинающийВ1С

18.06.19 — 11:08

Доброе утро.

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

На что обратить внимание, где может быть ошибка?

         Если Форма.ИмяФормы = «Документ.НашДокумент.Форма.ФормаДокумента» тогда

            
            ДобавляемыеРеквизиты    = Новый Массив;

        //реквизиты ТЧ Товары

        Номенклатура = Новый РеквизитФормы(«Номенклатура»,    Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»),    «Объект.Товары», «Номенклатура»);

            Характеристика      = Новый РеквизитФормы(«Характеристика»,        Новый ОписаниеТипов(«СправочникСсылка.ХарактеристикиНоменклатуры»), «Объект.Товары», «Характеристика»);

                
        //Заполним массив после описания реквизитов формы

        ДобавляемыеРеквизиты.Добавить(Номенклатура);

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

        
        //Добавим новые реквизиты в форму

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

                
        //добавление на форму элементов ТЧ

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

                Номенклатура.ПутьКДанным    = «Объект.Товары.Номенклатура»;

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

        
        Характеристика                = Форма.Элементы.Добавить(«Характеристика», Тип(«ПолеФормы»), Форма.Элементы.Товары);

        Характеристика.ПутьКДанным    = «Объект.Товары.Характеристика»;

        Характеристика.Вид            =ВидПоляФормы.ПолеВвода;

         КонецЕсли;

  

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

   НачинающийВ1С

1 — 18.06.19 — 11:10

Замечу, что в отладчике в «Форма.Объект.Товары» оба реквизита присутствуют после обхода этих строк.

А вот уже в предприятии номенклатуры нет, а характеристика есть.

   НачинающийВ1С

2 — 18.06.19 — 11:12

(1) Да собственно и перед выводом самим в самом конце события «при открытии формы» в отладчике оба реквизита присутствуют.

   aleks_default

3 — 18.06.19 — 11:24

Почисти кэш

   НачинающийВ1С

4 — 18.06.19 — 11:33

(3) Чистил, не помогло. На всякий случай еще раз почистил, снова не помогло.

   RomanYS

5 — 18.06.19 — 11:40

>> В самом документе в табличной части реквизиты в конфигураторе добавлены

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

   НачинающийВ1С

6 — 18.06.19 — 11:41

(5) А как правильно добавить на форму реквизиты?

Ошибок никаких не получаю.

   RomanYS

7 — 18.06.19 — 11:46

(6) Зачем это делать программно? Просто добавьте их в редакторе формы.

Код подобный вашему может быть использован для упрощения поддержки, когда непосредственное редактирование форм не рекомендуется. Но «НашДокумент» явно не тот случай.

   НачинающийВ1С

8 — 18.06.19 — 11:47

(7) «НашДокумент» это абстрактное название документа. Документ типовой. Как и Номенклатура и Характеристика это абстрактные названия реквизитов.

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

   catena

9 — 18.06.19 — 11:48

+(5)ТОже не поняла. Достаточно же элементы добавить.

   catena

10 — 18.06.19 — 11:48

Вот этого должно хватить, если реквизиты в ТЧ есть:

//добавление на форму элементов ТЧ

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

                Номенклатура.ПутьКДанным    = «Объект.Товары.Номенклатура»;

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

        
        Характеристика                = Форма.Элементы.Добавить(«Характеристика», Тип(«ПолеФормы»), Форма.Элементы.Товары);

        Характеристика.ПутьКДанным    = «Объект.Товары.Характеристика»;

        Характеристика.Вид            =ВидПоляФормы.ПолеВвода;

   НачинающийВ1С

11 — 18.06.19 — 11:53

(10) Убрал добавление самих реквизитов. Оставил только добавление элементов.

Все осталось как прежде — один реквизит добавляется, второй нет.

   НачинающийВ1С

12 — 18.06.19 — 11:54

(7) (10) Вы были правы, добавление реквизитов само по себе излишне. Уберу это в коде.

Но проблема с выводом на форму так и не решена.

   RomanYS

13 — 18.06.19 — 11:55

(8) Прикольно. Каков уровень абстракции: реквизит Номенклатура в ТЧ Товары !!!

(10) +1

(8) Проверь права, возможно на абстрактный добавленный тип их забыли установить. Вряд ли у тебя там добавлены абстрактные функциональные опции, но тоже проверь.

   НачинающийВ1С

14 — 18.06.19 — 11:56

(13) Запускаю с полными правами.

   RomanYS

15 — 18.06.19 — 11:58

(14) проверь ещё раз ПутьКДанным. Хотя при ошибке по идее исключение должно выдаваться

   RomanYS

16 — 18.06.19 — 12:00

Ещё имена переменных поменяй, вместо

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

делай

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

   НачинающийВ1С

17 — 18.06.19 — 12:02

(16) Имена переменных в базе итак другие (Элемент_ИмяЭлемента)

Путь к данным правильный.

В последней строке события «При открытии» по прежнему в «Объект.Товары» есть оба нужных реквизита. А в итоге почему-то только один.

   НачинающийВ1С

18 — 18.06.19 — 12:03

(17) Не в базе, а в моем коде.

   RomanYS

19 — 18.06.19 — 12:05

(17) В Объект.Товары они независимо от твоего кода — из метаданных расширения.

Смотри Форма.Элементы.ИмяТвоегоАбстактногоРеквизита: видимость, доступность…

   singlych

20 — 18.06.19 — 12:12

ставлю на функциональную опцию

   НачинающийВ1С

21 — 18.06.19 — 12:20

(19) Сверил.

Все строчки у обоих реквизитов идентичны.

   mikecool

22 — 18.06.19 — 12:25

добавить в конфигураторе, рулить видимостью — не вариант?

   НачинающийВ1С

23 — 18.06.19 — 12:26

(22) Вы имеете ввиду добавить в конфигураторе на форме не кодом? Не вариант так.

   mikecool

24 — 18.06.19 — 12:29

(23) как пожелаешь

   aleks_default

25 — 18.06.19 — 12:31

Вообще-то непонятно. Если реквизиты изначально есть, то почему изначально нет элементов формы для этих реквизитов? Они тоже тогда наверное должны быть. Может они тоже на самом деле уже есть, а их потом где-то дальше в коде скрывают(убирают видимость)?

   НачинающийВ1С

26 — 18.06.19 — 12:31

(24) Ну это не мое желание. Задание такое.

   НачинающийВ1С

27 — 18.06.19 — 12:32

(25) Потому что реквизиты добавлены мной вручную. А формы типовые.

   Вафель

28 — 18.06.19 — 12:32

(10) должно работать

   aleks_default

29 — 18.06.19 — 12:32

Может просмотреть код на наличие действий с элементами формы?

   aleks_default

30 — 18.06.19 — 12:34

(27) А тоесть ты реквизиты в расширении добавил?

   НачинающийВ1С

31 — 18.06.19 — 13:20

(30) Нет, сами реквизиты добавлены в конфигурации основной. А общий модуль, в котором приведенный код написан, находится в расширении. (29) Что имеется ввиду?

   RomanYS

32 — 18.06.19 — 13:24

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

   НачинающийВ1С

33 — 18.06.19 — 13:26

(32) Комплексная автоматизация 2 (2.4.7.109)

Документ «Коммерческое предложение клиенту».

В табличную часть не добавляется реквизит «Направление» (СправочникСсылка.НаправленияДеятельности)

   RomanYS

34 — 18.06.19 — 13:31

(33) Возможно Справочник.НаправленияДеятельности выключен фукнциональными опциями

   НачинающийВ1С

35 — 18.06.19 — 13:32

(34) Если добавлять просто на форму руками, все добавляется.

Как можно проверить выключен или нет?

   Avalone2010

36 — 18.06.19 — 14:49

(0) КА — типовая.Пустая.Включена ФО по КП. В модуле формы расширения.В процедуре при создании на сервере.

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

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

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

В КП добавлен в ТЧ товары новый реквизит «_НаправлениеДеятельности».

   Avalone2010

37 — 18.06.19 — 15:03

(35) Настройки фин реза и контролинг. раздел финансовый результат. галочка финансовый результат по направлениям деятельности. константа ФормироватьФинансовыйРезультат

  

НачинающийВ1С

38 — 18.06.19 — 15:21

(37) Спасибо! Это решило вопрос.

Содержание:

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

В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и «убивает» все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.

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

1.     Добавляем реквизит

Начнем с самого простого. Мы добавили реквизит «МоеРасширение_НаименованиеНаАнглийском» в справочник контрагентов.

                Для того, чтобы вывести его на форму програмно, пишем код процедуры «МоеРасширение_ПриСозданииНаСервереПосле» (Отказ, Стандартная Обработка).

                НовыйЭлемент = Элементы.Добавить («МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));

                НовыйЭлемент.ПутьКДанным                = «Объект. МоеРасширение_НаименованиеНаАнглийском»;

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

                НовыйЭлемент.ТолькоПросмотр         = Ложь;

                НовыйЭлемент.Видимость                      = Истина;

                НовыйЭлемент.Доступность                  = Истина.

Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит «МоеРасширение_ТекущаяЗадолженность».

Сначала создадим реквизит:

                ДобавляемыеРеквизиты           = Новый Массив;

                НовыйРеквизит = Новый РеквизитФормы(«МоеРасширение_ТекущаяЗадолженность»),      Новый ОписаниеТипов («Число», «Текущая задолженность»);

                ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);

                ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты).

Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле «ПутьКДанным» – здесь мы пишем наименование только что созданного реквизита:

                НовыйЭлемент = Элементы.Добавить(«МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));

                НовыйЭлемент.ПутьКДанным                = «МоеРасширение_ТекущаяЗадолженность»;

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

                НовыйЭлемент.ТолькоПросмотр         = Истина;

                НовыйЭлемент.Видимость                      = Истина;

                НовыйЭлемент.Доступность                  = Истина.

Теперь переместим наши реквизиты под поле «Полное наименование». Для этого надо определить на форме место добавления, в нашем случаем – над группой «ГруппаКолонки»:

Элементы.Переместить(Элементы.МоеРасширение_НаименованиеНаАнглийском,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);

Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки).

Получаем результат:

Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:

                Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие(«ПриИзменении», «МоеРасширение_РасшифроватьЗадолженность»). 

2.     Добавление кнопки

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

                НоваяКоманда = Команды.Добавить(«МоеРасширение_ПоказатьОСВ»);

                НоваяКоманда.Действие = «МоеРасширение_ПоказатьОСВ»;

                НоваяКоманда.Заголовок = «Показать ОСВ».

ВАЖНО!! В поле действие пишется имя процедуры.

Теперь добавляем саму кнопку:

                НоваяКнопка = Элементы.Добавить(«МоеРасширение_Кнопка_ПоказатьОСВ», Тип(«КнопкаФормы»));

                НоваяКнопка.ИмяКоманды = «МоеРасширение_ПоказатьОСВ». 

3.     Добавление группы

Для добавления группы переместим кнопку к полю «Текущая задолженность». На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.

Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит «Текущая задолженность» и кнопку «Показать ОСВ»:

                НоваяГруппа =Элементы.Добавить(«МоеРасширение_ГруппаЗадолженность», Тип(«ГруппаФормы»));

                НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;

                НоваяГруппа.Заголовок = «»;

                НоваяГруппа.ОтображатьЗаголовок = Ложь;

                НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;

                Элементы.Переместить(НоваяГруппа,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);

                Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,НоваяГруппа);

                Элементы.Переместить(Элементы.МоеРасширение_Кнопка_ПоказатьОСВ,НоваяГруппа). 

4.     Добавляем табличную часть 1С

Добавим к контрагенту табличную часть 1С «МоеРасширение_Номенклатура» с реквизитом «Номенклатура» и выведем ее на форму.

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

ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы «Табличная часть».

                НоваяТабличнаяЧасть = Элементы.Добавить(«МоеРасширение_ТаблицаНоменклатура», Тип(«ТаблицаФормы»));

                НоваяТабличнаяЧасть.ПутьКДанным = «Объект.МоеРасширение_Номенклатура»;

                НовыйРеквизитТабличнойЧасти = Элементы.Добавить(«МоеРасширение_Номенклатура», Тип(«ПолеФормы»),НоваяТабличнаяЧасть);

                НовыйРеквизитТабличнойЧасти.Заголовок = «Номенклатура»;

                НовыйРеквизитТабличнойЧасти.Вид = ВидПоляФормы.ПолеВвода;

                НовыйРеквизитТабличнойЧасти.ПутьКДанным = «Объект.МоеРасширение_Номенклатура.Номенклатура».

 

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

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

Максим Федоров

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

Программное добавление колонок в ТЧ управляемой формы

Что бы на первых порах не запутаться я возьму в качестве примера простенький созданный мной документ «Поступление» у которого есть табличная часть, со следующими реквизитами «Номер», «Наименование», Количество» и «Цена».

1С Добавление колонок в ТЧ

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

Как программно добавить реквизит табличной части управляемой форм

И в эту процедуру добавить следующий код.

Программное добавление колонок в ТЧ управляемой формы

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

1С как программно добавить реквизит табличной части

Это программный реквизит который создается в момент создания документа, в конфигураторе вы его не увидите.

1С как программно добавить колонку в табличную часть любого документа

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

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

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

Любой документ в 1с имеет определенную форму. Если нам необходимо ее изменить, например добавить для видимости колонку, то сделать это можно следующим способом:

1) Заходим в документ и в правом верхнем углу нажимаем на кнопку «Еще».

2) В появившемся списке выбираем «Изменить форму».

3) В открывшейся окне настройки формы проверяем проставленные «V» — возможно у нужного поля галочка не стоит.

Если ее нет, то проставляем и нажимаем «Ок» (Для примера добавим в «Тип»).

Также можно расположить колонки в нужно порядке. Для этого повторно заходим в «Настройка формы» (п.1, 2) и воспользуемся синими стрелочками. Нужно выделить строчку, которую нужно переместить и нажимаем на нужную стрелочку («Вверх», «Вниз» в зависимости от того куда его нужно переместить колонку на форме- правее или левее).

Для примера переместим «Тип» сразу за колонкой «Номенклатура».

Если в списке нет нужного реквизита, то можно воспользоваться кнопкой «Добавить поля», но это работает не всегда — там где возможно кнопка будет активна.

Для примера выведем на форму «Вид номенклатуры». Для этого открываем «Настройка формы» (п.1, 2), выбираем строчку «Номенклатура» и нажимаем «Добавить поля».

В появившемся списке ставим галочку возле «Вид номенклатуры» и нажимаем «ОК».

В списке «Настройка формы» появится соответствующая строчка. Нажимаем «ОК».

Текстовое примечание в документах 1С

Подходит для 1с для россии1с для казахстана1с для белоруссии1с для украины

Bерсия для печати

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

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

Именно для решения озвученных проблем и предназначена эта разработка. В первую очередь она добавляет колонку Примечание в таблицу товаров заказов и документов товародвижения:

  • заказ клиента,
  • заказ поставщику,
  • заказ на перемещение,
  • приобретение товаров и услуг,
  • реализация товаров,
  • сборка товаров,
  • перемещение товаров.

Посмотрим на примере заказа клиента (для остальных все аналогично).

примечание в заказе клиента

Добавлены печатные формы с выводом примечания.

заказ клиента с примечаниемпечатная форма с примечанием

Примечание можно заполнить как вручную, так и автоматически:

кнопка заполнения примечания

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

варианты заполнения примечания

Зачем склад в примечании

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

Для корректной работы расширения необходимо отключить безопасный режим.

отключение безопасного режима расширения

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

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

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

Как получить и обойти выделенные строки табличной части

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

Работа с табличной частью объектов в 1СДля получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

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

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

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

Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

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

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1=«Значение»;

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

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

Понравилась статья? Поделить с друзьями:
  • Dsv транспортная компания как расшифровывается
  • 1с разрешить редактирование реквизитов команда
  • Element 47 ювелирная компания официальный сайт
  • Eurasia drilling company limited лица компании
  • 1с расширение конфигурации изменение реквизита