Редактор и исполнитель программного кода в режиме Предприятие (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 не будет опубликован. Обязательные поля помечены *