Как обратиться к реквизиту формы в расширении

Расширения. Реквизиты и элементы формы.

Я
   LavSug

23.01.20 — 13:02

Ткните носом, что-то туплю.

1. Перенес справочник в расширение.

2. Добавил реквизит справочника.

3. Перенес форму элемента в расширение.

4. Добавил на форму в расширении поле ввода и указал путь к новому реквизиту.

5. Повесил на форму в расширении событие ПриСозданииНаСервере_После. Не могу обратиться через ЭтаФорма ни к своему элементу, ни к своему реквизиту.

6. Повесил на форму в расширении событие ПриОткрытии_После. Не могу обратиться через ЭтаФорма ни к своему элементу, ни к своему реквизиту.

Где я туплю? Как мне использовать на форме необходимое мне поле.

ПыСы: программно тоже добавлял, не видит и все тут…

  

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

   LavSug

1 — 23.01.20 — 17:27

1. Поставил последнюю платформу 8.3.16.1148

2. Добавил реквизит Объект для заимствованной формы.

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

Что не так-то?!?!

   pechkin

2 — 23.01.20 — 17:28

что значит «не могу» ?

   LavSug

3 — 23.01.20 — 17:30

(2) В обработчике событий формы не могу обратиться к Элементы.МоеПолеРеквизита…

   LavSug

4 — 23.01.20 — 17:30

(2) Моего поля нет в списке элементов формы:(

   LavSug

5 — 23.01.20 — 17:32

В обработчике ПриОткрытииПеред нет элемента формы Элементы.МоеПолеРеквизита…

   LavSug

6 — 23.01.20 — 17:33

Явно где-то я туплю… Режим совместимости конфигурации и расширения 8.3.12…

   LavSug

7 — 23.01.20 — 17:45

Если программно пытаюсь добавить 2 раза Элемент с одинаковым именем, оно дает ошибку…

   pechkin

8 — 23.01.20 — 17:47

реквизит добавил, а элемент добавил?

   pechkin

9 — 23.01.20 — 17:47

имя элемента совпадает с именем реквизита?

   LavSug

10 — 23.01.20 — 17:50

(8) да (9) пробовал и так, и так…

В какой момент формируется список элементов?

   LavSug

11 — 23.01.20 — 17:51

Он видит все элементы конфигурации и не видит элементы расширения (только поля ввода), группы полей расширения видит…

   Фрэнки

12 — 23.01.20 — 18:38

(11) имхо, первая ошибка — режим совместимости блокирует тебе возможности более продвинутых платформ.

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

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

   Сияющий в темноте

13 — 23.01.20 — 18:46

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

   LavSug

14 — 23.01.20 — 21:44

(13) В какой процедуре? ПриСозданииНаСервере?

   LavSug

15 — 23.01.20 — 22:22

(11) Декорации тоже показывает

   LavSug

16 — 23.01.20 — 22:27

Если реквизит добавить к форме в расширении и привязать к нему элемент, то обращение проходит. Не работает когда путькданным вида «Объект.Реквизит»… из-за чего это может быть?

   KoZuB

17 — 24.01.20 — 02:27

(1) Что значит «добавил реквизит Объект»? Вручную ввел? Или заимствовал?

   Сергиус

18 — 24.01.20 — 02:52

(0)В структуре реквизитов формы в Объект, если раскрыть его состав, твой реквизит присутствует?

   Сергиус

19 — 24.01.20 — 02:53

+(18) Скорее всего его там нет, судя по (16). Попробуй тогда на Объект, правой клавишей мыши, Добавить в расширение.

   LavSug

20 — 24.01.20 — 08:56

(18) Есть… Более того, в отладчике к реквизиту обратиться можно. А к элементу нельзя…

   Фрэнки

21 — 24.01.20 — 09:02

(20) то, что в отладчике можно — это ни разу не показательно. Отладчик работает в контексте исполнения.

А тебя работа просто в толстом клиенте в конфигураторе, средствами конфигуратора и конструкторами конфигуратора — что-то эти конструкторы видят, что-то не видят.

Что там выше о режимах совместимости установленных для основной базы и для расширения было? 8.3.12 — вроде нормально. Может оно в своих версиях формы запуталось.

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

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

   LavSug

22 — 24.01.20 — 09:11

(21) Не, ну к моим добавленным элементам формы и в отладчике обратиться не дает… А к реквизитам моим же дает…

Пока диагностировал, что проблема проявляется, когда ПутьКДанным содержит обращение к реквизитам объекта, которые добавлены в расширении… То есть с добавленными реквизитами самой формы проблем нет… А вот как только ПутьКДанным = «Объект.НовыйРеквизит», так сразу мимо… Объект добавлял через «Добавить в расширение». Форму удалял, добавлял заново, потом объект… Не помогает… Оно контекст объекта при заполнении элементов расширенной формы похоже берет оригинальный, а не из расширения…

   LavSug

23 — 24.01.20 — 09:13

(22) Единственное, что не пробовал, так это полностью удалить справочник из расширения и заново добавить… Так как изначально добавлял на платформе 8.3.13, а потом перешел на 8.3.16. Может какие связи не дописались.

   Фрэнки

24 — 24.01.20 — 09:17

(23) А ты вообще наслышан о ситуации, что если на такую базу, в которой есть Расширение с добавленными к типовыми объектам реквизитам, натравить ТИИ, то она похерит всю внесенную в реквизитах инфу?

   LavSug

25 — 24.01.20 — 09:18

(24) Наслышан… Сам не пробовал пока. Но при желании…

   Фрэнки

26 — 24.01.20 — 09:27

(25) Вот я про себя так скажу — использую Расширения в разработке в приоритете. Но при необходимости внесения в базу новой информации, даже к уже существующим объектам, либо использую типовые возможности (допсведения и допреквизиты (которые в табчастях справочников сидят)), либо новые объекты в расширении делаю со ссылками на существующие типовые объекты базы. Состав реквизитов у типовых объектов непосредственно не расширяю.

   LavSug

27 — 24.01.20 — 09:48

(26) То есть делаешь типа РасшСправочник… У него реквизит РасшСправочник.ОригинальныйСправочникСсылка ? И на форме ОригинальныйСправочник.ФормаЭлемента, например, в расширении обыгрываешь это все?

   LavSug

28 — 24.01.20 — 11:33

Продолжение истории…

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

   LavSug

29 — 24.01.20 — 11:37

(28) Смущает то, что элементы формы я добавляю на сервере, а не видно их на клиенте…

   PowerBoy

30 — 24.01.20 — 12:23

(0)Права на справочник дал по роли расширения?

   Фрэнки

31 — 24.01.20 — 12:32

(27) как-то так. Или не справочник, а регистр сведений в расширении. Но это при условии, что у него нет готовой таб части Дополнительные реквизиты.

У самых нужных в разработке справочников подобные табчасти в типовых уже указаны.

   LavSug

32 — 24.01.20 — 12:41

(30) Права дал…

   LavSug

33 — 24.01.20 — 12:42

(31) Дополнительные реквизиты использую… А как их в нужные места формы доставать? Как раз в расширении?

   Жан Пердежон

34 — 24.01.20 — 12:50

через ЭтотОбъект тоже не катит?

   LavSug

35 — 24.01.20 — 13:16

(34) В каком смысле? Не понял… ЭтотОбъект.Форма?

   LavSug

36 — 24.01.20 — 13:34

Еще раз убедился… Элемент создается в заимствованной форме расширения только если он не ссылается на добавленный в расширении реквизит объекта…

То есть, если ПутьКДанным = «МойРеквизит», то элемент создается автоматически. Если ПутьКДанным = «Объект.МойРеквизит», то элемент НЕ создается автоматически.

Этому есть какое-нибудь логическое объяснение?

   LavSug

37 — 24.01.20 — 13:35

(34) (35) ЭтотОбъект.Элементы тоже не содержит требуемого элемента…

   LavSug

38 — 24.01.20 — 14:24

(31) Пойду по этому пути…

  

LavSug

39 — 27.01.20 — 18:56

Все-таки не понимаю… Почему в расширениях даже при программном добавлении элементов на заимствованную форму в серверной процедуре ПриОткрытииНаСервере эти элементы не попадают в список элементов формы в процедуре ПриОткрытии?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Skip to content

1С, как добавить, изменить реквизит формы объекта через расширение

Как добавить, изменить реквизит формы через расширение

В новых версиях платформы, при изменении типовых форм, стандартные и новые реквизиты (добавленные в расширение) по умолчанию недоступны: их нельзя изменить, ни добавить в форму. Дело в том, что немного изменился механизм добавления реквизитов в расширение, для изменения типовых форм объектов.

Вам необходимо выполнить следующие действия:

  • В дереве метаданных нажать правой кнопкой мыши на реквизит -> «Добавить в расширение» -> выбрать расширение;

  • Перейти в расширение конфигурации, открыть форму, в которую планируем добавить (или изменить) реквизит -> в области справа выделить реквизит -> нажать правую кнопку мыши -> «Добавить реквизит»;

Почему в новой платформе изменился данный механизм?

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

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

Связанные статьи

Как обратиться к форме?

Автор isacnew21, 28 фев 2019, 11:03

0 Пользователей и 1 гость просматривают эту тему.

Прошу помочь советом, при использовании расширения в доработке типовой конфы 1с КА 2.4, потребовалось изменить стандартную форму документа, добавив туда реквизиты. Что бы введенные реквизиты сохранились, в модуле документа написал такой код:

Цитировать&После(«ПриЗаписи»)
Процедура Расш1_ПриЗаписи(Отказ)
     ФормаТендер = ЭтотОбъект.ПолучитьФорму(«ФормаДокумента»);
     ДатаАукциона = ФормаТендер.ЭлементыФормы.Индекс(«ДатаАукциона»);
     ТипЗаказа = ФормаТендер.ЭлементыФормы.Индекс(«ТипЗаказа»);
     ДатаКонтракта = ФормаТендер.ЭлементыФормы.Индекс(«ДатаКонтракта»);
     СостояниеЗаказа = ФормаТендер.ЭлементыФормы.Индекс(«СостояниеЗаказа»);
КонецПроцедуры

Он не работает, по причине того что ПолучитьФорму — метод интерактивный.:trhregerhg:


Цитата: isacnew21 от 28 фев 2019, 11:03
Прошу помочь советом, при использовании расширения в доработке типовой конфы 1с КА 2.4, потребовалось изменить стандартную форму документа, добавив туда реквизиты. Что бы введенные реквизиты сохранились, в модуле документа написал такой код:

Цитировать&После(«ПриЗаписи»)
Процедура Расш1_ПриЗаписи(Отказ)
     ФормаТендер = ЭтотОбъект.ПолучитьФорму(«ФормаДокумента»);
     ДатаАукциона = ФормаТендер.ЭлементыФормы.Индекс(«ДатаАукциона»);
     ТипЗаказа = ФормаТендер.ЭлементыФормы.Индекс(«ТипЗаказа»);
     ДатаКонтракта = ФормаТендер.ЭлементыФормы.Индекс(«ДатаКонтракта»);
     СостояниеЗаказа = ФормаТендер.ЭлементыФормы.Индекс(«СостояниеЗаказа»);
КонецПроцедуры

Он не работает, по причине того что ПолучитьФорму — метод интерактивный.:trhregerhg:

Если у тебя расширение то почему бы сразу в нем не создать реквизиты и вынести на форму?


Реквизиты созданы в расширении,на форму Документа добавлены, при создании в пользовательском режиме новых документов добавленные реквизиты не записываются и не проводятся.


Цитата: isacnew21 от 28 фев 2019, 16:18
Реквизиты созданы в расширении,на форму Документа добавлены, при создании в пользовательском режиме новых документов добавленные реквизиты не записываются и не проводятся.

Этот Код где написан? На форме? И точный код ошибки приведи.


В модуле Объекта Документа ЗаказКлиента.

Цитировать{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1836)}: Ошибка при вызове метода контекста (Записать)
   Результат = Форма.Записать(ПараметрыЗаписи);
по причине:
Ошибка при выполнении обработчика — ‘ПриЗаписи’
по причине:
{Расширение1 Документ.ЗаказКлиента.МодульОбъекта(8)}: Ошибка при вызове метода контекста (ПолучитьФорму)
     ФормаТендер = ЭтотОбъект.ПолучитьФорму(«ФормаДокумента»);
по причине:
Интерактивные операции недоступны


Цитата: isacnew21 от 28 фев 2019, 17:33
В модуле Объекта Документа ЗаказКлиента.

Цитировать{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(1836)}: Ошибка при вызове метода контекста (Записать)
   Результат = Форма.Записать(ПараметрыЗаписи);
по причине:
Ошибка при выполнении обработчика — ‘ПриЗаписи’
по причине:
{Расширение1 Документ.ЗаказКлиента.МодульОбъекта(8)}: Ошибка при вызове метода контекста (ПолучитьФорму)
     ФормаТендер = ЭтотОбъект.ПолучитьФорму(«ФормаДокумента»);
по причине:
Интерактивные операции недоступны

Убери весь код и проверь что получится.


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


Цитата: isacnew21 от 28 фев 2019, 17:56
Убрал, реквизиты ,добавленные из расширения заполняю, но они не записываются и не проводятся. Этот код написал с целью что бы обратиться к формедокумента вытащить оттуда реквизиты и записать их. Мне нужно что бы они отобразились в форме списка(которую тоже в расширении добавил), и в документе записались и провелись.
Ну и что бы эта ФораСписка тендер была на интерфейсе.

Открываешь документ и реквизиты пустые твои?




  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Как обратиться к форме?

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Инструкция. Программная модификация управляемых форм

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

Мы рассмотрим основные составляющие этой задачи: добавление реквизитов, добавление элементов формы и назначение обработчиков событий элементов формы.

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

Для добавления реквизитов используется метод объекта ФормаКлиентскогоПриложения

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

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

Переменная ДобавляемыеРеквизиты является массивом объектов типа РеквизитФормы.

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

							ДобавляемыеРеквизиты = Новый Массив;
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Демо_ТаблицаДанных", Новый ОписаниеТипов("ТаблицаЗначений"), , "Таблица значений", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"), "ТаблицаДанных", "Кто поставляет", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"), "ТаблицаДанных", "Имя товара", Ложь));
							ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОписаниеОбъекта", ТипСтрока, "", "Описание объекта", Ложь));
							ИзменитьРеквизиты(ДобавляемыеРеквизиты);
							

К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект. ˂Имя реквизита˃.

Процедуру ИзменитьРеквизиты логично вызывать из обработчика ПриСозданииНаСервере, но т.к. мы не заимствуем форму в расширение, то следует найти другую точку входа. Для конфигураций УТ 11, КА 2 и ERP 2 существует типовой механизм упрощенного изменения конфигураций. Нас интересует модуль МодификацияКонфигурацииПереопределяемый, в состав которого входит процедура

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

Данную процедуру можно заимствовать в расширение, добавить проверку имени формы и вставить код изменения реквизитов:

							Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
							// код модификации реквизитов
							КонецЕсли;
						

Для остальных конфигураций придется переопределять другие процедуры. Например

							ПодключаемыеКоманды.ПриСозданииНаСервере(Форма)
						

или

							ВерсионированиеОбъектов.ПриСозданииНаСервере(Форма)
						

Использование той или иной процедуры следует проверить в модуле редактируемой формы.

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

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

Для добавления нового элемента формы требуется передать в функцию Добавить данной коллекции имя элемента, его тип и родителя (при необходимости). Например:

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

По аналогии с добавлением реквизитов, данный код можно выполнять в функциях МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере (УТ, КА, ERP), ПодключаемыеКоманды.ПриСозданииНаСервере или ВерсионированиеОбъектов.ПриСозданииНаСервере.

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

Обработка событий формы

Выполнить код по событию элемента формы можно двумя способами:

  • Создать команду, указать для этой команды имя обработчика события и назначить эту команду элементу формы
  • Выполнить метод УстановитьДействие элемента формы, чтобы указать имя обработчика события в модуле формы

Оба метода предполагают наличие в модуле формы процедуры с сигнатурой, соответствующей обработчику события. Для первого способа в модуле формы должна быть клиентская процедура, принимающая единственный аргумент — Команда. Для второго — всё зависит от события, для которого выполняется обработчик. Так, например, для события ПриИзменении элемента формы с типом ПолеВвода будет требоваться процедура, принимающая единственный аргумент — ЭлементФормы. А для события ПередНачаломДобавления таблицы формы — целых 6 аргументов (ЭлементФормы, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр). Поэтому для некоторых событий попросту невозможно подобрать соответствующие клиентские методы в модуле формы и заимствования формы в расширение не избежать.

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

  • обработчик Подключаемый_ВыполнитьПереопределяемуюКоманду с переопределением процедуры МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду для УТ, КА и ERP;
  • обработчик Подключаемый_ВыполнитьКоманду с переопределением процедуры ПодключаемыеКомандыКлиент.ВыполнитьКоманду

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

Например:

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

Либо вариант с использованием команд:

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

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

Полезные советы

Работа с динамическими списками

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

Для небольших изменений гораздо лучше воспользоваться объектом СхемаЗапроса, появившемся в версии платформы 8.3.5. Он позволит всегда иметь актуальный текст запроса, если он поменяется при обновлении конфигурации.

Например:

							СхемаЗапроса = Новый СхемаЗапроса;
							СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
							Пакет = СхемаЗапроса.ПакетЗапросов[0];
							Оператор = Пакет.Операторы[0];
							Оператор.ВыбираемыеПоля.Добавить("РеализацияТоваровУслуг.Ссылка");
							Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
						

Переопределение открываемой формы

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

Для этого следует реализовать новую форму (не заимствовать её, а написать с нуля) и в модуле менеджера переопределить процедуру ОбработкаПолученияФормы.

Например:

							Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
								Если ВидФормы = "ФормаОбъекта" И Параметры.Ключ.Вид = Перечисления.ВидыТоваров.Услуга Тогда
									ВыбраннаяФорма = Метаданные.Справочники.Товары.Формы.ФормаУслуги;
									СтандартнаяОбработка = Ложь;
								КонецЕсли;
							КонецПроцедуры
						

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

30.10.2014

Расширения

Реализовано в версии 8.3.6.1977.

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

Чем хороши расширения?

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

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

Но часто заказчик хочет что-то добавить или что-то изменить в типовой конфигурации «под себя». Для этого режим поддержки изменяется, конфигурация снимается с полной поддержки. Партнёр, выполняющий внедрение, или собственные IT специалисты заказчика, вносят в неё необходимые изменения. С этого момента полностью автоматическое обновление типовой конфигурации на новую версию, выпущенную поставщиком, становится невозможным.

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

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

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

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

Когда нужно использовать расширения?

Механизм расширений заманчив своей универсальностью. Поэтому важно иметь правильное представление о том, для решения каких задач он предназначен.

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

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

Другая ситуация — это доработки типовой конфигурации под конкретного заказчика у него на внедрении. Или же доработки типовой конфигурации, которые выполняют для себя IT специалисты заказчика собственными силами. Если все эти доработки выполнить в расширении, то типовая конфигурация останется на полной поддержке, что значительно упростит её дальнейшее сопровождение.

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

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

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

Что можно изменять уже сейчас с помощью расширений?

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

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

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

Как устроено расширение?

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

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

Заимствованные объекты нужны не всегда. Лучше всего это объяснить на «бытовом» примере, если провести аналогию с обедом в ресторане.

Ситуация первая, когда заимствованные объекты нужны.

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

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

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

Через неделю вы приходите, но меню ресторана изменилось (типовую конфигурацию обновили). Однако в меню по-прежнему есть бифштекс и чай. Именно они вам и нужны. Вам их приносят, вы их съедаете. То есть расширение продолжает работать с обновлённой типовой конфигурацией.

Ещё через неделю вы приходите в ресторан, и видите, что бифштекс и чай исчезли из меню. Вы встаёте и уходите (сообщение об ошибке подключения расширения). Потому что вы хотели именно их. А о других блюдах (объектах) вы понятия не имеете. Разработчик не обучил вас, как правильно кушать улиток или омаров.

Другая ситуация, когда можно обойтись без заимствованных объектов.

Вы идёте в ресторан, но наличие конкретных блюд вас не интересует. Потому что вы всё равно не собираетесь их есть. Вы хотите их только сфотографировать. А фотографировать вы умеете какое угодно блюдо. Тогда вы просто подключаетесь к конфигурации и говорите: несите все закуски, которые есть у вас в меню (получаете коллекцию документов из метаданных). Я их перепроводить буду (фотографировать).

Если описать это сухим языком разработчиков то получится, что заимствовать объекты нужно:

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

Подключение расширения

Вы создаёте расширение в конфигураторе. После того, как оно отлажено и проверено, вы можете его отторгнуть, сохранив расширение в файл *.cfe.

Этот файл вы можете передать заказчику. Заказчик самостоятельно загрузит его в свою информационную базу в режиме 1С:Предприятие с помощью стандартной функции Управление расширениями конфигурации.

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

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

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

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

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

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

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

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

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

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

Работа расширения

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

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

Основную концепцию, используемую при совместной работе конфигурации и расширения, можно описать следующим образом. В тех местах, где они «не пересекаются», расширение дополняет конфигурацию. В тех местах, где они «пересекаются» — применяется расширение.

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

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

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

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

Для модулей форм используется другой подход. Для заимствованной формы в расширении создаётся собственный модуль с собственными обработчиками всех событий. В режиме 1С:Предприятие оба модуля формы (из типовой конфигурации и из расширения) объединяются в одном контексте. По этой причине каждое расширение имеет свой префикс, который добавляется к обработчикам всех событий в модуле формы. Чтобы не было совпадений с обработчиками из типовой конфигурации. После этого обработчики событий и команд вызываются последовательно и синхронно. Сначала обработчик из расширения. Потом из типовой конфигурации. Эту последовательность вы можете поменять, или совсем запретить выполнение обработчика из типовой конфигурации.

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

Что касается остальных объектов, которые вы можете использовать в расширении, то для них всё выглядит гораздо проще.

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

Расширять роли вы можете только добавляя в них объекты, созданные в расширении. Удалить что-нибудь из существующей роли вы тоже не можете. Это же относится и к командному интерфейсу.

Расширение — это почти конфигурация

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

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

Вы можете выгрузить расширение в файл (правда, с другим расширением *.cfe), и загрузить из файла. Расширения можно выгружать / загружать в XML.

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

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

Во встроенном языке основной объект для работы с расширениями это МенеджерРасширенийКонфигурации.

Теги:
расширения 
8.3.6 

1С: Предприятие 8.3.13 . Документация
Руководство администратора
Глава 33. Расширение конфигурации

33.3. Работа с расширением

33.3.1. Создание заимствованного объекта

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

Предположим, что в расширяемой конфигурации существует справочник Товары, который представлен некоторой структурой, которая представлена на рис. 683.

Рис. 683. Структура справочника Товары

Если добавить в расширение непосредственно сам справочник, то никакие подчиненные объекты добавлены не будут, что видно на рис. 684.

Рис. 684. После добавления объекта

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

Рис. 685. После добавления объекта с родителями

На рис. 685 видно, что кроме добавляемой формы ФормаЭлемента были добавлены также:

● Все реквизиты, которые присутствуют на форме;

● Все объекты, которые образуют типы реквизитов, присутствующих на форме.

При заимствовании составного типа поведение зависит от характеристик такого типа:

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

● Если в составной тип не может входить тип Произвольный, то такой составной тип будет заимствован по следующим правилам:

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

● Если в составной тип входит хотя бы один ссылочный тип (СправочникСсылка, ДокументСсылка и т. д.), то такой тип будет заимствован как простой тип ЛюбаяСсылка.

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

33.3.2. Работа с заимствованным объектом

Работа с заимствованным объектом имеет некоторые особенности.

Рис. 686. Свойства заимствованного объекта

Во-первых, у заимствованного объекта присутствуют только те свойства, которые могут быть установлены контролируемыми или модифицируемыми. Эта возможность (установка контролируемых или модифицируемых свойств, подробнее см. здесь) является второй особенностью панели свойств заимствованного объекта. Для указания контролируемого свойства, следует установить флажок перед именем свойства. На рис. 686 видно, что для справочника Товары указаны следующие контролируемые свойства: Иерархический, Длина наименования,Тип кода и Допустимая длина кода. Модифицируемое свойство отмечается флажком другого вида в панели свойств. На рис. 686 видно, что свойство Основная форма отмечено как модифицируемое.

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

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

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

33.3.3. Создание собственного объекта

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

● При подключении расширения ‑ среди имен расширяемой конфигурации и всех расширений;

● При разработке расширения ‑ среди имен расширяемой конфигурации и того расширения, в котором создается собственный объект.

Если в расширяемой конфигурации, например, существует обработка ПоискВДанных, то ни в одном расширении не может существовать одноименной обработки.

При создании собственного объекта, этот объект получает префикс, который задается при создании расширения.

33.3.4. Блокировка расширений

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

33.3.5. Совместная разработка расширения

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

● Хранение расширений в том же хранилище конфигурации, что и расширяемая конфигурация.

● Хранение в одном хранилище конфигурации нескольких расширений.

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

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

Команды работы с расширением расположены в меню Конфигурация ‑ Хранилище конфигурации окна Расширения конфигурации.

Рис. 687. Доступ к командам работы с хранилищем конфигурации для расширения

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

Смотри также:

● Хранилище конфигурации (см. здесь).

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