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



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

 

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

Но не все так оказалось плохо как казалось. Столкнувшись с необходимостью динамически менять именно код а не переменные походил по Инфостарту (и не только) изрядно, но все редакторы и технологии редактирования кода  сделаны для восьмерки. Например //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, так как построитель кода набивает их в порядке следования в таблице подстановк. Вроде бы очевидно, но я сам с этим однажды тупанул:)

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

 

43 Comments

  1. dusha0020

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

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

    Reply
  2. Boroda

    Очень неплохо! Беру на вооружение. Спасибо! Чувствую, 7-ка ещё долго будет жить….

    Reply
  3. vkr

    Круть!!! Интерпретёр внутри интерпретёра… Вот так и вбиваются гвозди в крышку гроба монстров… 😀

    А если серьезно — то ОЧЕНЬ полезная штука для программера!!! ПЛЮС!!!

    Reply
  4. zk96

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

    Reply
  5. TrinitronOTV

    присоединюсь к вышесказанному, тоже плюс поставлю

    Reply
  6. Serj1C

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

    Столетием ошибся ))

    Reply
  7. ksv74

    Плюсану. Все просто,идея лежит на поверхности, но сам не додумался.

    Reply
  8. dusha0020

    (5) Serj1C, Да. Принцип именно такой:), А насчет столетия… В восьмерке нет достаточной практики — только книжка и задания по ней. А мои публикации это побочные продукты ежедневного и упорного писания под 7-ку. Ну так мне и платят за нее…

    Reply
  9. DDos76

    Идея хорошая. Сам собирался много раз но лень победить не смог. А еще никак не мог придумать, каким же образом «Покрасить» текст модуля в окне редактирования. А именно окраски очень не хватает. Что сделать — привычка. Но все равно спасибо и мой +!

    Reply
  10. Арчибальд

    Мне лень посмотреть. Это примерно как в http://infostart.ru/public/59433/ ?

    Reply
  11. Famza

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

    Reply
  12. dusha0020

    (9) Арчибальд, Да это примерно так. И не тешил себя мыслью, что идея моя на 100% оригинальна, но вот отыскать Вашу разработку не смог…

    Reply
  13. warenic

    В качестве идеи для развития проекта: неплохо бы иметь возможность вводить какие-либо данные. Их можно использовать как критерии отбора при групповой обработке или значения для реквизитов. Как, например, в редакторе таблиц, списков значений или универсальных редакторах моей разработки (там использована компонента Rainbow addon 2000, переродившаяся в 1С++).

    Reply
  14. Арчибальд

    (12) См. пост 9. Там как раз подстановка есть… А вычисление формул в контексте (Документа) — вот здесь http://infostart.ru/public/58541/

    Reply
  15. CheBurator

    Сделай возможность «тестового исполнения кода» — оберни код в транзакцию.. по окончанию кода — отментьТранзакцию()

    Reply
  16. CheBurator

    Сделай возможность «тестового исполнения кода» — оберни код в транзакцию.. по окончанию кода — отментьТранзакцию()

    Reply
  17. warenic

    (13) Арчибальд,

    Ты меня не понял.

    Допустим, нам нужно из справочника «Номенклатура» обработать все элементы, у которых есть определенное свойство. Ссылку на элемент свойства как в тексте указать?

    Спр=СоздатьОбъект(«Справочник.ВидыСвойств»);
    Спр.НайтиПоКоду(123);
    ВидСвойства=Спр.ТекущийЭлемент();
    Спр=СоздатьОбъект(«Справочник.ЗначенияСвойств»);
    Спр.НайтиПоНаименованию(«трам-пам-пам»);
    ЗначениеСвойство=Спр.ТекущийЭлемент();
    Спр=СоздатьОбъект(«Справочник.СвойстваНоменклатуры»);
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 цикл
    Если 9Спр.ВидСвойство=ВидСвойства) и (Спр.ЗначениеСвойства=ЗначениеСвойства) тогда
    НужноеСвойство=Спр.ТекущийЭлемент();
    Прервать;
    КонецЕсли;
    КонецЦикла;
    

    Показать

    Можно еще вот так, если заранее узнать внутренний код.

    НужноеСвойство=ЗначениеИзСтрокиВнутр(«{«»B»»,»»0″»,»»0″»,»»562″»,»»0″»,»»0″»,»»         5   «»}»);

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

    НужноеСвойство=Форма.Параметр.Получить(«НужноеСвойство»);
    Reply
  18. dusha0020

    Спасибо всем за замечания и предложения. Попробую все учесть, а также обойтись всего одним ert-шником. Это было написано за 3 часа и ночью, после бурной трудовой недели, я сам удивился, что так быстро заработало:) Сегодня посижу после работы — чего нибудь допишу.

    Reply
  19. Арчибальд

    (16) Да понял я. :)))

    Reply
  20. Арчибальд

    (17) Одним — не так-то просто. Если только формекс применить…

    Reply
  21. ГСГ

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

    Reply
  22. ГСГ

    Скачал, совсем даже недурно. Действительно семерка еще долго будет на службе у пользователей, еще много интересного увидим.

    Reply
  23. warenic

    (19)

    Одним — не так-то просто. Если только формекс применить…

    Как вариант: можно модуль основной обработки вынести в текст. К кнопке «Выполнить» цепляем процедуру, текст которой собственно и будем писать в диалоге. Сохраняем текст модуля (с написанной процедурой), а потом открываем обработку, чтобы модуль заново скомпилировался. Теперь с новой процедурой на кнопке.

    Минус — если модуль не скомпилится из-за ошибки, то форма обработки не откроется, совсем…

    (17) dusha0020. не загоняйся, 2 ert-шки и набор текстовиков — самое то 🙂

    Reply
  24. Lyuba-Lyuba

    Сьавлю плюс. Полезно!

    Reply
  25. nurislam

    Нормально! Молодец!

    Reply
  26. Maximus1982

    Вещь нужная

    Reply
  27. Altair777

    (0) Позабавили названия скриншотов «Scrin1.jpg» и т.д.

    Автор, Вам должно быть стыдно 🙂

    Reply
  28. Арчибальд

    Вариант с всего одной ert-шкой (исполнитель кода генерируется скриптом) — вообще шедеврален. Жаль что дополнительный плюс не предусмотрен.

    Reply
  29. dusha0020

    (27) Арчибальд, Такие рецензии нужно в рамочку и на стену вместе с дипломами и серификатами вешать. Но рамка — золотая и на пол метра выше:)!

    Reply
  30. victuan

    А всё-таки почему автором пост (3) оставлен без внимания?

    Reply
  31. Арчибальд

    (29) Могу я ответить. 1С++ годится в «домашних» условиях, когда он уже загружен. Данную же обработку можно носить в кармане — скажем, с целью потестить совершенно чужую базу.

    Reply
  32. victuan

    (30)А 1срр.dll в карман уже не лезет? 😉

    Reply
  33. dusha0020

    (29) victuan, Идея была навеяна именно штатными возможностями 8-ки и аналогичными консолями под нее. И с самого начала, я решил использовать только базовые возможности семерки. В итоге их не хватило (пришлось прибегнуть к vbs и стандартному объекту WSH), но это штатный функционал любой (с 2000 кажется) винды. В итоге мы имеем 1 ert, а не ert+ 1cpp.dll. Не скажу что мой подход лучший с точки зрения затрат времении программиста, но думаю, что те кто скачал и разобрал код, смогут найти интересные идеи и чуть-чуть расширить представление о возможностях семерки.

    Reply
  34. Арчибальд

    (31) Регить свою dll-ку на чужом компе неприлично.

    Reply
  35. victuan

    (32)Т.е. ert + WSH это лучше, чем ert + 1cpp.dll? Может быть, может быть…

    (33)1c++ регить в реестре нет необходимости, она подключается из встроенного языка 1С (ЗагрузитьВнешнююКомпоненту) без всяких дополнительных действий в системе.

    Reply
  36. dumal

    Спасибо. Честно говоря, читая, как называется данная разработка, был уверен, что увижу что-то вроде совета создавать текстовый файл, подключать его с помощью #ЗагрузитьИзФайла и потом менять его в процессе работы. Возьму на вооружение

    Reply
  37. Арчибальд

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

    Reply
  38. dumal
    Арчибальд пишет:

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

    Что ж, честь ему и хвала. А нам — отличный инструмент для работы

    Reply
  39. lcd-boost

    Крутая вещь. Добавил пару функций 🙂 и она мне очень помогает экономить время на кодинге :))))

    Reply
  40. Гость

    Нужная вещь, спасибо.

    Reply
  41. dicwork

    Интересная вещь. Только почему прискачивании скачивается файл с расширением HTM, который является файлом RAR. Могу конечно переименовать, но все же нехорошо это.

    Reply
  42. alexqc

    Обработку посмотреть не могу (счас занимаюсь 8кой), по контексту обсуждения понял, что вы наверно создаете временный файл-ERTшник через что-то типа ADODB.Stream с #ЗагрузитьИзФайла и файл который это самое #Загрузить и загружает. Скажите, я угадал?

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

    В текстовом поле неограниченной длины код писать все же не совсем удобно (таб не нажмешь, форматирования-раскраски никакой…), удобно скопировать в текстовый документ (который через файл-новый-текст открывается), ему в свойсвах текста указать что это «текст модуля» (как вариант, установить «открывать текст как модуль» в сервис-параметры), там отредактировать как удобно, и скопировать обратно.

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

    Вот примерный код (не проверял, может сразу не заработать)

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

    Показать

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

    Reply
  43. dusha0020

    (42) alexqc, Да. Вы догадались правильно. Хекс содержимое временного ert-шника записано в код основной обработки и восстанавливается скриптом, таким образом нужен всего один файл с обработкой.

    А Ваша фитча очень интересная. Обязательно попробую прикрутить к данной обработке, тем более, что писать в бесконечном текстовом поле действительно неудобно, да и не эффектно:) Спасибо большое.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *