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

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

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

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

Для примера, стоит задача в конфигурации ЗУП 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

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

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

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

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

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

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

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

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

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

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

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

...

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

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

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

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


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

Расширение реквизит таб. части

Я
   Масянька

21.12.21 — 11:10

День добрый!

Имеем: Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.19.48), 1С:Предприятие 8.3 (8.3.19.1264).

Расширение (дополнение) — добавлен документ (реквизиты, ТЧ, форма). В ТЧ добавлен новый реквизит.

Как связать?

&НаСервере

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

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

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

Элемент.ПутьКДанным = Объект.Сотрудники.ПричиныОбоснования;

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

Выдает ошибку:

Поле объекта не обнаружено (ПричиныОбоснования)

{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(241)}:Элемент.ПутьКДанным = Объект.Сотрудники.ПричиныОбоснования;

Спасибо.

  

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

   Фрэнки

1 — 21.12.21 — 11:16

Добавление новых реквизитов в ТЧ типового документа Расширение разрешает, но вот таким образом «расширять» — моветон

   Масянька

2 — 21.12.21 — 11:18

(1) А как не моветон?

   Фрэнки

3 — 21.12.21 — 11:21

(2) либо в доп-сведения, что есть в типовом (это не всегда удобно, но застрянет в основной базе практически навсегда)

либо дописать в своем расширение регистр сведений и связать его множеством разных способов с основной ТЧ. В ЗУП для этих связок даже готовый реквзит в большинстве документов предусмотрен.

   Фрэнки

4 — 21.12.21 — 11:22

типа, идентификатор строки ТЧ — через него можно

   Масянька

5 — 21.12.21 — 11:24

(3) Спасибо.

Готовый — это ТЧ ДополнительныеРеквизиты?

   Кулибин

6 — 21.12.21 — 11:25

(0)

    Если Элементы.Найти(«ОСМЦ01») = Неопределено Тогда

        ТЧ = Элементы.Найти(«ОС»);

        ЭлементФормы = Элементы.Добавить(«ОСМЦ01», Тип(«ПолеФормы»), ТЧ);

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

        ЭлементФормы.ПутьКДанным = «Объект.ОС.МЦ01»;

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

        Элементы.Переместить(ЭлементФормы,Элементы.Найти(«ОС»),Элементы.Найти(«ОСОсновноеСредство»));

    КонецЕсли;

Вот так работает

   Масянька

7 — 21.12.21 — 11:29

(6) Элемент.ПутьКДанным = «Объект.Сотрудники.ПричиныОбоснования»;

выдает:

Недопустимое значение

{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(241)}:Элемент.ПутьКДанным = «Объект.Сотрудники._ПричиныОбоснования»;

   Кулибин

8 — 21.12.21 — 11:34

(7) Не знаю, кусок из «вчерашнего» кода, было проще скопировать, всё работает чётко.

Процедура:

&НаСервере

Процедура Адапт1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

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

   Масянька

9 — 21.12.21 — 11:36

(8) Реквизит один и тот же — кусок названия убираю (могу косякнуть).

   Масянька

10 — 21.12.21 — 11:47

Заработало так: ЭлементФормы.ПутьКДанным = «Сотрудники._ПричиныОбоснования»;

   Фрэнки

11 — 21.12.21 — 11:50

(5) // Готовый — это ТЧ ДополнительныеРеквизиты?

эти тч есть только у справочников

   Масянька

12 — 21.12.21 — 11:55

   Кулибин

13 — 21.12.21 — 11:59

(10) странно всё это, какая платформа? Но всё равно «пожалуйста»)))

   Масянька

14 — 21.12.21 — 12:00

(13) 8.3.19.1264

   Масянька

15 — 21.12.21 — 12:00

(13) Странно — это очень мягко сказано…

   Кулибин

16 — 21.12.21 — 12:03

У меня четвертая восьмерка и две крайние другие, скоро придется переписывать, видимо)

   Кулибин

17 — 21.12.21 — 12:05

Проверил, без «Объект.» валится.

   Масянька

18 — 21.12.21 — 12:06

(17) У меня с объектом валится, а без объекта не пишет в реквизит. Один хрен — фигня полная…

   Фрэнки

19 — 21.12.21 — 12:09

(12) в таких ТЧ Допреквизитов для документов все равно не хватает привязки к строкам из основной ТЧ, если там окажется много строк.

   Мультук

20 — 21.12.21 — 12:13

(18)

Масянька, а вас не смущает, что «таблица» которую вы видите на форме вовсе не привязана к Объект.Сотрудники

а привязан к таблице значений «Сотрудники» (реквизит формы) ?

   Масянька

21 — 21.12.21 — 12:15

(20) А Вы все не читаете? Принципиально?

Уже метод тыка пошел. Ошибка на «Объект.Сотрудники…»

   Мультук

22 — 21.12.21 — 12:23

(21)

Еще раз для танкистов

>>> У меня с объектом валится, а без объекта не пишет в реквизит. Один хрен — фигня полная…

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

Напишите уже код, который «При создании» будет совать ваш данные вашего реквизита в т.з. «Сотрудники», а при записи наоборот.

P.S.

ну или тыкайтесь, ага

P.P.S

Процедура ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)

Процедура ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)

   Масянька

23 — 21.12.21 — 12:26

(22) Спасибо, буду пробовать.

   Кулибин

24 — 21.12.21 — 12:35

(20) Ну, это в корне меняет дело)))

   Масянька

25 — 22.12.21 — 10:22

(22) Вот:

&НаСервере

&После(«ЗаполнитьФормуПоДаннымОбъекта»)

Процедура _ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)

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

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

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

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

                                           «Объект.Сотрудники», «_ПричиныОбосновани»);

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

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

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

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

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

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

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

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

Выдает:

Недопустимое значение

{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(268)}:    НовыйЭлемент.ПутьКДанным    = «Объект.Сотрудники._ПричиныОбоснования»;

{Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(598)}:    ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект);

{Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(70)}:    ПриПолученииДанныхНаСервере(ТекущийОбъект);

по причине:

Недопустимое значение

   Мультук

26 — 22.12.21 — 10:52

(25)

1) Вас не смущает, что вы пытаетесь добавлять реквизиты в процедуре, которая при жизни формы будет вызываться более одного раза ?

2) Я написал про перенос данных, а НЕ про создание реквизитов

Наводящие вопросы.

1) Вы понимаете что фактически должны добавить новую колонку в реквизит формы «Сотрудники» (тип «ТаблицаЗначений»)

2) Далее нужно где-то (например в «ПриСоздании») отобразить эту добавленную колонку на форме

3) Далее нужно модифицировать процедуры

Процедура ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)

Процедура ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)

чтобы значение из табличной части попадало в таблицу значений Сотрудники

а затем обратно

   Масянька

27 — 22.12.21 — 10:57

(26) 1. Да

2. Да.

3. Непонятно что и как модифицировать.

Встречный вопрос: а почему нельзя вывести колонку (как обычно, в конфигураторе, в расширении) и просто установить связь?

   Мультук

28 — 22.12.21 — 12:05

(27)

Будет три картинки

https://pastenow.ru/FF3J2

https://pastenow.ru/FF3ID

https://pastenow.ru/FF3KK

1) Добавляем в расширение нужные объекты

2) Перетаскиваем мышкой в расширении колонку «НекаяХерня» в табличную часть

3) Дописываем код

4) Смотрим, что получилось, проверяем что сохраняется и открывается

5) Пишем пост на мисту

6) Осторожнее с «ЗаполнитьФормуПоДаннымОбъекта» — это чистой пример. Особо головой я не думал.

&НаСервере

&Вместо(«ЗаполнитьОбъектПоДаннымФормы»)

Процедура Расш1_ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)

    
УстановитьПривилегированныйРежим(Истина);

    
    ТекущийОбъект.ВремяВЧасах = ВремяВЧасах = 1;

    ТекущийОбъект.Сотрудники.Очистить();

    
    ПоляБухучета = «»;

    Если ТекущийОбъект.БухучетЗаданВСтрокахДокумента Тогда

        ПоляБухучета = «СтатьяФинансирования,СтатьяРасходов,СпособОтраженияЗарплатыВБухучете,ОтношениеКЕНВД»;

    КонецЕсли;

    
    Для Каждого СтрокаТаблицы Из Сотрудники Цикл

        Для Каждого ДеньРаботы Из СписокДат Цикл

            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();

            НоваяСтрока.Сотрудник         = СтрокаТаблицы.Сотрудник;

            НоваяСтрока.СпособКомпенсацииПереработки = СтрокаТаблицы.СпособКомпенсацииПереработки;

            НоваяСтрока.Дата = ДеньРаботы.Значение;

            Если ТекущийОбъект.ВремяВЧасах Тогда

                НоваяСтрока.ОтработаноЧасов = СтрокаТаблицы[ИмяКолонкиДатаСтрока(ДеньРаботы.Значение)];

            Иначе

                НоваяСтрока.НеРаботал = НЕ СтрокаТаблицы[ИмяКолонкиРаботалСтрока(ДеньРаботы.Значение)];

            КонецЕсли;

            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы, ПоляБухучета);

        КонецЦикла;

        Если СписокДат.Количество() = 0 Тогда

            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();

            НоваяСтрока.Сотрудник = СтрокаТаблицы.Сотрудник;

            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы, ПоляБухучета);

        КонецЕсли;

        
        ///———————————

        НоваяСтрока.НекаяХерня = СтрокаТаблицы.НекаяХерня;

        //———————————

        
    КонецЦикла;

    
    Если Сотрудники.Количество() = 0 Тогда

        Для Каждого ДеньРаботы Из СписокДат Цикл

            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();

            НоваяСтрока.Дата = ДеньРаботы.Значение;

        КонецЦикла;

    КонецЕсли;

    
    ТекущийОбъект.ДатаНачалаСобытия = ?(СписокДат.Количество() > 0, СписокДат[0].Значение, Объект.ПериодРегистрации);

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

&НаСервере

&Вместо(«ЗаполнитьФормуПоДаннымОбъекта»)

Процедура Расш1_ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)

        СписокДат.Очистить();

    Сотрудники.Очистить();

    
    ПраздничныеДни = ОбщегоНазначения.ВыгрузитьКолонку(ТекущийОбъект.Сотрудники, «Дата», Истина);

    Для каждого ПраздничныйДень Из ПраздничныеДни Цикл

        СписокДат.Добавить(ПраздничныйДень, Формат(ПраздничныйДень, «ДЛФ=Д»));

    КонецЦикла;

    ДобавитьКолонкиТаблицыСотрудники(СписокДат.ВыгрузитьЗначения());

    
    СтрокиСотрудников = Новый Соответствие;

    СотрудникиДокумента = Новый Массив;

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

        Если СотрудникиДокумента.Найти(СтрокаТЧ.Сотрудник) = Неопределено Тогда

            СотрудникиДокумента.Добавить(СтрокаТЧ.Сотрудник);

        КонецЕсли;

        СтрокиСотрудника = СтрокиСотрудников[СтрокаТЧ.Сотрудник];

        Если СтрокиСотрудника = Неопределено Тогда

            СтрокиСотрудникаПоСпособуКомпенсации = Новый Массив;

            СтрокиСотрудника = Новый Соответствие;

            СтрокиСотрудника.Вставить(СтрокаТЧ.СпособКомпенсацииПереработки, СтрокиСотрудникаПоСпособуКомпенсации);

            СтрокиСотрудников.Вставить(СтрокаТЧ.Сотрудник, СтрокиСотрудника);

        Иначе

            СтрокиСотрудникаПоСпособуКомпенсации = СтрокиСотрудника[СтрокаТЧ.СпособКомпенсацииПереработки];

            Если СтрокиСотрудникаПоСпособуКомпенсации = Неопределено Тогда

                СтрокиСотрудникаПоСпособуКомпенсации = Новый Массив;

                СтрокиСотрудника.Вставить(СтрокаТЧ.СпособКомпенсацииПереработки, СтрокиСотрудникаПоСпособуКомпенсации);

            КонецЕсли;

        КонецЕсли;

        СтрокиСотрудникаПоСпособуКомпенсации.Добавить(СтрокаТЧ);

    КонецЦикла;

    
    Для каждого СотрудникДокумента Из СотрудникиДокумента Цикл

        
        СтрокиСотрудника = СтрокиСотрудников[СотрудникДокумента];

        Для каждого СтрокиПоСпособуКомпенсации Из СтрокиСотрудника Цикл

            
            НоваяСтрока = Сотрудники.Добавить();

            НоваяСтрока.Сотрудник = СотрудникДокумента;

            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокиПоСпособуКомпенсации.Значение[0]);

            
            
            
            Для каждого СтрокаТЧ Из СтрокиПоСпособуКомпенсации.Значение Цикл

                Если ЗначениеЗаполнено(СтрокаТЧ.Дата) Тогда

                    НоваяСтрока[ИмяКолонкиДатаСтрока(СтрокаТЧ.Дата)] = СтрокаТЧ.ОтработаноЧасов;

                    НоваяСтрока[ИмяКолонкиРаботалСтрока(СтрокаТЧ.Дата)] = НЕ СтрокаТЧ.НеРаботал;

                    
                    //——————————

                    НоваяСтрока.НекаяХерня = СтрокаТЧ.НекаяХерня;

                    //——————————

                    
                КонецЕсли;

            КонецЦикла;

        
        КонецЦикла;

        
    КонецЦикла;

    
    УстановитьДоступностьЭлементов();

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

   Масянька

29 — 22.12.21 — 12:24

(28) 2-ой скрин: после того, как я добавила реквизит в табличную часть — этот реквизит не появляется в ТЗ —

https://ibb.co/RhjKr6f

   Мультук

30 — 22.12.21 — 12:32

(29)

А он сам и не появится.

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

   osa1C

31 — 22.12.21 — 12:34

(29) мат в два хода

   Масянька

32 — 22.12.21 — 12:37

(30) В инструкции нету :)

(31) Я так и делала.

   Масянька

33 — 22.12.21 — 13:31

(30) ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

😘😘😘😘😘😘

   Масянька

34 — 22.12.21 — 13:37

Блин… А связь?

  

Масянька

35 — 22.12.21 — 13:43

(34) Мой косяк.

Еще раз СПАСИБО!

Экспериментируем в тонком клиенте, Бухгалтерия предприятия, редакция 3.0 (3.0.51.25) .

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

Добавили в расширение документ УстановкаЦенНоменклатуры. Далее добавляем ФормуДокумента.

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

фотка 1

Ревизит2 добавлен явно в форме документа в Расширении.

фотка 2

Реквизит3 явно добавлен в Форме документа в ветку реквизитов Объект / Табличная часть . Он будет появляться в таблице Товары.

    В модуле ФормыДокументы добавляем Реквизит1 и Реквизит2 к имеющейся форме, и Реквизит3 к табличные :

  • &НаСервере
  • мм1 = Новый Массив;
  • //здесь обычные реквизиты Реквизит1 , Реквизит2, …
  • Реквизит1 = Новый РеквизитФормы(«Реквизит1», Новый ОписаниеТипов(«Строка»), , «Реквизит1», Истина);
  • мм1.Добавить(Реквизит1);
  • …..
  • //здесь Реквизит4 — реквизит табличной части
  • Реквизит4 = Новый РеквизитФормы(«Реквизит4», Новый ОписаниеТипов(«Строка»),»Объект.Товары» , «Реквизит4», Истина);
  • мм1.Добавить(Реквизит4);
  • ….
  • ИзменитьРеквизиты(мм1);
  • //———— связываем реквизиты с элементами формы——————————-
  • Элемент = ЭтаФорма.Элементы.Добавить(«Реквизит1», Тип(«ПолеФормы»), ЭтаФорма);
  • Элемент.Вид = ВидПоляФормы.ПолеВвода;
  • Элемент.ПутьКДанным = «Реквизит1»;
  • Элемент = ЭтаФорма.Элементы.Добавить(«Реквизит2», Тип(«ПолеФормы»), ЭтаФорма);
  • Элемент.Вид = ВидПоляФормы.ПолеВвода;
  • Элемент.ПутьКДанным = «Реквизит2»;
  • Элемент = ЭтаФорма.Элементы.Добавить(«Реквизит3», Тип(«ПолеФормы»), Этаформа.Элементы.Товары);
  • Элемент.Вид = ВидПоляФормы.ПолеВвода;
  • Элемент.ПутьКДанным = «Объект.Товары.Реквизит3»;

Теперь для заполнения колонки Реквизит3 достаточно на Сервере сделать так (без предварительного кода сразу ссылаемся на Объект.Товары :
Для каждого стр из Объект.Товары цикл
стр.Реквизит3 = 123;
КонецЦикла;

Для установки значения Реквизит1(или Реквизит2) делаем на Сервере так ЭтаФорма[«Реквизит1»]=»34231432432″ (эту возможность я искал 3 часа в интернете). ЗначениеВРеквизитФормы(«вопыорвоап»,»Реквизит1″) — не катит.
Создать изначально в Объекте Реквизит1 = Новый РеквизитФормы(«Реквизит1», Новый ОписаниеТипов(«Строка»),»Объект» , «Реквизит1», Истина) — тоже не проходит.

Представьте: Вы доработали форму, потом в новом релизе добавили реквизиты – но они на форме не отображаются!…

Смотрите в Конфигуратор – есть. Видимость, доступность – все Ok.

Тем не менее – на форме новые реквизиты не видно, хотя они есть!

Вот прямо вчерашний пример из комментариев:

Добавили (заимствовали) форму Заказа в расширение. Вывели на заимствованную форму добавленные в расширении реквизиты. Все хорошо…

Выходит новый релиз конфигурации поставщика, где у документа добавлен КакойТоНовыйРеквизит, который выведен на форму документа в конфигурации поставщика.

Если после обновления расширение успешно подключится, то, как минимум, в режиме Предприятия на форме документа не будет этого нового реквизита.

И с этим надо что-то делать:)

На самом деле нет повода для паники :) Нужно просто помнить, как 1С “вычисляет”, что показывать на форме.

Дело в том, что платформа использует сразу 3 формы:

  • Форму из основной конфигурации
  • Сохраненную форму
  • Форму из расширения.

И как они взаимодействуют – мы разберем в новом видео.

12 минут видео, 100% полезности :)

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

  • Как дорабатывать типовые конфигурации внешними средствами
  • Как разрабатывать и использовать расширения
  • Оптимальные приемы обновления
  • Все, что экономит, страхует, помогает.

Musthave для внедренцев.

Содержание:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

17.03.2021

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

Так мы делали, когда разрабатывали расширение “Заполнение чека ККМ по заказу клиента“. Нам нужно было в форму Чека добавить колонку с Заказом клиента.

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

&После("ПриСозданииНаСервере")
Процедура v8PRO_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
	
	Если Форма.ИмяФормы = "Документ.ЧекККМ.Форма.ФормаДокумента" Тогда
		КолонкаЗаказКлиента = Форма.Элементы.Добавить("v8PRO_Заказ", Тип("ПолеФормы"), Форма.Элементы.Товары);
		КолонкаЗаказКлиента.ТолькоПросмотр = Истина;
		КолонкаЗаказКлиента.ПутьКДанным = "Объект.Товары.v8PRO_Заказ";
		КолонкаЗаказКлиента.Вид = ВидПоляФормы.ПолеВвода;
		
		Форма.Элементы.Переместить(КолонкаЗаказКлиента, Форма.Элементы.Товары, Форма.Элементы.ТоварыУпаковкаЕдиницаИзмерения);
		
	КонецЕсли;
	
КонецПроцедуры

Расширения конфигурации

Позволяют изменять поведение прикладного решения без изменения конфигурации:

  • Изменять алгоритмы
  • Изменять формы и добавлять новые формы
  • Добавлять реквизиты к существующим объектов (кроме регистров)
  • Добавлять новые объекты

Демонстрационная задача

Имеется конфигурация, в которой реализован складской учёт товаров.

Необходимо реализовать:

  • Отчет по остаткам товаров
  • Учет взаиморасчетов с поставщиками
  • Расчет стоимости поставки с учётом скидок

Импорт существующей базы

1. Добавить новую базу данных

2. Создание новой информационной базы

3. Создание информационной базы без конфигурации для разработки новой конфигурации или загрузки выгруженной ранее информационной базы

4. Укажите наименование информационной базы и выберите тип расположения информационной базы «На данном компьютере или на компьютере в локальной сети»

5. Укажите параметры информационной базы

6. Добавление информационной базы/группы

Выбор созданной информационной базы

1. Выбираем базу и нажимаем кнопку «Конфигуратор»

Открываем дерево конфигурации

Конфигурация — Открыть конфигурацию

Загрузка информационной базы

Администрирование — Загрузить информационную базу

Файл базы данных имеет расширение .dt.

Просмотр древа исходных данных для выполнения задания

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

Настройка режима поддержки (когда необходимо доработать саму конфигурацию)

Конфигурация — Поддержка — Настройка поддержки
Включение возможности изменения

Создание расширения

Конфигурация — Расширения конфигурации — Добавить

Заполняем поля данных нового расширения.

Для уникальности расширения дополнительно заполняется поле «Префикс».

Двойной щелчок на имени расширения — открытие его древа.

Создание отчета в расширении 

Отчеты — Добавить.

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

Подтверждаем действия по созданию макета.

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

Для данного отчета будем заимствовать регистр конфигурации «Остатки товаров».

ПКМ по регистру в древе конфигурации — Добавить в расширение

Регистр будет отображен теперь и в древе расширения. 

Так же заимствуется каждый элемент регистра. В нашем случае это измерения и ресурсы.

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

Запрос будем создавать с помощью конструктора запроса.

Выберем нужные поля.

Укажем ресурс — КоличествоОстаток.

Установим выбранные поля в настройках.

Добавим новую группировку.

Оставим для нее настройки по умолчанию.

Просмотрим результат в режиме предприятия.

Управление доступными расширениями из режима предприятия

Выбираем Все функции…

(Если эта кнопка не доступна, включим ее Сервис-Параметры-Отображать команду «Все функции»)

Стандартные — Управление расширениями конфигурации.

Активно — расширение работает, доступно в предприятии.

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

Изменения этих настроек произойдут при перезапуске конфигуратора.

Из этого списка также можно экспортировать расширения конфигурации в формате .cfe, а также импортировать в него расширения с этим форматом.

Учет расчета с поставщиками

Для этого сначала заимствуем документ ПоступлениеТоваров в наше расширение.

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

Видно, что пока реализован только складской учет с регистром ОстаткиТоваров.

Заимствуем справочник Контрагенты из основной конфигурации.

А также документ ПоступлениеТоваров с процедурой из модуля объекта (щелчок на названии процедуры ОбработкаПроведения).

Выберем тип вызова нашей доработки — После.

Этапы выполнения процедуры из расширения (Перед, После):

Вид процедуры ОбработкаПроведения в расширении.

Для документа ПоступлениеТоваров заимствуем реквизиты и табличную часть с реквизитом Сумма (реквизиты табличной части заимствуются каждый по отдельности).

Для учета расчетов с поставщиками создадим новый регистр накопления в расширении.

Зададим название, синоним и выберем тип Остатки.

Добавим измерение регистра Поставщик с типом СправочникСслыка.Контрагенты.

А также ресурс — Сумма.

Установим документ ПоступлениеТоваров в качестве регистратора.

Опишем в модуле объекта этого документа в расширении алгоритм проведения.

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

В списке расширений конфигурации снимем галочку с «Безопасный режим».

Теперь можем посмотреть регистр в режиме предприятия после проведения одного из докуменов ПоступлениеТоваров: Все функции… — Регистры — Взаиморасчеты с поставщиками.

Расчет стоимости поставки с учетом скидки

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

Добавим в расширении к табличной части этого документа новый реквизит «Процент скидки».

Заимствуем из основной конфигурации форму документа в расширение.

Перенесем реквизит «Процент скидки» на форму, перетащив его из правой колонки в левую.

Установим его перед реквизитом ТоварыСумма с помощью стрелок.

Посмотрим, какие процедуры есть в основной конфигурации этой формы.

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

Нам необходимо дополнить данную процедуру. Для этого нажимаем на ее название ПКМ и добавляем в расширение .

Выберем тип вызова — Вызывать вместо.

Алгоритм работы «Вызывать вместо»:

Будет добавлен новый общий модуль в расширение со следующим содержанием.

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

Локальные переменные родительского модуля не доступны здесь.

Опишем перерасчет Суммы во вновь созданном модуле расширения.

Посмотрим результат работы в режиме предприятие.

Экспорт расширения из конфигуратора

Действия — Конфигурация — Сохранить конфигурацию в файл.

Инструкция создана на основе вебинара компании «1C-ГЭНДАЛЬФ» подготовки ко второму этапу конкурса IT-Планета «Программирование 1С: Предприятие 8».

Понравилась статья? Поделить с друзьями:
  • Доверенность от компании на постановку автомобиля на учет
  • Доверенность удостоверенная управляющей компанией образец
  • Договор инвестиции в бизнес проекты от частного инвестора
  • Договор на управление ооо с управляющей компанией образец
  • Договор с газовой компанией обязателен или нет в квартире