Файлы материала
Описание
Новый реквизит на форму, можно добавить программно через расширение, при этом не забирать саму форму в расширение (это удобно тем, что последующие обновления внешнего вида формы не смогут сломать наше расширение). В типовых конфигурациях, данный способ можно реализовывать в процедуре “ПриСозданииНаСервере” общего модуля “УправлениеСвойствами” .
Программное добавление реквизита на форму
Для примера, стоит задача в конфигурации ЗУП 3.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 |
#Область ДобавлениеРеквизитовФормы // Массив для новых реквизитов ДобавляемыеРеквизиты = Новый Массив; // Опишем ревизиты формы Реквизит_РабочееМесто = Новый РеквизитФормы(«АВ_РабочееМесто», Новый ОписаниеТипов(«СправочникСсылка.РабочиеМестаОхраныТруда»), , «Рабочее место»); // Заполним массив после описания реквизитов формы ДобавляемыеРеквизиты.Добавить(Реквизит_РабочееМесто); // Добавим новые реквизиты в форму Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); #КонецОбласти #Область ДобавлениеЭлементовФормы ... #КонецОбласти #Область ЗаполнениеДанных Форма.АВ_РабочееМесто = Форма.Объект.АВ_РабочееМесто; #КонецОбласти |
Расширения, Типовые приемы, Шаблоны и заготовки
Contents
- 1 Механизм расширения конфигурации 1C
- 2 Как добавить расширение конфигурации 1С 8.3
Механизм расширения конфигурации 1C
Приветствую уважаемый читатель, в данной статье предлагаю ознакомиться с Механизмом расширения конфигурации 1С 8.3, в частности мы познакомимся с его работой в режиме Адаптация, а также рассмотрим пример программного изменения Формы объекта при помощи расширения. Ну, а сейчас немного теории…
Как указано в описании: «Механизм расширения конфигурации – это специальный механизм, предназначенный для доработки расширяемой конфигурации без изменения этой конфигурации (в том числе без снятия с поддержки).»
Основным назначением расширения конфигурации является доработка прикладных решений (конфигураций) под нужды клиента. При этом нет необходимости в снятии дорабатываемой конфигурации с поддержки. В результате сохраняется простота сопровождения и обновления типового прикладного решения, стоящего на поддержке.
При разработке расширений следует учитывать следующие факты:
— в системе могут функционировать более одного расширения.
— расширяемая конфигурация в любой момент может быть изменена, например, в результате обновления и разработчик расширения никак не может повлиять на возможность или невозможность обновления
Расширение может иметь одно из следующих назначений:
Исправление — предназначено для оперативного исправления ошибок в прикладном решении. В таких расширениях часто применяется метод с помощью аннотации Вместо. Как правило это назначение предназначено для определенной версии прикладного решения. При выходе следующей версии этого решения автор расширения должен проводить анализ применимости созданных расширений в новой версии.
Адаптация — предназначено для адаптации прикладного решения под условия конкретного заказчика. Предполагается, что в каждый момент времени в информационной базе существует минимальное количество таких расширений. Если в одно расширение невозможно включить весь набор изменений, то рекомендуется расширения с назначением Адаптация разбивать по максимально крупным блокам расширяемого прикладного решения.
Дополнение — предназначено для реализации новых возможностей прикладных решений, которые минимально привязаны к конкретной версии прикладного решения. В качестве примера можно привести создание нового набора отчетов, который отсутствует в прикладном решении. Предполагается, что таких расширений может быть произвольное количество.
Расширение создается в конфигураторе, хранится в информационной базе и может быть выгружено в файл. Для подключения расширения, сохраненного в файл, в прикладное решение нет необходимости использовать конфигуратор. Подключить расширение можно с помощью стандартного функционала (Все функции Стандартные Управление расширениями конфигурации). Подключить расширение также используя программный интерфейс, предоставляемый платформой.
Ограничения использования расширений:
Расширения конфигурации не поддерживают создание следующих собственных объектов:
— Параметры сеанса.
— Общие реквизиты.
— Критерии отбора.
— Подписки на события.
— Регламентные задания.
— Функциональные опции и параметры функциональных опций.
— Определяемые типы.
— Хранилища настроек.
— Языки.
— Константы.
— Журналы документов.
— Бизнес-процессы и задачи.
— Внешние источники данных.
Не поддерживается расширение следующих объектов:
— Нельзя создавать подчиненные подсистемы.
— Если объект не может быть собственным объектом расширения его расширение также не поддерживается.
— Состав значений перечислений;
Не поддерживается добавление реквизитов и табличных частей для:
— План видов характеристик;
— План счетов;
— План видов расчетов.
Не поддерживается изменение структуры регистров всех видов. Поддерживается только расширение состава регистраторов.
В базовых версиях прикладных решений работа с расширениями не поддерживается.
Стоит помнить, что Механизм расширения конфигурации – это перспективный постоянно развивающийся механизм и с выходом новых версий платформ их функционал только расширяется и лишается текущих недочетов.
Как добавить расширение конфигурации 1С 8.3
Предлагаю рассмотреть задачу добавления нового Справочника «Категория должности по Классификатору Предприятия» с выводом его значения на Форму Справочника Должности, на базе Конфигурации ЗУП 3.1
Для создания расширения необходимо запустить 1С в режиме конфигуратора.
В конфигураторе необходимо зайти в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». Откроется окно со списком расширений (если они есть). Далее нажмем кнопку «Добавить». Мы увидим диалоговое окно создания расширения:
Стоит отдельно выделить поле Назначение – необходимо выбрать его значение в зависимости от решаемой задачи – т.к. мы выполняем добавление объектов по требованиям конкретного заказчика – нам подойдет вариант «Адаптация».
После нажатия на кнопку «ОК» — двойным кликом по появившейся строке откроем Конфигурацию расширения. Мы увидим практически пустое дерево конфигурации.
Добавим в расширение справочник Категория должности по Классификатору Предприятия. Стоит обратить внимание, что в название всех объектов процедур и функций созданных в расширении, добавляется его префикс (в нашем случае Расш1_);
Разместим наш новый Справочник в Подсистеме «ШтатноеРасписание» для этого необходимо добавить эту подсистему в Расширение – Перейдем в дерево основной Конфигурации и нажмем правой кнопкой мыши на строке с нужной подсистемой и выберем пункт «Добавить в расширение».
Теперь мы можем управлять ее составом, добавим наш новый объект в подсистему.
Далее добавим в расширение Справочник Должности и добавим для него новый реквизит КатегорияДолжности с типом СправочникСсылка.Расш1_КатегорияДолжностиПоКлассификаторуПредприятия
Далее необходимо решить задачу с выводом реквизита КатегорияДолжности на форму Справочника Должности, реализовать это можно двумя способами:
— Интерактивно, добавив Форму «ФормаЭлемента» в расширение
— Программно, не добавляя Форму Справочника в расширении, а добавив подходящую процедуру, вызываемую в обработчике Формы «ПриСозданииНаСервере» в расширение.
Останавливаться на плюсах и минусах каждого решения не будем, а ниже рассмотрим оба варианта.
Интерактивное изменение Формы в расширении.
Для того чтобы вывести Реквизит на форму интерактивно: необходимо добавить саму Форму «ФормаЭлемента» в расширение. Обращу ваше внимание на следующий момент – для того чтобы появилась возможность Интерактивного добавления Реквизита объекта на форму необходимо сам Объект тоже добавить в расширение.
Далее добавим новый Реквизит в подходящую Группу на форме.
Запустив 1С в режиме Предприятия убедимся, что новый Справочник появился в интерфейсе
А открыв элемент справочника Должности, увидим, что добавляемый реквизит Категория должности также в нужном месте.
Программное изменение Формы в расширении.
Для того чтобы программно добавить элемент на форму нам необходимо определится в каком месте это сделать оптимально с точки зрения простоты дальнейшей поддержки и обновления конфигурации.
Предлагаю воспользоваться одной из процедур вызываемых в обработчике Формы «ПриСозданииНаСервере», в которую передается наша Форма в качестве параметра например УправлениеСвойствами.ПриСозданииНаСервере.
Перейдем в Общий модуль УправлениеСвойствами где находится данная процедура, и кликнем правой кнопкой мыши по процедуре ПриСозданииНаСервере. В выпадающем меню выберем пункт «Добавить в расширение»
Система предложит нам выбрать одну из аннотаций, подробнее о каждой из них рассмотрим в следующих публикациях, а сейчас выберем «Вызывать после»
После проделанных процедур увидим что в Расширение был добавлен общий модуль УправлениеСвойствами и процедура Расш1_ПриСозданииНаСервере с аннотацией &После(«ПриСозданииНаСервере»)
Далее в добавленную процедуру поместим следующий код:
//Определим тип, чтобы ограничить добавление реквизитов только нужными нам Формами Если ТипЗнч(Форма.СсылкаНаобъект) = Тип("СправочникСсылка.Должности") Тогда // Добавим элемент формы "Категория должности" мИмя = "Расш1_КатегорияДолжности"; Если Форма.Элементы.Найти(мИмя) = Неопределено Тогда Элемент = Форма.Элементы.Добавить(мИмя, Тип("ПолеФормы"), Форма.Элементы.ОплатаГруппа); Элемент.Вид = ВидПоляФормы.ПолеВвода; Элемент.ПутьКДанным = "Объект.КатегорияДолжности"; Элемент.Заголовок = "КатегорияДолжности (пр.)"; КонецЕсли; КонецЕсли;
Запустим 1С в режиме предприятия и убедимся, что на форме также появился добавленный реквизит «КатегорияДолжности (пр.)»
Готовое расширение можно выгрузить в файл перейдя в конфигураторе в меню «Конфигурация» и выбрать пункт «Расширения конфигурации». В открывшемся списке расширений по правой кнопкой мыши можно вызвать выпадающее меню, либо выбрать пункт командной панели «Конфигурация» и выбрать пункт «Сохранить конфигурацию в файл…». На выходе мы получим Файл типа *.cfe который можно передать заказчику.
Таким образом, мы научились создавать собственные расширения на примере конкретного кейса.
Содержание:
- Добавляем реквизит
- Добавление кнопки
- Добавление группы
- Добавляем табличную часть 1С
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и «убивает» все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит «МоеРасширение_НаименованиеНаАнглийском» в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры «МоеРасширение_ПриСозданииНаСервереПосле» (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить («МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));
НовыйЭлемент.ПутьКДанным = «Объект. МоеРасширение_НаименованиеНаАнглийском»;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Ложь;
НовыйЭлемент.Видимость = Истина;
НовыйЭлемент.Доступность = Истина.
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит «МоеРасширение_ТекущаяЗадолженность».
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(«МоеРасширение_ТекущаяЗадолженность»), Новый ОписаниеТипов («Число», «Текущая задолженность»);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты).
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле «ПутьКДанным» – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить(«МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));
НовыйЭлемент.ПутьКДанным = «МоеРасширение_ТекущаяЗадолженность»;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Истина;
НовыйЭлемент.Видимость = Истина;
НовыйЭлемент.Доступность = Истина.
Теперь переместим наши реквизиты под поле «Полное наименование». Для этого надо определить на форме место добавления, в нашем случаем – над группой «ГруппаКолонки»:
Элементы.Переместить(Элементы.МоеРасширение_НаименованиеНаАнглийском,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);
Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки).
Получаем результат:
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие(«ПриИзменении», «МоеРасширение_РасшифроватьЗадолженность»).
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда = Команды.Добавить(«МоеРасширение_ПоказатьОСВ»);
НоваяКоманда.Действие = «МоеРасширение_ПоказатьОСВ»;
НоваяКоманда.Заголовок = «Показать ОСВ».
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить(«МоеРасширение_Кнопка_ПоказатьОСВ», Тип(«КнопкаФормы»));
НоваяКнопка.ИмяКоманды = «МоеРасширение_ПоказатьОСВ».
3. Добавление группы
Для добавления группы переместим кнопку к полю «Текущая задолженность». На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит «Текущая задолженность» и кнопку «Показать ОСВ»:
НоваяГруппа =Элементы.Добавить(«МоеРасширение_ГруппаЗадолженность», Тип(«ГруппаФормы»));
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.Заголовок = «»;
НоваяГруппа.ОтображатьЗаголовок = Ложь;
НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
Элементы.Переместить(НоваяГруппа,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);
Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,НоваяГруппа);
Элементы.Переместить(Элементы.МоеРасширение_Кнопка_ПоказатьОСВ,НоваяГруппа).
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С «МоеРасширение_Номенклатура» с реквизитом «Номенклатура» и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы «Табличная часть».
НоваяТабличнаяЧасть = Элементы.Добавить(«МоеРасширение_ТаблицаНоменклатура», Тип(«ТаблицаФормы»));
НоваяТабличнаяЧасть.ПутьКДанным = «Объект.МоеРасширение_Номенклатура»;
НовыйРеквизитТабличнойЧасти = Элементы.Добавить(«МоеРасширение_Номенклатура», Тип(«ПолеФормы»),НоваяТабличнаяЧасть);
НовыйРеквизитТабличнойЧасти.Заголовок = «Номенклатура»;
НовыйРеквизитТабличнойЧасти.Вид = ВидПоляФормы.ПолеВвода;
НовыйРеквизитТабличнойЧасти.ПутьКДанным = «Объект.МоеРасширение_Номенклатура.Номенклатура».
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Специалист компании «Кодерлайн»
Максим Федоров
1С, как добавить, изменить реквизит формы объекта через расширение
В новых версиях платформы, при изменении типовых форм, стандартные и новые реквизиты (добавленные в расширение) по умолчанию недоступны: их нельзя изменить, ни добавить в форму. Дело в том, что немного изменился механизм добавления реквизитов в расширение, для изменения типовых форм объектов.
Вам необходимо выполнить следующие действия:
- В дереве метаданных нажать правой кнопкой мыши на реквизит -> «Добавить в расширение» -> выбрать расширение;
- Перейти в расширение конфигурации, открыть форму, в которую планируем добавить (или изменить) реквизит -> в области справа выделить реквизит -> нажать правую кнопку мыши -> «Добавить реквизит»;
Почему в новой платформе изменился данный механизм?
Теперь связанные с формой реквизиты в дереве метаданных платформы не переносятся вместе с формой в расширение, а только отображаются как отражение основной конфигурации. Перенос реквизитов для их модификации проводится прямо из формы. Сделано это было для того, чтобы при изменении какого либо реквизита в стандартной конфигурации — расширение не теряло свою работоспособность.
Реквизиты, которые возможно изменить в форме выделяются черным цветом, а недоступные — серым. При этом при обновлении реквизиты в старых расширениях будут сразу доступны для редактирования.
Связанные статьи
Новые реквизиты в расширении |
Я |
07.10.19 — 02:35
Создавать новые реквизиты в расширении можно уже давно. Но пока приходилось создавать новые объекты целиком (новый справочник, документ, регистр) и все было ок. И вот понадобилось добавить реквизит к заимствованному документу. Ну как бы все реализовано (https://wonderland.v8.1c.ru/blog/rasshirenie-dannykh/) приступаем.
Создаем расширение, заимствуем форму, создаем новый реквизит. осталось добавить его на форму … и тут упс… а в форме его нет. Связать с ним поле нельзя
что за?.. опять новая фича или я где-то затупил
1 — 07.10.19 — 03:09
Как бы реализовано, ага, а режим совместимости какой?
2 — 07.10.19 — 03:10
(0) вы невнимательны. Выбрали вверху ФормаДокумента. А надо наоборот, ту что внизу ФормаДокумента.
3 — 07.10.19 — 03:15
(0)
Правой кнопкой на «Объект» (в области на которой ты указал знак вопроса) -> «Добавить в расширение» и всё получится
4 — 07.10.19 — 03:16
7 — 07.10.19 — 06:42
(0) сейчас при расширении формы не заимствуются все связанные реквизиты, таким образом, можно добавлять реквизиты на форму программно. Это предпочтительнее.
8 — 07.10.19 — 07:01
Специально создал демо без режима совместимости на последней платформе. Форма открыта правильно уже заимствованная
9 — 07.10.19 — 07:02
(4) ну так этим я создам реквизит формы в расширении и он не будет связан с новым реквизитом объекта в расширении
10 — 07.10.19 — 08:44
Не стоит создавать реквизиты в расширении, чтобы потом не терять из них данные
11 — 07.10.19 — 09:00
(10) это тема для другой дискуссии. Сейчас не об этом
12 — 07.10.19 — 09:56
(11) В (2) тебе четко назвали причину. Добавляешь реквизит в расширении, так и на форму выводи его в расширении, а не в основной форме
13 — 07.10.19 — 09:58
(12) тьфу ты блин. Спать надо ночью …
14 — 07.10.19 — 10:00
Интересно, как тогда предполагается понимать по задумке ребяток из 1С надпись «Форма (расширение)» в конструкторе формы )
15 — 07.10.19 — 10:02
(14) ага, вот это и меня смутило. Вроде форма уже заимствована, реквизит добавлен, а оказывается его еще раз надо добавлять в форму
16 — 07.10.19 — 10:04
(15) Так ты сначала добавил реквизит, а потом заимствовал?
17 — 07.10.19 — 10:05
(16) по разному пробовал. и сначала форму, потом реквизит. И сначала заимствовал объект, потом добавил реквизит, потом заимствовал форму. разницы никакой
18 — 07.10.19 — 10:10
(17) Так ты открывал форму (конструктор формы) из дерева основной конфигурации, а не из дерева расширения, правильно понял?
19 — 07.10.19 — 10:14
нет, все из дерева расширения естественно
20 — 07.10.19 — 10:14
Проверил: (14) не наблюдается.
Значит у тебя на твоей картинке открыта форма из расширения. Что тогда предлагают тебе делать (2) и (11) не ясно.
21 — 07.10.19 — 10:16
ну а у тебя добавить реквизит на форму получилось?
22 — 07.10.19 — 10:21
(21) На 8.3.10 поведение не отличается от того, что ты описал
23 — 07.10.19 — 10:21
Щас на конфе с режимом совместимости 8.3.12 проверю
24 — 07.10.19 — 10:23
(22) это 8.3.11 появилось
25 — 07.10.19 — 10:23
+(23) Аналогично
26 — 07.10.19 — 10:23
(24) Платформа 8.3.14 везде, в (22) вел речь о режиме совместимости конфы / расширения.
27 — 07.10.19 — 10:25
Полагаю, в конструктор формы расширения добавляемые в объект реквизиты тупо не подвезли
28 — 07.10.19 — 10:25
Т.е. программно добавить элемент и путь к данным прописать получится без труда
29 — 07.10.19 — 10:27
(27) Проверил. Там реально крепкий маразм. В расширенной форме нужно объект (в реквизитах) добавить в расширение)))
30 — 07.10.19 — 10:29
+(29) пытаюсь найти в этом хоть каплю здравого смысла, пока не получается
31 — 07.10.19 — 10:31
+(29) Ага, помогло. Только после этого отображение формы сломалось.
А при вызове команды «Обновить расширение формы» все возвращается обратно, в т.ч. и добавленный реквизит исчезает.
32 — 07.10.19 — 10:32
+(31) После этого действия добавленный реквизит в объект уже никак не добавить, команда «добавить в расширение» неактивна)
33 — 07.10.19 — 10:32
*добавленный в объект реквизит в форму уже никак не добавить
34 — 07.10.19 — 10:33
(31) да вообще какой-то треш с обновлением расширений. Если сделал чего-то сложного — задолбешься потом переделывать. В общем какое-то уг пока. Попробую попользовать на паре реквизитов, ну а одну идею пока отложу до лучших времен
35 — 07.10.19 — 10:34
(34) В 8.3.15 вроде это пофиксили, там форма в расширение приезжает сразу куцая
36 — 07.10.19 — 10:34
(31) (32) (33) Жесть. Ну их в ж.. эти расширения. Где адепты этого волшебного инструмента?
37 — 07.10.19 — 10:35
(35) не, че-то ничего они толком не пофиксили
38 — 07.10.19 — 10:35
(35) Это не лечит (31). Я тестил на 8.3.15.1656
39 — 07.10.19 — 10:36
(38) А режим совместимосты конфы и расширения тоже 8.3.15?
40 — 07.10.19 — 10:37
(39) да, я ради этого как раз новую пустую демо и создавал. Тоже грешил на совместимость вначале
41 — 07.10.19 — 10:37
(36) Используем только как патчи, и не для форм
42 — 07.10.19 — 10:39
(41) ну при этом то хочется. Снимать с поддержки конфу если надо пару реквизитов добавить и в печ форму вывести очень не хочется, а использовать дополнительные реквизиты неудобно из-за их вывода в ж-пе формы
43 — 07.10.19 — 10:40
(31) Эта кнопка вроде должна обновлять сохраненную форму основной конфы в составе расширенной после изменения/обновления конфигурации. Почему она вообще доступна и что-то делает, если конфигурация не менялась?
44 — 07.10.19 — 10:41
(39) было 8.3.13. Перепроверил (расширение создавал заново) без совместимости — всё также
45 — 07.10.19 — 10:42
(42) Снимать с поддержки рано или поздно скорее всего все равно придется, оттягивая этот момент только добавляешь себе мороки по началу) Если конечно ты не потоковый франч с типовыми
46 — 07.10.19 — 10:42
(42) «использовать дополнительные реквизиты неудобно из-за их вывода в ж-пе формы» // Вот через расширение как раз можно использовать чтоб программно переопределять место вывода нужных тебе доп. реквизитов, например.
47 — 07.10.19 — 10:43
(40) (44) Ок, спс, запомнил что расширения для интерактивной работы с конструктором формы не подходят)
48 — 07.10.19 — 10:44
(47) Подходят. Только нельзя нажимать «обновить форму», это запомнить нельзя, я себе запишу))
49 — 07.10.19 — 11:22
Никогда не обращал внимания, но вы оказались правы. Действительно поведение в расширении более чем странное. Вроде нашел лекарство. Встать на Объект, Изменить и обновить тип объекта (например «ДокументОбъект.ЗаказПокупателя») реквизит появляется и можно выводить на форму. При этом уже не требует обновить форму. Проверьте как у вас
50 — 07.10.19 — 11:25
(49) Естественно Объект в форме расширения
51 — 07.10.19 — 11:38
(47)
Нормально оно всё подходит
52 — 07.10.19 — 11:43
(49) Да. Реквизит возвращается.
>> При этом уже не требует обновить форму
Он и до этого не требовал. Но если Вам потребуется или случайно нажмете — сюрприз
53 — 07.10.19 — 16:13
(52) Не для дискуссии, но у меня требовал. Вернее в конфигураторе сверху формы писал «Форма была изменена. Обновить форму?».
54 — 08.10.19 — 09:25
ну вроде разобрался с добавлением. Добавил. Запускаю, а на форме изменений нет. Что за … трава у разработчиков
55 — 08.10.19 — 11:17
(54) расширение единственное в базе или еще есть?
56 — 08.10.19 — 11:19
И безопасный режим расширения отключи, если включен
57 — 08.10.19 — 11:32
ответ дали еще в (3)
о чем вы говорите?
Cyberhawk
58 — 08.10.19 — 19:24
(57) «Ну, братец, виноват: Слона-то я и не приметил» (с)
Не всегда можно сходу определить причину ошибки, возникающей у слушателя в процессе выполнения обязательных и необязательных заданий курса.
Не имея под рукой его информационной базы, в первую очередь, мы начинаем задавать уточняющие вопросы. В процессе обсуждения по возможности определяем причину ошибки, и очень часто бывает, как в той самой басне Крылова: “А ларчик просто открывался”:
Вопрос
Добрый день! Не получается программно добавить элемент на форму элемента справочника Организации в расширении.
Взял ЕРП 2.4.7.127. Платформа 8.3.14.1630. Режим совместимости расширения 8.3.12. Добавил расширение (БезопасныйРежим = Ложь). Позаимствовал процедуру ПриСозданииНаСервере() общего модуля МодификацияКонфигурацииПереопределяемый:
&После(“ПриСозданииНаСервере”) Процедура Расш1_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт Если Форма.ИмяФормы = “Справочник.Организации.Форма.ФормаЭлемента” Тогда НовыйЭлементФормы = Форма.Элементы.Добавить(“ОсновнойБанковскийСчет”, Тип(“ПолеФормы”),Форма.Элементы.Наименования); НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлементФормы.ПутьКДанным = “Объект.ОсновнойБанковскийСчет”; НовыйЭлементФормы.Видимость = Истина; НовыйЭлементФормы.Доступность = Истина; КонецЕсли; КонецПроцедуры
В отладчике получаю ошибку “Поле объекта не обнаружено (ОсновнойБанковскийСчет)”.
Ответ тренера
В релизе ERP 2.4.7.127 у справочника Организации нет реквизита ОсновнойБанковскийСчет. Именно поэтому возникает ошибка “Поле объекта не обнаружено (ОсновнойБанковскийСчет)”. В остальном код у вас корректный.
Для моделирования ошибки использую любой другой реквизит, например, ГрафикРаботы. Вот такой код корректно работает. В пользовательском режиме поле на форме появляется, в процедуре ПриОткрытии есть добавленный элемент:
&После("ПриСозданииНаСервере") Процедура Расш1_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Если Форма.ИмяФормы = "Справочник.Организации.Форма.ФормаЭлемента" Тогда НовыйЭлементФормы = Форма.Элементы.Добавить("ОсновнойБанковскийСчет", Тип("ПолеФормы"), Форма.Элементы.Наименования); НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлементФормы.ПутьКДанным = "Объект.ГрафикРаботы"; НовыйЭлементФормы.Видимость = Истина; НовыйЭлементФормы.Доступность = Истина; КонецЕсли; КонецПроцедуры
Было предположение, что для расширения установлена галочка Безопасный режим, поэтому серверный код не выполнился, но вы явно пишете, что эта галочка сброшена. Как вариант – попробовать на другом релизе платформы.
Уточнение слушателя
“ОсновнойБанковскийСчет” – это добавленный реквизит в расширение. Если добавлять реквизит в основной конфигурации, то все работает. Есть возможность вытащить реквизит из расширения?
Уточнение тренера
Вот теперь ошибка не воспроизводится. Взял платформу 8.3.14.1630, релиз ЕРП 2.4.7.127, добавил реквизит “ОсновнойБанковскийСчет” в расширение. Заимствовал процедуру “ПриСозданииНаСервере()” общего модуля МодификацияКонфигурацииПереопределяемый. Код скопировал ваш. Получил результат – в пользовательском режиме на форме появился новый реквизит. Может, что-то еще не указали?
Уточнение слушателя
Спасибо, что обнадежили на дальнейшие поиски проблемы. Причина в правах доступа к реквизиту.
Экспериментируем в тонком клиенте, Бухгалтерия предприятия, редакция 3.0 (3.0.51.25) .
Пример документа, в котором надо в форму добавить новый реквизит, в табличную часть добавить новую колонку, программно установить им значения и т.д. Все это можно сделать через расширение конфигурации.
Добавили в расширение документ УстановкаЦенНоменклатуры. Далее добавляем ФормуДокумента.
Ревизит1 и Реквизит4 создаем исключительно программно в форме документа в Расширении. Реквизит1 добавляем к форме документа, а Реквизит4 добавляем к табличной части документа.
Ревизит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», Истина) — тоже не проходит.