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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

С версии платформы 8.3.11.2867 стало возможным с помощью расширений добавлять к прикладному решению собственные структуры для хранения данных, в том числе табличные части и реквизиты табличных частей. И это замечательно. Однако не всегда конфигурация работает на старшей версии платформы и в нужном режиме совместимости. Кроме того, при добавлении в расширение объектов хранения данных возможны неочевидные проблемы при обновлении (см., например, публикацию 1039552). Поэтому в ряде случаев представляется разумным использовать совместно с расширением механизм дополнительных реквизитов.

Пример выполнен в конфигурации «1С:Документооборот КОРП 2.1» (далее ДО), однако подход применим к любой конфигурации на управляемых формах с БСП и режимом совместимости, допускающим использование расширений.

В конфигурации ДО необходимо создать вид внутреннего документа Премия, с табличной частью позволяющей учитывать премии сотрудников подразделения. При выборе сотрудника в строке табличной части должна подставляться его должность. Реквизит Должность должен быть недоступен для изменения. При изменении в строке ТЧ суммы премии должна изменяться сумма документа – реквизит Итого распределено. Конфигурация на полной поддержке, включать возможность изменения нельзя.

Создаем вид внутреннего документа – Премия (НСИ / Виды документов / Создать). Устанавливаем флаг Учитывать сумму документа. Остальные настройки – по желанию. (Напомню, что внутренний документ в ДО – это справочник).

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

Итак, добавляем три новых доп. реквизита Сотрудник1 – Соотрудник3:

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

Добавляем три доп. реквизита Должность1Должность3 (тип Должность):

Добавляем три доп. реквизита Сумма1Сумма3 (тип Число 10, 2):

Аналогично добавляем три доп. реквизита Основание1Основание3 (тип Строка).

И добавляем реквизиты шапки:  Итого распределено (тип Число 10, 2)  и Фактическая численность (тип Число 2,0; Заполнять обязательно).

В результате получаем 14 доп. реквизитов документа Премия, из них два – реквизиты шапки и 12 – реквизиты собственно таблицы:

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

Идем в меню Еще / Настройки / Изменить форму и настраиваем.

У группы Премия устанавливаем горизонтальную группировку.

В группе Премия создаем четыре группы:

— Сотрудник (Отображение – Слабое выделение);

— Занимаемая должность (Отображение – Сильное выделение)

— Сумма премии (Отображение – Сильное выделение)

— Основание (Отображение – Сильное выделение)

У всех групп группировка вертикальная, флаг Отображать заголовок установлен.

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

У всех полей доп. реквизитов устанавливаем Положение заголовкаНет.

Настраиваем шапку. В группе Свойства создаем группу Шапка (Отображение – Нет, Группировка – Вертикальная, Отображать заголовок – Нет).

В группе Шапка создаем две группы: Группа подразделение и Группа сумма и численность. У обеих групп Отображение – Нет, Группировка – Горизонтальная, Отображать заголовок – Нет.

В группу Группа подразделение  перетаскиваем из группы Реквизиты / Группа элемента / ГруппаПраво / Реквизиты реквизит (стандартный, не доп.) Подразделение и, выделив этот реквизит, добавляем кнопкой Добавить поля реквизит Руководитель.

В группу Группа сумма и численность перетаскиваем из той же группы Реквизиты / Группа элемента / ГруппаПраво / Реквизиты группу Группа сумма и наш доп. реквизит Фактическая численность. У реквизита Сумма устанавливаем заголовок Премиальный фонд (сумма).

Доп. реквизит Итого распределено перемещаем в группу Шапка.

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

А вкладка Свойства  документа Премия так:

Далее открываем конфигуратор и добавляем расширение (Конфигурация / Расширения конфигурации / Добавить):

Добавляем в расширение форму элемента справочника ВнутренниеДокументы и План видов характеристик ДополнительныеРеквизитыИСведения (нужен для установки типа реквизита формы).

В расширении добавляем реквизиты формы:

— ЭтоПремия – тип Булево;

— КоличествоСтрокВТаблицеПремия – тип Число 3,0;

— ИтогоСумма – тип Число 10,2.

— СвойствоИтогоРаспределено – тип ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения.

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

Код модуля формы элемента справочника ВнутренниеДокументы в расширении представлен ниже:

// Добавлены реквизиты формы(для документа вида Премия):
// ЭтоПремия - Булево
// ИтогоСумма - Число
// КоличествоСтрокВТаблицеПремия - Число
// СвойствоИтогоРаспределено - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения

#Область ОбработчикиСобытийФормы

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

Если Объект.ВидДокумента = Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Премия") Тогда

ЭтоПремия = Истина;

///////////////////////////////////
КоличествоСтрокВТаблицеПремия = 3;
///////////////////////////////////

СвойствоИтогоРаспределено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Итого распределено (Премия)");

ОбработатьУстановкуДействияДляДопреквизитов_Премия(Отказ, СтандартнаяОбработка, Неопределено);

Иначе
ЭтоПремия = Ложь;
КонецЕсли;

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

&НаКлиенте
Процедура Премия_ПриОткрытииПосле(Отказ)

Если ЭтоПремия Тогда

Элементы.Подразделение.АвтоОтметкаНезаполненного = Истина;

УстановитьСвойстваПолей_Премия();

КонецЕсли;

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


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

Если ЭтоПремия Тогда
Если НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Поле ""Подразделение"" не заполнено'"), ,
"Подразделение", "Объект");
Отказ = Истина;
КонецЕсли;
КонецЕсли;

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

&НаКлиенте
Процедура Премия_ПослеЗаписи(ПараметрыЗаписи)
УстановитьСвойстваПолей_Премия();
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыПремияНазначаемые

&НаКлиенте
Процедура СуммаПриИзменении_Премия()

ИтогоСумма = 0;
Для Сч=1 По КоличествоСтрокВТаблицеПремия Цикл
СуммаТекущая = НайтиДопреквизитВФорме("Сумма"+СокрЛП(Сч));
Если СуммаТекущая.Видимость Тогда
ИтогоСумма = ИтогоСумма + Число(СокрЛП(СуммаТекущая.ТекстРедактирования));
КонецЕсли;
КонецЦикла;

УстановитьЗначениеДопРеквизитаИтогоРаспределено();

УстановитьСвойстваПолей_Премия();

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

&НаКлиенте
Процедура СотрудникПриИзменении()

ЗначениеДопРеквизитаСотрудник = Вычислить("ЭтаФорма." + ТекущийЭлемент.Имя);
Должность = РаботаСПользователями.ПолучитьДолжность(ЗначениеДопРеквизитаСотрудник);

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

НаименованиеДопреквизитаДолжность = "Должность" + НомерСтрокиТаблицы + " (Премия)";
УстановитьЗначениеДопРеквизитаДолжность(НаименованиеДопреквизитаДолжность, Должность);

УстановитьСвойстваПолей_Премия();

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

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

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьДействияДляДопреквизита(НаименованиеДопРеквизита, ДействиеСтрока, ПроцедураСтрока)

СтруктураПоиска = Новый Структура("Наименование", НаименованиеДопРеквизита);
ИмяДопРеквизита = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска)[0].ИмяРеквизитаЗначение;
ДопРеквизит = Элементы[ИмяДопРеквизита];
ДопРеквизит.УстановитьДействие(ДействиеСтрока, ПроцедураСтрока);

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

// Параметры:
//  НаименованиеДопРеквизита  - Строка
// Возвращаемое значение:
//  ПолеФормы   - искомый допреквизит типа ПолеФормы
&НаКлиенте
Функция НайтиДопреквизитВФорме(НаименованиеДопРеквизита)

СтруктураПоиска = Новый Структура("Наименование", НаименованиеДопРеквизита);
МассивСтрок = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);
Если МассивСтрок.Количество() = 0 Тогда
Возврат Неопределено;
Иначе
ИмяДопРеквизита = МассивСтрок[0].ИмяРеквизитаЗначение;
ДопРеквизит = Элементы[ИмяДопРеквизита];
Возврат ДопРеквизит;
КонецЕсли;

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

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

Для Сч=1 По КоличествоСтрокВТаблицеПремия Цикл
УстановитьДействияДляДопреквизита("Сумма" + СокрЛП(Сч), "ПриИзменении", "СуммаПриИзменении_Премия");
УстановитьДействияДляДопреквизита("Сотрудник" + СокрЛП(Сч), "ПриИзменении", "СотрудникПриИзменении");
КонецЦикла;

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

&НаКлиенте
Процедура УстановитьСвойстваПолей_Премия()

УстановитьТолькоПросмотрДляПоля("Итого распределено");
УстановитьТолькоПросмотрДляПолейДолжность();
УстановитьКнопкаОткрытияЛожьДляПолейДолжность();

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

// Возвращает наименование доп. реквизита
// Параметры:
//  ИмяДопреквизита  - Строка. Например, ДополнительныйРеквизитЗначение_71A6C86Dx0E4Ex11E8x873Dx0022155C4930_71A6C875x0E4Ex11E8x873Dx0022155C4930
// Возвращаемое значение:
//  НаименованиеДопреквизита  - Строка. Например, Сотрудник1
//
&НаКлиенте
Функция ПолучитьНаименованиеДопреквизитаПоИмени(ИмяДопреквизита)

СтруктураПоиска = Новый Структура("ИмяРеквизитаЗначение", ИмяДопреквизита);
МассивСтрок = ЭтаФорма.Свойства_ОписаниеДополнительныхРеквизитов.НайтиСтроки(СтруктураПоиска);
Если МассивСтрок.Количество()=0 Тогда
Возврат Неопределено;
Иначе
НаименованиеДопреквизита = МассивСтрок[0].Наименование;
Возврат НаименованиеДопреквизита;
КонецЕсли;

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

&НаСервере
Процедура УстановитьЗначениеДопРеквизитаИтогоРаспределено()

УправлениеСвойствами.ПеренестиЗначенияИзРеквизитовФормыВОбъект(ЭтаФорма, Объект);

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

Для каждого Строка Из Объект.ДополнительныеРеквизиты Цикл
Если Строка.Свойство.Ссылка = СвойствоИтогоРаспределено Тогда
Строка.Значение = ИтогоСумма;
НашлиСтроку = Истина;
КонецЕсли;
КонецЦикла;

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

КонецЕсли;

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

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

&НаСервере
Процедура УстановитьЗначениеДопРеквизитаДолжность(НаименованиеДопреквизитаДолжность, Должность)

УправлениеСвойствами.ПеренестиЗначенияИзРеквизитовФормыВОбъект(ЭтаФорма, Объект);

Если Объект.ДополнительныеРеквизиты.Количество() = 0 Тогда
Возврат;
КонецЕсли;

СвойствоТекущаяДолжность = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаименованиеДопреквизитаДолжность);

НашлиСтроку = Ложь;
Для каждого Строка Из Объект.ДополнительныеРеквизиты Цикл
Если Строка.Свойство.Ссылка = СвойствоТекущаяДолжность Тогда
Строка.Значение = Должность;
НашлиСтроку = Истина;
Прервать;
КонецЕсли;
КонецЦикла;

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

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

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

&НаКлиенте
Процедура УстановитьТолькоПросмотрДляПоля(НаименованиеДопРеквизита)

ДопРеквизитПоле = НайтиДопреквизитВФорме(НаименованиеДопРеквизита);
Если ДопРеквизитПоле <> Неопределено Тогда
ДопРеквизитПоле.ТолькоПросмотр = Истина;
КонецЕсли;

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

&НаКлиенте
Процедура УстановитьТолькоПросмотрДляПолейДолжность()

Для Сч =1 По КоличествоСтрокВТаблицеПремия Цикл
УстановитьТолькоПросмотрДляПоля("Должность" + СокрЛП(Сч));
КонецЦикла;

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

&НаКлиенте
Процедура УстановитьЗначениеСвойстваПоляФормыДопРеквизита(НаименованиеДопРеквизита, СвойствоПоляФормы, ЗначениеСвойстваПоляФормы)

ДопРеквизитПоле = НайтиДопреквизитВФорме(НаименованиеДопРеквизита);
Если ДопРеквизитПоле <> Неопределено Тогда
Выполнить("ДопРеквизитПоле." + СвойствоПоляФормы + "=" + ЗначениеСвойстваПоляФормы);
КонецЕсли;

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

&НаКлиенте
Процедура УстановитьКнопкаОткрытияЛожьДляПолейДолжность()

Для Сч =1 По КоличествоСтрокВТаблицеПремия Цикл
УстановитьЗначениеСвойстваПоляФормыДопРеквизита("Должность" + СокрЛП(Сч), "КнопкаОткрытия", "Ложь")
КонецЦикла;

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

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

Таким образом, в документе получаем таблицу следующего вида:

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

Остается только перейти в Настройка и администрирование / Поддержка и обслуживание / Управление пользовательскими настройками и скопировать настройки документа всем (или избранным) пользователям. Это функционал БСП.

В реальной боевой базе (госучреждение) внутренний документ Премия содержит 30 строк. Таково максимальное количество сотрудников в отделе. Кроме того, настроен автозаполняемый шаблон Word, бизнес-процесс согласования-утверждения документа, настроены права, сделан отчет. Работают два года, все довольны. Конфигурация на полной поддержке. Это к тому, что на доп. реквизитах можно делать полноценную автоматизацию.

Боевая конфигурация ДГУ 2.1.9.3 работает на платформе 8.3.9.1850. Настоящая публикация готовилась на платформе 8.3.13.1690 в демо-версии ДО 2.1.12.2 (режим совместимости 8.3.8).

Содержание:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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