Начиная с версии 8.3.6.1977 в платформе 1С появился новый механизм адаптации прикладных решений - механизм расширений, подробности тут: https://wonderland.v8.1c.ru/blog/rasshireniya/. По сегодняшний день механизм успешно развивается и открывает новые возможности для адаптации типовых решений.
В процессе применения расширений, именно в части доработок типовых и отраслевых решений, я определил для себя некоторые правила:
- Новые объекты метаданных (далее МД) и новые реквизиты типовых объектов МД рекомендую добавлять в основную конфигурацию, не нужно спешить и добавлять сразу все в расширение, ниже описание причин.
- Новые объекты и новые реквизиты это прежде всего хранение данных, расширение в этом плане имеет ряд недостатков, его можно удалить и даже в пользовательском режиме, появляется риск потери данных, а это ценно прежде всего для заказчика и ответственность понесет разработчик.
- Бывают случаи когда сам вендор ставит ограничения на новые объекты МД в расширении. Например в конфигурации "Альфа-Авто" пока есть возможность добавления в расширения новых объектов следующих типов: отчеты, обработки, подсистемы. Если попытаться выйти за эти рамки то программа будет выдавать ошибку при следующем обновлении о том что идентификатор не найден в справочнике "идентификаторов объектов расширений", потому что просто не сможет его там создать.
- Как можно меньше заимствовать типовых объектов, реквизитов в расширение, только в самых необходимых случаях, если что-то лишнее добавилось в процессе заимствования формы рекомендую удалять их из расширения. Все это необходимо для более быстрого обновления основной конфигурации, например до обновления реквизит объекта имел прямую ссылку на тот или иной тип, а после обновления его типизировали через определяемый тип и таких реквизитов может быть много, придется править расширение, чем больше привязка расширения к основной конфигурации тем, скорее всего, сложнее и дольше придется обновлять основную конфигурацию.
- Модифицируем формы в большинстве случаев кодом.
Пример доработок в конфигурации "1С:Альфа-Авто: Автосалон+Автосервис+Автозапчасти КОРП. Редакция 6". Данная методика применялась на платформе версии 8.3.16.1148, версия конфигурации 6.0.16.03.
Добавления в основной конфигурации. Для нового объекта МД пишем имя Префикс_ИмяОбъекта (например справочник Доработка_МойНовыйСправочник) синоним пишем привычное название.
По аналогии если добавляем новый реквизит в типовой объект или табличную часть Префикс_ИмяРеквизита (например Доработка_МойНовыйРеквизит) синоним пишем привычное название.
Если добавляем новую табличную часть, то достаточно назвать по правилу Префикс_ИмяТабличнойЧасти , а подчиненные реквизиты можно оставить без префикса.
Включаем наши новые объекты в свою, новую подсистему так же названную по правилу Префикс_ИмяПодсистемы, подсистема будет служебной для отбора новых объектов, соответственно в командный интерфейс конфигурации не включаем. Префикс необходим для того чтобы разработчик не тратил время на лишний анализ по новым объектам и реквизитам.
Примеры модификации форм элементов и групп справочников, пока то что зафиксировал, проходит через процедуру ниже. В конфигурации "Альфа-Авто" есть общий модуль "УправлениеСвойствами" его нужно заимствовать в ваше расширение и внести нужные изменения после процедуры "ПриСозданииНаСервере", пример кода:
Саму процедуру "СоздатьЭлементФормы" я разместил в новом модуле расширения.
Примеры модификации форм списка регистров сведений и справочников, форм записи регистров сведений, пока то что зафиксировал, проходит через процедуру ниже. Общий модуль "УправлениеДиалогомСервер" его нужно заимствовать в ваше расширение и внести нужные изменения после процедуры "ДобавитьРеквизитыФормы", пример кода:
Для того чтобы прописать необходимые события на созданные элементы на форме нужно будет заимствовать форму в расширении, лишние элементы удалить из расширения и в самой форме прописать событие, в моей процедуре "СоздатьЭлементФормы" имя события собирается здесь:
На форме это будет выглядеть примерно так:
Пример программной доработки форм в конфигурации 1C:ERP Управление предприятием 2 (2.4.11.93) платформа 8.3.16.1148.
Заимствуем в расширение общий модуль "МодификацияКонфигурацииПереопределяемый", там перехватываем процедуру "ПриСозданииНаСервере" и после описываем наши доработки. Пример кода:
Сами процедуры по добавлению элементов на форму можно так же вывести в "ВашОбщийМодульВРасширении", с галками сервер, вызов сервера.
Пример кода ниже:
Функция ДобавитьЭлементВКоллекциюЭлементовФормы(ЭлементыФормы, Параметры, Родитель = Неопределено) Экспорт
Перем ИмяЭлемента, ТипЭлемента;
Если НЕ ТипЗнч(Параметры) = Тип("Структура") Тогда
ВызватьИсключение "Параметры элемента формы не заданы!";
КонецЕсли;
Если НЕ Параметры.Свойство("Имя", ИмяЭлемента) Тогда
ВызватьИсключение "Имя элемента формы не задано!";
КонецЕсли;
Если НЕ Параметры.Свойство("ТипЭлемента", ТипЭлемента) Тогда
ВызватьИсключение "Тип элемента формы не задан!";
КонецЕсли;
Если НЕ Родитель = Неопределено Тогда
Если ТипЗнч(Родитель) <> Тип("ГруппаФормы")
И ТипЗнч(Родитель) <> Тип("ТаблицаФормы")
И ТипЗнч(Родитель) <> Тип("УправляемаяФорма") Тогда
ВызватьИсключение "Родитель должен иметь один из перечисленных типов: ГруппаФормы; ТаблицаФормы; УправляемаяФорма.";
КонецЕсли;
КонецЕсли;
ЭлементФормы = ЭлементыФормы.Добавить(ИмяЭлемента, ТипЭлемента, Родитель);
ЗаполнитьЗначенияСвойств(ЭлементФормы, Параметры);
Возврат ЭлементФормы;
КонецФункции
Функция СформироватьПараметрыЭлементов(ТипЭлементов) Экспорт
СтруктураЭлементов=Новый Структура;
СтруктураЭлементов.Вставить("Имя",);
СтруктураЭлементов.Вставить("Видимость", Истина);
Если ТипЭлементов="КолонкиТЗ" Тогда
СтруктураЭлементов.Вставить("ПутьКДанным", );
СтруктураЭлементов.Вставить("ПутьКДаннымПодвала", );
СтруктураЭлементов.Вставить("Подсказка",);
СтруктураЭлементов.Вставить("ПодсказкаВвода",);
СтруктураЭлементов.Вставить("Заголовок",);
СтруктураЭлементов.Вставить("Вид",ВидПоляФормы.ПолеВвода);
СтруктураЭлементов.Вставить("ТипЭлемента", Тип("ПолеФормы"));
СтруктураЭлементов.Вставить("ЦветТекста",Новый Цвет(22,39,121));
СтруктураЭлементов.Вставить("КнопкаОчистки",Истина);
СтруктураЭлементов.Вставить("КнопкаОткрытия",Истина);
СтруктураЭлементов.Вставить("КнопкаВыбора",Истина);
СтруктураЭлементов.Вставить("КнопкаВыпадающегоСписка",Истина);
СтруктураЭлементов.Вставить("КнопкаСоздания",Ложь);
СтруктураЭлементов.Вставить("БыстрыйВыбор",Ложь);
СтруктураЭлементов.Вставить("ИсторияВыбораПриВводе",ИсторияВыбораПриВводе.Авто);
СтруктураЭлементов.Вставить("ОтображениеКнопкиВыбора",ОтображениеКнопкиВыбора.ОтображатьВПолеВвода);
СтруктураЭлементов.Вставить("АвтоМаксимальнаяВысота",Истина);
СтруктураЭлементов.Вставить("ОтображатьВШапке",Истина);
СтруктураЭлементов.Вставить("ОтображатьВПодвале",Ложь);
СтруктураЭлементов.Вставить("РежимРедактирования",РежимРедактированияКолонки.Непосредственно);
СтруктураЭлементов.Вставить("АктивизироватьПоУмолчанию",Истина);
СтруктураЭлементов.Вставить("ТолькоПросмотр", Ложь);
ИначеЕсли ТипЭлементов="Кнопка" Тогда
СтруктураЭлементов.Вставить("ТипЭлемента", Тип("КнопкаФормы"));
СтруктураЭлементов.Вставить("Вид",ВидКнопкиФормы.ОбычнаяКнопка);
СтруктураЭлементов.Вставить("АвтоМаксимальнаяВысота", Истина);
СтруктураЭлементов.Вставить("АвтоМаксимальнаяШирина", Истина);
СтруктураЭлементов.Вставить("АктивизироватьПоУмолчанию", Ложь);
СтруктураЭлементов.Вставить("Высота", 0);
СтруктураЭлементов.Вставить("ВысотаЗаголовка", 0);
СтруктураЭлементов.Вставить("Доступность", Истина);
СтруктураЭлементов.Вставить("Заголовок",);
СтруктураЭлементов.Вставить("ИмяКоманды", );
//СтруктураЭлементов.Вставить("Картинка",);
СтруктураЭлементов.Вставить("КнопкаПоУмолчанию", Ложь);
СтруктураЭлементов.Вставить("МаксимальнаяВысота", 0);
СтруктураЭлементов.Вставить("МаксимальнаяШирина", 0);
//СтруктураЭлементов.Вставить("Отображение",ОтображениеКнопки.Картинка);
СтруктураЭлементов.Вставить("Отображение",ОтображениеКнопки.Авто);
СтруктураЭлементов.Вставить("ОтображениеПодсказки", ОтображениеПодсказки.Всплывающая);
СтруктураЭлементов.Вставить("Пометка", Ложь);
СтруктураЭлементов.Вставить("РастягиватьПоВертикали", Ложь);
СтруктураЭлементов.Вставить("РастягиватьПоГоризонтали", Ложь);
СтруктураЭлементов.Вставить("Ширина", 0);
ИначеЕсли ТипЭлементов="ПолеФормы" Тогда
СтруктураЭлементов.Вставить("ПутьКДанным", );
СтруктураЭлементов.Вставить("ТипЭлемента", Тип("ПолеФормы"));
СтруктураЭлементов.Вставить("Заголовок",);
СтруктураЭлементов.Вставить("ПоложениеЗаголовка",ПоложениеЗаголовкаЭлементаФормы.Лево);
СтруктураЭлементов.Вставить("Видимость",Истина);
СтруктураЭлементов.Вставить("ТолькоПросмотр",Истина);
СтруктураЭлементов.Вставить("РастягиватьПоВертикали", Ложь);
СтруктураЭлементов.Вставить("ПропускатьПриВводе", Истина);
СтруктураЭлементов.Вставить("Вид", ВидПоляФормы.ПолеВвода);
// СтруктураЭлементов.Вставить("ЦветТекстаЗаголовка", Новый Цвет(22,39,121));
ИначеЕсли ТипЭлементов="ГоризонтальнаяГруппа" Тогда
СтруктураЭлементов.Вставить("Вид",ВидГруппыФормы.ОбычнаяГруппа);
СтруктураЭлементов.Вставить("Имя",);
СтруктураЭлементов.Вставить("Заголовок",);
СтруктураЭлементов.Вставить("ТипЭлемента", Тип("ГруппаФормы"));
СтруктураЭлементов.Вставить("Группировка", ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная);
СтруктураЭлементов.Вставить("ОтображатьЗаголовок",Ложь);
СтруктураЭлементов.Вставить("Отображение",ОтображениеОбычнойГруппы.Нет);
//СтруктураЭлементов.Вставить("Высота", 4);
ИначеЕсли ТипЭлементов="ВертикальнаяГруппа" Тогда
СтруктураЭлементов.Вставить("Вид",ВидГруппыФормы.ОбычнаяГруппа);
СтруктураЭлементов.Вставить("Имя",);
СтруктураЭлементов.Вставить("Заголовок",);
СтруктураЭлементов.Вставить("ТипЭлемента", Тип("ГруппаФормы"));
СтруктураЭлементов.Вставить("Группировка", ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);
СтруктураЭлементов.Вставить("ОтображатьЗаголовок",Ложь);
СтруктураЭлементов.Вставить("Отображение",ОтображениеОбычнойГруппы.Нет);
//СтруктураЭлементов.Вставить("Высота", 4);
КонецЕсли;
Возврат СтруктураЭлементов;
КонецФункции
Выводы: расширение это удобный механизм если его использовать правильно, с помощью расширений вы можете ускорить обновление в части изменения форм, однако новые объекты метаданных, реквизиты и табличные части лучше пока хранить в основной конфигурации.