Имя: Пароль:
1C
1С v8
какой длины может достигать "код" в выполнить(Код) ?
,
0 andron81_81
 
01.02.19
16:03
Добрый день всем.

Подскажите
выполнить(код);

код как известно имеет тип "текст".
и вот вопрос какой длины может быть переменная код ?

задача такова, что я динамически код хочу подсовывать код. Но он может быть довольно большой длины.
1 andron81_81
 
01.02.19
16:04
извиняюсь тип переменной - строка .
2 Fish
 
01.02.19
16:05
Емнип, неограниченно.
3 Fish
 
01.02.19
16:05
+(2) Но могу и ошибаться.
4 Вафель
 
01.02.19
16:06
нет такого понятия "неграничено". Только в теории
5 bolobol
 
01.02.19
16:06
Пока накопителя или свопы не закончатся. Вряд ли это документированная величина - надо в 1С спрашивать.
6 andron81_81
 
01.02.19
16:07
(3) я тоже думаю неограничено. но как в реалиях.
можно , конечно, попробовать создать строку на пару сотен Мб ...
7 Кац
 
01.02.19
16:08
Все ограничено, как и наша Вселенная
8 Вафель
 
01.02.19
16:09
лучше спросить: при каком размере кода начнется существенная деградация
9 Fish
 
01.02.19
16:10
(4) У тебя нет, у 1С есть: https://hkar.ru/X9Dm
10 Hans
 
01.02.19
16:15
Вот так с Выполнить нельзя писать? ТОлько что попытался. Что то написало мне.

Переменная = Выполнить(ТекстВЫполнения");
11 Вафель
 
01.02.19
16:18
юзай Вычислить
12 andron81_81
 
01.02.19
16:20
(10) что это ?
13 andron81_81
 
01.02.19
16:21
(10) и к чему ?
14 ptiz
 
01.02.19
16:23
(10) В чем бы тогда был смысл?
15 andron81_81
 
01.02.19
16:25
блин, нафлудили. короче никто не сталкивался. задач таких не было
16 NikVars
 
01.02.19
17:01
(15) Насколько большой? Мегабайты? Килобайты? 100 строк?
17 igork1966
 
01.02.19
17:04
18 Hans
 
01.02.19
17:34
(14) Думал динамически нужную функцию подсовывать что бы возвращала значение.
19 Fish
 
01.02.19
17:38
(18) Для этого есть (11)
20 int32i
 
01.02.19
18:15
теоретически 2^31-1 (2147483647) или 2Gb значащих символов (плюс финальный 0) для 32-битной платформы
21 NikVars
 
01.02.19
18:25
А чисто практически - весь код реготчета Баланс - 10500 строк, это примерно 500Кбайт.
22 andron81_81
 
01.02.19
19:48
(20) должно хватить )
23 andron81_81
 
01.02.19
19:50
просто вопрос во ставке кода расчета в документе некоторых реквизитов, конечно, это делается просто в конфигураторе просто функциями и процедурами. но с этим сложности - нужно корректировать оперативно алгоритмы расчета и придётся всех выгонять.
24 Провинциальный 1сник
 
01.02.19
19:59
Интересно, а внутри кода, выполняемого командой Выполнить, может присутствовать команда Выполнить?
25 Casey1984
 
01.02.19
20:05
(24) Может, КД 2.1 на этом построена :-)
26 vde69
 
01.02.19
20:07
в старых версиях 1с не поддерживала строки длинее 64к,


по этому скорее всего менее 64к вполне полезет, засем может понадобится больше - я не представляю
27 Casey1984
 
01.02.19
20:08
(0) Какой большой длинны? Суй, всё влезет ;-)
28 andron81_81
 
01.02.19
20:13
(27) помню в MS SQL Server (transact SQL ) там строки не более 8 Кбайт или около того. а вот ссумированные строки каждая до 8Кб проходило   :

exec (@str1+@str2+@str3)
29 vde69
 
01.02.19
20:21
(28) в SQL есть ограничение - весь код вместе с параметрами должен помещаться в оперативку, путем практических проверок я пришел к выводу, что более 0.5мб ему лучше не совать, что сильно больше указаных тобой 8кб, от куда такая цифра?
30 Casey1984
 
01.02.19
20:22
(28) Для статистики посчитал код одного из обработчиков в конвертации клиента: 16300 слов, 132466 знаков. Вам хватит?
31 andron81_81
 
01.02.19
20:34
(30) там ситуация такова , что там хранимки СУБД состоящие из простого перебирания тупого IF else и их нужно перевести на язык 1с короче запрограммировать расчеты реквизитов документа.

сейчас я попробовал одну хранимку (думаю она самая большая) она весит около 300Кб . немного как больше чем у Вас )))
раза в 3 :)
32 Casey1984
 
01.02.19
21:00
(31) У кого-то мозги набекрень от такой писанины :-/
33 andron81_81
 
01.02.19
21:11
(32) это производство. Ничего не поделаешь."миллион" вариантов. Системе это не потдается
34 andron81_81
 
01.02.19
21:12
(32) то есть алгоритму
35 andron81_81
 
01.02.19
21:13
(34) только простой перебор вариантов
36 vde69
 
01.02.19
21:20
(35) а сделать отдельную таблицу соответствий и в запросе простой джойн - ума не хватает ?
37 France
 
01.02.19
21:24
бан в секции как глянуть?
38 Serg_1960
 
01.02.19
21:24
Будет смешно наблюдать за попыткой подсчитать длину, когда вспомнят, что в Выполнить(Код) можно обращаться к функциям и процедурам конфигурации :)
39 andron81_81
 
01.02.19
21:26
(36) :)) досвидос
40 France
 
01.02.19
21:29
(0) в чОм вопрос то?? нет там ограничений.. ну, лет 13 назад не было
41 andron81_81
 
01.02.19
21:29
(38) а ты внимательно читал что я писал. Я же говорил, что мне оперативно вмешиваться в код надо. Твой метод имеет ньюанс :выгнать придеттся всех дабы обновить конфигу
42 andron81_81
 
01.02.19
21:29
(40) в этом и был вопрос
43 France
 
01.02.19
21:30
(42) нет там ограничений.. по сведениям 13 летней давности))
44 andron81_81
 
01.02.19
21:31
(38) кстати сейчас так и слелано.
45 vde69
 
01.02.19
21:33
(41) блин, нафига оперативно вмешиватся в код... детский сад...

сделай по нормально, сделай таблицу и пусть ПОЛЬЗОВАТЕЛИ сами оперативно вносят туда условия
46 andron81_81
 
01.02.19
21:39
(45) да не выйдет я же говорю. 100 тыщ строк не хочешь пооучить в такой табле. Входных параметров в таблице до 40 не хочешь. Вот и считай сколько различных картежей в такой будет . Легче если - иначе оформить. Плюс где-то формулы. Плюс бабушки работают. Им таблички делать предлагаешь?
47 andron81_81
 
01.02.19
21:40
(45) не оформить там таблой. Не флудите
48 vde69
 
01.02.19
21:40
(46) таблички по любому лучше и БЫСТРЕЕ будет, даже если ее админить будешь ты а не пользаки
49 andron81_81
 
01.02.19
21:46
(48) проходили. Не все так просто. Пример высылать не буду. И спорить не хочу
50 andron81_81
 
01.02.19
21:53
(48) к тому же параметры входные постоянно добавляются что-то пересчитывается на ходу  в алгоритме и из этих пересчетов так же как бы таблица варантов вырастает из результата опять пересчет и опять таблица. Вы такие таблицы хотите научить пользователей составлять?))
51 andron81_81
 
01.02.19
21:55
Это оформится 15 строчками алгоритма который я поправлю с легкостью. Таблу тут даже затруднииельно составить
52 int32i
 
01.02.19
22:13
(22) Я указал теоретический максимум исходя из внутреннего представления строки 1С.
Практический потолок будет ниже и будет зависеть от распределителя памяти ОС.

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

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

Практически можно опираться на то, что при Выполнить(строкаКода) отрабатывает тот же алгоритм, что и при загрузке\разборе модулей при старте конфигурации. Я не встречал сообщений о том, что на какой-то здоровенной конфигурации платформа уходит в аут. Значит в разумных пределах ограничений на длину и сложность строкаКода нет. Но нужно учитывать на разбор оочень длинной и оочень сложной строкаКода потребуется мноого времени.
53 andron81_81
 
01.02.19
22:31
(52) короче не стоит связываться, да?))
54 France
 
01.02.19
22:32
(53) на "Выполнить" сделали конфу, за которую заплатили овер чем пару лямов в баксах.. так что, решай, стоит ли..
55 andron81_81
 
01.02.19
22:37
(54) то есть? Заплатили разработчики за свои косяки или заказчики разработчикам? Как расценивать  ваш коментарий как камень в огород "выполнить" или как наоборот крутой подход?
56 andron81_81
 
01.02.19
22:38
Или я вообще ничего не понял
57 France
 
01.02.19
22:39
(55) подход, который сработал в свое время.. и заказчик и исполнитель в итоге остались довольны
58 France
 
01.02.19
22:39
но, по догмам 1С так поступать нельзя
59 andron81_81
 
01.02.19
22:47
(58) по идее ведь можно всегда оставить путь отхода. Сделать 2 варианта:

1. Выполнить "ФункцияИзКонфигуратора("...

2. Выполнить строкаКоманд.

В данном случае 1. Это путь отхода. Который менее по идее удовлетворяет догмам, наверно не будет нагружать ресурсы.
60 France
 
01.02.19
22:52
(59) в этом деле я бы заморачивался на безопасность, а не на ресурсы..
когда надо было выбирать между "Выполнить" и наконфигурачить - в итоге наконфигурчил..
хотя, был участником того самого проект с "Выполнить". пят лет..
61 andron81_81
 
01.02.19
22:53
(52) можете прояснить последнее свое предложение. Мне показалось, что оно противоречит первому предложению этого же абзаца(
Практически можно опираться...)
62 andron81_81
 
01.02.19
22:56
(60) под безопасностью что имеете ввиду? Что-то вроде инъекций?))
63 andron81_81
 
01.02.19
23:02
(62) риск иньекции?
64 France
 
01.02.19
23:08
(63) ну, если "инекции" - это возможность для дебила (и не только) порушить все, то, таки да...
65 France
 
01.02.19
23:09
кстати, в моем примере через выполнить операции над данными не выполнялись)) через выполнить создавали контекст выполнения))
66 int32i
 
02.02.19
00:36
(61) Из УТ_10_3_45_4 самый большой модуль CommonModule.ЭлектронныеДокументыВнутренний.Module.txt имеет размер 4081917 байт или ~3.8Мб. Платформа его без проблем загружает (разбирает парсером и переводит в байт-код для исполнения). Значит и Выполнить(строкаКода) где строка кода будет порядка 4Мб платформа переварит без проблем. И в первом и втором случае отрабатывает один и тот же парсер (компилятор) платформы.
Думаю что платформа без проблем загрузит модуль размером и в 40Мб. Думаю что разработчики поиздевались и потестировали ее на такие размеры. Но при загрузке (разборе и компиляции) 40Мб кода платформа уже ощутимо призадумается. Но справится. Значит и Выполнить(40Мб) справится. Только при загрузке модуля платформа буде призадумываться один раз, а при Выполнить(..) каждый раз и это может быть уже неприемлемым.
Также думаю, что на 400Мб кода разработчики ее уже не тестировали и слетит она как пить дать. Ну или при 800Мб слетит. Но эта граница будет железо-ос-версия-зависимой т.к. будет зависеть от взаимодействия платформа-ос-железо.
Но зачем нам искать границу около 400Мб, если уже, к примеру, на 40Мб нам неприемлемо по быстродействию? Вспомните неповоротливость и прожорливость EDT. Она занимается тем же самым - код разбирает. Вы же не хотите чтобы Ваше решение через Выполнить() было таким же.
Поэтому Вам нужен не некий теоретический предел по размеру, а практически приемлемый предел по критерию размер-быстродействие. А его можно только нащупать.
Удачи.
ПС. Размер и сложность выражений разные вещи. 40Мб кода вида "а=1" это не тоже что "а=1+2+3+...+12334209808" на 40Мб. Сложное выражение рекурсивному парсеру переваривать намного сложнее и он скорее сломается по исчерпанию стека. Памяти в системе может быть и 4Гб, а стек все равно 1Мб на процесс для 32-битной системы. Опять же Ваши Выполнить(..) щупать надо, а не теоретизировать.
67 France
 
02.02.19
00:41
(66) у платформы нет компилятора..
68 int32i
 
02.02.19
00:51
(67) У фирмы 1С нет компилятора языка 1С в машинный код. У фирмы 1С есть компилятор языка 1С в байт-код виртуальной машины 1С.
ПС. У меня есть компилятор языка 1С в машинный код для x86 на базе LLVM (https://forum.infostart.ru/forum9/topic178313/). Правда я его до ума так и не довел - не нужен никому :(
69 mikeA
 
02.02.19
05:18
(31) Если алгоритмы сложные, я бы сделал через внешние обработки. Отлаживать на порядок удобнее.
Был опыт и так и так. Сложные алгоритмы отлаживать в Выполнить то ещё удовльствие. Хотя можно конечно извернуться.
70 andron81_81
 
02.02.19
08:23
(66) ну там бывают расчеты(формулы) , а так же если тогда конструкции(их бывает прилично) . Кстати есть пара рекурсивных процедур, правда глубина их не велика(у меня с рекурсией мозги меньше кипят, поэтому этот метод и использую)
71 andron81_81
 
02.02.19
08:24
(69) очень интересно, но это как? Не могли бы попотробнее.
72 andron81_81
 
02.02.19
08:25
Через внешние обработки
73 Конструктор1С
 
02.02.19
08:48
(0) НЕ надо писать такой громоздкий код. Это автоматом грозит сложностью его сопровождения
74 mikeA
 
02.02.19
09:00
(71)

В модуле обработке создаёшь экспортную функцию ЗаполнитьМойРеквизит(Параметры).
В коде функции помещаешь алгоритм вычисления значения реквизита.
При заполнении реквизита создаёшь объект обработки и вызываешь у него эту функцию.

Если алгоритмы заполнения реквизитов в документах отличаются, можно делать по одной обработке на документ и в ней несколько функций для заполнения реквизитов, ЗаполнитьРеквизит<ИмяРеквизита>. Вот здесь уже и использовать Вычислить:

    Объект.ИмяРеквизита= Вычислить(СтрШаблон("ОбработкаЗаполнения.ЗаполнитьРеквизит%1(ПараметрыЗаполнения)", "ИмяРеквизита"));

Если конфигурация с БСП, обработку можно поместить в справочник Дополнительные отчёты и обработки, там есть функция для создания объекта обработки по ссылке на элемент справочника.

Есть ещё момент по отладке. Там где будешь хранить соответствия документов, реквизитов, и обработок заполнения, сделай тип для реквизита обработки составной, строка и ссылка на Дополнительные отчёты и обработки. На этапе тестирования пишешь в реквизит строку - путь к обработке на диске в общей папке, доступной с сервера. В этом случае при заполнении реквизита создаешь объект обработки с помощью ВнешниеОбработки.Создать(ПутьКОбработке). Тогда можно просто открыть файл обработки в конфигураторе и поставить breakpoint. Только открывать нужно с сетевого диска, даже если он находится на твоём компьютере. А отлаживать внешние обработки из справочника БСП задача нетривиальная.

Если нет БСП, можно сделать свой справочник для хранения внешних обработок. Я кстати так и поступил, хотя БСП была) Там особой магии нет, единственно в управляемом приложении надо учитывать особенности интерфейса чтения/записи файла.
75 andron81_81
 
02.02.19
12:14
(74) блин, мой скиллы не настолько круты , чтобы не возникли вопросы по твоим комментариям:  то есть ты предлагаешь ссылаться на функции и процедуры обработки , которые я могу, отредактировав в тестовой базе , подгрузить в режиме предприятия . Верно ? если я верно понял, то это то что нужно , очень интересно и круто !!!
76 dmpl
 
02.02.19
12:29
(23) Не нужно корректировать оперативно. Нужно организовать нормально процесс разработки. От таких оперативностей потом хаос получается.
77 andron81_81
 
02.02.19
12:36
(76) Ты наверно ген. директор промышленного предприятия, что так утверждаешь ? нет? тогда ты умник попробуй ген. диру предприятия объяснять это в захолустном городке (с убитыми напрочь рабочими местами), которому необходимо налету скорректировать нормирование исходя из сложившихся хотелок заказчика которые накапливаются постоянно. И это всё нужно делать без отрыва расчета заказа, то есть без обновления конфиги.
78 ДенисЧ
 
02.02.19
12:38
(77) Я объяснял. Меня понимали.
Я говорил "А давайте выгоним всех" (в момент пика отгрузки) из базы. Они посидят полчасика, клиенты подождут пару часов, ничего страшного...

И ничего, сразу же все хотелки сиюсекунду отваливались.
79 andron81_81
 
02.02.19
12:41
(78) Ребята , пожалуйста, не засоряйте тут орг. советами. тут люди дело говорили сейчас из-за вашего флуда , они не прочитают моих вопросов и не ответят.
80 ДенисЧ
 
02.02.19
12:48
(79) Ты не понимаешь, куда задаёшь вопросы. Особенно в субботу. Тут всегда флуд. И только скилл "Истинный мистянин - 70" позволяет отсеять нужное от остального.
81 dmpl
 
02.02.19
13:00
(77) Автоматизируя бардак получишь автоматизированный бардак. В итоге постоянно головняк будет и фантазии пользователей. Если ген.дир не дурак - он поймет. Если дурак - нечего с ним работать, все равно это предприятие будет, в лучшем случае, прозябать с переменным успехом, а то и совсем загнется.
82 mikeA
 
02.02.19
13:32
(75) Да.
83 andron81_81
 
02.02.19
13:56
(82) большое спасибо . это отличный вариант.
84 vde69
 
02.02.19
15:01
(74) если уж допиливать, то я-бы вообще сделал еще круче:

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

а теперь следим за руками:
в тестовой делаем расширение, можно даже несколько, которые изменяют интерфейсы заглушки. и в ПОЛЬЗОВАТЕЛЬСКОМ режиме загружаем эти расширения юзерам (даже можно каждому юзеру свое расширение).

поменять код для конкретного юзера? - пожалуйста, выгружаем у него старое расширение и подгружаем моджифицированое...
85 sieben
 
02.02.19
15:17
(84) > каждому юзеру свое расширение

Это как?
86 vde69
 
02.02.19
15:42
(85) легко... расширения они разные бывают, некоторые из них можно подключать выборочно а не всем...
87 Сияющий в темноте
 
03.02.19
18:37
У расширений одна проблема-конфы в режиме совместимости ими давятся.
2 + 2 = 3.9999999999999999999999999999999...