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

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

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

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

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

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

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

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новые ревизиты формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        ,
        "Единица измерения"
    );
    РеквизитТекущийОстаток = Новый РеквизитФормы(
        "ТекущийОстаток",
        Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(10, 3)),
        ,
        "Текущий остаток"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);
    ДобавляемыеРеквизиты.Добавить(РеквизитТекущийОстаток);

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

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

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

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

    // Добавляем элементы внутрь новой группы
    НовыйЭлемент = Элементы.Добавить(
        "ЯчейкаХранения",
        Тип("ПолеФормы"),
        НоваяГруппаФормы
    );
    НовыйЭлемент.ПутьКДанным    = "ЕдиницаИзмерения";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр = Истина;

    НовыйЭлемент = Элементы.Добавить(
        "ТекущийОстаток",
        Тип("ПолеФормы"),
        НоваяГруппаФормы
    );
    НовыйЭлемент.ПутьКДанным    = "ТекущийОстаток";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ТолькоПросмотр = Истина;

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

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

    // Имитируем заполнение данных
    ЭтаФорма.ЕдиницаИзмерения = ПредопределенноеЗначение(
        "Справочник.ЕдиницыИзмерения.Штука"
    );
    ЭтаФорма.ТекущийОстаток = 12;

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

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

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

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

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

    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив();

    // Описываем новый ревизит формы
    РеквизитЕдиницаИзмерения = Новый РеквизитФормы(
        "ЕдиницаИзмерения",
        Новый ОписаниеТипов("СправочникСсылка.ЕдиницыИзмерения"),
        "Объект.Состав",
        "Единица измерения"
    );

    // Заполняем массив новых реквизитов
    ДобавляемыеРеквизиты.Добавить(РеквизитЕдиницаИзмерения);

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

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

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

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

Поиск:
1С:Предприятие • Изменить реквизиты • При создании на сервере • Реквизит • Управляемая форма • Элемент формы

Как программно добавить дополнительные реквизиты?

Я
   Vito

04.07.22 — 12:07

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

  

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

   saaken

1 — 04.07.22 — 12:39

сначала вводишь руками, потом аналогично делаешь в конфинураторе

   Ryzeman

2 — 04.07.22 — 12:43

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()

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

   Vito

3 — 04.07.22 — 12:56

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

Объект.ДополнительныеРекивзиты.<Как соcлаться на реквизит с именем «ExternalId»?>

   Vito

4 — 04.07.22 — 12:59

И где хранятся значения, доп.реквизитов? Где их можно посмотреть?

   xenos

5 — 04.07.22 — 12:59

(3) найди свойство по имени перебери все строки и найди нужное свойство

   Ryzeman

6 — 04.07.22 — 13:00

(3) я тебе уже написал.

УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()

Через точку обращаться нельзя, это не реквизит. Это строка табличной части ДополнительныеРеквизиты. В запросе надо обращаться туда. Вне запросов делай через БСП

   Dmitry1c

7 — 04.07.22 — 13:01

(0) наркоманы …

   Vito

8 — 04.07.22 — 13:21

Простите чайника . Ничего не пойму. Получается, что обратиться можно только через запрос, если не использовать БСП?

(6) Как обратиться, можете пример написать? Ну вот никак не соображу как сделать, сижу часов 8 уже с этой проблемой.

(5) Как найти свойство?

   Vito

9 — 04.07.22 — 13:24

(6) Пробовал вот так но не получается:

Объект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура(«ExternalId»,»»))[0].Значение

   rudnitskij

10 — 04.07.22 — 13:34

(9) НовСтр = Объект.ДополнительныеРеквизиты.Добавить()…

и заполнять реквизиты строки таб части.

Писали же выше, что это обычная табчасть

   Ryzeman

11 — 04.07.22 — 13:35

Для начала тебе надо почитать про то, что такое вообще дополнительные реквизиты. Заодно что такое ПланыВидовХарактеристик и как с ними работать.

Затем, тебе надо понять твою задачу.

Затем, тебе надо понять как работать с БСП.

Я тебе в третий раз пишу — установить значение, задача, которую ты написал в (0) делается через УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(). Это метод БСП, который именно для этого написан. Он тебе и нужен и правильнее всего им и воспользоваться.

Что у тебя в строках табличной части ты можешь посмотреть в конфигураторе. Какие там значения — тем же запросом «ВЫБРАТЬ * ИЗ МойДокумент.ДополнительныеРеквизиты КАК МойДокумент ГДЕ МойДокумент.Ссылка = &СсылкаНаДокумент»

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

// Записывает дополнительные реквизиты и сведения владельцу свойств.

// Изменения происходят в транзакции.

//

// Параметры:

//  ВладелецСвойств — Ссылка — например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.

//  ТаблицаСвойствИЗначений — ТаблицаЗначений — с колонками:

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

//    * Значение — Произвольный — любое значение, допустимое для свойства (указано в элементе свойства).

//

Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт

Изучи всё это, попробуй, что не получится — напиши.

   Vito

12 — 04.07.22 — 14:13

БСП, к сожалению нет, нужно как-то решить задачу без БСП.

Насчет получения информации и Доп.Реквизитов, понял, что только через запрос к БД, а не к объекту конфигурации БД. Спасибо!

   Ryzeman

13 — 04.07.22 — 14:17

(12) Я прошу прощения, а откуда у тебя взялись доп реквизиты без БСП?

   Vito

14 — 04.07.22 — 14:32

(13) В ручную в карточке контрагента добавил

   Ryzeman

15 — 04.07.22 — 14:34

(14) Ты издеваешься сейчас?) Какая конфигурация? Что такое по-твоему БСП?) Ты путаешь с ИТС? Что будет если ты в конфигураторе в любом модуле напишешь УправлениеСвойствами.ЗаписатьСвойстваУОбъекта() и нажмёшь F12 на нём?)

   Vito

16 — 04.07.22 — 15:17

(15) Я не издеваюсь, я в 1С погружаю только 3-ю неделю (правда до этого были курсы 6 мес, но для аналитика). Конфигурация УНФ. Т.е. Вы хотите сказать, что БСП является частью стандартной конфигурации? Зачем тогда о ней вообще упоминать. Я думал это некая внешняя подключаемая библиотека.

Нажал F12 м попал в общий модуль, а там всякие процедуры и функции интересные лежат. Мне что теперь использовать соответствующую процедуру: ЗаполнитьДополнительныеРеквизитыВФорме ?

   Ryzeman

17 — 04.07.22 — 15:23

(16) БСП = Библиотека Стандартных Подсистем, и во все (какие мне известно) типовые тиражные решения от 1с и франчей она входит. Сам механизм дополнительных реквизитов и сведений — это стандартная подсистема из этой библиотеки. То есть это есть в любой современной конфигурации на БСП.

>> Зачем тогда о ней вообще упоминать

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

>>Мне что теперь использовать соответствующую процедуру

Да. Это самый правильный вариант решения задачи из (0). Не надо изобретать велосипедов, надо вдумчиво посмотреть как работает уже существующий и правильно крутануть педаль.

   Vito

18 — 04.07.22 — 19:28

(17) Спасибо! Попробовал вот такой вариант:

        МассивСтруктур = Новый Массив;

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

    S = Новый Структура(«Свойство, Значение»,Z,»123456789″);     

    МассивСтруктур.Добавить(S);

    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(NewCounterparty,МассивСтруктур);

Но на последней строке получаю ошибку:

Ошибка при вызове метода контекста (Заблокировать)

{ОбщийМодуль.УправлениеСвойствами.Модуль(1175)}:Блокировка.Заблокировать();

по причине:

Неверный тип значения: Справочник.Контрагенты.Ссылка

Никак не пойму почему. Вроде в отладчики структура правильная…

   Ryzeman

19 — 04.07.22 — 19:52

(18) Сделай точку на останова на функции, посмотри что передаёшь в NewCounterparty.

Не совсем понял что у тебя за версия БСП, почему массив структур? В моей таблицу значений надо.

Если не поможет — попробуй остановку по ошибке (отладка — остановка по ошибке…). Там посмотри что у тебя вообще передаётся во ВладелецСвойств. И дальше через стек вызовов сможешь отследить. Чёт думается что ты пустую ссылку кидаешь или ещё что-то непотребное.

Ещё два совета — не используй короткие перменные типа Z и S даже в таких случаях. В 1с это не принято, если перебираешься к нам — избавляйся от этой привычки.

ПВХ лучше искать по полю «имя», оно уникально. В режиме предприятия это в самом низу будет. Там по умолчанию добавляется УИД, но ты сам можешь задать как тебе надо.

   Ryzeman

20 — 04.07.22 — 19:53

(19) если вдруг не знаешь как смотреть — выделяешь переменную, shift+F9. Ну вообще отладчиком пользоваться надо обязательно научиться. Это ключевой навык.

   Vito

21 — 04.07.22 — 20:18

( (19) Получилось ! Спасибо за помощь!

Как Вы и предположили передавал в NewCounterparty не ссылку, а объект.

Подскажите, как узнать используемую в конфигурации версию БСП?

   Гений 1С

22 — 04.07.22 — 20:21

Мой гений дарит вам, ггг (запоздало):

&НаСервере

Функция СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт

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

    
    //включим константу использования

    Если Не Константы.ИспользоватьДополнительныеРеквизитыИСведения.Получить() Тогда

        Константы.ИспользоватьДополнительныеРеквизитыИСведения.Установить(Истина);

    КонецЕсли;

    
    //попробуем найти реквизит по наименованию

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

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

    Если НЕ ЗначениеЗаполнено(ДопРеквизитСсылка) Тогда

        //если не нашли реквизит — будем его создавать

        ДопРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();

        ДопРеквизитОбъект.Заголовок = НаименованиеРеквизита;

        ДопРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой]; //.Справочник_Контрагенты;

        Если ТипЗначения = Неопределено Тогда

            ТипЗначения = Новый ОписаниеТипов(«Строка»,,,,Новый КвалификаторыСтроки(250));

        КонецЕсли;

        ДопРеквизитОбъект.ТипЗначения = ТипЗначения; //

        ДопРеквизитОбъект.Наименование = ДопРеквизитОбъект.Заголовок + » («+ДопРеквизитОбъект.НаборСвойств+»)»;

        ДопРеквизитОбъект.Виден = Истина;

        ДопРеквизитОбъект.Доступен = Истина;

        ДопРеквизитОбъект.МногострочноеПолеВвода = Многострочный;

        ДопРеквизитОбъект.ДополнительныеЗначенияИспользуются = Истина;

        //зададим имя нового реквизита

        ДопРеквизитОбъект.Имя = ИдентификаторРеквизита; //»filap_»+СтрЗаменить(ИмяРеквизита,» «,»»);

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

        ДопРеквизитСсылка = ДопРеквизитОбъект.Ссылка;        

    КонецЕсли;

    
    //добавим наш реквизит в набор дополнительных реквизитов контрагента

    НаборДополнительныхРеквизитовКонтрагента = Справочники.НаборыДополнительныхРеквизитовИСведений[НаборСвойствСтрокой].ПолучитьОбъект(); //Справочник_Контрагенты

    Если НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Найти(ДопРеквизитСсылка, «Свойство») = Неопределено Тогда

        //добавим реквизит в набор

        Стр = НаборДополнительныхРеквизитовКонтрагента.ДополнительныеРеквизиты.Добавить();

        Стр.Свойство = ДопРеквизитСсылка;

        НаборДополнительныхРеквизитовКонтрагента.Записать();

    КонецЕсли;

    
    Возврат  ДопРеквизитСсылка;

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

Примеры вызова:

&НаСервере

Функция  ДатьЗначениеДопРеквизитаНаСервере(Ссылка, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения = Неопределено, Многострочный = 0) Экспорт

    Если ТипЗнч(Ссылка) = Тип(«СправочникСсылка.Контрагенты») Тогда

        НаборСвойствСтрокой = «Справочник_Контрагенты»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«СправочникСсылка.Партнеры») Тогда

        НаборСвойствСтрокой = «Справочник_Партнеры_Общие»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«СправочникСсылка.ДоговорыКонтрагентов») Тогда

        НаборСвойствСтрокой = «Справочник_ДоговорыКонтрагентов»;

    ИначеЕсли ТипЗнч(Ссылка) = Тип(«ДокументСсылка.ЗаказКлиента») Тогда

        НаборСвойствСтрокой = «Документ_ЗаказКлиента»;

    Иначе

        Возврат Неопределено;

    КонецЕсли;

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

    Реквизит = СоздатьДопРеквизитНаСервере(НаборСвойствСтрокой, ИдентификаторРеквизита, НаименованиеРеквизита, ТипЗначения, Многострочный);

    ИскСтрока = Ссылка.ДополнительныеРеквизиты.Найти(Реквизит, «Свойство»);

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

        Возврат Неопределено;

    КонецЕсли;

    Возврат ИскСтрока.Значение;

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

    ДанныеДоговора.Вставить(«ПодписантКлиентаФИО»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаФИО», «Подписант клиента ФИО», ТипСтрока250));

    ДанныеДоговора.Вставить(«ПодписантКлиентаДолжность»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаДолжность», «Подписант клиента должность», ТипСтрока250));

    ДанныеДоговора.Вставить(«ОГРН»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ОГРН», «ОГРН», ТипСтрока250));

    ДанныеДоговора.Вставить(«ДействующийНаОсновании»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ДействующийНаОсновании», «Действующий на основании», ТипСтрока250));

    ТипСтрока250 = Новый ОписаниеТипов(«Строка»,,,,Новый КвалификаторыСтроки(250));

    
    ДанныеДоговора.Вставить(«ПодписантКлиентаФИО»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаФИО», «Подписант клиента ФИО», ТипСтрока250));

    ДанныеДоговора.Вставить(«ПодписантКлиентаДолжность»,  ДатьЗначениеДопРеквизитаНаСервере(Договор, «Договор_ПодписантКлиентаДолжность», «Подписант клиента должность», ТипСтрока250));

    ДанныеДоговора.Вставить(«ОГРН»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ОГРН», «ОГРН», ТипСтрока250));

    ДанныеДоговора.Вставить(«ДействующийНаОсновании»,  ДатьЗначениеДопРеквизитаНаСервере(ДанныеДоговора.Партнер, «Партнер_ДействующийНаОсновании», «Действующий на основании», ТипСтрока250));

   Фантазер

23 — 04.07.22 — 20:29

(21) Ну вот еще одно зачатие 1С-ника. А злые языки говорят — вырождаемся.

   Vito

24 — 04.07.22 — 20:44

(23) Зачался как 1С-ник месяцев 6 назад еще, а сейчас Спасибо всем за то, что грудями выкармливаете!

   Ryzeman

25 — 04.07.22 — 20:55

(21) Пожалуйста :)

>>Подскажите, как узнать используемую в конфигурации версию БСП?

В режиме предприятия посмотреть регистр сведений «Версии подсистем»

У меня, например, СтандартныеПодсистемы версии 3.1.5.385

(22) Кыш! Не порти нам человека своей гггениальностью))

   Garykom

26 — 04.07.22 — 21:03

(22) А если «Дополнительное значение (иерархия)» где?

  

Гений 1С

27 — 04.07.22 — 22:13

(26) допили

Содержание:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4.     Добавляем табличную часть 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

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

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

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

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

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

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

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

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

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

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

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

...

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

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

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

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


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

 +16 

   

Распечатать

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

Код 1C v 8.2 УП

 &НаКлиенте
Процедура ПоКнопкеНовыйКонтрагент(Команда)
// Вставить содержимое обработчика.
Перем НовыйКонтрагент;

НовыйКонтрагент = Новый Структура("Наименование, ПолноеНаименование, ИНН");
НовыйКонтрагент.Наименование = "РиК ООО";
НовыйКонтрагент.ПолноеНаименование = "ООО Рога и копыта";
НовыйКонтрагент.ИНН = "123456789012";

Если СоздатьНовогоКонтрагента(НовыйКонтрагент) = 0 Тогда
Сообщить("Не удалось создать нового контрагента");
КонецЕсли;

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

&НаСервере
Функция СоздатьНовогоКонтрагента(СтруктураСправочника)

Перем НовыйКонтрагент,СпрПользователи;

СпрКонтрагенты = Справочники.Контрагенты;
НовыйКонтрагент = СпрКонтрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = СтруктураСправочника.Наименование;
НовыйКонтрагент.ПолноеНаименование = СтруктураСправочника.ПолноеНаименование;
НовыйКонтрагент.ИНН = СтруктураСправочника.ИНН;
Попытка
НовыйКонтрагент.Записать();
Возврат 1;
Исключение
Возврат 0;
КонецПопытки;

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


Код 1C v 8.х

 //Пример 1
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.Наименование = "ООО Березка";
// Установить другие реквизиты.
НовыйЭлемент.Записать();

НовыйЭлемент = Справочники.Банки.СоздатьЭлемент();
// Получить ссылку на группу, в которой будет находиться новый элемент.
Родитель = Справочники.Банки.НайтиПоКоду("000000001");
НовыйЭлемент.Наименование = "ВТБ";
НовыйЭлемент.Код = "000000011";
НовыйЭлемент.Родитель = Родитель;

// Установить другие реквизиты.
НовыйЭлемент.Записать();

//Пример 2
СпрСотр = Справочники.Сотрудники;
//или так:
//СпрСотр = Справочники["Сотрудники"]
НовЭл = СпрСотр.СоздатьЭлемент();
НовЭл.Наименование = "Иванов Иван Иванович";
НовЭл.Оклад = 100;
НовЭл.Записать();

Код 1C v 7.x

  //Пример 1
//создаваться будет прямо в корне справочника
спр = создатьОбъект("Справочник.Контрагенты");
спр.Новый();
спр.Наименование = "ООО Березка";
спр.УстановитьНовыйКод();
// итак далее
//спр.Реквизит1="......"
//спр.Реквизит2="......"
спр.Записать();

//Пример 2
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.Новый();
СпрСотр.Наименование = "Иванов Иван Иванович";
СпрСотр.Оклад = 100;
СпрСотр.Записать();

Чтобы вывести реквизиты на форму программно нужно в обработчике «ПриСозданииНаСервере» в форме выполнить следующий алгоритм:

Реквизит должен находится в метаданных.

Листинг кода:


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

Чтобы вставить нужный нам реквизит перед каким либо уже существующим реквизитом нужно использовать параметр «Вставить()» . Четвертым параметром этого метода и будет являть тот реквизит перед которым мы будем вставлять наш реквизит.

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

Программное добавление поля ввода на форму:

Листинг:

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

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

Чтобы подключить событие к созданному полю нужно создать процедуру и подключить ее к полю:

*Процедура команды обязательно должна выполняться в директиве компиляции «&НаКлиенте»

Добавление команды на форму программно: 

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

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