Доработки объектов метаданных и форм (только кодом) с помощью расширений на примере типовых конфигураций: 1C:ERP Управление предприятием 2.4 и 1С:Альфа-Авто: Автосалон+Автосервис+Автозапчасти КОРП 6

10.09.20

Разработка - Механизмы платформы 1С

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

   Начиная с версии 8.3.6.1977 в платформе 1С появился новый механизм адаптации прикладных решений - механизм расширений, подробности тут: https://wonderland.v8.1c.ru/blog/rasshireniya/. По сегодняшний день механизм успешно развивается и открывает новые возможности для адаптации типовых решений. 

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

  1. Новые объекты метаданных (далее МД) и новые реквизиты типовых объектов МД рекомендую добавлять в основную конфигурацию, не нужно спешить и добавлять сразу все в расширение, ниже описание причин.
    • Новые объекты и новые реквизиты это прежде всего хранение данных, расширение в этом плане имеет ряд недостатков, его можно удалить и даже в пользовательском режиме, появляется риск потери данных, а это ценно прежде всего для заказчика и ответственность понесет разработчик.
    • Бывают случаи когда сам вендор ставит ограничения на новые объекты МД в расширении. Например в конфигурации "Альфа-Авто" пока есть возможность добавления в расширения новых объектов следующих типов: отчеты, обработки, подсистемы. Если попытаться выйти за эти рамки то программа будет выдавать ошибку при следующем обновлении о том что идентификатор не найден в справочнике "идентификаторов объектов расширений", потому что просто не сможет его там создать.
  2. Как можно меньше заимствовать типовых объектов, реквизитов в расширение, только в самых необходимых случаях, если что-то лишнее добавилось в процессе заимствования формы рекомендую удалять их из расширения. Все это необходимо для более быстрого обновления основной конфигурации, например до обновления реквизит объекта имел прямую ссылку на тот или иной тип, а после обновления его типизировали через определяемый тип и таких реквизитов может быть много, придется править расширение, чем больше привязка расширения к основной конфигурации тем, скорее всего, сложнее и дольше придется обновлять основную конфигурацию.
  3. Модифицируем формы в большинстве случаев кодом. 

   Пример доработок в конфигурации "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);
	
	КонецЕсли;	
	
	Возврат СтруктураЭлементов;
	
КонецФункции

 

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

 

 

расширения Альфа-Авто 6 ERP 2.4 доработки.

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4525    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5294    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6409    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

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

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8821    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. omut 02.02.20 20:02 Сейчас в теме
Какое отношение содержание статьи имеет к заголовку? В Альфе куча специфических моментов, на которые следует обращать внимание при доработке. Но автор рассказывает о тривиальных способах доработки с помощью расширений, не имеющих отношения к конкретной конфигурации!
Red1; promagent; leonidol; YurySigolaev; +4 Ответить
2. improg 568 02.02.20 20:07 Сейчас в теме
(1)Здравствуйте, специфика в том что добавление элементов на формы в "Альфа-Авто" идет через модули "УправлениеСвойствами" и "УправлениеДиалогомСервер", по остальному просто описал общий механизм доработок через расширения.
3. improg 568 02.02.20 20:12 Сейчас в теме
(1)+ перехватываем там типовую форму и дорабатываем программно.
8. improg 568 21.04.20 11:35 Сейчас в теме
(1) Изначально статья писалась с целью показать данный прием в Альфа-Авто и все таки соглашусь тут больше описание о доработках с помощью расширений, поправил заголовок + добавил описание как такое же можно проделать в ERP 2.4. Спасибо за комментарий.
4. Pixar0000 06.02.20 00:21 Сейчас в теме
не понятно к чему статья... а это "полёт" мысли
Данная методика применялась на платформе версии 8.3.16.1063, версия конфигурации 6.0.16.03. Позже вышла информация от поставщика о рекомендуемой версии платформы 8.3.14.1779, прошу обратить на это внимание.
5. improg 568 06.02.20 08:15 Сейчас в теме
(4) А что непонятного? Вроде все расписано как внести доработки в Альфу с помощью расширения с наименьшими затратами.
6. improg 568 06.02.20 08:19 Сейчас в теме
(4) имеется в виду оформление типовых форм если в объектах уже есть доработки по структуре. Показал модули, процедуры через которые это делается, привел примеры, оформил максимально просто без заморочек.
7. пользователь 16.04.20 11:00
Сообщение было скрыто модератором.
...
Оставьте свое сообщение