Файлы материала
Описание
Новый реквизит на форму, можно добавить программно через расширение, при этом не забирать саму форму в расширение (это удобно тем, что последующие обновления внешнего вида формы не смогут сломать наше расширение). В типовых конфигурациях, данный способ можно реализовывать в процедуре “ПриСозданииНаСервере” общего модуля “УправлениеСвойствами” .
Программное добавление реквизита на форму
Для примера, стоит задача в конфигурации ЗУП 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 |
#Область ДобавлениеРеквизитовФормы // Массив для новых реквизитов ДобавляемыеРеквизиты = Новый Массив; // Опишем ревизиты формы Реквизит_РабочееМесто = Новый РеквизитФормы(«АВ_РабочееМесто», Новый ОписаниеТипов(«СправочникСсылка.РабочиеМестаОхраныТруда»), , «Рабочее место»); // Заполним массив после описания реквизитов формы ДобавляемыеРеквизиты.Добавить(Реквизит_РабочееМесто); // Добавим новые реквизиты в форму Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); #КонецОбласти #Область ДобавлениеЭлементовФормы ... #КонецОбласти #Область ЗаполнениеДанных Форма.АВ_РабочееМесто = Форма.Объект.АВ_РабочееМесто; #КонецОбласти |
Расширения, Типовые приемы, Шаблоны и заготовки
1С, как добавить, изменить реквизит формы объекта через расширение
В новых версиях платформы, при изменении типовых форм, стандартные и новые реквизиты (добавленные в расширение) по умолчанию недоступны: их нельзя изменить, ни добавить в форму. Дело в том, что немного изменился механизм добавления реквизитов в расширение, для изменения типовых форм объектов.
Вам необходимо выполнить следующие действия:
- В дереве метаданных нажать правой кнопкой мыши на реквизит -> «Добавить в расширение» -> выбрать расширение;
- Перейти в расширение конфигурации, открыть форму, в которую планируем добавить (или изменить) реквизит -> в области справа выделить реквизит -> нажать правую кнопку мыши -> «Добавить реквизит»;
Почему в новой платформе изменился данный механизм?
Теперь связанные с формой реквизиты в дереве метаданных платформы не переносятся вместе с формой в расширение, а только отображаются как отражение основной конфигурации. Перенос реквизитов для их модификации проводится прямо из формы. Сделано это было для того, чтобы при изменении какого либо реквизита в стандартной конфигурации — расширение не теряло свою работоспособность.
Реквизиты, которые возможно изменить в форме выделяются черным цветом, а недоступные — серым. При этом при обновлении реквизиты в старых расширениях будут сразу доступны для редактирования.
Связанные статьи
Добавление реквизита справочника в объект расширения |
Я |
10.02.21 — 12:05
Добрый день, нужен совсем, совсем запутался.
Есть база, в ней есть расширение, в котором я и работаю. Нужно добавить в расширении реквизит справочника типа булево и вывести его на форму.
Создать его я создал, но в объекте он не появился. При нажатии на ПКМ что на новый реквизит, что на объект формы, кнопки «Добавить в расширение» нет. Подскажите, как быть
1 — 10.02.21 — 12:09
Что именно хотите добавить? Какой элемент справочника?
2 — 10.02.21 — 12:12
Посмотрите Это видео, возможно Вам даст что-то новое и прояснит Ваши мысли!
Видео на Ютубе: https://www.youtube.com/watch?v=jb4S3iXl6sQ
3 — 10.02.21 — 12:28
Это не совсем то. Мне нужно добавить на форму справочника номенклатура булевый реквизит. В документе заказ клиента создать вкладку, в которой будет таблица значений с реквизитами номенклатура и количество. У номенклатуры тип ссылка на справочник номенклатура, у количество число.
Нужно, чтобы при нажатии на кнопку добавить в табличной части выводились только те номенклатуры, где созданный реквизит в справочнике равен истина.
Чтобы реализовать это придумал только запрос к номенклатуре, где созданный реквизит равен истина. Проблема в том, что он не отображается на форме документа в объекте ( тип справочникобъект.номенклаиура)
Может быть можно как-то проще решить мою задачу?
4 — 10.02.21 — 12:29
(3) нажмите кнопку обновить форму , должен слева появиться и перетащите
5 — 10.02.21 — 12:30
т.е. в расширении открываете форму элемента , предварительно ее добавив в расширение из основной конфигурации.
6 — 10.02.21 — 12:35
Нет. Я открываю расширение, в котором есть все, что нужно, кроме реквизита с типом булево. Мне нужно его создать в расширении. Я нажимают на справочник номенклатура ПКМ, добавить, реквизит. Создаю его таким образом, захожу в форму под названием «форма документа» и хочу вывести только что созданный реквизит на форму, но его там нет. В чем может быть проблема?
7 — 10.02.21 — 12:36
Обновить форму?
Что-то не вижу такой кнопки, где она располагается?
Нашёл только «обновить расширение формы»
8 — 10.02.21 — 12:37
(6) Форму документа перетащил в расширение?
9 — 10.02.21 — 12:37
(6) захожу в форму под названием «форма документа» и слева вверху смотрите обновить форму в расширении , как-то так было и в окне реквизитов слева должен появится ваш реквизит , который вы добавили в расширение
10 — 10.02.21 — 12:39
Форма документа уже была в расширении. Я создал реквизит в справочнике в расширении, смотрю форму документа в расширении и там его нет
11 — 10.02.21 — 12:40
(9) в элементах появиться должен?
12 — 10.02.21 — 12:41
В элементах его нет
13 — 10.02.21 — 12:42
Вы можете написать, что именно Вы хотите перенести в Расширение, чтобы это можно было визуально отобразить в табличной части элементов Справочника, а то получается догадайся по Феншую!?
14 — 10.02.21 — 12:45
Напишите Конфигурацию, что за Справочник, и какой реквизит Вы не можете вытащить из Конфигурации!? Чтобы можно было у себя проверить, и Вам подсказать!
15 — 10.02.21 — 12:46
Попробую ещё раз
Я открываю расширение. Справочник номенклатура. Мне нужно создать в нем реквизит под названием «проверка» с типом булево. Я в расширении нажимаю на справочник номенклатура ПКМ, добавить, реквизит. Создаю реквизит. Теперь он отображается в реквизитах справочника номенклатура в расширении.
Теперь нужно вывести его на форму документа. Для этого открываю форму» форма документа», ищу в объекте реквизит «проверка» и не нахожу. Он не отображается там.
16 — 10.02.21 — 12:46
(15) Форма документа в Расширении есть?
17 — 10.02.21 — 12:46
Конфигурация УТ 11.4.12.71
18 — 10.02.21 — 12:47
Сохрани, закрой, открой заново. Перезапусти в режиме предприятия.
19 — 10.02.21 — 12:47
Где открываешь форму документа? Когда?
20 — 10.02.21 — 12:47
(16) форма документа в расширении есть.
Я работаю только в расширении
21 — 10.02.21 — 12:48
Не «форма документа», а «форма элемента», прошу прощения
22 — 10.02.21 — 12:49
Добавь форму элемента в расширение еще раз.
23 — 10.02.21 — 12:50
(18) сейчас попробую. (19) в конфигураторе выбираю нужную мне форму и открываю её для редактирования
24 — 10.02.21 — 12:52
Ничего не изменилось. В расширении у справочника номенклатура есть реквизит «проверка», в форме элемента расширения реквизита нет
25 — 10.02.21 — 13:08
(24) Если ты смотришь в конфигураторе, внутри расширения и смотришь на заимствованную форму элемента, а она не видит добавленных реквизитов для этого элемента — ну что-то с самой формой не так. Попробуй где-то на тестовой копии поиграться. Удалить форму совсем, добавить ее заново и попытаться отредактировать.
26 — 10.02.21 — 13:08
Есть ещё какие то версии?
27 — 10.02.21 — 13:08
Оно как-то глючит… по бестолковому
28 — 10.02.21 — 13:09
Я однажды глюк в чем-то похожий словил… Пока заново все не загрузил на «чистое место» — ничего не помогало. Походу с кешами оно работает глючно.
29 — 10.02.21 — 13:10
Ну я правильно же понимаю, что реквизит, созданный в расширении у справочника, должен быть виден в объекте форы элемента этого же справочника в этом же расширении, как сейчас я и сделал, но по какой-то причине не вижу его
30 — 10.02.21 — 13:13
Если создать свою отдельную форму, то да. Будешь видеть все также как и в основной привык видеть. Но после заимствования что-то оно не дает смотреть. Может закрыть его надо. Убрать с редактирования и заново открыть из списка расширений, чтоб правильно все встало. Тут трудно что-то предположить.
31 — 10.02.21 — 13:14
Сохранил расширение в файл. Загрузил тестовую базу без него в новую папку в новой строчке пускаца (чтоб кэшей не было 100%) — затем установил готовое расширение из файла. Смотрю. Работает как нужно.
32 — 10.02.21 — 13:15
Понял, спасибо за помощь)
Буду разбираться
33 — 10.02.21 — 13:39
Эх, мне это не помогло(
34 — 10.02.21 — 13:58
Спецы по расширениям. Подскажите в чем может быть дело.
Мне надо в расширение вынести движения существующего документа по новому регистру которого нет конфигурации Поставщика.
Создаю расширение.
1. Добавил в расширение существующий документ.
2. Добавил в расширение новый регистр.
Ни у документа ни у регистра в расширении не вижу где их связать по схеме «документ является регистратором регистра».
Куда копать ?
Платформа 8.3.17.1851)
Пробую на конфе Бухгалтерия предприятия, редакция 3.0 (3.0.82.24)
35 — 10.02.21 — 14:03
(34) Свойства документа / Движения / Указать новый регистр
36 — 10.02.21 — 14:05
(10) верхняя панель слева пункт ОБНОВИТЬ РАСШИРЕНИЕ ФОРМЫ и в объекте ищите свой реквизит
37 — 10.02.21 — 14:12
(36) + все этонадо делать на форме открытой в конфигураторе в расширении
38 — 10.02.21 — 16:12
(34) Рискуешь. Отвалится твое расширение — и будешь потом все свои «новые движения» с бубном искать.
39 — 10.02.21 — 16:13
(35) Спасибо. Вроде то что нужно.
40 — 10.02.21 — 16:14
(38) Если не дают снимают с поддержки , есть другие варианты ? Озвучь
41 — 10.02.21 — 16:14
(38) Отвалиться значит через набор записей выгружу — загружу через XML. Сериализацию давно придумали.
42 — 10.02.21 — 16:19
(40) У меня другая задача.
Я неоднократно сталкивался уже с задачами типа «надо обновить переписанную вхлам конфу при этом у существующих документов добавлены движения по новым регистрам».
И каждый раз при накатывании обновления ты вынужден проверять эти моменты.
Пропустишь этот момент и у тебя набор записей регистра по документам этого вида обнулится. Когда тебе надо за выходные успеть накатить релизов 20 то пропустить глазами подобные моменты очень просто.
43 — 10.02.21 — 16:22
(40) При этом со всем остальным проблемы не настолько сложные.
Формы копируются и таким образом отвязываются от форм Поставщика. Необходимость изменения в модулях объектов легко обходиться через подписки. Реквизиты добавляются без проблем.
А вот отслеживание ситуации «у существующих документов добавлены движения по новым регистрам» без использования расширения это реально большая проблема.
44 — 11.02.21 — 11:01
(5) А в расширении можно заменять основную форму на другую ?
То есть в конфигурации у элемента справочника создана форма И_ФормаЭлемента.
И включены изменения на корень объекта метаданных этого справочника.
И сейчас в качестве основной формы прописана она.
Можно ли в расширении указать что основная форма элемента справочника ФормаЭлемента а И_ФормаЭлемента ? При этом имея в основной конфигурации замочек на справочнике ?
45 — 11.02.21 — 12:24
(44) конечно, щелкаешь на свойства справочника, там есть Основная форма объекта
46 — 11.02.21 — 13:49
(45)
1. Добавил в расширение документ.
2. Добавил в расширение добавленную форму.
3. В расширении выбираю свойствам документа. Все поля недоступны. Начиная от «тип номера», «длина номера» заканчивая «основная форма объекта», «основная форма списка», «основная форма выбора».
Назначение расширения выбрал «Дополнение».
47 — 11.02.21 — 13:51
+(46) В чем нюанс ? Почему в свойствах документа эти поля недоступны ?
48 — 11.02.21 — 14:08
стоишь на справочнике в расширении.
справа отображается панель Свойства
Представление
о Основная форма объекта (пустое поле для выбора формы) — вот тут в самом начале в чек-бокс тыкаешь — а затем уже сможешь форму выбирать.
з.ы. И самое смешное — для особо одаренных — Если после заимствования Справочника, переходишь внутрь него (там пусто) и начинаешь создавать новую форму — само пишет «Сделать форму основной?»
Да
Смотришь в свойствах — а оно уже прописалось.
49 — 11.02.21 — 14:16
(48)
>стоишь на справочнике в расширении.
Стою.
>справа отображается панель Свойства
Отображается. Но поля со свойствами форм недоступны. Доступно поле только с движениями.
50 — 11.02.21 — 14:20
(48) >Основная форма объекта (пустое поле для выбора формы) — вот тут в самом начале в чек-бокс тыкаешь — а затем уже сможешь форму выбирать.
У меня это поле НЕДОСТУПНО.
Все поля начиная от «тип номера», «длина номера» заканчивая «основная форма объекта», «основная форма списка», «основная форма выбора» недоступны.
Доступно только «Движения».
51 — 11.02.21 — 14:50
(49) это так нарисовано на экране, что недоступно. Типа затененные. А на самом деле доступно, это просто такая игра цветов у них.
52 — 11.02.21 — 14:53
(50) свойство Основная форма объекта, ставлю слева флажок, потом выбираю форму из списка или создаю в расширении новую. Что я делаю не так?
53 — 11.02.21 — 21:13
(52) >ставлю слева флажок, потом выбираю форму из списка
Да точно. Спасибо за подсказку.
Что-то сразу не сообразил что поле становится доступным только если галочка слева ставится.
54 — 19.02.21 — 19:39
Вопрос к знатокам расширений.
Объясните понятным языком в чем разница между «Адаптацией» и «Дополнением» ?
Что можно делать в одном случае и не нельзя и что в другом.
В теории очень сухо и непонятно этот момент описан.
55 — 19.02.21 — 19:48
56 — 19.02.21 — 20:25
(34) я в таких случаях делаю документ-пустышку с одним реквизитом «ДокументОснование» (ссылка на типовой док), он и пишет движуху в новые регистры через подписку
т.е. и док движения и регистры — добавлены
надо только один раз нормально «обвязку» сделать — и забываешь о пропаже движений
57 — 19.02.21 — 20:26
(56) ну и в отчетах не забывать Регистратор.ДокументОснование использовать
58 — 20.02.21 — 16:53
(56) >надо только один раз нормально «обвязку» сделать — и забываешь о пропаже движений
Ты не понял в чем сложность от которой хочу уйти использованием расширений.
Смысл в том что если ты пропустишь изменения в Документ.Движения то у тебя слетят все движения по добавленным регистрам.
>он и пишет движуху в новые регистры через подписку
Еще раз.
Проблема не в том чтобы написать движения по регистру. А в том что после того как у тебя в Документ.Движения пропадет связь «Документ Х делает движения по регистру Y» у тебя автоматом пропадают все движения по регистру Y где регистраторы докуvенты типа X/
а пропадает эта связь если ты накатываешь документ с измененными Документ.Движения из конфигурации Поставщика.
59 — 20.02.21 — 21:08
(58) он то как раз понял
И добавил костыль.
В виде отдельного,
совсем отдельного регистратора,
которые сохранит наличие наборов записей регистра,
даже тогда, когда будет оборвана связь с документом основной конфигурации.
60 — 20.02.21 — 21:09
Хотя потребность в нагораживании такого костыля отсутствует.
ЧессМастер
61 — 25.02.21 — 12:33
(59) Какое то реально сильное извращение такая схема.
В новом релизе платформы 8.3.11 очень существенно доработан механизм расширений конфигураций, по сути, он позволяет сделать новую конфигурацию поверх текущей, которая останется на поддержки, т.е. может спокойно обновляться. Об этих революционных изменениях в платформе 8.3.11 и будет моя статья.
На мой взгляд, самое главное новшество в механизме расширений конфигурации это возможность в расширении конфигурации создавать собственные объекты – документы, справочники, планы счетов обмена и регистры сведений. А так же возможность создавать у заимствованных документов и справочников собственные табличные части и реквизиты. Исследуем эти новые возможности, для реализации примеров, я буду использовать конфигурацию 1С «Управляемое приложение».
У конфигурации должен стоять режим совместимости «Не использовать», так же как и у расширения.
Для этого создадим в конфигурации «Управляемое приложение» подсистему «Учет автомобилей» со следующими объектами
Справочники: Марки автомобилей, Автомобили, Гаражи
Документы: Прибытие в гараж, Выбытие из гаража.
Создадим новое расширение, которое назовем «Учет автомобилей», назначение этого расширения будет «Дополнение».
Добавим в новое расширение собственную картинку, в которую загрузим иконку автомобиля
Теперь создадим новую подсистему, которую назовем «Учет автомобилей», в этой подсистеме отметим флаг «Включать в командный интерфейс» и в свойстве «Картинка» укажем нашу новую иконку.
Создадим справочники: МаркиАвтомобилей, Автомобили (будет реквизит Марка с типом ссылка на справочник МаркиАвтомобилей) и Гаражи.
Создать новый справочник в расширении конфигурации легко, все делается точно так же как и в обычной конфигурации: выделяется ветка справочники, вызывается контекстное меню, в котором нужно кликнуть на пункт «Добавить»
Точно так же создадим новые документы: Прибытие автомобиля и Выбытие автомобиля.
Включим все наши новые объекты в подсистему.
Теперь запустим нашу конфигурацию и посмотрим на новую подсистему
Теперь попробуем в справочник расширяемой конфигурации добавить новый реквизит, причем тип этого реквизита будет из расширения. Сделаем следующую задачу: в справочник контрагент добавим новый реквизит с типом ссылка на справочник Автомобиль.
Для этого заимствуем справочник Контрагент в расширение.
Добавим для заимствованного справочника новый реквизит, который назовем Автомобиль.
Реквизит мы добавили, но на форме он еще не отобразился. Для этого необходимо заимствовать форму элемента справочника.
И добавить на заимствованную форму реквизит расширения.
Теперь, если мы зайдем в справочник нашей конфигурации, то сможем заполнить этот реквизит из расширения.
Таким образом, можно прорезюмировать: платформа 8.3.11 дает принципиально новые возможности по доработкам конфигурации. По сути, теперь расширение конфигурации является самостоятельно полноценной конфигурацией, которая строиться поверх основной конфигурации. Будем следить дальше за развитием платформы 1С.
Семь бесплатных видео-урока по работе с расширениями конфигурации
Учимся перехватывать методы в расширении конфигурации
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Начиная с версии платформы 1С 7.7 одной из самых частых задач является доработка конфигурации под нужды организации или клиента. В версии платформы 8.2 в конфигурации для внесения изменений необходимо было включить возможность изменений или вовсе снять с поддержки. Это означает, что конфигурация не может обновляться автоматически и обновление нужно делать вручную. И чем больше и чем серьезней вносятся изменения в конфигурации, тем более сложной и трудоемкой становится дальнейшая поддержка и обновление. Поэтому начиная с версии 8.3.6 в платформе появился механизм расширений. Он позволяет вносить изменения, не затрагивая основную конфигурацию и не снимая ее с поддержки. В расширениях можно добавлять новые объекты, изменять поведение форм, переопределять типовые алгоритмы.
В статье покажу 2 способа доработки форм в 1С. Первым способом мы доработаем форму при помощи редактора форм платформы. Вторым способом проделаем все те же манипуляции, но только изменения будем вносить программно. За основу возьмем конфигурацию Библиотека стандартных подсистем версии 3.1.6.198 и доработаем в ней форму элемента справочника Контрагенты. Все доработки весьма условны и призваны показать возможности доработки форм.
Contents
- 1 Добавление расширения для изменения форм 1С
- 2 Доработка форм 1С в редакторе форм
- 3 Программное изменение форм 1С при помощи расширений
- 3.1 Вспомогательные функции и процедуры для создания элементов формы
- 3.1.1 ЕслиСтруктураНеопределена
- 3.1.2 Процедуры УстановитьСвойстваЭлемента и УстановитьСобытияЭлемента
- 3.1.3 ВидыПолейФормы
- 3.2 Добавление нового реквизита на форму
- 3.3 Создание реквизита формы
- 3.4 Создание группы формы
- 3.5 Создание страницы
- 3.6 Создание команды и кнопки
- 3.1 Вспомогательные функции и процедуры для создания элементов формы
В самом начале мы добавим новое расширение в конфигурацию. Расширение назовем «ДоработкаФорм». В расширение добавим справочник «_ДемоКонтрагенты» и добавим этому справочнику новый реквизит «ДФ_КонтактноеЛицо». Также нам необходимо будет добавить в расширение форму элемента справочника, с которой мы будем дальше работать.
Откроем форму элемента справочника и доработаем форму при помощи редактора формы:
Доработка форм 1С в редакторе форм
Для начала попробуем доработать форму справочника контрагенты в редакторе форм. Откроем редактор, раскроем ветку объекта в реквизитах формы:
В списке реквизитов объекта мы не увидим наш добавленный реквизит. Для того чтобы он появился, необходимо добавить сам объект в расширение.
Нажимаем правой кнопкой мыши на объекте и выбираем пункт «Добавить в расширение»:
После добавления объекта в расширение, реквизит «ДФ_КонтактноеЛицо» станет виден:
Теперь реквизит «ДФ_КонтактноеЛицо» мы можем вытащить на форму:
Добавим новый реквизит и также вытащим его на форму. Пусть это будет обычный флажок, который будет управлять видимостью реквизита «Контактное лицо». Добавляем новый реквизит, тип указываем булево и вытаскиваем его на форму:
Объединим реквизиты в группу, чтобы они были на одной строке. Для этого в дереве элементов нажмем правую кнопку мыши и добавим обычную группу без отображения. После добавления группы перенесем в нее добавленные реквизиты. Результат проделанных действий будет выглядеть следующим образом:
Создадим обработчик события «ПриИзменении» реквизита «Видимость контактного лица» и добавим в него код:
Добавим новую страницу в группу страниц и перенесем на нее добавленные реквизиты. Для этого в дереве элементов найдем группу «Страницы», нажмем правую кнопку мыши на ней и добавим новую группу «Страница».
Страницу назовем просто «Новая страница» и после добавления переносим на нее наши добавленные реквизиты. После переноса форма примет вид:
В конце мы добавим команду формы, также вытащим ее на форму и создадим обработчик, который будет сообщать нам содержимое реквизита «Контактное лицо». Для добавления новой команды нужно перейти на вкладку «команда», нажать кнопку «добавить». Созданную команду назовем «Сообщить контактное лицо» и создадим обработчик команды. Саму команду вытащим на форму, на созданную ранее страницу, и поместим ее под реквизитами:
В обработчике команды напишем следующий код:
Таким образом, можно дорабатывать формы любых объектов. Однако у такого способа есть, как по мне, минусы. Во-первых, необходимо добавлять объект в само расширение, т.е. тянуть из основной конфигурации ненужные нам элементы. Во-вторых, в дальнейшем формы, доработанные таким образом, становятся очень трудоемки в плане поддержки. После очередного обновления доработки могут работать некорректно или вовсе форма перестанет открываться.
В следующей части статьи мы проделаем все то же самое, но только все доработки будут сделаны программно. Мы не будем в редакторе форм добавлять сам объект в расширение, не будем добавлять элементы, реквизиты и команды.
Программное изменение форм 1С при помощи расширений
При программном изменении форм при помощи расширений все изменения вносятся в коде программы, обычно в обработчике формы «ПриСозданииНаСервере». Этот способ является более предпочтительным, т.к. облегчает дальнейшую поддержку при обновлениях программы.
При программном изменении можно создавать любые элементы формы: поля ввода, команды, различные группы элементов и т.д. Попробуем так же доработать форму справочника Контрагентов, но уже программно. Но для начала необходимо будет создать несколько процедур и функций общего назначения, которые подойдут для любой конфигурации.
Для начала в расширении создадим общий модуль ДФ_РаботаСЭлементаФормы:
В общем модуле добавим функцию, которая будет возвращать нам новый элемент формы:
Данная функция добавляет на форму новый элемент и в качестве возвращаемого значения возвращает этот же элемент для дальнейшей работы с ним. Это одна из основных функций, которая будет использоваться в дальнейшем практически везде.
В качестве параметров передаются:
- Форма – управляемая форма;
- ИмяЭлемента – строковое представление элемента;
- ТипЭлемента – при помощи функции Тип() передать тип элемента. Например, Тип(”ПолеВвода”) или Тип(”ГруппаФормы”);
- РодительЭлемента – родитель добавляемого элемента. Это может быть как группа формы, так и сама форма;
- ЭлементПеред – элемент формы, перед которым будет добавлен новый элемент.
Вспомогательные функции и процедуры для создания элементов формы
Перед тем как мы перейдем к непосредственному созданию элементов формы, опишу вспомогательные функции и процедуры, которые понадобятся в дальнейшем.
ЕслиСтруктураНеопределена
Данная процедура переопределяет входящий параметр. Если параметр будет равен «Неопределено», то процедура переопределит его на тип «Структура». Такая проверка довольно часто будет использоваться, поэтому была вынесена в отдельную процедуру.
Процедуры УстановитьСвойстваЭлемента и УстановитьСобытияЭлемента
Две весьма похожие процедуры. Процедура УстановитьСвойстваЭлемента устанавливает свойства элемента. Здесь в качестве параметров передаем элемент и структуру свойств. В структуре свойств ключ – это имя свойства, например, ТолькоПросмотр, Видимость, Доступность, а значение структуры – это значение свойства. Аналогично работает процедура УстановитьСобытияЭлемента, только структура в качестве ключа будет содержать имя события, например ПриИзменении, а значение структуры – имя обработчика, который определен в модуле формы, например «НаименованиеПриИзменении».
ВидыПолейФормы
Функция возвращает соответствие видов полей формы. Предназначена для определения вида поля. Потребуется при создании полей формы. Список видов полей формы весьма велик, поэтому возьмем часто используемые.
Добавление нового реквизита на форму
Допустим, есть задача: на форму элемента справочника «Контрагенты» необходимо добавить новый реквизит «Контактно лицо». Для этого добавляем форму элемента справочника в расширение. После добавляем реквизит «КонтактноеЛицо». На форму этот реквизит мы будем выводить в обработчике событий «ПриСозданииНаСервере» и вызывать его после основного обработчика.
Далее в общем модуле опишем функцию, которая добавит поле ввода, и свяжем ее с нашим новым реквизитом.
В данной функции мы получаем виды полей при помощи вспомогательной функции, по умолчанию это поле ввода. Создаем новый элемент на форме, заполняем заголовок и путь к данным. Также если заполнены структуры свойств и структуры событий, то заполняем их. В обработчике «ПриСозданииНаСервереПосле» напишем следующий код:
После запуска и отработки обработчика «ПриСозданииНаСервереПосле» форма элемента справочника примет вид:
Как видно, функция по созданию нового поля отработала, и наш реквизит появился на форме.
Создание реквизита формы
Для следующего примера добавим реквизит уже формы, который будет управлять видимостью нашего реквизита «Контактно лицо». Для создания реквизитов формы создадим пару новых процедур.
Процедура СоздатьРеквизиты создает реквизиты формы. В качестве параметров мы передаем саму форму и структуру реквизитов. Ключом структуры является имя реквизита формы, а значением структуры описание типа реквизита. Процедура СоздатьРеквизит создает структуру с одним значением и вызывает процедуру СоздатьРеквизиты. Добавляем новый реквизит формы «ВидимостьКонтактногоЛица». Для этого в обработчике «ПриСозданииНаСерверПосле» допишем следующий код:
Для начала мы создаем новый массив, добавляем в него тип булево и создаем новое описание типов. После этого вызываем нашу процедуру из общего модуля и создаем новый реквизит формы. Новый реквизит формы создан, но этого недостаточно. Теперь необходимо добавленный реквизит отобразить на форме. Воспользуемся функцией общего модуля СоздатьПоле, но вид у этого поля будет уже флажок. Также мы хотим, чтобы при изменении флажка изменялась видимость поля «Контактное лицо». Перед вызовом функции СоздатьПоле создадим структуру. Ключом структуры будет имя события «ПриИзменении», а значением структуры — имя обработчика. Ниже описываем процедуру обработчика. После добавления кода форма справочника примет следующий вид:
В конец формы добавился реквизит. Если изменять его значение, то поле «Контактное лицо» будет скрываться или отображаться. Все вроде хорошо, но хотелось бы, чтобы флажок был вместе с полем «Контактное лицо» на одной строке. Для этого нам необходимо добавить группу формы.
Создание группы формы
По своей сути создание группы формы ничем не отличается от создания обычных элементов. Тут нам потребуется в общий модуль добавить пару новых функций:
Первая функция создает обычную группу, вторая функция обычную группу без отображения.
В этих двух функциях появилась новая вспомогательная функция СвойстваГруппыФормы. Она возвращает структуру со свойствами, характерными для групп формы. При необходимости эту функцию можно расширить другими свойствами:
Для нашего примера создадим обычную группу и переместим в нее наши ранее созданные элементы. Придется переработать код обработчика «ПриСозданииНаСервереПосле»:
Вначале мы получаем структуру свойств для группы. В этой структуре переопределяем два свойства: группировка и заголовок. Группировку укажем «ГоризонтальнаяВсегда», заголовок произвольный. Создаем обычную группу при помощи функции «СоздатьОбычнуюГруппу». В нее мы передаем форму, имя группы, родителя и структуру свойств. Функция вернет нам элемент группы формы. Далее остается все то же самое, кроме одного момента. В создаваемых элементах формы в качестве родителя мы будем указывать не саму форму, а ранее созданную группу. Также для флажка «ВидимостьКонтактногоЛица» в качестве параметра ЭлементПеред укажем созданное поле «КонтактноеЛицо». Это нужно для того, чтобы элементы выстроились друг за другом.
После доработки обработчика результат его работы будет выглядеть следующим образом: созданные флажок и поле объединились в группе «Добавленные реквизиты»:
Создание страницы
На форме есть группа формы страницы с несколькими страницами: Основные, значения по умолчанию и т.д. Попробуем создать свою страницу и перенести на нее ранее созданные элементы. Для создания страницы также опишем пару функций. Первая функция, вспомогательная, будет возвращать структуру свойств для страницы, вторая создаст саму страницу:
В функцию «СоздатьСтраницу» в параметрах передаем форму, имя страницы, группу страницы – т.е. это группа, которой будет подчинена наша страница, структура свойств и страница перед – т.е. группа страницы, перед которой будет создана наша страница.
Добавим новую страницу и перенесем в нее наши созданные элементы. Как и ранее будем дорабатывать обработчик «ПриСозданииНаСервереПосле».
Получим структуру свойств страницы. Заголовок, к примеру, укажем «Новая страница», а группировку оставим без изменений, т.е. вертикальная. Нашу новую страницу добавим в самое начало, т.е. перед страницей «Основное». Создаем станицу. Для того чтобы создаваемые элементы далее перенеслись на новую страницу, для группы элементов родителем укажем не форму, а созданную страницу. После доработки обработчика результат получится такой — как видно на рисунке, добавилась новая страница в начало группы страниц и на эту страницу перенесены все созданные элементы.
Создание команды и кнопки
Следующим элементом формы, который мы создадим, будет кнопка формы. В данном случае последовательность действий та же, что и при создании реквизита формы. Т.е. мы программно создаем команду формы, создаем элемент формы кнопка и связываем их. Так же как и для предыдущих элементов определим вспомогательную функцию «СвойстваКнопки» и определим в ней пару свойств:
Добавим в общий модуль пару функций. Первая будет создавать команду формы, вторая будет создавать элемент формы кнопка и связывать ее с командой формы.
При создании новой команды формы в качестве параметров нам потребуется указать форму, в которой добавляется команда, имя команды и действие. Действие — это имя обработчика команды в виде строки.
Переходим к доработке обработчика «ПриСозданииНаСервереПосле». В конец обработчика сначала добавляем код создания команды формы. В качестве действия команды передадим имя обработчика, которое выведет в качестве сообщения содержимое поля контактное лицо. После создаем кнопку формы. Получаем структуру свойств кнопки и, при необходимости, переопределяем их. Создаем элемент формы кнопка и связываем ее с созданной командой. Для этого нужно передать имя команды, которое передавали в параметре ИмяКоманды функции СоздатьКоманду. После доработки код обработчика «ПриСозданииНаСервереПосле»:
После того как обработчик «ПриСозданииНаСерверПосле» отработает, форма примет следующий вид. Нажмем на кнопку «Сообщить конт. лицо» и проверим, срабатывает ли обработчик команды.
При нажатии на кнопку обработчик команды срабатывает и сообщает нам содержимое поля контактное лицо. При желании кнопку можно перенести в командную панель. Для этого при создании кнопки формы в параметр РодительКнопки передадим командную панель формы:
Результат работы такого кода приведен на рисунке.
Процесс программной доработки форм может быть весьма трудоемок, но все затраты компенсируются при последующие поддержке и обслуживании конфигурации.
Содержание:
- Добавляем реквизит
- Добавление кнопки
- Добавление группы
- Добавляем табличную часть 1С
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и «убивает» все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит «МоеРасширение_НаименованиеНаАнглийском» в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры «МоеРасширение_ПриСозданииНаСервереПосле» (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить («МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));
НовыйЭлемент.ПутьКДанным = «Объект. МоеРасширение_НаименованиеНаАнглийском»;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Ложь;
НовыйЭлемент.Видимость = Истина;
НовыйЭлемент.Доступность = Истина.
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит «МоеРасширение_ТекущаяЗадолженность».
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(«МоеРасширение_ТекущаяЗадолженность»), Новый ОписаниеТипов («Число», «Текущая задолженность»);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты).
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле «ПутьКДанным» – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить(«МоеРасширение_НаименованиеНаАнглийском», Тип(«ПолеФормы»));
НовыйЭлемент.ПутьКДанным = «МоеРасширение_ТекущаяЗадолженность»;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Истина;
НовыйЭлемент.Видимость = Истина;
НовыйЭлемент.Доступность = Истина.
Теперь переместим наши реквизиты под поле «Полное наименование». Для этого надо определить на форме место добавления, в нашем случаем – над группой «ГруппаКолонки»:
Элементы.Переместить(Элементы.МоеРасширение_НаименованиеНаАнглийском,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);
Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки).
Получаем результат:
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие(«ПриИзменении», «МоеРасширение_РасшифроватьЗадолженность»).
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда = Команды.Добавить(«МоеРасширение_ПоказатьОСВ»);
НоваяКоманда.Действие = «МоеРасширение_ПоказатьОСВ»;
НоваяКоманда.Заголовок = «Показать ОСВ».
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить(«МоеРасширение_Кнопка_ПоказатьОСВ», Тип(«КнопкаФормы»));
НоваяКнопка.ИмяКоманды = «МоеРасширение_ПоказатьОСВ».
3. Добавление группы
Для добавления группы переместим кнопку к полю «Текущая задолженность». На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит «Текущая задолженность» и кнопку «Показать ОСВ»:
НоваяГруппа =Элементы.Добавить(«МоеРасширение_ГруппаЗадолженность», Тип(«ГруппаФормы»));
НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
НоваяГруппа.Заголовок = «»;
НоваяГруппа.ОтображатьЗаголовок = Ложь;
НоваяГруппа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
Элементы.Переместить(НоваяГруппа,Элементы.ГруппаКолонки.Родитель,Элементы.ГруппаКолонки);
Элементы.Переместить(Элементы.МоеРасширение_ТекущаяЗадолженность,НоваяГруппа);
Элементы.Переместить(Элементы.МоеРасширение_Кнопка_ПоказатьОСВ,НоваяГруппа).
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С «МоеРасширение_Номенклатура» с реквизитом «Номенклатура» и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы «Табличная часть».
НоваяТабличнаяЧасть = Элементы.Добавить(«МоеРасширение_ТаблицаНоменклатура», Тип(«ТаблицаФормы»));
НоваяТабличнаяЧасть.ПутьКДанным = «Объект.МоеРасширение_Номенклатура»;
НовыйРеквизитТабличнойЧасти = Элементы.Добавить(«МоеРасширение_Номенклатура», Тип(«ПолеФормы»),НоваяТабличнаяЧасть);
НовыйРеквизитТабличнойЧасти.Заголовок = «Номенклатура»;
НовыйРеквизитТабличнойЧасти.Вид = ВидПоляФормы.ПолеВвода;
НовыйРеквизитТабличнойЧасти.ПутьКДанным = «Объект.МоеРасширение_Номенклатура.Номенклатура».
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Специалист компании «Кодерлайн»
Максим Федоров
09.06.2017
Расширение данных
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Реализовано в версии 8.3.11.2867.
Теперь с помощью расширений конфигурации вы можете добавлять к прикладному решению собственные структуры для хранения данных: справочники, документы, регистры сведений.
В расширении вы добавляете (или модифицируете) соответствующий объект конфигурации. При загрузке расширения, «на лету», выполняется реструктуризация базы данных, и, перезапустив сеанс, вы сразу же можете заполнять новые структуры своими данными.
Что мы сделали
Можно сказать, что это самая сложная и самая ожидаемая доработка механизма расширений. Мы доработали механизм расширений таким образом, что теперь вы можете добавить в прикладное решение объекты или реквизиты, данные которых будут сохранены в информационной базе. Раньше вы могли дорабатывать прикладное решение, но расширение не влияло на структуру хранимых данных. Теперь с помощью расширений вы можете изменить и структуру данных тоже.
Вы можете добавлять собственные:
- Справочники;
- Документы;
- Регистры сведений;
- Планы обмена.
Кроме этого к справочникам и документам прикладного решения вы можете добавить собственные:
- Реквизиты;
- Табличные части;
- Реквизиты табличных частей.
Как это устроено физически
Чтобы не усложнять, рассмотрим основные принципы работы этого механизма на примере справочника.
Если расширение добавляет собственный справочник, то для него создаётся новая таблица в базе данных. В этом случае всё просто и очевидно.
Сложнее обстоят дела, когда расширение модифицирует уже существующую структуру данных. Если расширение добавляет собственный реквизит к справочнику прикладного решения, то для этого справочника создаётся отдельная таблица с новой структурой (с дополнительной колонкой для нового реквизита). Будем называть её расширенная таблица. В неё переносятся данные из старой таблицы справочника. В дальнейшем все обращения к этому справочнику будут переадресовываться к расширенной таблице.
Независимо от количества расширений, модифицирующих этот справочник, расширенная таблица будет всегда одна. Её структура будет содержать изменения, добавленные всеми расширениями.
Если прикладное решение использует разделение данных, и расширение применяется к одной рабочей области, то в расширенную таблицу будут копироваться только те данные справочника, которые относятся к этой области. На рисунке расширенная таблица называется _REFERENCE1X, оранжевым цветом обозначена колонка, добавленная расширением.
В этой рабочей области обращение к данным справочника будет переадресовываться к расширенной таблице. А для остальных областей, для которых не применялось расширение, все обращения к данным будут адресоваться к старой, исходной таблице справочника _REFERENCE1.
Из такой реализации вытекает одно ограничение, которое, на наш взгляд, не должно существенно помешать вам использовать новые возможности.
Если расширение, модифицирующее структуру данных, вы хотите применять к отдельным областям, то все объекты прикладного решения, которые модифицируются расширением, должны разделяться только «независимо».
Если же вы хотите модифицировать и те объекты, которые разделяются «независимо и совместно», то в этом случае вам не удастся применить расширение только к одной области. Его надо будет применить ко всей базе, ко всем областям сразу. Для этого нужно указать, что разделение данных на расширения «не действует» (свойство общего реквизита Разделение расширений конфигурации = Не использовать).
Дальше рассмотрим несколько ситуаций, которые могут возникнуть после того, как вы применили к прикладному решению расширение, модифицирующее структуру данных.
Изменение расширяемой конфигурации
Итак, в базе данных появились расширенные таблицы. Но после этого конфигурация прикладного решения изменилась. Что будет происходить при реструктуризации базы данных?
Все расширенные таблицы также будут реструктуризироваться. Общая стратегия заключается в том, что все расширенные таблицы должны обновиться до нового состояния расширяемой конфигурации. При этом если в процессе их обновления возникнут ошибки, вызванные исключительно изменениями основной конфигурации, то информация об этом будет выдана так же, как и раньше.
Невозможность применения расширения
Другая ситуация — пользователи поработали, заполнили расширенные таблицы данными. После этого конфигурация прикладного решения изменилась, и при очередном запуске расширение не применилось. Что будет с данными в расширенных таблицах?
Самое главное – данные никуда не исчезнут, они останутся в таблицах. А вот способы работы с этими таблицами могут быть разными.
Самый простой случай, если расширение добавляло собственный справочник. Тогда мы оказываемся в ситуации, когда таблица есть, а метаданных, которые её описывают, нет. В этом случае данные просто будут недоступны. До тех пор, пока не будет решена проблема с применением расширения.
Более интересная ситуация получается тогда, когда расширение модифицировало существующий справочник. В этом случае мы имеем расширенную таблицу и метаданные (из конфигурации), которые описывают только часть этой таблицы. В такой ситуации данные, находящиеся в колонках, добавленных расширением, также будут недоступны. Но остальные данные можно будет прочитать.
Однако запись в этот справочник будет недоступна. До тех пор, пока не будет решена проблема с применением расширения. То есть до тех пор, когда у платформы не появится полный набор метаданных, описывающих эту таблицу.
Удаление расширения
Раньше вы могли спокойно удалять расширения из информационной базы. Это не имело никаких последствий для данных, так как расширения привносили только свою функциональность.
Теперь удаление расширений становится ответственной операцией. Потому что при удалении расширения из базы данных будут удалены и все данные, которые содержатся в структурах, добавленных расширением.
При этом если получается так, что конечная структура таблиц полностью описывается конфигурацией прикладного решения, будет выполнена и «обратная» реструктуризация. То есть данные из расширенных таблиц будут скопированы обратно в исходные таблицы объектов, а сами расширенные таблицы будут удалены.
Загрузка, применение и реструктуризация
Как вы понимаете, результатом использования новых возможностей расширения должна стать база данных с новыми таблицами. Процесс изменения структуры таблиц базы данных (реструктуризация) обычно, раньше, выполнялся только в конфигураторе. В тот момент, например, когда вы нажимали кнопку Обновить конфигурацию базы данных.
Теперь ситуация меняется. Расширения могут подключаться как в конфигураторе, так и в режиме работы 1С:Предприятие. Если при этом требуется изменить структуру таблиц, то в том же режиме будет выполняться и реструктуризация. И для её выполнения требуется монопольный режим.
Если вы работаете с неразделённой базой, то будет установлена монопольная блокировка всей базы. А если база использует режим разделения данных, то будет установлена монопольная блокировка той области, в которую загружается расширение.
При работе в конфигураторе реструктуризация, как и раньше, выполняется в момент обновления конфигурации базы данных. То есть сначала вы загружаете (или создаёте) расширение, сохраняете его в информационной базе. А затем выполняете обновление конфигурации базы данных. В этот момент происходит реструктуризация и создание новых и расширенных таблиц.
А при работе в режиме 1С:Предприятие процессы загрузки расширения и реструктуризации базы данных совмещены, не разделяются.
То есть в момент добавления расширения, или в момент его загрузки в существующее расширение, будут выполнены следующие действия:
- Загрузка расширения в информационную базу;
- Проверка возможности применения расширения;
- Анализ изменений;
- Если на предыдущем этапе выяснилось, что нужно изменять структуру данных, то будет установлен монопольный режим;
- Реструктуризация (если она необходима).
Если на 2 шаге окажется, что расширение применить невозможно, весь процесс будет возвращён к исходному состоянию, в том числе и загрузка расширения в информационную базу.
Реструктуризация в режиме 1С:Предприятие выглядит проще, чем в конфигураторе. Чтобы понять разницу, напомним, как это выглядело в конфигураторе раньше.
Сначала платформа анализировала изменение метаданных и готовила всё, что необходимо для последующего изменения структуры базы данных. Когда всё было готово, она отображала диалог будущих изменений, и ожидала от вас явной команды для того, чтобы всё это выполнить. Вы соглашались, и платформа начинала менять структуру базы данных. Если в этом месте происходил сбой, то оставшиеся изменения платформа выполняла при следующем запуске конфигуратора. Если реструктуризация не была завершена, а вы пытались запустить сеанс 1С:Предприятия, платформа не позволяла вам это сделать, и предлагала перейти в конфигуратор, чтобы завершить реструктуризацию.
Теперь, когда реструктуризация выполняется в режиме 1С:Предприятие, всё происходит так же, но проще. Отсутствует диалог явного принятия будущих изменений. Если в фазе подготовки никаких ошибок не возникло, платформа автоматически примет все изменения и изменит структуру базы данных. Если в фазе изменения структуры базы данных произойдёт сбой, то завершение изменений будет выполнено при следующем запуске сеанса 1С:Предприятия (или при следующем входе в область, если база в режиме разделения данных). То есть тут не требуется участие конфигуратора ни на какой стадии.
Ограничения и планы
Нужно сказать, что в описываемой версии мы сделали не всё, что хотелось сделать. Однако мы решили, что важнее выпустить то, что уже сделано, пусть даже с некоторыми ограничениями.
На текущий момент существенные, на наш взгляд, ограничения выглядят так:
- Регистраторы регистра сведений. Заимствованному регистру нельзя назначить ни собственный, ни заимствованный регистратор (документ);
- При этом собственному регистру можно назначить как заимствованный, так и собственный регистратор;
- При обмене в распределенной информационной базе в главном узле и в подчинённом узле должен быть одинаковый набор расширений, модифицирующих структуру данных. Автоматическая синхронизация таких расширений между узлами пока не реализована;
- В состав плана обмена (собственного или заимствованного) могут быть включены только собственные объекты расширения;
Эти ограничения мы планируем устранять, в ближайшее время мы будем работать в этом направлении.
Кроме этого мы планируем увеличить набор объектов конфигурации, которые можно дорабатывать с помощью расширений.
Также мы будем работать над тем, чтобы упростить создание расширений, упростить их адаптацию к изменениям прикладного решения (тот случай, когда расширение перестаёт подключаться).
Помимо этого мы готовы принимать ваши пожелания, анализировать их, и учитывать. В настоящий момент существует довольно широкий спектр задач и направлений для дальнейшего развития, поэтому своими пожеланиями вы можете повысить приоритет тех или иных задач в нашей будущей работе. Прежде всего, нам хотелось бы увидеть пожелания, основанные на реальной практике создания и использования расширений.
Теги:
расширения
8.3.11