gifts2017

Генератор кода

Опубликовал Олег Молочников (milkers) в раздел Программирование - Практика программирования

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

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

Молочников Олег Spb. 2011.

Генератор кода.

 

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

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

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

 

НовыйОбъект = Справочники.ВнешниеОбработки.СоздатьОбъект();
СтарыйОбъект = НовыйОбъект; // заглушка, поменяйте.
НовыйОбъект.ХранилищеВнешнейОбработки=неопределено; //Хранилище значения
НовыйОбъект.ВидОбработки=Перечисления.ВидыДополнительныхВнешнихОбработок.ПустаяСсылка(); //Виды дополнительных внешних обработок
НовыйОбъект.Комментарий=""; //Строка
НовыйОбъект.КомментарийКФайлуИсточнику=""; //Строка
//ЗаполнитьЗначенияСвойств(НовыйОбъект,СтарыйОбъект," ХранилищеВнешнейОбработки, ВидОбработки, Комментарий, КомментарийКФайлуИсточнику");

Для каждого СтараяСтрока из СтарыйОбъект.Принадлежность цикл
НоваяСтрока = НовыйОбъект.Принадлежность.Добавить();
НоваяСтрока.ПредставлениеОбъекта=""; //Строка
НоваяСтрока.СсылкаОбъекта=неопределено; //Все документы
НоваяСтрока.ТабличнаяЧастьИмя=""; //Строка
НоваяСтрока.ТабличнаяЧастьПредставление=""; //Строка
НоваяСтрока.НастройкиПостроителяДляОтбора=неопределено; //Хранилище значения
НоваяСтрока.ХранилищеВнешнейОбработки=неопределено; //Хранилище значения
НоваяСтрока.ЗаменяемаяПечатнаяФорма=неопределено; //Внешние обработки, Строка
НоваяСтрока.ИмяФайлаПечатнойФормы=""; //Строка
НоваяСтрока.ПредставлениеОтбораПостроителя=""; //Строка
НоваяСтрока.ПредставлениеКнопки=""; //Строка
НоваяСтрока.ДополнительныеПараметрыОбработки=неопределено; //Хранилище значения
НоваяСтрока.МетаданныеОбъекта=""; //Строка
НоваяСтрока.СпособЗапуска=Перечисления.СпособыЗапускаВнешнихОбработокВОтчетахНаБазеУниверсального.ПустаяСсылка(); //Способы запуска внешних обработок в отчетах на базе универсального
НоваяСтрока.ПредставлениеНастроекОбработки=""; //Строка
//ЗаполнитьЗначенияСвойств(НоваяСтрока,СтараяСтрока," ПредставлениеОбъекта, СсылкаОбъекта, ТабличнаяЧастьИмя, ТабличнаяЧастьПредставление, НастройкиПостроителяДляОтбора, ХранилищеВнешнейОбработки, ЗаменяемаяПечатнаяФорма, ИмяФайлаПечатнойФормы, ПредставлениеОтбораПостроителя, ПредставлениеКнопки, ДополнительныеПараметрыОбработки, МетаданныеОбъекта, СпособЗапуска, ПредставлениеНастроекОбработки");
КонецЦикла;
//НовыйОбъект.Принадлежность.Свернуть(" ПредставлениеОбъекта, СсылкаОбъекта, ТабличнаяЧастьИмя, ТабличнаяЧастьПредставление, НастройкиПостроителяДляОтбора, ХранилищеВнешнейОбработки, ЗаменяемаяПечатнаяФорма, ИмяФайлаПечатнойФормы, ПредставлениеОтбораПостроителя, ПредставлениеКнопки, ДополнительныеПараметрыОбработки, МетаданныеОбъекта, СпособЗапуска, ПредставлениеНастроекОбработки","");

А для документа  болванка будет выглядеть так:

 

НовыйДокумент = Документы.Доверенность.СоздатьДокумент();
СтарыйДокумент = НовыйДокумент; // заглушка, поменяйте.
НовыйДокумент.Дата='00010101000000'; //Дата документа
НовыйДокумент.Номер=""; //Номер документа
НовыйДокумент.Организация=Справочники.Организации.ПустаяСсылка(); //Организация
НовыйДокумент.ФизЛицо=Справочники.ФизическиеЛица.ПустаяСсылка(); //Физические лица
НовыйДокумент.БанковскийСчетОрганизации=Справочники.БанковскиеСчета.ПустаяСсылка(); //Банковский счет
НовыйДокумент.Контрагент=Справочники.Контрагенты.ПустаяСсылка(); //Контрагент
НовыйДокумент.ДоговорКонтрагента=Справочники.ДоговорыКонтрагентов.ПустаяСсылка(); //Договор контрагента
НовыйДокумент.Сделка=неопределено; //Счет на оплату поставщика, Заказ поставщику, Заказ покупателя, Счет на оплату покупателю
НовыйДокумент.ДатаДействия='00010101000000'; //Дата
НовыйДокумент.НаПолучениеОт=""; //Строка
НовыйДокумент.ПоДокументу=""; //Строка
НовыйДокумент.Подразделение=Справочники.Подразделения.ПустаяСсылка(); //Подразделение
НовыйДокумент.Комментарий=""; //Строка
НовыйДокумент.Ответственный=Справочники.Пользователи.ПустаяСсылка(); //Пользователь
//ЗаполнитьЗначенияСвойств(НовыйДокумент,СтарыйДокумент," Организация, ФизЛицо, БанковскийСчетОрганизации, Контрагент, ДоговорКонтрагента, Сделка, ДатаДействия, НаПолучениеОт, ПоДокументу, Подразделение, Комментарий, Ответственный");

Для каждого СтараяСтрока из СтарыйДокумент.Товары цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.НаименованиеТовара=""; //Строка
НоваяСтрока.ЕдиницаПоКлассификатору=Справочники.КлассификаторЕдиницИзмерения.ПустаяСсылка(); //Классификатор единиц измерения
НоваяСтрока.Количество=0; //Число
//ЗаполнитьЗначенияСвойств(НоваяСтрока,СтараяСтрока," НаименованиеТовара, ЕдиницаПоКлассификатору, Количество");
КонецЦикла;
//НовыйДокумент.Товары.Свернуть(" НаименованиеТовара, ЕдиницаПоКлассификатору, Количество","");

 

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

 

Обновление от 21.06.2012

Теперь вместо 'неопределено' реквизитам присваивается пустое значение типа.  Что позволяет сэкономить еще некотрое количества времени при написании кода.

Для документов добавились "Дата" и "Номер".

PS: Надеюсь вам понравится эта и другие мои разработки на http://infostart.ru/profile/48714/.

Очень жду ваших комментариев  и пожеланий.

Молочников Олег Spb. 2011.

 

Скачать файлы

Наименование Файл Версия Размер
ГенераторКода82 356
.epf 16,62Kb
21.06.12
356
.epf 16,62Kb Скачать
ГенераторКода81 40
.epf 15,09Kb
21.06.12
40
.epf 15,09Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. NovSL NovSL (NovSL) 30.09.11 13:43
До OpenConf 7-го далеко, но все же приятно использовать
ВадимЛитовченко; mdzen; +2 Ответить
2. Ийон Тихий (cool.vlad4) 30.09.11 13:44
это можно в консоль кода или в запросник добавить...
3. Олег Молочников (milkers) 30.09.11 13:52
(3) У меня есть некоторые планы по развитию этой темы. Сложно развивать чужие проекты
ВадимЛитовченко; +1 Ответить 1
4. Dragon Ago (DragonAgo) 30.09.11 16:08
Интересная обработка
ВадимЛитовченко; +1 Ответить
5. Сергей Рудаков (fishca) 30.09.11 16:11
(0)Лень-двигатель прогресса! Спасибо!
6. Александр Медведев (anig99) 30.09.11 20:59
текстовое поле на форме можно сделать типом Программный код (или как-то так), тогда текст будет раскрашиваться
ВадимЛитовченко; echo77; +2 Ответить
7. shisha136 01.10.11 12:56
А что делать начинающим программистам? Совсем отупеют! Либо не быть им хорошими программистами =)
ВадимЛитовченко; +1 Ответить
8. Андрей Крутских (K_A_O) 01.10.11 13:05
Более интересный набор конструкторов есть в обработке "Консоль выполнения произвольных текстов модуля"
http://infostart.ru/public/61601/
ВадимЛитовченко; tomvlad; Yasen; Арчибальд; +4 Ответить
9. г. Казань Рустем Гумеров (Rustig) 01.10.11 14:22
(0) классная вещь! хороший инструмент! отличная идея!
спасибо! :)
пригодится не только при обменах!
ВадимЛитовченко; +1 Ответить
10. Артур Аюханов (artbear) 01.10.11 14:41
Подобный код уже сейчас можно вставлять прямо в Конфигураторе с помощью проекта Снегопат www.snegopat.ru
Всем рекомендую
ЗЫ дело за малым - написать скрипт для Снегопата, вставляющий подобный код прямо в открытое окно.
ИМХО не должно быть сложно, т.к. фактически очень много из кода 1С доступно для выполнения в скриптах.
ВадимЛитовченко; sound; JohnyDeath; +3 Ответить 1
11. Ийон Тихий (cool.vlad4) 01.10.11 14:59
(10) Артур может стоит подробнее описать(статью) snegopat? Уже не первый раз слышу, в принципе и на сайте был, и запускал...
12. Ийон Тихий (cool.vlad4) 01.10.11 15:01
Вообще неплохо бы как-то аккумулировать мысли по поводу кодинга, где-нибудь на форуме/блоге...
ВадимЛитовченко; +1 Ответить 1
13. Артур Аюханов (artbear) 01.10.11 15:13
(11) Пока что Снегопат на стадии тестирования, в открытую продажу еще не вышел.
Поэтому пока не создаю подобную публикацию.
В будущем у меня публикация запланирована, если автор, Саша Орефков, сам не выложит на сайт.
ИМХО он наверняка это сделает после выхода релиза, тем более, что это несложно - скопировать HTML со своего сайта на ИС.
ЗЫ Кучу фич уже юзаем :)

(12) У меня есть такая публикация :) Правда, давненько не обновлял :(
14. Ярослав Радкевич (WKBAPKA) 01.10.11 15:15
ну не знаю, где это может пригодиться...
для типовых не подходит...
для конфигураций с нуля, я сторонник унификации, лучше один раз потратить время, написать общие процедуры по заполнению параметров новых документов!
для обмена через СОМ, может быть, но код в этом случае достаточно специфичен, требует написания дополнительных функций... так что в чем полезность данной идеи не понимаю!
ВадимЛитовченко; +1 Ответить
15. Vlad Dyukov (vl88) 01.10.11 16:59
шикарный конструктор!
ВадимЛитовченко; +1 Ответить
16. Владимир Клименко (KliMich) 01.10.11 20:59
Хорошая предпосылка для создания OpenConf для 8-ки!
ВадимЛитовченко; +1 Ответить
17. г. Казань Рустем Гумеров (Rustig) 02.10.11 16:27
(0) корректура кода для улучшений :)

Процедура ТипДанныхПриИзменении(Элемент)
	
	ВидДанных = Неопределено;	
	
	СписокОбъектовМетаданных = Новый СписокЗначений;
	
	Для Каждого МетаданныеДокумент Из Метаданные[ТипДанных] Цикл
		СписокОбъектовМетаданных.Добавить(МетаданныеДокумент.Имя, МетаданныеДокумент.Синоним);
	КонецЦикла;
	
	ЭлементыФормы.ВидДанных.СписокВыбора = СписокОбъектовМетаданных;
	
КонецПроцедуры
...Показать Скрыть


Далее, ставим галочку в Палитре свойств у Элемента формы "ВидДанных" на закладке Использование для параметра "РежимВыбораИзСписка". Это для быстрого поиска объекта: после набора первых символов названия объекта и нажатия Enter в поле ввода "Вид данных".
18. г. Казань Рустем Гумеров (Rustig) 02.10.11 17:04
(0) Начал использовать сей инструмент, задался вопросом: а тип "Виды поступлений товаров" - это справочник или перечисление? И тогда родилось ... предложение по расширению функциоанала:

я вместо кода
 + Реквизит.Тип 


записал так
 + ОпределитьТипЗначения(Тип) 


а функцию определил так
Функция ОпределитьТипЗначения(Тип) Экспорт
	
	СоставТипов = "";
	
	МассивТипов = Тип.Типы();
	Если МассивТипов.Количество() = 1 Тогда
		
		Если Справочники.ТипВсеСсылки().СодержитТип(МассивТипов[0]) Тогда
			СоставТипов = "Справочник ";
		ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(МассивТипов[0]) Тогда
			СоставТипов = "Документ ";
		ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(МассивТипов[0]) Тогда
			СоставТипов = "Перечисление ";
		КонецЕсли;	
		
		Возврат СоставТипов + Тип;
		
	Иначе //составной тип данных
		
		Для Каждого Эл Из МассивТипов Цикл
			
			Если Справочники.ТипВсеСсылки().СодержитТип(Эл) Тогда
				СоставТипов = СоставТипов + " Справочник " + Эл + ",";
			ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Эл) Тогда
				СоставТипов = СоставТипов + " Документ " + Эл + ",";
			ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Эл) Тогда
				СоставТипов = СоставТипов + " Перечисление " + Эл + ",";
			Иначе
				СоставТипов = СоставТипов + " " + Эл + ",";
			КонецЕсли;	 
			
		КонецЦикла;
		
		Возврат СоставТипов;
		
	КонецЕсли;
	
КонецФункции
...Показать Скрыть


Далее, если использовать КвалификаторыСтроки и КвалификаторыЧисла, можно вытащить длину строки или формат числа для примитивных типов.
19. г. Казань Рустем Гумеров (Rustig) 02.10.11 17:09
(0) вообще мне такой инструмент не хватал при написании алгоритмов проведения документов по регистрам... теперь я думаю вопрос только во времени, когда я это реализую (или кто-нибудь другой :))
и еще, что-то подобное я использовал, когда алгоритмы 7.7 переводил в алгоритмы 8.1 и наоборот. написал для этих целей конвертор строк кода. думаю эту тему можно будет развить в текущем функционале. опять-таки вопрос времени
20. Олег Шалимов (CaSH_2004) 02.10.11 19:12
Из предложений:
- возможноость выбирать таб части
- обрабатывать не только док. и спр. но и все регистры с их особенностями
ИМХО конечно, но если рассуждать логически правильнее было бы добавить свой функционал в разработку http://infostart.ru/public/61601, она действительно будет пофункциональнее, а плодить кучу разработок как-то неправльно. Ведь каждая получается в чем-то уникальная, хотя и одной тематики. Вот и приходится всем один и тот же вилосипед изобретать, разного цвета, вместо того чтобы взять его и перекрасить :)
21. г. Казань Рустем Гумеров (Rustig) 02.10.11 22:34
(0) для болванки создания документов надо добавить обязательный к заполнению реквизит "Дата" документа.
:)
22. г. Казань Рустем Гумеров (Rustig) 02.10.11 23:06
(20) кто-нибудь может выложить ссылки на все обработки, которые он использует в своей практике? :) тогда махом закроются все вопросы по поводу изобретения велосипеда. ведь цель текущей публикации - это обмен опытом в части рабочих инструментов программиста-разработчика. :)
я попробую:
http://infostart.ru/public/19821/ - структура таблиц в базе
http://infostart.ru/public/22147/ - декомпиляция и анализ форм с генерацией кода формы
http://infostart.ru/public/89310/ - шаблоны с возможностью поиска и отбора по ключевым словам
http://infostart.ru/public/15782/ - конструктор параметров командной строки

:) так что, друзья-разработчики, пишите еще

П.С. Посмотрел - сравнил - и ответственно заявляю :) , что текущая разработка отличается от того, что предлагает обработка http://infostart.ru/public/61601/
23. Олег Шалимов (CaSH_2004) 03.10.11 00:30
(22) Да было бы неплохо выложить все, да вот только к сожалению бесполезно это, т.к. рейтинг обновляется и статья через 1-2 месяца не будет висеть. Тут нужен инструмент на сайте чтобы видны были такие обработки. Хотя можно пользоваться фильтрами.

Да http://infostart.ru/public/61601/ отличается, но не так значительно как перечисленные тобой обработки, там те же конструкторы и то же формирование кода, поэтому логичнее включить данную разработку в ее функционал, например как продолжение проекта

В копилку обработок для программистов 8-ков я бы добавил:
http://infostart.ru/public/15317/ - Power Explorer, один из первых комбайнов, я до сих пор в основном им пользуюсь
http://infostart.ru/public/15324 - Интерфейсная панель
http://infostart.ru/public/69707/ - Универсальный журнал документов, до сих пор развивается!
http://infostart.ru/public/16332/ - WindowsПроводник 1.3, просто отличный пример что может 1С без компонент, не пользуюсь, но любуюсь :) можно брать как пример и не городить заново аналоги
24. Яков Коган (Yashazz) 03.10.11 11:17
Бесполезная вещь, как все слишком универсальные конструкторы. Трудозатраты на доработку напильником "по месту" приблизительно равны тем, какие были бы в случае создания "с нуля". Элементарный копипаст - наше всё.
25. Олег Молочников (milkers) 03.10.11 12:19
Какой функционал Вы хотели бы добавить в следующих версиях? Я вижу несколько направлений:
1) Генерация кода для различных операций с таблицами. (Создание, поиск, удаление и т.д.)
2) Генерация вызовов отчетов расшифровок с заданными отборами, группировками и другими настройками.
И добро пожаловать в соответствующую ветку форума: Какой функционал Вы хотели бы добавить в следующих версиях?
26. Taras Варварич (itar59) 03.10.11 13:13
milkers пишет:

Какой функционал Вы хотели бы добавить в следующих версиях? Я вижу несколько направлений:

1) Генерация кода для различных операций с таблицами. (Создание, поиск, удаление и т.д.)

2) Генерация вызовов отчетов расшифровок с заданными отборами, группировками и другими настройками.

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



Совершенно согласен!!!
27. Женя * (smok1986) 03.10.11 14:06
Спасибо огромное за грамотную, нужную и полезную вещь!!!
28. andrybar (andrybar) 03.10.11 15:58
Полезная штучка. сэкономит немало времени. А время, как говорится, деньги, тем более для кодеров.
29. Виталий (vint2008) 03.10.11 17:37
Полезная штука пригодилась неоднократно :)
30. ivan afanas'ev (g1s3s6) 04.10.11 08:35
31. Андрей Янакаев (YAN) 04.10.11 11:16
32. Alex Tim (Qseft) 05.10.11 15:57
Собрать бы все конструкторы (Ваш, конструктор ТаблицыЗначений и т.д.) в единый инструмент, было бы удобно.
33. Олег Молочников (milkers) 05.10.11 16:00
(0)(32) Я планирую добавить конструктор ТЗ в собственной редакции в ближайшее время.
34. Олег Молочников (milkers) 08.10.11 21:28
(0) 2011-10-08 Было немножко свободного времени - сделал генерацию кода цветной.
35. Автоматизация Производства (dimanich70) 13.10.11 19:26
Коль уж создается новый документ, добавить в конце "Записать и т.д." через Попытка и т.д.
36. Noy A (Noy12) 19.10.11 13:32
37. Ю М (mtv:)) 21.10.11 20:42
(0) Наконец-то генерация кода стала цветной. Теперь можно скачать и попробовать.
Спасибо.
Хотя, может стоит дождаться "Конструктор ТЗ в собственной редакции"? :)
38. napan Noname (napan) 24.10.11 19:57
Хорошая и очень полезная вещь. Спасибо автору.Мне точно пригодиться!!!
39. Илья Одноэсник (testy05) 26.10.11 15:41
40. Michael Smith (opiumdx) 31.10.11 07:27
41. Юрий Смирнов (itsimpossible) 13.11.11 18:39
Интересная весч, попробуем
42. Александр Орефков (orefkov) 08.12.11 11:34
Портирование под Снегопат начато, вот первая проба
cool.vlad4; +1 Ответить
43. Эстер Коган (e.kogan) 07.02.12 11:03
(25) Возможность вместо Неопределено для всех монотипных реквизитов подставлять пустое значение типа. Ссылочные - ПустойСсылкой(), простые - соответственно типу.
44. Олег Шалимов (CaSH_2004) 07.03.12 15:25
Несмотря на Снегопат решил развить идею, и не только я:
http://infostart.ru/public/119748/ - жто моедополнение, но и оно написано на чужое дополнение к данной обработке:
http://infostart.ru/public/92872/
45. Осипов Сергей (fixin) 29.03.12 22:39
Изучать всё долго. Вброшу - а кто-нибудь догадался написать код, где выбираешь нужные существующие элементы справочника или докумнта, а он генерит код по их созданию????
47. Владимир Чаклин (vec435) 27.06.12 12:02
(32) Qseft, было бы удобно создать некий шаблон, в котором подключаешь обработку тз от одного автора, генератор кода от другого. Не понравился от этого, подключил от другого. Но для этого нужно согласовать шаблон подключения, я думаю
48. Maxim Goncharov (maxx) 01.08.12 12:49
Приятная штука.

Хорошо еще бы добавить шаблоны:

1.) Для документов событие "Обработка проведения" заполнение регистров сопоставляя имена, типа как делает сейчас конструктор, для событие ОбработкаЗаполнения - как бы если один документ заполнялся другим (даже если ввода на основании в конфигураторе не указан документ)

2.) Для регистров прописывание набор записей во все регистры независимо программно

3.) Шаблон для справочников для прописывания значения в регистры сведений независимые, если Справочник участвует в Измерение как Ведущее
49. Олег Молочников (milkers) 01.08.12 13:03
(48) Хорошие мысли. Надо добавить. Только со временем совсем напряг.
50. Roman R (romann) 11.09.12 17:07
Полезная вещь. А то всё время приходится ручками.. или, в лучшем случае, копипастить откуда-нибудь.
Спасибо!
51. Евгений Рачковский (eugen91) 06.12.12 15:41
Спасибо! Хороша обработка. Воспользовался вашим механизмом!
52. Kostya Zhurov (It-developer) 05.09.13 14:56
53. Алекс Ю (AlexO) 17.10.13 01:29
(45) fixin,
а кто-нибудь догадался написать код, где выбираешь нужные существующие элементы справочника или докумнта, а он генерит код по их созданию????

Так а развитие идеи от CaSH_2004 от ( 45) не это делает?
(47) vec435,
было бы удобно создать некий шаблон, в котором подключаешь обработку тз от одного автора, генератор кода от другого.
Чьи обработки вы хотели бы так подключать?
(50) romann,
А то всё время приходится ручками.. или, в лучшем случае, копипастить откуда-нибудь.
Вы только новые объекты в конфе все время создаете? :)
55. Юрий Лу (yura1960) 15.06.14 11:01
Что-то подобное уже есть, но с более расширенным функционалом, где указывается объект, а потом проставляешь галочки, что тебе нужно и ... И там же можно связывать объекты.
Кажется я это здесь видел. К сожалению ссылки нет (((