Имя: Пароль:
IT
1C 7.7
v7: Принципы «правильного» структурирования кода
,
0 Emery
 
13.04.16
13:28
При большом объеме программного кода возникает проблема эффективного управления им. Особенно это заметно, когда прошло достаточно много времени и прежде, чем что-либо изменить в собственном коде, не говоря уже о чужом, приходится тратить много времени на повторное освоение давно написанного и уже подзабытого. Также затруднительно вносить какие-либо существенные изменения. Часто проще, переписать весь проект заново, чем серьезно изменять существующий код. Не зря говорится в среде программистов: «Работает – не трожь!»

Конечно, в разных системах программирования есть разные возможности по структурированию кода. Самые важные из них это модульность и следование «правильным» принципам оформления исходного текста. Естественно, что процедурное программирование будет отличаться, от объектно-ориентированного или там клиент-серверного. Тем не менее, уверен, что вполне можно говорить об общих принципах.

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

Далее, код должен быть максимально линеаризованным. Вот возьмем для простоты 1С77. Программируем конфигурацию с нуля самостоятельно. Выносим максимум кода во внешние обработки. Во внешнюю обработку с общим кодом передаем контекст вызывающей ее формы (внешней либо внутренней) и также возвращаем из нее другой, нужный нам, контекст.

В начальной процедуре пишем нечто вроде:

Процедура ПриОткрытии()
    Если ИницСправочников() = 0 Тогда
        Перейти ~Финиш;
    КонецЕсли;                          

    Если ИницПарамФормы() = 0 Тогда
        Перейти ~Финиш;
    КонецЕсли;

    // . . .

~Финиш:
    СтатусВозврата(0); // Данная команда не даст открыться форме обработки
    Возврат;  
КонецПроцедуры

Во второй функции пишем нечто вроде:

Функция ИницПарамФормы()
    Если ПроверкаИсходнДанных() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    Если ПолучитьКонтВызывФормы() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    Если ОбработатьИсточнДанных() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    // . . .

    Возврат 1;
КонецФункции // ИницПарамФормы()

И т.д. и т.п. Только в конечных функциях код может быть нелинеен, но должен быть достаточно простым для восприятия и хорошо задокументирован.

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

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

Мое мнение, НУЖНО ПРОГРАММИРОВАТЬ КОД КАК ГИПЕРТЕКСТ. Одних сверток тел функций явно недостаточно. К сожалению, я не знаю систем программирования, предоставляющих подобный функционал. В принципе можно оформлять подобный гипертекст в MS Word либо аналогичных текстовых процессорах. Однако сказать, что это будет удобно, совершенно невозможно.

Какие ваши идеи?
86 4St
 
13.04.16
15:08
GOTO бывает незаменим внутри "Выполнить", поскольку там нельзя вызывать "Возврат". В остальных случаях - на усмотрение разработчика.

Вложенность циклов или условий более 2-3 - плохой признак. Значит, скоро там кто-то запутается.

Глобальные переменные - зло, особенно для УФ. Во многих случаях они легко заменяются на одноименные функции, которые уже можно кэшировать в каком-нибудь Соответствии. Потерь скорости практически нет.

Свертка кода - приятная фича, но можно спокойно жить и без нее. Точка входа, F12, F12, ....
87 Broadbread
 
13.04.16
15:08
(77) Нет ни одной задачи автоматизации, которую нельзя решить при помощи асма.
88 Карупян
 
13.04.16
15:09
(81) А посложнее
СхемаКомпоновкиДанныхДляВыводаВТабличныйДокументИмениБорисаНуралиева (с)
89 quest
 
13.04.16
15:10
(85)+ и второе - код не надо писать. Его надо генерировать. Но данная нам объективной реальности 1С - не умеет этого делать. Ибо те кто планируют разработку платформы и введение новых возможностей - *удаки.
90 Локи-13
 
13.04.16
15:10
(87) есть:
создай каталог телефонных номеров за 10 минут, с поиском и сортировкой по имени, фамилии, отчеству и городу
91 quest
 
13.04.16
15:11
(87) используя bones можно решать легко на scheme
92 mingw
 
13.04.16
15:11
(88) скдЖе

(86) Вот про Выполнить() не подумал. Наверно потому что не пользуюсь. Проще так не издеваться и свой "выполнитель скриптов" наваять спец. Даже несколько разных с нужным функционалом.
93 Broadbread
 
13.04.16
15:11
(90) Где там код?
94 Тролль главный
 
13.04.16
15:12
вот это по сути про ООП  http://v8.1c.ru/o7/201603module/index.htm
единственное сделано через ж...
95 quest
 
13.04.16
15:12
(86) а еще в eval()  можно обратно в цикл зайти, и много прикольных плюшек поиметь. Ну нахер такой изврат.
96 mingw
 
13.04.16
15:14
(94) Уже сейчас в типовых никакой поллитры не хватит чтобы разобраться. После использования этого в типовых они станут черными ящиками.
И будет проще свои ящики объекты (справочники и документы) ваять чем править существующие.
97 orefkov
 
13.04.16
15:14
(31)
А, понял. То есть вы просто не знаете хоткей "F12" и "Ctrl + Shift + -" в Конфигураторе? Бывает.
98 mingw
 
13.04.16
15:15
(97) а еще там отладчик есть и СП "от Дениса"
99 Timon1405
 
13.04.16
15:16
(97) Обратный переход вроде просто ctrl+"-"
100 Локи-13
 
13.04.16
15:16
(93) вот и я том же
(94) не надо свои педали прикручивать к нашей лодке
это не для ооп, это для других задач
101 orefkov
 
13.04.16
15:17
(99)
Возможно. Навскидку не помню, я его всегда на Alt-Left переназначаю, привычка.
102 Локи-13
 
13.04.16
15:18
(97) (99) не то и не другое, забыл не могу вспомнить (
вы оба написали сворачивание группировки
103 Карупян
 
13.04.16
15:18
(94) Это скорее не ООП, АОП (аспектно-ориентированное)
104 Timon1405
 
13.04.16
15:20
(102) Нет, мы все правильно пишем. Сворачивание - это контрол-шифт-NUM-, а тут ctrl+"ОбычныйМинусНеНумпадовский"
105 Локи-13
 
13.04.16
15:20
(104) блин, точно, есть же другой минус
106 Локи-13
 
13.04.16
15:21
контрол-шифт-NUM- это свернуть все
контрол-NUM- свернуть текущую группировку
107 Broadbread
 
13.04.16
15:28
(100) >вот и я том же
Одинэса там тоже нет.
108 Локи-13
 
13.04.16
15:32
(107) на 1С это делается за 10 минут без сточки кода

Все разжевывать нужно чтоли? Нет задач в 1С где нужен ООП.
Для любых возникающих задач хватает того что есть, но даже для самых извращенных можно подключить внешнюю компоненту.
109 Broadbread
 
13.04.16
15:32
(91) Используя питон можно легко и непринуждённо генерить код фокспро.
110 Broadbread
 
13.04.16
15:33
(108) На экселе создаётся новый документ.
111 Broadbread
 
13.04.16
15:34
(108) В опу 1С - речь шла о задачах автоматизации вообще.
112 Локи-13
 
13.04.16
15:37
(110) на экселе тоже можно решать задачи. но только небольшого определенного круга.
(111) с фига ли? читай (57)
113 Broadbread
 
13.04.16
15:38
(112) Читай своё же (77)
114 quest
 
13.04.16
15:39
(109) но фокпрос не умеет копилироватся на асм. а схема через кости - может
115 Локи-13
 
13.04.16
15:42
(113) Не тупи, вопрос был про задачу автоматизации на 1С, т.к. (77) ответ на (57) который об 1С

и с такой логикой тебе давать ООП? нет уж, извольте.
116 Broadbread
 
13.04.16
15:43
(115) Не выкручивайся.
117 Broadbread
 
13.04.16
15:45
(114) И это хорошо.
118 Лефмихалыч
 
13.04.16
15:45
(59) ты ИНОГДА плохой и негодный программист, но очень редко
119 Broadbread
 
13.04.16
16:34
В одной C#-кальке с 1С было приятно кодить. Прямо крылья расправлялись.
120 mingw
 
13.04.16
17:13
(119) и где эти решения то? речь про NG Framework?
121 Emery
 
13.04.16
18:22
(97)  > А, понял. То есть вы просто не знаете хоткей "F12" и "Ctrl + Shift + -" в Конфигураторе? Бывает.

Переход на определения функций и сворачивание / их тел это не полноценный гипертекст. Смотрите, лучше всего дела обстоят в VC++. Допустим там мы определили два класса в файлах SomeClass.h и SomeClass.cpp. Пусть в классе под сотню функций, не считая определений констант и переменных. Естественно, ничто нам не мешает нам на имени некоторой функции нажать F12 или Ctrl+F12 (перейти к определению или к объявлению) либо просто показать определения, никуда не переходя (Alt+F12). Можно даже там найти все ссылки (Shift+F12), показать иерархию вызовов (Crrl+KT) и много чего еще. Все это просто великолепно. Но хочется большего. Например, я хочу каждую функцию видеть на отдельной странице / закладке нашей IDE. Не суть важно, чтобы это было сто файлов для одного класса, которые еще замучаешься компоновать всякими #include и т.п. Но, отображения разных функций я хочу в видеть в разных окнах, чтобы не отвлекаться на «лишний» код. Вот, что я имею в виду под гипертекстом – отображение / визуализацию кода на разных страницах IDE, но не обязательно в разных файлах. С файлами я и так могу делать, что хочу.
122 Gary417
 
13.04.16
18:31
гипертекст... "..Конгресс, немцы какие-то... голова пухнет! ..." (c)


оч сомневаюсь что у вас получится какуюто новую концепцию придумать. Все эти хотелки с функциями в новых окнах реализуются силами IDE, такое и в эклипсе и в нетбинсе, и прочих вижуалстудиях при желании можно сделать. Но вот разрекламить чтобы этим стали пользоватся? Вопрос... я вот сколько раз не перечитал тему...ну никак не могу въехать в чём удобность такого подхода... по отдельности всё понимаю, а в целом нет.
123 mingw
 
13.04.16
18:38
(122) в спагетти-коде с кучей goto проблема понять в многоэкранных портянках это все еще та же функция или уже другая

вот ТС и хочет чтобы каждая функция на отдельной закладке, и случайно спагетину с другой функции не засосать
124 Fragster
 
гуру
13.04.16
18:40
125 Broadbread
 
13.04.16
19:08
(120) Ага. Вроде оно.
126 Emery
 
13.04.16
19:24
(122) До сих пор программный код ЯВУ представлен в виде обычного текста. Я хочу, чтобы это был гипертекст. И так, наверное, будет, рано или поздно. А навигацию по коду удобно делать мышкой, как, например, в справочной системе Qt. А на верхней панели чтобы были стрелочки вперед / назад по дереву навигации. Нужно еще, чтобы любая страница кода сразу же могла редактироваться в стиле MS Word. Идеологически это похоже на высокоразвитые средства разработки сайтов. Пока  наиболее близкий по реализации продукт – последняя версия MS VS C++. Думаю, мелкософт здесь движется в правильном направлении.
127 Gary417
 
13.04.16
19:32
<Идеологически это похоже на высокоразвитые средства разработки сайтов>

Это какие например?
128 Gary417
 
13.04.16
19:33
(126) <последняя версия MS VS C++>

Это называется MS Visual Studio
129 mingw
 
13.04.16
19:38
(126) Понятно. Можно сделать через IDE. Это просто интерфейс.
Использование функции в коде помечается гиперссылкой. При нажатии нее автоматом переход в  код этой функции.

Но не сможете пользоваться таким. Неудобно будет. Например переименование функции как?
130 Emery
 
13.04.16
19:49
(129) > Использование функции в коде помечается гиперссылкой. При нажатии нее автоматом переход в  код этой функции.

А на странице будет отображаться только одна эта функция или все имеющиеся функции? Понятно, что речь идет о примочках IDE, там уже много чего есть, но есть и куда еще совершенствоваться.

> Но не сможете пользоваться таким. Неудобно будет. Например переименование функции как?

Рефакторинг отлично реализован в IntelliJ IDEA последних версий, пусть MS возьмет оттуда лучшее.
131 Zhuravlik
 
13.04.16
20:40
(124) +1
(0) Зачем внешние обработки? Для 77 есть замечательная ВК TurboMD. А все остальное - просто структурируйте код (по ссылке в (124) рассказано как). Пишите понятно, и никаких проблем.
132 Emery
 
13.04.16
21:12
(131) > Зачем внешние обработки? Для 77 есть замечательная ВК TurboMD.

Я вот сейчас еще раз почитал информацию в Интернете об этой компоненте и не нашел там ничего интересного. Почему внешние обработки? А потому, что они подгружаются по мере необходимости, что очень удобно для разделения кода. Вызываю я их через общее меню «семерки», посредством вызова простейшей внутренней прокси-обработки, которая уже вызывает внешнюю форму. А та может делать дальнейшие вызовы по необходимости. Не вижу причин отказываться от внешних обработок, они меня вполне устраивают.

> А все остальное - просто структурируйте код (по ссылке в (124) рассказано как).

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

> Пишите понятно, и никаких проблем.

Я уже писал, что главное это максимальная линеаризация кода, комментирование и логическая модульность. Другие возможности связаны с интерфейсом используемой IDE и внешними компонентами. Возможности гипертекстового кода оставим на будущее.
133 mingw
 
13.04.16
21:20
(132) >максимальная линеаризация кода, комментирование и логическая модульность

Какая еще линеаризация? Отвыкаем от квикбейсика. Переходите на прогрессивный визуал бейсик и турбо паскаль.
134 Злопчинский
 
13.04.16
21:25
(132) "...логическая модульность"
- я здесь понимаю это словосочетание как "смысловая модульноть". потому как по логике все может быть правильно но настолько "запутано" по смыслу шо каец...
- я прав?
135 orefkov
 
13.04.16
21:28
(121)
Вам бы вместо маниловщины и невнятных мечтаний матчасть как следует освоить. Поизучать состав меню Окна в конфигураторе. Он между прочим позволяет разделять/слеплять/дублировать окна в любых мыслимых и немыслимых сочетаниях, не говоря уж о пристыковывании их к любой стороне экрана. Чтобы писать код, надо просто писать код. Через неделю привыкаешь, и всякие невнятные хотелки отпадают, так как всё нормально получается и без них.
136 Emery
 
13.04.16
21:31
(133) > Какая еще линеаризация?

Имеется в виду последовательный вызов функций возвращающих успех выполнения либо неудачу. И так по рекурсии. Конечные функции могут содержать нелинейный код, но желательно максимально простой, который легко понять и сопровождать. Наверное, я когда-нибудь выложу подробную статью на эту тему в Интернете.
137 Emery
 
13.04.16
21:46
(135) Т.е., если я Вас правильно понял, Вы утверждаете, что программный код ЯВУ всегда был, есть и будет текстовым и никогда гипертекстовым? А в конфигураторе «восьмерки» есть все что нужно?

Я только что поэкспериментировал с окнами, о которых Вы пишите, в общем-то, неплохо, но не совсем то, о чем я говорю. Однако мы уже решили оставить проблему гипертекстового кода на будущее. Будем пользоваться тем, что есть.
138 Broadbread
 
13.04.16
21:48
(137) В нормальной IDE он и так гипертекстовый.
139 Злопчинский
 
13.04.16
21:52
(136) кстати, я так последнее время и стараюсь писать...
140 ildary
 
13.04.16
21:52
(137) за всех не скажу, скажу за себя - в 7.7 есть прекрасная вещь на основе OpenConf - называется SiColorer, и в ней сделана возможность гипертекстовости процедур и функций, то есть Ctrl + LMB делают переход на нее. Вот только этой фичей я не пользуюсь - потому что быстрее нажать Ctrl+Enter (точно такой же результат), чем снимать правую руку с клавы на мышь, кликать, а потом назад.
141 Злопчинский
 
13.04.16
21:52
(134)
- Доктор, почему меня все игнорируют?
- Следующий!
142 Emery
 
13.04.16
21:52
(138) > В нормальной IDE он и так гипертекстовый.

Можете привести образец такого гипертекстового кода, для конкретной IDE? Типа html-верстки.
143 mingw
 
13.04.16
21:53
(136) Нет смысла в линейном коде.
Для простоты чтения. Достаточно выносить в функции/процедуры. Весь код внутри циклов. По максимуму. И внутри прочих сложных конструкций тоже.
144 Broadbread
 
13.04.16
22:09
145 Emery
 
13.04.16
22:10
(134) > - я здесь понимаю это словосочетание как "смысловая модульноть". потому как по логике все может быть правильно но настолько "запутано" по смыслу шо каец...
- я прав?

Русский язык, от такой :) . В С++ под логическим модулем естественно понимать один класс и то в двух файлах *.h и *.cpp. В 1С это понятие более размыто. Я воспринимаю его как набор функций для решения определенной задачи, например для создания полууниверсальной обработки (в «семерке», в «восьмерке» целесообразней использовать другие возможности) для создания определенной группы отчетов и загрузок промежуточных данных для последующих специальных отчетов. Или это могут общие функции для первичных и вторичных журналов расчетов (реализованных на справочниках) и т.д. и т.п.

А так, Ваше замечание правильно. Но простое нередко является гениальным :) .
146 Emery
 
13.04.16
22:12
(139) кстати, я так последнее время и стараюсь писать...

Ну вот, уже появились единомышленники, что на форумах редко бывает :) .
147 Злопчинский
 
13.04.16
22:18
(146) а с +рекурсией это у меня получается при последовательном чтении иксемелек...
148 Emery
 
13.04.16
22:19
(140) > за всех не скажу, скажу за себя - в 7.7 есть прекрасная вещь на основе OpenConf

Согласен, недавно вот поставил себе, понравилось. Спасибо Александру Орефкову! Уже даже пришлось редактировать скрипты, которые вызвали ошибки в работе. Благо, это нетрудно сделать. Со временем, надеюсь освоить глубже.
149 Злопчинский
 
13.04.16
22:19
(145) " Но простое нередко является гениальным :) ." - прям как
Флажок = 1-Флажок;
150 mingw
 
13.04.16
22:22
(149)

Функция НЕ(ЧислоБулево01)
  Возврат 1-ЧислоБулево01;
КонецФункции

И тогда Флажок = НЕ(Флажок);
151 Emery
 
13.04.16
22:25
(143) > Для простоты чтения. Достаточно выносить в функции/процедуры

Добавлю еще, что эти функции вызываются последовательно и всегда возвращают только успех / неудачу, что должно проверяться. Я называю это рекурсивной линеаризацией (за исключением конечных функций, которые могут быть нелинейными, но не очень сложными). Вообще все проблемы идут от неопределенности в терминологии.
152 Broadbread
 
13.04.16
22:26
Всё придумано до нас.
153 mingw
 
13.04.16
22:29
(151) Функции вызываются не последовательно. А согласно структурам программы. Могут и не вызываться. Так как пропустили. Или вызываться много раз. Могут заново начать вызываться с начала (рекурсия основной программы на себя).
154 Злопчинский
 
13.04.16
22:33
(151) ".. и всегда возвращают только успех / неудачу,"
я обычно еще возвращаю некое "расширенное содержимое неудачи" дабы можно было куда-нить логгировать/выводить.. и вообще чтоб понятнее было что за неудача и для каждого расследования не лезть внутрь
155 Злопчинский
 
13.04.16
22:34
(153) "Могут и не вызываться.".. фигня.. это тот же самый выхов, но 0 раз... ;-)
156 Broadbread
 
13.04.16
22:35
А ещё, могут вызываться строго по порядку, а могут произвольно...
157 франц
 
13.04.16
22:41
"процедуры должны быть оформлены в виде функций" - по мне, всегда пытаюсь следовать данному принципу.
"логический успех или неуспех" - с передачей параметра самое лучшее.
"через общие переменные модуля" - ну, я бы за это как минимум четверовал бы через повешение с сиквестированием мозга и прочих ненужных такому программисту органов и возможностей..
158 orefkov
 
14.04.16
07:20
(137)
Упс. Только сейчас понял, что про семёрку речь идет. В ней да, чуть похуже. Но там надо ставить openconf+telepat+scicolorer - немного исправляет ситуацию.
159 Kyon8
 
14.04.16
09:01
(10) +1000
160 Emery
 
14.04.16
09:29
(158) > Да, исправляет, никто не спорит. Плюс использование внешних обработок (или внутренних, при желании) как общих модулей, без отображения их формы, для логически связанного кода, куда можно передавать контекст любой вызывающей формы и получать обратно любой контекст.
161 Zhuravlik
 
14.04.16
09:41
(132) Самый популярный отмаз для отказа чтения ИТС. Там тест-драйв есть :)
162 Emery
 
14.04.16
10:21
(161) > Там тест-драйв есть :)

На него я не обратил внимание. Получил временную регистрацию, посмотрел указанные примеры. В принципе, как я и предполагал там речь идет о правильном стиле программирования в 1С, как таковом. При этом ничего не говорится о выносе кода конфигурации во внешние модули (обработки). Почему стоит вопрос об этом? Просто текущие конфигурации вроде 1С:ЕРП УП слишком уж монстрообразные. Поэтому хотелось разделить их код на внешние модули, загружаемые по мере необходимости. Речь не идет конкретно о данной ЕРП, а вообще, хочется иметь дело не с монолитным блоком 1С, а с чем-то более структурированным. Это и отладку облегчает и исправление отдельных модулей, и понимание структуры и т.д.

Поэтому, готовя свой собственный проект по учету ресурсов и начислений (на семерке) к публикации, решил сделать полный рефакторинг кода, с целью упрощения его сопровождения и лучшего понимания (когда все подзабывается со временем). Первый вопрос встал о модульности, второй о рекурсивной линеаризации, третий это хороший стиль программирования – как раз то, на что указывает ссылка из (124). Однако по некоторым концептуальным вопросам я с фирмой 1С не согласен, хотя особых противоречий это не вызывает, просто мой код не является 1С:Совместимым, только и всего. Но мне нравиться, а моим клиентам не принципиально.

Кстати, похожая проблема есть и опенсорсных С++ проектах. Так, я решил чуток переделать под себя код Audacity, использующий wxWidgets,. Все, в общем-то, прекрасно получается, однако процесс перекомпиляции проекта при изменениях занимает слишком большое время. Понятно, что без предварительной компиляции отдельных модулей никуда не деться. Как раз с этим сейчас и разбираюсь, в свободное время.
163 VladZ
 
14.04.16
10:31
(0)  Из всего текста важное: "При программировании код нужно структурировать".  Все остальное можно не читать.
164 Злопчинский
 
14.04.16
14:18
посмотри СКАТ-ПРОФЕССИОНАЛ.
они почти весь прикладной уровень решения вынесли за конфигуратор.
165 quest
 
14.04.16
18:06
(162) "рекурсивной линеаризации" - это что? На пальцах может рассказать?
166 Emery
 
14.04.16
20:16
(164) > посмотри СКАТ-ПРОФЕССИОНАЛ.
> они почти весь прикладной уровень решения вынесли за конфигуратор.

Посмотрел. И «семерку» и «восьмерку». Только не понял, что имеется в виду в последнем предложении? Как по мне, то все на месте. Часть кода защищена от просмотра и редактирования, только и всего. Все остальное как обычно. Хотя в «семерке» много всяких ВК используется, это можно поизучать.

А вот конфигурация "РБ-Софт:Рабочее место кассира" для «семерки» действительно почти не работает ни с собственной базой данных ни с собственными формами. Весьма экзотический вариант, хотя и глюковатый. Доступ к внешним dbf осуществляется через компоненту v7mysql.dll. А вместо формы списков используются обычные ТЗ. Кое-что здесь действительно интересно, но в целом выглядит странновато.
167 Злопчинский
 
14.04.16
20:45
(166)  8-ка у них весьма интересная
Я с их программером пообщался, он меня в экспресс-режиме протащил по решению, обновление у них делается просто - просто загрузкой нового дт, все остальное вынесено в метаконфигуратор, то есть можно под себя написать в прикладном режиме почти все и то большинство всякими собственными настройками, вплоть до произвольных правил видимости любых реквизитов на формах
Короче интересно
168 Emery
 
14.04.16
20:56
(165) "рекурсивной линеаризации" - это что? На пальцах может рассказать?

В теме приведен схематический пример кода для 1С77. В «главной» функции делаем «линейные» вызовы вида:

Функция ИницПарамВызывающФормы()
    Если ПроверкаИсходнДанных() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    Если ПолучитьКонтВызывающФормы() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    Если ОбработатьИсточнДанных() = 0 Тогда
        Возврат 0;
    КонецЕсли;                          
    
    // . . .

    Возврат 1;
КонецФункции // ИницПарамВызывающФормы ()

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

Функция ПроверкаИсходнДанных()
    Если ПроверкаЭлемСпрПараметры() = 0 Тогда
        Возврат 0;
    КонецЕсли;

    Если ПроверкаПриемнДанных() = 0 Тогда
        Возврат 0;
    КонецЕсли;
    
    Возврат 1;
КонецФункции  // ПроверкаИсходнДанных()

И так «рекурсивно» углубляемся до каждой «конечной» функции. «Последние» функции будут уже иметь более содержательный вид. Не исключен нелинейный код (переключатели, циклы, попытки – исключения, транзакции и т.п.) в «промежуточных» функциях. Но он должен быть максимально простой структуры, как правило, в виде вызовов функций следующего уровня. Где-то так.

Когда я сделаю рефакторинг своей конфигурации в этом стиле, я опубликую ее код для примера. Подобные идеи (с различными вариациями) можно применять в других ЯВУ. В том же С++ функции часто возвращают целочисленное значение, характеризующую меру своего успеха / неудачи выполнения (вроде типа HRESULT).
169 mingw
 
14.04.16
21:01
(167) А мануал по этому метаконфигуратору есть у них?
170 Emery
 
14.04.16
21:06
(167) > Короче интересно

А свои модули в «восьмерке» «УправлениеПроведением», «УправлениеРегистрацией» и «БюджетныйУчет» они защитили с помощью WiseAdvise?
171 Emery
 
14.04.16
21:27
(169) А мануал по этому метаконфигуратору есть у них?

У них на сайте есть файл scat_help8.zip (запакованный chm-файл в виде CKAT8.exe ). Там есть раздел Метаконфигуратор. Также этот раздел есть в кратком варианте документации СКАТ-Профессионал.pdf.
172 quest
 
14.04.16
22:27
(168) :pre и :post из кложуры - ты об этом хотел сказать?

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

Уже говорил, но повторюсь - нельзя писать код. Его надо генерить.

Но если генерить не получается - то простой DSL для твоего случая -

Функция ИницПарамВызывающФормы()
@Когда (ПроверкаИсходнДанных() = 1
            ПолучитьКонтВызывающФормы() = 1
            ОбработатьИсточнДанных() = 1 )
    
    // . . .

    Возврат 1;
КонецФункции // ИницПарамВызывающФормы ()
ну а @Когда раскрываешь уже сам в меру сил и потребностей отдельным компилятором, который берет все твои макросы и раскрывает их на 1С.
173 Emery
 
15.04.16
07:42
(172) Нам трудно понять друг друга по обрывкам информации. Любой используемый принцип не абсолют,  применяется постольку, поскольку в нем имеется смысл. Излагаемые здесь идеи подсмотрены  в открытом С++ коде. Но там легко применялись исключения из правил, когда это является целесообразным. Возможно в будущем, когда код будет представлен в двух видах (внутреннем, как html / xml и т.п. и внешнем как гипертекст) то средства структурирования программ станут на порядок лучше.
174 quest
 
15.04.16
09:03
(173) Все равно не понял. Зачем тебе гипертекст??? что он даст? Вот тебе функция -
Функция ф(х,у)
если х = 0 тогда
   вызватьисключение "Делимое 0 - так нельзя";
конецесли
если у = 0 тогда
   вызватьисключение "Делитель 0 - так нельзя";
конецесли
если у = 1 тогда
   вызватьисключение "Делитель 1 - так  тоже нельзя";
конецесли

если у = 2 тогда
   вызватьисключение "Делитель 2 - и так  тоже нельзя";
конецесли
возврат х / у;
конецфункции

Перепиши в своей нотации с гипертекстом. Как это будет выглядеть?
175 Emery
 
15.04.16
10:48
(174) > Все равно не понял. Зачем тебе гипертекст??? что он даст?

Для удобства навигации по коду (как, скажем, в справочной системе Qt). При этом желательно, чтобы на одной странице отображалась только одна функция (или несколько, по выбору, т.е., чтобы «лишний» код не загромождал обзор), причем во внутреннем представлении это должен быть один модуль (в соответствии с нашим проектом). Также должно быть доступно редактирование гипертекста в своем внешнем представлении (а не только через html-коды, их, вообще, должна делать система автоматически). Теоретически из такого кода можно будет сделать целый сайт со всякими прибамбасами, но внутренняя его структура должна определяться выбранной структурой проекта. Возможно, это покажется чересчур избыточным, но, почему-то уверен, что так будет. M$ уже не знает, что придумать в программировании, поэтому ему можно продать эту идею :) .

> Вот тебе функция

Переходы можно делать по именам (переменных, констант, структур, классов, функций и т.п.), примерно то, что сейчас достигается в Visual Studio C++ через клавиши (Ctrl+F12; Shift+F12; Alt+F12; Ctrl+KT и т.п. Только там нет отображения одного объекта на одну страницу / вкладку / закладку / экран / окно и т.д.). В твоей функции представлены только параметры, ключевые слова и текст. Есть смысл, здесь демонстрировать только каким либо образом (на уровне системы), что x и y являются параметрами данной функции.
176 quest
 
15.04.16
10:53
может на doxygen посмотришь? я так понимаю это то что тебе надо, только без редактирования текста.
177 Emery
 
15.04.16
10:56
(176) > это то что тебе надо, только без редактирования текста

Вот! В принципе, близко. Только обязательно должно быть редактирование и просмотр выбранного объекта в отдельном окне, без нарушения структуры проекта.
178 Карупян
 
15.04.16
10:58
(177) пиши на яве. Там каждый объект в отдельном окне (файле)
179 Emery
 
15.04.16
11:06
(178) Под объектом я понимаю не только класс, но и любую структурную единицу, например, функцию, обычную структуру, перечисление и т.п.

А Ява предлагает только размешать один класс в одном файле, да еще и структуру каталогов поддерживать самому. Лучше уж писать на С++ с фрейморками в Visual Studio или в Qt Creator. Это, на мой взгляд, более удобные системы программирования.
180 quest
 
15.04.16
11:17
(177) Ну напиши. Ничего сложного нет - парсинг текста + анализ + хранение информации + отображение.
181 Emery
 
15.04.16
11:31
(180) > Ну напиши. Ничего сложного нет - парсинг текста + анализ + хранение информации + отображение.

Смеешься? Хотя, если оформить как плагин для Qt Creator, то можно подумать.
182 Mikeware
 
15.04.16
11:34
"НУЖНО ПРОГРАММИРОВАТЬ КОД КАК ГИПЕРТЕКСТ"
чот напомнило: "современные ракетные двигатели - они скорее как цилиндр"©
183 quest
 
15.04.16
11:35
(181) да не привязывайся ты к инструменту. Делай методологию. Тогда и инструмент станет  понятен
184 Emery
 
15.04.16
11:50
(183) Согласен, что теория нужна, но примеры реализации не повредят. Будем стремиться.
185 Тролль главный
 
15.04.16
14:52
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан