gifts2017

Редактор и исполнитель программного кода в режиме Предприятие (1С 7.7)

Опубликовал Andrey Smirnov (dusha0020) в раздел Программирование - Практика программирования

Внешняя обработка которая позволяет написать и исполнить код языка 1С в режиме Предприятия. Есть возможность подключения текстовых библиотек кода, а также подстановки переменных базового и агрегатного типов из таблицы значений на форме в код редактора.

 

Иногда бывает лень ради трех-пяти строчек кода создавать обработку. Да и хранить такой программный мусор тяжело (у меня отдельная папка, но как показывает практика, когда таких штук  с полсотни, то быстрее написать новую обработку, чем отыскивать, то, что может подойти). А вообще еще позавчера я и не думал, что 7-ка такое умеет. Вот думал 8-ка молодец, она может, а на семерке, таже если строчку кода хочешь куда-то встроить или изменить программно  - фиг тебе!

Но не все так оказалось плохо как казалось. Столкнувшись с необходимостью динамически менять именно код а не переменные походил по Инфостарту (и не только) изрядно, но все редакторы и технологии редактирования кода  сделаны для восьмерки. Например http://infostart.ru/public/62374/ и еще какие-то. Но для семерки не нашел НИЧЕГО.

Опять же, не утверждаю, что ничего подобного нет, но встречается не часто. Короче показалось мне, что быстрее написать самому, чем найти. Ну а когда решил свою маленькую проблему, подумал, что неплохо было бы те принципы, которые использовал оформить чем-то полезным. Так и родилась эта публикация. 

Суть проста. В форме видим поле - в поле пишем код. Нажимаем "Исполнить" видим либо ругательства в окне сообщений, либо результат работы. Исполняем хоть одну команду хоть сто одну.

 Пдробности:

 1. Код исполняется либо непосредственно как одна процедура без названия (процедура в этом случае создается  по умолчанию) либо делим его на процедуры / функции как обычно. В последнем случае не забываем ставить соответствующую галочку на форме и помним, что первой запустится последняя по счету процедура.

 2. Если хотим большего подключаем текстовую библиотеку. Это обычный текстовый файл с кодом процедур / функций.

 Используем его так как будто мы все это уже написали сверху нашего поля с кодом.

 3.  Так как не 8-ка все таки, то я не смог уйти от связки двух файлов для работы данного редактора.
Как говорится один бьет, а другой - держит. Поэтому избрал более простой и логичной пару двух ert, а не ert с текстовым.

Файл TextCode.ert и есть собственно редактор. Открываем его как внешний отчет в режиме Предприятие пишем код и запускаем.

Файл RunCode.ert должен просто находиться рядом с TextCode.ert (в одной папке).
Так как все это рассчитано на программистов, думаю Вы легко, в случае необходимости, разберетесь как эту пару встроить в конфигурацию.
Сейчас путь к RunCode.ert берется именно в каталоге внешней обработки TextCode. Если она перестанет быть внешней,
то и путь к RunCode.ert нужно указать по другому.

Текстовый файл в комплекте поставки просто библиотека на которой я тестировал как загружаются и работают библиотеки.

Там две функции не подавляющие своей сложностью. 

 P.S. Для людей которым просто захочется поиграться в программистов БОЛЬШОЙ совет и предупреждение "Если Вы своим кодом, а точнее бездумным его написанием и исполнением, запортите свою базу я никакой ответственности за последствия ВАШИХ действий НЕ НЕСУ!!!" Исполняется только то что пишется, а написать теперь выходит может кто угодно...

 Версия 2. 

 На продолжение и развитие данной публикации меня подтолкнули советы и комментарии к предыдущей версии редактора, а также собственный опыт использования данной разработки. Особая благодарность пользователям Арчибальд 

http://forum.infostart.ru/user/46936/ и Warenic http://forum.infostart.ru/user/36483/.

 Вторая версия состоит всего из одного файла ert (победил таки неспособность семерки работать с двоичными файлами) и отличается от предыдущей наличием таблицы подстановок куда можно вводить как базовые типы данных, так и объекты метаданных (справочники, документы, перечисления и константы) и назначать для них переменные. Таблица подстановок редактируется как кнопками Добавить/Удалить так и непосредственно двойным кликом по ячейке.

 Таблица подстановок может содержать как базовые так и агрегатные типы данных. Правила включения их в модуль конечного исполнения таковы:
Если код разделен на процедуры и функции то переменные таблицы объявляются как глобальные (в самом начале модуля) и определяются (получают значения) в конце вне процедур и функций. Т.е. могут использоваться в любой из процедур.
Если в коде отсутствует такое деление, то определение переменных располагается после обявления процедуры по умолчанию, перед тем кодом, который будет написан в поле.

Особое замечание. Если при определении значения переменной а необходимо знать значение переменной b то в таблице определение b должно находиться раньше.
То есть если а = b+c, b=с-3, с=8 то в таблице значений мы сначала определяем с, затем b и в последнюю очередь a, так как построитель кода набивает их в порядке следования в таблице подстановк. Вроде бы очевидно, но я сам с этим однажды тупанул:)

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

 

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

Наименование Файл Версия Размер
ВесьКомплект 128
.rar 9,97Kb
25.11.11
128
.rar 9,97Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Andrey Smirnov (dusha0020) 19.11.11 14:25
Внешняя обработка которая позволяет написать и исполнить код языка 1С в режиме Предприятия. Есть возможность подключения текстовых библиотек кода, а также подстановки переменных базового и агрегатного типов из таблицы значений на форме в код редактора.

Перейти к публикации

1. Vladimir (Boroda) 19.11.11 14:25
Очень неплохо! Беру на вооружение. Спасибо! Чувствую, 7-ка ещё долго будет жить....
2. vkr (vkr) 19.11.11 21:20
Круть!!! Интерпретёр внутри интерпретёра... Вот так и вбиваются гвозди в крышку гроба монстров... :D
А если серьезно - то ОЧЕНЬ полезная штука для программера!!! ПЛЮС!!!
3. Ваня (zk96) 20.11.11 01:08
Не стал скачивать. Но думаю что Вы действительно сделали большую и сложную работу, поэтому плюс. Но мне кажеться, что если бы Вы использовали 1С++ и его объект ВыполняемыйМодуль, то добились того же результата с небольшими затратами времени и сил.
4. Александр Лыткин (TrinitronOTV) 20.11.11 09:24
присоединюсь к вышесказанному, тоже плюс поставлю
5. Serj (Serj1C) 20.11.11 21:13
Скачивать не стал, все-равно семерки уже нет установленной. Сам задумался как такое сделать, пришло в голову только сохранять исполняемый код в текстовый файл, а в обработке использовать конструкцию "загрузить текст модуля", и хитро ее вызывать. Поставлю плюс, но мой вывод:

Столетием ошибся ))
6. sergej anonymous (ksv74) 20.11.11 21:35
Плюсану. Все просто,идея лежит на поверхности, но сам не додумался.
7. Andrey Smirnov (dusha0020) 20.11.11 21:40
(5) Serj1C, Да. Принцип именно такой:), А насчет столетия... В восьмерке нет достаточной практики - только книжка и задания по ней. А мои публикации это побочные продукты ежедневного и упорного писания под 7-ку. Ну так мне и платят за нее...
8. Димон * (DDos76) 21.11.11 07:38
Идея хорошая. Сам собирался много раз но лень победить не смог. А еще никак не мог придумать, каким же образом "Покрасить" текст модуля в окне редактирования. А именно окраски очень не хватает. Что сделать - привычка. Но все равно спасибо и мой +!
9. Александр Рытов (Арчибальд) 21.11.11 08:17
Мне лень посмотреть. Это примерно как в http://infostart.ru/public/59433/ ?
Прикрепленные файлы:
10. Иван Иванов (Famza) 21.11.11 09:00
Плюс, конечно, но надо бы добавить реквизит какой на форму неопределенного типа, а то как подставить че-нить из данных?
11. Andrey Smirnov (dusha0020) 21.11.11 10:52
(9) Арчибальд, Да это примерно так. И не тешил себя мыслью, что идея моя на 100% оригинальна, но вот отыскать Вашу разработку не смог...
12. Валерий (warenic) 21.11.11 11:48
В качестве идеи для развития проекта: неплохо бы иметь возможность вводить какие-либо данные. Их можно использовать как критерии отбора при групповой обработке или значения для реквизитов. Как, например, в редакторе таблиц, списков значений или универсальных редакторах моей разработки (там использована компонента Rainbow addon 2000, переродившаяся в 1С++).
13. Александр Рытов (Арчибальд) 21.11.11 14:23
(12) См. пост 9. Там как раз подстановка есть... А вычисление формул в контексте (Документа) - вот здесь http://infostart.ru/public/58541/
14. Сергей (Che) Коцюра (CheBurator) 21.11.11 16:43
Сделай возможность "тестового исполнения кода" - оберни код в транзакцию.. по окончанию кода - отментьТранзакцию()
15. Сергей (Che) Коцюра (CheBurator) 21.11.11 16:43
Сделай возможность "тестового исполнения кода" - оберни код в транзакцию.. по окончанию кода - отментьТранзакцию()
16. Валерий (warenic) 21.11.11 16:54
(13) Арчибальд,
Ты меня не понял.
Допустим, нам нужно из справочника "Номенклатура" обработать все элементы, у которых есть определенное свойство. Ссылку на элемент свойства как в тексте указать?
Спр=СоздатьОбъект("Справочник.ВидыСвойств");
Спр.НайтиПоКоду(123);
ВидСвойства=Спр.ТекущийЭлемент();
Спр=СоздатьОбъект("Справочник.ЗначенияСвойств");
Спр.НайтиПоНаименованию("трам-пам-пам");
ЗначениеСвойство=Спр.ТекущийЭлемент();
Спр=СоздатьОбъект("Справочник.СвойстваНоменклатуры");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
	Если 9Спр.ВидСвойство=ВидСвойства) и (Спр.ЗначениеСвойства=ЗначениеСвойства) тогда
		НужноеСвойство=Спр.ТекущийЭлемент();
		Прервать;
	КонецЕсли;
КонецЦикла;
...Показать Скрыть

Можно еще вот так, если заранее узнать внутренний код.
НужноеСвойство=ЗначениеИзСтрокиВнутр("{""B"",""0"",""0"",""562"",""0"",""0"",""         5   ""}");

Но лучше иметь на форме реквизит (или лучше список значений), в котором это значение просто выбрать. А потом передать в открываемую форму через параметр. Тогда в тексте на него ссылаться просто
НужноеСвойство=Форма.Параметр.Получить("НужноеСвойство");
17. Andrey Smirnov (dusha0020) 21.11.11 17:08
Спасибо всем за замечания и предложения. Попробую все учесть, а также обойтись всего одним ert-шником. Это было написано за 3 часа и ночью, после бурной трудовой недели, я сам удивился, что так быстро заработало:) Сегодня посижу после работы - чего нибудь допишу.
18. Александр Рытов (Арчибальд) 21.11.11 17:16
19. Александр Рытов (Арчибальд) 21.11.11 17:18
(17) Одним - не так-то просто. Если только формекс применить...
20. ГСГ (ГСГ) 22.11.11 09:50
Скачаю и посмотрю, идея очень понравилась, такое действительно бывает нужно и полезно.
21. ГСГ (ГСГ) 22.11.11 09:55
Скачал, совсем даже недурно. Действительно семерка еще долго будет на службе у пользователей, еще много интересного увидим.
22. Валерий (warenic) 22.11.11 11:09
(19)
Одним - не так-то просто. Если только формекс применить...

Как вариант: можно модуль основной обработки вынести в текст. К кнопке "Выполнить" цепляем процедуру, текст которой собственно и будем писать в диалоге. Сохраняем текст модуля (с написанной процедурой), а потом открываем обработку, чтобы модуль заново скомпилировался. Теперь с новой процедурой на кнопке.
Минус - если модуль не скомпилится из-за ошибки, то форма обработки не откроется, совсем...
(17) dusha0020. не загоняйся, 2 ert-шки и набор текстовиков - самое то :)
Арчибальд; +1 Ответить
23. Ольга Зверькова (Lyuba-Lyuba) 23.11.11 10:22
24. Нурислам Ямбаев (nurislam) 23.11.11 13:29
25. Максим Елкин (Maximus1982) 23.11.11 18:04
26. Альтаир (Altair777) 24.11.11 12:19
(0) Позабавили названия скриншотов "Scrin1.jpg" и т.д.
Автор, Вам должно быть стыдно :)
27. Александр Рытов (Арчибальд) 25.11.11 10:35
Вариант с всего одной ert-шкой (исполнитель кода генерируется скриптом) - вообще шедеврален. Жаль что дополнительный плюс не предусмотрен.
28. Andrey Smirnov (dusha0020) 25.11.11 21:12
(27) Арчибальд, Такие рецензии нужно в рамочку и на стену вместе с дипломами и серификатами вешать. Но рамка - золотая и на пол метра выше:)!
29. Victor Nespyatin (victuan) 30.11.11 08:01
А всё-таки почему автором пост (3) оставлен без внимания?
30. Александр Рытов (Арчибальд) 30.11.11 08:23
(29) Могу я ответить. 1С++ годится в "домашних" условиях, когда он уже загружен. Данную же обработку можно носить в кармане - скажем, с целью потестить совершенно чужую базу.
31. Victor Nespyatin (victuan) 30.11.11 08:26
(30)А 1срр.dll в карман уже не лезет? ;)
32. Andrey Smirnov (dusha0020) 30.11.11 09:05
(29) victuan, Идея была навеяна именно штатными возможностями 8-ки и аналогичными консолями под нее. И с самого начала, я решил использовать только базовые возможности семерки. В итоге их не хватило (пришлось прибегнуть к vbs и стандартному объекту WSH), но это штатный функционал любой (с 2000 кажется) винды. В итоге мы имеем 1 ert, а не ert+ 1cpp.dll. Не скажу что мой подход лучший с точки зрения затрат времении программиста, но думаю, что те кто скачал и разобрал код, смогут найти интересные идеи и чуть-чуть расширить представление о возможностях семерки.
33. Александр Рытов (Арчибальд) 30.11.11 09:11
(31) Регить свою dll-ку на чужом компе неприлично.
34. Victor Nespyatin (victuan) 30.11.11 12:34
(32)Т.е. ert + WSH это лучше, чем ert + 1cpp.dll? Может быть, может быть...
(33)1c++ регить в реестре нет необходимости, она подключается из встроенного языка 1С (ЗагрузитьВнешнююКомпоненту) без всяких дополнительных действий в системе.
36. Dima Dima (dumal) 30.11.11 17:14
Спасибо. Честно говоря, читая, как называется данная разработка, был уверен, что увижу что-то вроде совета создавать текстовый файл, подключать его с помощью #ЗагрузитьИзФайла и потом менять его в процессе работы. Возьму на вооружение
37. Александр Рытов (Арчибальд) 30.11.11 17:34
(36) В 9 посте я задал вопрос, так ли это - так и было. А потом автор ушел вперед...
38. Dima Dima (dumal) 30.11.11 18:15
Арчибальд пишет:

(36) В 9 посте я задал вопрос, так ли это - так и было. А потом автор ушел вперед...


Что ж, честь ему и хвала. А нам - отличный инструмент для работы
Арчибальд; +1 Ответить
39. LeXxX Астопов (lcd-boost) 04.12.11 05:29
Крутая вещь. Добавил пару функций :) и она мне очень помогает экономить время на кодинге :))))
40. Гость 13.12.11 15:43
41. Виктор Клименко (dicwork) 30.12.11 00:08
Интересная вещь. Только почему прискачивании скачивается файл с расширением HTM, который является файлом RAR. Могу конечно переименовать, но все же нехорошо это.
42. Алексей (alexqc) 17.02.12 13:58
Обработку посмотреть не могу (счас занимаюсь 8кой), по контексту обсуждения понял, что вы наверно создаете временный файл-ERTшник через что-то типа ADODB.Stream с #ЗагрузитьИзФайла и файл который это самое #Загрузить и загружает. Скажите, я угадал?

А к самой обработке по опыту написания-использования аналогичного могу предложить такую "сервисную" фичу:

В текстовом поле неограниченной длины код писать все же не совсем удобно (таб не нажмешь, форматирования-раскраски никакой...), удобно скопировать в текстовый документ (который через файл-новый-текст открывается), ему в свойсвах текста указать что это "текст модуля" (как вариант, установить "открывать текст как модуль" в сервис-параметры), там отредактировать как удобно, и скопировать обратно.
А вот для автоматизации этого процесса сделать такой хитрый ход: создать объект Текст, открыть его, а после редактирования прочитать его содержимое обратно - это все можно сделать программно, по нажатию соотв кнопок на форме. А используя недокументированную функцию формы Форма.ОбработкаОжидания - даже оперативно получать данные оттуда.

Вот примерный код (не проверял, может сразу не заработать)
Перем ТекстМод;
Процедура ВТекст()
	ТекстМод=СоздатьОбъект("текст");
	ТекстМод.ДобавитьСтроку(ПолеФормы);
	ТекстМод.Показать();
	Форма.ОбработкаОжидания("обработкаТекста",1);
КонецПроцедуры

//-------------------------------
Процедура обработкаТекста()
    Если ТипЗначения(ТекстМод)=100 Тогда
        Если ТекстМод.КоличествоСтрок()>0 Тогда
        	Стр="";
			Для ш=1 по ТекстМод.КоличествоСтрок() Цикл
				Стр=Стр+ТекстМод.ПолучитьСтроку(ш)+РазделительСтрок;
			КонецЦикла;
			Если ПолеФормы<>Стр Тогда
				ПолеФормы=Стр;
				Форма.обновить();
			КонецЕсли;
			Возврат;
		ИначеЕсли ПолеФормы="" Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	Форма.ОбработкаОжидания("обработкаТекста",0);
КонецПроцедуры

...Показать Скрыть

где ПолеФормы - поле для редактирования, ВТекст() - проц. на кнопке. Процедура создает и открывает текстовый док с ред. содержимым, и запускает обработку ожидания ОбработкаТекста. В ОбработкеТекста по мере изменения содержимое текст. дока копируется обратно в поле редактирования, а также проверяется факт существования объекта и то что он открыт (если текст док закрыть, у него очистится содержимое) - при закрытии текст.дока обработка отключается.
43. Andrey Smirnov (dusha0020) 17.02.12 14:15
(42) alexqc, Да. Вы догадались правильно. Хекс содержимое временного ert-шника записано в код основной обработки и восстанавливается скриптом, таким образом нужен всего один файл с обработкой.
А Ваша фитча очень интересная. Обязательно попробую прикрутить к данной обработке, тем более, что писать в бесконечном текстовом поле действительно неудобно, да и не эффектно:) Спасибо большое.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа