1С:Ассемблер. Немного летнего веселья!

Публикация № 1080907

Разработка - Практика программирования

313
Все вы, наверное, слышали, что 1С-ники жалуются на свою систему, считая язык 1С недостаточно низкоуровневым, скучным и т.п. Все они с тоской поглядывают в сторону "настоящих" языков программирования. Так вот, господа, они неправы. В системе 1С есть места, где можно размять программерский мозг и получить удовольствие от низкоуровневой техники. Предлагаю вам погрузиться в недра виртуальной машины 1С и понять, как она работает. Там есть свой "ассемблер" и мы попробуем его в действии!

Посвящается Валерию Агееву (awa)

Стековые виртуальные машины

Мир все больше и больше захватывают динамические языки программирования. От "честных" нативных языков в строю остался, пожалуй, только Си (с плюсами и без). Это если брать промышленный мейнстрим. Все популярные языки так или иначе имеют прослойку в виде "исполняющей среды" или "виртуальной машины", которая обеспечивает выполнение кода на той или иной архитектуре железа. И подавляющее большинство этих "виртуальных машин" являются стековыми, т.е. реализуют обработку операций с помощью такой известной в компьютерном мире структуры, как "стек".

Ремарка для тех, кто забыл

Стек (Stack) в переводе с английского означает "стопка". Когда мы кладем в стопку (скажем, книг) какую-то новую книжку, то она оказывается сверху. Убирать из стопки книги мы можем только сверху вниз. Т.е. последняя добавленная книжка снимается из стопки самой первой. Это тот самый принцип "LIFO" - last in/first out. Обратной ситуацией является очередь (в магазине). Кто первый встал - того и тапки.

Java, Python, C# и 1С - все они используют стековые машины для выполнения своего кода. Рискну предположить, что node.js - тоже, но это неточно, а гуглить мне лень. 95% вероятности, что это так и есть.

 

Если совсем спускаться в академические точности, то есть язык, а есть исполняющая среда. Так вот, язык - это лишь спецификация и, вообще-то, текст. Он не выполняется, он в блокноте написан. А вот то, что выполняет написанное - это может быть как стековым, так и нет. Поэтому нельзя сказать что Java - это стековый язык. Стековым бывает то, что выполняет язык. Так, например, для Java есть общепринятая машина JVM - она стековая. А в Андроидах используется (или использовалась) регистровая машина Dalvik. Ходят слухи, что ее оттуда выпилили, но я не проверял. Язык - один, машин может быть несколько. Но, как правило, этим можно пренебречь, поскольку все равно у каждого языка есть всего одна (реже несколько) реализующих машин и почти все они, скорее всего, будут стековыми.

У языка 1С тоже есть несколько реализаций. Первая - сама 1С, вторая - например, 1Script. Есть еще несколько, чуть менее известных.

Стековая машина

Устроена стековая машина невероятно просто. Я разбирал ее устройство на Хабре еще в 2014 году, поэтому здесь просто коротенько напомню.

Итак, вот есть у вас выражение А = 1 + 1; как оно выполняется стековой машиной?

 

PushConst 1
PushConst 1
Add
LoadVar A

 

Поместить в стек операнд-константу 1 (2 раза), затем выполнить операцию Add.

Операция Add извлекает свои аргументы из стека (2 штуки) и складывает. Результат кладет обратно на стек. Операция LoadVar берет переданную переменную А и загружает в нее то, что лежит на стеке (в данном случае - результат сложения).

Этот простой алгоритм позволяет эффективно вычислять цепочки выражений. Например, операция А = 1+1+2 будет выглядеть вот так:

 

PushConst 1 ; поместили константу на стек
PushConst 1 ; поместили константу на стек
Add ; забрали 2 аргумента из стека (1 и еще 1), сложили, поместили в стек результат
PushConst 2 ; поместили константу на стек
Add ; забрали 2 аргумента из стека (2 и еще 2), сложили, поместили в стек результат
LoadVar A ; забрали из стека то, что там лежало (4) и загрузили в переменную А.

 

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

Операции, выполняемые виртуальной машиной, принято называть "байт-кодом". Это такой "ассемблер" для стековой машины.

Как увидеть байт-код машины 1С

По умолчанию, если вы сохраняете какой-либо модуль, он сохраняется в чистом виде, так, как вы его написали. Однако, если поставить на модуль пароль или удалить модуль из поставки, то системе потребуется как-то все-таки знать - что выполнять. Поэтому, система при сохранении компилирует ваш код 1С в байт-код и сохраняет уже его. Например, если вы поставите пароль на модуль внешней обработки, то в файл epf ляжет скомпилированный байткод. Его можно посмотреть утилитами семейства v8unpack.

 

Какой же хакер без подходящих инструментов

Давайте посмотрим на байткод 1С. Права на описанные инструменты принадлежат их авторам, как и всяческие респекты от меня и сообщества.

 

Для начала нам потребуется распаковщик файлов epf. Самый простой способ, это установить его через chocolatey

 

choco install v8unpack --version 3.0.41 --source https://www.myget.org/F/onescript/api/v2

 

Тем, у кого нет chocolatey (эй,чуваки, как вы без него живете?) можно скачать по прямой ссылке https://github.com/e8tools/v8unpack/releases/download/v.3.0.40/v8unpack.exe но не забудьте потом exe прописать в PATH, чтобы было удобнее запускать.

 

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

 

v8unpack -P КакаяТоОбработка.epf content

 

Будет создан каталог content, а в нем размещено содержимое внутренних файлов контейнера 1С (кому интересно - формат контейнера описан вот здесь: //expert.bizon22.ru/public/250142/)

 

Итак, в этом контейнере нас интересует каталог "<какой-то-GUID>.0", а в нем файлы "info" и "text". Файл "text" это просто текст модуля, а файл инфо это служебный файл, с которым мы еще поработаем. Теперь удалим каталог content и закроем модуль нашей обработки паролем. Откройте редактирование модуля в конфигураторе и в меню "Текст" выберите пункт "Установить пароль". Теперь, при попытке редактирования модуля Конфигуратор будет спрашивать пароль.

 

Отлично, а что же на уровне внутренних файлов? Сохраним запароленную обработку, удалим каталог content от предыдущего запуска и повторим команду

 

v8unpack -P КакаяТоОбработка.epf content

 

посмотрим в каталог с GUID.0 ого, появился файлик image, а в файле text - какая-то абракадабра. Платформа зашифровала содержимое модуля, его действительно не видно, но ей же надо как-то выполнять алгоритмы, верно? Для этого она перед шифрованием скомпилировала код 1С в байт-код виртуальной машины и записала его в файл image. Посмотрим на него:

 

 

Это - ассемблер 1С. Именно его выполняет наша любимая платформа, когда считает всем зарплату. И знаете, что самое интересное? Мы можем напрямую писать код на этом ассемблере, не прибегая к услугам компилятора! Слабо? Я же говорил, что будет весело!

 

А зачем это нужно?

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

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

Оговорка

Я против воровства результатов чужого труда. Если вы пользуетесь декомпилятором, то скорее всего, вы не хотите платить автору, т.е. просто хотите украсть его работу. Это некрасиво. Поэтому, я не буду приводить ссылки на декомпилятор 1С в сети. Более того, каждый раз, когда в сети (чаще на Мисте) вы видите вопрос про "как декомпилировать обработку", "как снять пароль" - обязательно напишите автору вопроса, что он говнюк и мелкий воришка.

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

 

И еще: я не буду рассказывать, как именно построить такой обфускатор (я против, помните), но дам пару намеков, которые могут сработать, если вы захотите создать таковой.

Ну че, поехали?

К статье прилагается внешняя обработка "Ассемблер", которая позволяет изучить формат модуля 1С. Создайте внешнюю обработку с зашифрованным модулем, распакуйте ее с помощью v8unpack и в "Ассемблере" откройте файл "image", который мы рассмотрели чуть раньше.

 

Тут пока все будет не очень понятно, поэтому, давайте разбираться, как работает виртуальная машина 1С.

Раздел "Операции"

Основной код модуля описан в виде потока операций (команд). Каждая команда имеет числовой номер - код операции. Сокращенно его называют ОпКод (OpCode), этот термин можно встретить в специальной литературе. Каждая команда, помимо опкода имеет один числовой аргумент. Трактовка аргумента зависит от опкода. Каждая команда, получая на вход свой аргумент сама принимает решение, что с ним делать. Некоторые команды не имеют аргумента (ничего не делают со своим аргументом). Итак, запомнили, каждая команда - это два числа: опкод и аргумент операции.

Какие же бывают ОпКоды? В машине 1С их 128, но большую часть составляют встроенные функции типа Лев, НачалоКвартала и им подобные. Низкоуровневых операций существенно меньше.

Раздел "Константы"

С константами вообще классно. Любая ЭВМ должна иметь где-то прошитый набор констант, чтобы понимать что один - это один, а ноль - это ноль. В моем военном прошлом я изучал и работал со старой советской ЭВМ и там был даже специальный блок "ЗУ Констант", хранивший побитовые представления основных констант. Т.е. чтобы прибавить к чему-либо единицу, машина должна понимать, а как вообще выглядит единица с точки зрения включенных/выключенных электронных регистров памяти. Помимо единицы и нуля там же хранилась Пи, таблица синусов/косинусов и всякое такое. Полагаю, современные устройства тоже имеют нечто подобное внутри ПЗУ.

 

Ну это было лирическое отступление. Наша машина хотя и работает поверх железной, тем не менее, тоже нуждается в термине "Константы". Когда вы в коде пишете "А = 2" компилятор 1С записывает эту двойку в специальный раздел модуля. Туда же попадают литералы дат и строк. При выполнении есть специальная команда "Взять константу за номером таким-то и поместить в стек".

Раздел "Переменные"

Операторы языка 1С (как и любого другого языка) оперируют переменными. В переменную можно положить какое-нибудь значение (например константу). Переменные бывают экспортными, локальными и глобальными. Информацию о переменных компилятор также складирует в специальный раздел. Глобальные переменные модуля хранятся в глобальном разделе "Переменные", Каждый метод (процедура или функция) имеет свой отдельный блок переменных, в котором хранятся переменные относящиеся к конкретному методу.

Как кодить-то?

Кодить в такой парадигме довольно увлекательно. По сути - очень похоже на настоящий ассемблер, только вместо регистров - один стек, на который складываютя и из которого вынимаются операнды. Давайте попробуем сложить 2 числа на байткоде 1С.

Запишем в раздел констант числовую константу 2. Она будет иметь номер 0 в списке констант.

Сложение чисел 2 и 2 будет выглядеть следующим образом:

 

LdConst 0
LdConst 0
Add 0

 

Готово! Следите за руками: Все опкоды, которые кладут что-либо на стек, я по традиции обозначил префиксом Ld от слова "Load". Этой традиции много лет, даже Терминатор в своем будущем соблюдал канон и пользовался этим сокращением в своей прошивке.

Команда LdConst имеет аргумент, который указывает на номер константы в списке констант (мы помним, что там по адресу 0 лежит двойка). Команда смотрит в свой аргумент, достает двойку по заданному адресу и кладет ее в стек. В стеке один элемент - двойка.

Вторая команда делает то же самое, в стеке 2 элемента (и оба - двойки)

Третья команда - это операция сложения. Она не нуждается в аргументе, так как оба ее операнда должны лежать в стеке, но поскольку совсем без аргумента нельзя, то в байткоде у Add будет просто 0. Операция сложения извлекает 2 элемента из стека и складывает их по правилам языка 1С (с учетом типа значения самого левого аргумента).

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

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

Превед, Мир!

По традиции, изучение нового языка или технологии проще всего начать с демонстрационной программы "Hello World".

 

Откройте обработку "Ассемблер" и на закладке "Процедуры" введите строку следующего содержания:

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

Далее, на закладке "Константы и переменные" заведите строку

 

 

А теперь, наберите в поле "Операции" следующий код:

 

LdConst 0
ArgNum 1
CallLoc 0
End 0

 

и нажмите кнопку "Запустить". Моргнет, фыркнет-пшикнет и результат будет выведен в окно сообщений

 

А чо это было?

При нажатии кнопки "Запустить" за кадром ваш код был записан в "скобочном формате" и с помощью v8unpack упакован во временную внешнюю обработку. Эта обработка была запущена штатным 1С-овским образом и выдала результат. Полная спецификация байткода доступна по кнопке "Справка по командам" в обработке "Ассемблер". Далее будут рассмотрены основные моменты работы с байткодом.

Работа с переменными

Рассмотрим работу с переменными. Пока пусть будут только глобальные переменные. Вот такой фрагмент кода

А = 8;
Б = А + 2;
М = Б - А;

 

При трансляции из него получится следующее: во-первых, в раздел констант попадут константы 8 и 2 в порядке их "встречи" компилятором. Восьмерка получит номер 0, а двойка - номер 1. Далее, в раздел переменных попадут переменные А, Б и М. Опять же номера будут присвоены по порядку попадания в поле зрения компилятора.

 

Константы

 

Номер

Тип

Значение

0

Число

8

1

Число

2

 

Переменные

 

Номер

Имя

Признаки

0

А

Глобальная

1

Б

Глобальная

2

М

Глобальная

 

Для работы с глобальными переменными используется опкод LdVar. Он помещает на стек переменную с номером, переданным в аргументе команды. Вот код программы, выполняющий указанную логику:

 

LineNum 1 ; маркер строки исходника
LdVar 0 ; загрузить на стек переменную 0 (А)
LdConst 0 ; загрузить на стек константу 0 (равную 8)
Assign ; присваивание - снять со стека правую и левую части, присвоить.
LineNum 2 ; маркер строки исходника
LdVar 1 ; загрузить на стек переменную 1 (Б)
LdVar 0 ; загрузить на стек переменную 0 (А)
LdConst 1 ; загрузить на стек константу 1 (равную 2)
Add ; сложить 2 значения на стеке, результат положить в стек (А+2)
Assign ; присваивание - снять со стека правую и левую части, присвоить (Б = (А+2)).
LineNum 3 ; маркер строки
LdVar 2 ; поместить переменную 2 (М)
LdVar 1 ; поместить переменную 1 (Б)
LdVar 0 ; поместить переменную 0 (А)
Sub; вычитание. Снять 2 значения, результат положить
Assign; присваивание М = (Б-А)
End; конец блока кода

 

Видите, все довольно просто, хотя, наверняка, возникли вопросы. Например, что делает оператор LineNum? Очень просто, он привязывает байткод к строкам исходного кода, чтобы при возникновении исключения можно было бы выдать номер строки, в которой произошла ошибка. Без этого оператора машина не узнает какой набор опкодов какой строке исходника принадлежит. Кстати, весьма вероятно, что народный способ "писать код в одну строку, чтобы было быстрее" происходит именно отсюда. Если весь код написать в одну строку, то мы сократим число вызовов LineNum. Однако, сопровождение такого кода превращается в ад, и я бы отрывал руки тем, кто так пишет для корпоративного продакшена.

Вызовы методов

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

 

 

ArgNum

Кладет на стек число, показывающее сколько параметров было положено в стек для вызова метода (число переданных параметров)

CallLoc

Вызов локальной функции по номеру из таблицы методов

CallProc

Вызов метода объекта, как процедуры

CallFunc

Вызов метода объекта, как функции (с возвратом значения)

Ret

Запоминание результата функции (не на стеке)

LdRet

Положить результат последнего метода на стек

 

Давайте попробуем вызвать метод. Пусть в таблице методов существует запись про метод "МояФункция" с одним параметром. Пусть эта запись имеет номер 0.

 

Для краткости, я опущу операции LineNum. С помощью обработки "Ассемблер" вы всегда сможете посмотреть в каких местах 1С добавляет этот оператор.

 

LdConst 0; поместим на стек какую-нибудь константу

ArgNum 1; указываем сколько аргументов надо будет снять со стека при вызове метода

CallLoc 0; вызов метода с номером 0.

 

При вызове метода машина снимает со стека число значений, заданное оператором ArgNum. Это число показывает - сколько значений надо снять со стека и распределить по параметрам метода. Эта механика необходима потому, что у нас могут быть необязательные параметры в методах. Тогда при вызове метода с неполным числом параметров машина должна знать, сколько реальных значений засунуто в стек при вызове.

Обработка возвратов

Мы можем вызвать любой метод, как процедуру (игнорируя возвращаемое значение), а можем вызвать, как функцию - присваивая куда-то результат. Вспомним оператор Assign, рассмотренный ранее. Он извлекает из стека 2 аргумента. Чтобы присваивание возвращаемого значения сработало требуется поместить результат функции на стек. Это делает оператор LdRet. При этом, сама функция не знает, будут использовать ее результат или нет. Поэтому компилятор всегда компилирует тело функции одинаково, вызывая оператор Ret, который кладет результат функции в некое временное хранилище. Если значение из этого хранилища извлекут методом LdRet - хорошо. А если нет, значит оно не понадобилось. Просто и элегантно. Я при разработке 1Script не додумался про временное хранилище и мне пришлось городить довольно муторную механику "отброса" неиспользованных результатов Возврата со стека.

Более сложные случаи

Код, выполняющийся линейно, мы разобрали. Давайте посмотрим на ветвления и циклы. Для начала изучим самый простой оператор, обеспечивающий ветвление. Это Jmp. Он просто переводит выполнение на команду, номер которой передан в Jmp аргументом. С помощью джампов можно строить очень запутанный код и декомпиляция его может превратиться в ад. Если вы пишете обфускатор, то не сможете выполнить такую обфускацию, портя код исключительно на уровне исходника 1С. А в байт-коде - сколько душе угодно, была бы фантазия.

Сокращенные вычисления логических выражений

Я думаю, вы знаете, что 1С использует сокращенные вычисления логических выражений. Этот термин означает, что при вычислении выражения "А и Б" выражение Б может вообще не выполняться, если результат А - ложь. Если А = Ложь, то и все "А и Б" равно ложь и нет смысла вычислять Б. Например:

 

Если ТипЗнч(Переменная) = Тип("Структура") И Переменная.Свойство = 2 Тогда

 

имеются 2 части логического выражения: проверка типа И обращение к свойству. В 1С такая конструкция безопасна именно благодаря сокращенному вычислению. Если тип переменнной не структура, то левая часть И будет равна Ложь, а значит и все выражение будет равно Ложь. Правая часть И вообще не будет выполнена, а значит обращение к свойству "НЕ структуры" не произойдет.

 

Аналогично с ИЛИ, только наоборот. Если левая часть равна Истина, то правую часть вычислять нет смысла. Для реализации этой логики существуют 2 ОпКода - And и Or соответственно. Аргументом операции идет число, показывающее на какой адрес команды перейти, если сработает сокращенное вычисление.

 

Например, для "И" если операнд на вершине стека Ложь, то происходит переход по адресу, указанному в аргументе опкода, т.е. пропуск вычисления второго операнда, т.к. от него уже ничего не зависит. Из стека при этом значение не удаляется (результатом операции является Ложь). Иначе, если на вершине стека Истина, из стека удаляется значение и перехода не происходит, т.е. вычисляется второй операнд, результат которого полностью определяет результат всей операции).

 

Есть еще 2 команды условных переходов: JmpTrue и JmpFalse. Аргументом опкода идет адрес (номер команды), на который надо перейти, а переход выполняется только тогда, когда на стеке находится Истина или Ложь соответственно. Причем, оператор JmpTrue 1С никогда не использует при компиляции исходника. Т.е. декомпилировать байткод, использующий JmpTrue, будет намного сложнее, т.к. в синтаксисе языка 1С отсутствует соответствующая ему конструкция (trollface) Кстати, 1Script тоже никогда не использует JmpTrue и в его байткоде такая операция совсем не предусмотрена.

Условия

Как же выглядят условия? Пусть есть константа 0 со значением 1, пусть есть переменная А с номером 0 и значением 1

 

0: LdVar 0 ; кладем на стек значение А
1: LdConst 0 ; кладем на стек значение 1
2: Cmp ; сравниваем (оператор кладет результат сравнения на стек)
3: JmpFalse 6 ; перейти на команду 6, если на стеке Ложь
4: внутри IF ; не выполняется
5: внутри IF ; не выполняется
6: продолжение кода… ; выполняется

 

Если условие не выполнено - идет переход на конкретный адрес. Если выполнено - просто идет выполнение дальше и заходит в блок условия.

Циклы

Циклов у нас 3 вида: "Пока", "Для..По" и "Для Каждого.. Из". Причем для "Пока" вообще не требуется дополнительных опкодов, он целиком реализуется на джампах.

 

Для цикла "Для..По" используется отдельный стек "временных переменных", который хранит значения, обеспечивающие работу цикла. Так, во временный стек кладется конечное значение итерации цикла, и при каждом проходе текущее значение инкрементируется и сравнивается с временным. Сравнение выполняется оператором Gte (больше-или-равно) и уже знакомым нам JmpFalse если счетчик цикла стал больше или равен конечному значению цикла. Приводить байткод не буду, это домашнее задание для тех кто захочет разобраться с обработкой "Ассемблер".

 

 

Цикл с итератором "Для Каждого Из"

С итератором все вообще интересно. Итератор - это такой объект, который отвечает за обход коллекции и выдает очередной ее элемент при вызове условного метода Next()

 

Для получения итератора используется опкоды Iter, Next и неявная служебная переменная, которую компилятор создает в блоке переменных. Плюс, используется стек временных переменных и… зачем так сложно, я так и не понял, цикл с итератором в 1Скрипт сделан, на мой взгляд, попроще.

 

Попробуем разобраться. Вот фрагмент кода Внимание, потребуется включить мозг, рекомендуется налить кофе:

Функция А(Арг)

    Для Каждого Элемент Из Арг Цикл
        Элемент.Метод();
    КонецЦикла; 

КонецФункции

 

Для начала, в блок переменных у нас попадет "Арг" с номером 0, и "Элемент" с номером 1. Потом, внезапно, у нас в блоке переменных появится переменная "0Элемент", которую добавит компилятор. Вам говорили, что имя переменной не может начинаться с цифры? Забудьте, это все вранье :) В байткоде вы легко можете создать переменную с именем "@#$&^%" и вам ничего за это не будет.

 А что же дальше? Дальше вот что, сначала на стеке временных переменных будет создана новая переменная и размещена в основном стеке:

 

PutTmp ; создаем пустую переменную
LdTmp ; кладем пустую переменную в стек

 

затем на стек будет помещена итерируемая коллекция (она лежит в переменной 0)

 

LdLoc 0 ; помещаем Арг на стек

 

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

 

Iter ; взять со стека значение Арг и получить от него объект-итератор.
Assign ;присваивание итератора в Tmp

 

Вот полный листинг указанной функции, лучше сверяться с ним при дальнейшем чтении:

 
 Много байт-кода

 

Мы находимся на адресе 5. Оператор Assign, берет со стека 2 аргумента - временную переменную и объект итератор. Итератор попадает во временную переменную.

Дальше идет последовательность операций:

 

LdLoc 2 ; загрузили на стек волшебную переменную 0Элемент
LdTmp 0 ; загрузили на стек итератор
Assign; записали итератор в переменную 0Элемент
LdLoc 2; опять загрузили 0Элемент на стек
Next; вызвали получение очередного элемента из переменной на стеке
JmpFalse 26 ; если это конец коллекции - переход на адрес очистки состояния цикла.

 

Следует подробнее остановиться на операторе Next. Он извлекает из итератора очередной элемент и записывает его в переменную, которая была на стеке в этот момент (0Элемент), эта переменная извлекается из стека, а на стек кладется значение Истина, если элемент был получен, или Ложь, если коллекция кончилась. Идущий следом JmpFalse съедает этот флаг и выполняет переход согласно логике цикла.

 

Итак, после операции JmpFalse у нас в переменной 0Элемент лежит значение элемента, во временном стеке лежит итератор. Зачем нужна чехарда с перекладыванием итератора из временных переменных в 0Элемент, а потом результата итератора опять в 0Элемент - я не понял. Можно же воспользоваться сразу переменной Элемент и складывать значение в нее…

 

Наконец-то можно приступить к телу цикла. Адреса 19-23 это тело цикла. Адрес 25 - Jmp на верхушку цикла, адрес 26 и далее - выход из цикла и чистка всех временных сущностей.

Особенно интересны операции с 27-й по 32-ю. Это очистка переменной 0Элемент, которая выполняется почему-то 2 раза. Наверное, если с первого раза присваивание Неопределено не сработало, то надо сделать еще одну попыточку… Кажется, мы имеем +3 ненужных операции на каждом цикле с итератором, помимо магии с 0Элемент в начале цикла. А может в этом есть тайный смысл, который я недопостиг, как знать…

 

Для сравнения, тот же самый код в 1Script выглядит следующим образом:

 

0  :(LineNum     3)
1  :(PushLoc     0)
2  :(PushIterator  0)
3  :(LineNum     3)
4  :(IteratorNext  0)
5  :(JmpFalse   12)
6  :(LoadLoc     1)
7  :(LineNum     4)
8  :(PushLoc     1)
9  :(ArgNum      0)
10 :(ResolveMethodProc  0)
11 :(Jmp         3)
12 :(StopIterator  0)
13 :(PushConst   1)
14 :(Return      0)

 

Имеем 15 операций байткода вместо 37. Такое сравнение нельзя считать корректным, т.к. не столько количество опкодов влияет на скорость, сколько время выполнение каждого конкретного опкода. И нельзя сказать, что циклы 1Script заведомо быстрее циклов 1С. Но байткод получился намного понятнее и прозрачнее.

Хардкор для сильных духом

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

 

Что такое исключение? Это, в первую очередь, прерывание текущего потока исполнения и переход либо вверх по стеку вызовов, либо в блок "Исключение" оператора "Попытка".

 

Во-первых стоит разобраться с тем, как 1С выполняет возврат из метода. Она применяет опкод BlckEnd сразу за которым идет Jmp на конец тела метода. По всей видимости, BlckEnd - это какой-то специализированный оператор очистки конца блока. При выходе из тела процедуры аргумент опкода BlckEnd всегда равен 0.

 

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


Попытка // 1
    Попытка // 2
        Попытка // 3
            Возврат 2; // BlckEnd 3

 

Т.е. "возврат" просто из тела процедуры - это BlckEnd 0, а "возврат" из Попытки - это BlckEnd <номер вложенности блока попытки>. Да, под словом "блок Попытка" я понимаю именно тот блок, который находится между словами Попытка и Исключение, т.е. я имею в виду "безошибочную" часть конструкции "Попытка Исключение".

Разбор конструкции Попытка-Исключение

Блок обработки ошибок открывается опкодом BeginTry, аргументом которого идет адрес начала блока Исключение. Т.е. при возникновении ошибки будет переход на тело обработчика. Далее, идет собственно код тела Попытка, а в его конце будет стоять BlckEnd <номер> и Jmp за пределы оператора КонецПопытки;

 

Рассмотрим байткод для следующего модуля:

Функция А()
    Попытка
       ;
    Исключение
       ;
    КонецПопытки;
КонецФункции

 

 

 

 

 

Адрес

Операция

Аргумент

Описание

 

0

BeginTry

4

Индекс шага в блоке Cmd раздела Исключение

 

1

LineNum

6

Начало строки кода

Номер строки в исходном модуле

 

2

BlckEnd

1

Окончания блока Попытка номер 1

 

3

Jmp

6

Переход за строку КонецПопытки

 

4

LineNum

6

Начало строки кода

Номер строки в исходном модуле

 

5

EndTry

0

КонецПопытки (конец блока Исключение)

 

6

LineNum

7

Начало строки кода

Номер строки в исходном модуле

 

7

End

0

Конец блока (процедуры, модуля)

 

8

End

0

Конец блока (процедуры, модуля)

 

9

End

0

Конец блока (процедуры, модуля)

 

 

Здесь все довольно прозрачно. Блок Попытка открывается оператором BeginTry и указанием адреса, куда перейти, если вдруг что случится (начало блока Исключение).

 

Далее идет тело блока (здесь отсутствует), а в конце оператор очистки BlckEnd и прыжок за пределы обработчика ошибок (адреса 2-3). Блок Исключение завершается оператором EndTry.

 

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

Самая вкуснятина

Ну а как же все это применить на практике? Как создать работоспособную обработку, написанную на чистом байткоде? Для этого, в обработке "Ассемблер" есть кнопка "Сохранить". Она позволяет сохранить в файл image весь код и описания констант-процедур, который вы введете в обработке, а затем с помощью v8unpack собрать готовый epf.

 

Сейчас мы сделаем одну интересную вещь, которую вы вряд ли увидите в другой ситуации.

 

Смотрите какая штука: у каждой коллекции есть итератор. Итератор это полноценный объект и размещается в том же самом стеке, что и другие переменные. Это значит, что с ним можно работать как с обычным (не-системным) значением, так ведь? Например, можно цикл "Для Каждого" переделать в примерно такой вариант:

 

Итератор = Массив.ПолучитьИтератор();

Пока Итератор.Следующий() Цикл
    Сообщить(Итератор.Значение);
КонецЦикла;

 

Представьте, что написали обфускатор, который все циклы "Для Каждого" превращает в "Пока-Следующий()". Декомпилировать такой код обратно в синтаксис 1С будет затруднительно, поскольку в синтаксисе 1С в принципе нет конструкций, позволяющих работать с итераторами напрямую!

 

Давайте проверим эту гипотезу. Откройте обработку "Ассемблер" и в разделе "Переменные" заведите любую переменную. Далее, в разделе константы заведите строковую константу со значением "Массив" - это будет имя типа который нам нужен. А в коде введите следующее:

 

Код

Пояснение

Читает со стека

Кладет  на стек

LdVar 0

 загрузили переменную-приемник

 

Переменную

ArgNum 0

в конструктор не будем передавать аргументов (ноль)

 

 

New 0

Вызвали конструктор типа, имя которого указано в константе 0

 

Массив

Assign

Присвоили массив в переменную на стеке

Правую часть присваивания и левую часть присваивания

Ничего

LdVar 0

Кладем на стек переменную с массивом

 

Массив

Iter

Получаем итератор

Массив

Итератор

ТипЗнч

проверим тип того, что лежит на стеке

аргумент ТипЗнч

Тип

ArgNum 1

Число аргументов, которые будем передавать в Сообщить

 

 

CallLoc 0

Вызовем процедуру Сообщить

Тип

 

End

Корректный выход

 

 

 

А теперь сохранитесь на всякий случай и нажмите кнопку "Запустить". У меня выводится слово "Итератор". Поняли что мы сделали? Мы сделали, чтобы "Сообщить(ТипЗнч(М))" выдавало слово "Итератор". Поищите-ка такой тип в синтакс-помощнике. Нету? А он - есть!

 

Об этой фишке мне рассказал Сергей Батанов (baton_pk, он же dmpas), я просто пересказал ее здесь, а все респекты за этот трюк должны идти ему :)

 

Disclaimer

Следует отдавать себе отчет в том, что вы действительно работаете на низком уровне системы, в котором не предусматривается присутствие пользователя. Если вы ошибетесь при вводе команд, будете работать не с теми адресами или значениями стека, то клиент 1С у вас будет аварийно завершаться. Это нормально, здесь за вас никто ничего контролировать и перепроверять не будет. Сама обработка "Ассемблер" тоже поставляется в образовательных целях. Она не является универсальным удобным редактором, там довольно мало проверок и подсказок по заполнению таблиц. Мне важно показать саму возможность управления байткодом. Ровно по этой же причине, код внутри обработки "Ассемблер" написан с нарушением почти всех мыслимых стандартов кодирования, просьба это учитывать.

К чему я это все

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

 

Творческих вам успехов!

 

P.S.

Исследование и документирование команд байт-кода, а также расшифровка значений "скобочного формата" модулей выполнены Валерием Агеевым (awa) незадолго до ухода. Без этого человека не случилось бы очень многих легендарных разработок в сообществе 1С. Я очень горд тем, что был с ним знаком лично.

313

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

Наименование Файл Версия Размер
1С:Ассемблер. Немного летнего веселья!:
.epf 34,10Kb
20.06.19
49
.epf 34,10Kb 49 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. artbear 1165 21.06.19 13:54 Сейчас в теме
Очередная крутая статья! Большое спасибо!
gubanoff; ice-net; Krio2; +3 Ответить
2. comol 4136 21.06.19 14:10 Сейчас в теме
Крутые у тебя "летние" развлечения :)). Это с какой то целью? Или "чистая наука".

P. S. меня не оставляет мысль что если для js сделали ts... То при наличии EDT для 1С можно сделать такой же 1С+. С блэкджеком и ш... ООП и строгой типизацией... Но птразбираышись так же в байькоде понял что Транслироваться оно должно в наивный 1С а не в 1С:Ассемблер
16. ArchLord42 69 21.06.19 19:53 Сейчас в теме
(2) Можно сделать свою обертку над 1Сным ЯП, но при этом нативный код будет не читабелен, как пример все те обработки по "Реализации ООП в 1С", которые реализуют ООП через жуткие конструкции
17. starik-2005 1979 21.06.19 19:56 Сейчас в теме
(16)
Реализации ООП в 1С
В принципе можно, ибо класс - это некий прототип со списком адресов методов и переменных. Если можно будет передавать адрес функции в итератор, то можно будет делать что-то типа "Обработать(Массив, МояФункция)" - уже только это будет круто!
50. kote 501 22.06.19 19:55 Сейчас в теме
(17)
то можно будет делать что-то типа "Обработать(Массив, МояФункция)" - уже только это будет круто!


https://infostart.ru/public/591496/
Evil Beaver; +1 Ответить
19. comol 4136 21.06.19 21:01 Сейчас в теме
(16) и хрен с ним. Если есть EDT и трансляция - можно не показывать наивный код
starik-2005; +1 Ответить
3. comol 4136 21.06.19 14:11 Сейчас в теме
Всё омрачила только инфа про Агеева. Жаль так и не был знаком лично :(((
awk; cleaner_it; +2 Ответить
6. Evil Beaver 6403 21.06.19 14:12 Сейчас в теме
(3) Реверс-инжиниринг байткода делал awa, статья сделана целиком по его материалу. Я не мог не упомянуть.
Kinestetik; sashocq; JohnyDeath; awk; fishca; cleaner_it; Labotamy; 🅵🅾️🆇; GreenDragon; kuntashov; +10 Ответить
4. pbazeliuk 1716 21.06.19 14:11 Сейчас в теме
5. comol 4136 21.06.19 14:12 Сейчас в теме
7. Evil Beaver 6403 21.06.19 14:13 Сейчас в теме
8. vandalsvq 1131 21.06.19 16:24 Сейчас в теме
Очень крутая статья, но видимо я немного для этого "туповат" ((((
9. Захаров_Николай 7 21.06.19 16:51 Сейчас в теме
Ценность этой информации может оценить только тот кто рыл пибайткод и составлял эти таблицы. Приятно было читать и понимать что шел правильным путем.
Андрей, спасибо.
10. capitan 1351 21.06.19 17:35 Сейчас в теме
Вспоминается...
Сдача в экзамена в автошколе:
Мужик получает зачетный лист.
Там оценки 5+++ восхитительно ! превосходно! Бесподобно!
Он естественно задает вопрос ???
Мастер ошалело смотрит и говорит:
- Вы кем работаете ?
- Гинекологом
- Тогда понятно. Комиссии очень понравились ваши теоретические знания матчасти, но когда вы поменяли свечи зажигания через выхлопную трубу...

Очень круто.

На самом деле декомпилятор не всегда нужен для воровства.
1. Для любопытства
2. Есть нехорошие разработчики, причем очень большого уровня, которые мало того что пишут говнокод код с ошибками, так еще и его паролят. И ты такой получаешь конфигурацию отраслевую полностью ккупленную со всеми этими косяками и ответом - ждите у моря погоды.
Тогда очень пригождается творение авы огромное оему спасибо на все века.
STEPPRK; dyuha; ice-net; Aitbay; klinval; m_aster; vadver; RibD; Kinestetik; AllexSoft; vvh74; sashocq; fvadim; Ziggurat; Jeka44; saver77; Dementor; info1i; Evil Beaver; bulpi; +20 1 Ответить
11. bulpi 158 21.06.19 18:35 Сейчас в теме
ОФИГЕТЬ !!!!
Хотел даже добавить призовые плюсы, но
Брат, я по машине вижу, тебе деньги не нужны (с) Мама не горюй
По рейтингу видно , что незачем :)
for_sale; +1 Ответить
18. Evil Beaver 6403 21.06.19 20:08 Сейчас в теме
(11)как это незачем? Понравилось - плюсуй!
Kinestetik; cssprite; Marsel; Labotamy; +4 Ответить
42. bulpi 158 22.06.19 12:36 Сейчас в теме
(18)
Плюсуй - то понятно. Есть еще возможность добавить вознаграждение за статью, оторвав от себя. Я это имел в виду.
12. for_sale 815 21.06.19 19:32 Сейчас в теме
Сижу я такой целый день с утра, ковыряюсь в байткоде, чтобы понять, как оно работает - и тут на тебе! Как будто второй день рождения))) Огромное спасибо!

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

Да и вообще - обфускаторы не в 1С придуманы, в джаваскрипте том же самом попробуй ещё найди не обфусцированный код. jQuery тот же, да и практически любая библиотека там идёт обфусцированной.
AllexSoft; d.zhukov; +2 Ответить
13. ArchLord42 69 21.06.19 19:41 Сейчас в теме
(12) в JS не обфусцируют, а минифицируют, +- примерно тоже самое, только цель стоит другая, уменьшить размер конечного бандла, там просто пробелы, переносы строк и названия переменных делаются как можно меньше, поэтому переменные \ методы \ классы все называются "а, b, c" и тд, так разрмер JS довольно сильно уменьшается и скорость загрузки сокращается.
В общем если вы видите не "обфусцированный" JS в браузере, то фронтендерам данного проекта наоборот надо настучать)

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

https://github.com/jquery/jquery/tree/master/src
AllexSoft; for_sale; zeegin; +3 Ответить
21. for_sale 815 21.06.19 21:29 Сейчас в теме
(13)
Да, спасибо) Я не стал в это углубляться в комменте, понятное дело, что jQuery - это открытый продукт и именно у них это не обфускация, спасибо за уточнение! Хотя я часто встречаю именно обфусцированный джаваскрипт, в основном на комм. сайтах, интернет-магазинах и т.п., больше это имел в виду, но вы правы, пример неудачный выбрал.

Но вопрос остаётся открытым - как быть с воровством программных продуктов в 1С? Потому что неприятие сокрытия исходного кода в 1С я слышу постоянно, но воспринимаю это больше как неспособность или нежелание признавать возможность создания коммерческих продуктов в 1С. В пример часто ставится сама 1С, которая не закрывает свой код, но при этом упускается главная деталь - у 1С совсем другая ситуация и другая бизнес-модель.
23. 🅵🅾️🆇 438 21.06.19 21:54 Сейчас в теме
(21) Выносите часть логики в сервис или внешнюю компоненту.

Пользуйте вайзэдвайз или нетленку)
27. Evil Beaver 6403 21.06.19 23:57 Сейчас в теме
(23)вайз это фирма же. Как ее пользовать? И что за нетленка?
29. Evil Beaver 6403 22.06.19 00:11 Сейчас в теме
(28) получается, что вайзы делают как раз то, о чем я писал - меняют байткод, чтобы паттерн-матчер декомпилятора не узнавал конструкции. А еще можно всем именам переменных присвоить одно и то же имя "&=!жулик-не-воруйБLe@4Ь", вместо процедур сделать линейный код с джампами, ну и всякое такое :))
🅵🅾️🆇; +1 Ответить
30. 🅵🅾️🆇 438 22.06.19 00:12 Сейчас в теме
(29) Угу, и все это дело, вроде как, подкрепляют hasp ключиками.
34. for_sale 815 22.06.19 00:33 Сейчас в теме
(29)
А интерпретатор не обвалится на одинаковых именах переменных?
37. Evil Beaver 6403 22.06.19 08:32 Сейчас в теме
(34) если в модуле нет Вычислить или Выполнить, то не отвалится. Имена переменных нужны только для динамической компиляции этими операторами
65. ValeriVP 1016 24.06.19 13:01 Сейчас в теме
(37) отвалится. 1С не переваривает одинаковые имена в байт-коде.
Evil Beaver; +1 Ответить
104. Evil Beaver 6403 05.07.19 17:36 Сейчас в теме
(65) Нуу, может быть, я не пробовал. Хорошо, пусть будут разные, по вида "@#$-Цифра"
31. for_sale 815 22.06.19 00:23 Сейчас в теме
(23) с их ценами проще своё сделать) что и было сделано.
А вот внешние компоненты я и правда не понимаю. Может я просто не умею их правильно готовить, но всё же хочется, чтобы всё было в одном месте, а не создавать франкенштейна. Это я ещё скромно умолчал о том, что я просто не умею их писать, соответственно, как минимум вначале нужно ещё кучу времени потратить на это)
32. 🅵🅾️🆇 438 22.06.19 00:26 Сейчас в теме
(31) Ну у нетленки, вроде, вполне адекватный ценники, начиная с 7500 руб/год.
Сам я не пользовал, что могу - под MIT лицензией, остальное попадает под NDA)
33. for_sale 815 22.06.19 00:32 Сейчас в теме
(32)
От 12500 и то, там какая-то самая базовая защита, байт-код начинаеся от 17500. В год. Я уж не говорю о том, что, например, их онлайн тестер даже имена переменных не меняет. В общем, мы себе сваяли довольно неплохой обфускатор, плюс постоянно его дорабатываем, много идей уже реализовано, много ещё в планах, плюс он у нас как часть автосборки идёт.
35. 🅵🅾️🆇 438 22.06.19 00:34 Сейчас в теме
(33) Тама с верху есть радиокнопочки)


Я и не аггитирую "за" или "против".
Сам не использую, просто знаю, что такие услуги предоставляются.
Давно видел тред на мисте, там автор как раз анонсировал этот функционал и сказал, что делает сайт, тк боится, что "скомуниздят" штуку, которая призвана защищать от "скомуниздинга")
36. for_sale 815 22.06.19 00:42 Сейчас в теме
(35)
Мда, и правда радиокнопочки))) Не заметил

Но всё равно - не тянет покупать. Во-первых, в год действительно дорого даже 12500 (байт-код начинается оттуда), во-вторых, опять же, онлайн демонстрация не впечатлила. Может, полная версия круче, но тогда зачем делать онлайн демонстрацию хуже полной версии? Да и затягивает процесс самообфускации)) Начинал со старой обработки из открытого доступа, поправил ошибки, добавил примочки, потом кодировка строк и пошло-поехало)) Сегодня, вот, какую-никакую защиту байт-кода от великого и могучего декомпилятора от awa прикрутили, дальше надо будет её автоматизировать, а ещё вот автор статьи подкинул теперь такое поле для размышлений, обработку я уже скачал, надо будет тоже всё это штудировать.
🅵🅾️🆇; +1 Ответить
64. ValeriVP 1016 24.06.19 12:58 Сейчас в теме
(31) За эту цену (до недели работы программиста, даже в провинции) вы получаете не только инструмент, который работает сразу и стабильно, с минимальными затратами Вашего времени, но так же получаете бесплатные консультации и обновления с учетом изменений платформы
68. for_sale 815 24.06.19 13:35 Сейчас в теме
(64)
Где-то находил информацию о том, что кто-то уже умеет декомпилировать такой код (не помню, нетленки или вайса) и автор (вы?) якобы признал, что алгоритм слабый и обещал исправить. Плюс писалось, что там много каких-то требований к коду - наименования процедур-функций-переменных и прочие заморочки.

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

С другой стороны я уже сам умею обфусцировать байт-код так. чтобы декомпилятор отваливался, т.е. без дополнительного анализа или других инструментов код раскрыть невозможно. Плюс сам код обфусцирован, т.е. даже в декомпилированном виде он выглядит не очень приятно:) Также всё это встроено в общий цикл формирования релиза и тестирования. Даже парочку своих интересных мыслей внедрили по поводу обфускации и лицензирования.

Поэтому какой смысл мне сейчас платить эту цену?
77. ValeriVP 1016 24.06.19 14:23 Сейчас в теме
(68) Если у вас уже есть инструмент, который вас полностью устраивает, то мое мнение - не имеет особого смысла менять его на другой, вне зависимости от цены.

Другое дело, что есть затраты на разработку и поддержку такого решения.
Ваши затраты на разработку уже многократно превзошли стоимость тиражного решения.
При этом ваше решение 99% не имеет документации и поэтому новому разработчику будет труднее адаптироваться к работе с вашей самописной системой.(68)
85. for_sale 815 24.06.19 17:14 Сейчас в теме
(77)
Проблема в том, что цена на продукт обычно берётся из воздуха. Почему 12500? Почему не 200 тысяч или не 2 тысячи? Почему в год, а не в месяц или не разовая плата? Проводился какой-то анализ? Я без претензии, почти любой продукт (если это не Виндоус какой-нибудь или не БМВ) так запускается. Но, анализируя цену, предполагаемое качество, плюсы-минусы и затраты на покупку было принято решение - слишком дорого.

Да, затраты сейчас уже превысили 12500 (не на много), но, во-первых, это разовые затраты и это не надо платить раз в год (ведь на следующий год затраты бы составили минимум 25000 плюс повышение цены, ещё через год это будет уже тысяч 40 с учётом повышения цены и так далее, как ни крути, а в какой-то момент, какими бы не были затраты, они перекроются ценой стороннего решения), во-вторых, получился продукт именно под себя (как сшитый костюм), в-третьих, некоторые разработанные механизмы вообще довольно полезны сами по себе, их можно применить как для повышения качества обфускации, так и для некоторых других вещей внутри основного продукта да и в целом в работе 1С-программиста. В-четвёртых и очень даже в-одном-из-самых-главных, как я уже выше говорил, сама идея отправлять куда-то то, что ты пытаешься скрыть, уже делает очень странным и даже неприемлимым использование такого механизма. Если обфукация такая качественная - что мешает поставлять её конечным пользователям, а не СааС? Получается, "мы очень-приочень качественно обфусцируем ваш продукт за немалые деньги, только вы его, во-первых, нам пришлите открытым, во-вторых, мы не можем собственное решение обфусцировать так, чтобы его не украли, но предлагаем услуги обфускации вам".

По поводу документации - у нас большое внимание уделяется качеству кода. Обфускация говнокодом у нас не применяется)) Поэтому код довольно самопоясняемый, если вдруг возникнет такая нужда, можно будет документацию набросать. В контексте обсуждаемого вопроса документация вообще не имеет никакого отношения, потому что при покупке вашего (насколько я понял), продукта, у нас не будет ни документации, ни кода.
88. ValeriVP 1016 24.06.19 17:55 Сейчас в теме
(85) Цена рождается из баланса затрат на создание, спроса и цен конкурентов.

Да, затраты сейчас уже превысили 12500 (не на много)

Вы потратили три дня (из расчета минимальной ЗП программиста 1С в 5000р/день) на создание обфускатора? С учетом изучения методик работы с cf, с байткодом, ...? Тогда вы гений, и интересно что вы делаете на этом форуме...
Или же вы просто ошиблись в ноликах?

разовые затраты и это не надо платить раз в год

Мы предлагаем свое решение (http://www.v8-zk.ru/) как разовую покупку.

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

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

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

Мы поставляем инструмент конечным пользователям.

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

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

Кроме того, наша система умеет автоматически интегрировать в защищаемый код защиту от не лицензионного использования на базе промышленных систем лицензирования HASP SRM HL/SL, HASP SL LaaS или Guardant Sign/SP. И этот функционал входит в стоимость единоразовой покупки и не требует знакомства разработчика 1С с методиками и практиками работы с системами лицензирования.
90. for_sale 815 24.06.19 18:20 Сейчас в теме
(88)
Цена рождается из баланса затрат на создание, спроса и цен конкурентов.

Ну так я так и сказал - из воздуха. Или может быть, вы проводили какое-то масштабное исследование спроса и баланса затрат? Цены конкурентов принимались за константу ("уж они-то точно провели масштабное исследование!")? Видимо, исследование было не настолько масштабным, чтобы захватить нас, вашу целевую группу, потому что ваше решение, которое ещё дороже (17500), нам показалось дороговатым.

Вы потратили три дня (из расчета минимальной ЗП программиста 1С в 5000р/день) на создание обфускатора?

Внимательно почитайте, я там выше писал, откуда у нас обфускатор и как начиналась наша работа над ним.

(88)
Мы предлагаем свое решение (http://www.v8-zk.ru/)

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

(88)
С учетом изучения методик работы с cf, с байткодом, ...?

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

(88)
и интересно что вы делаете на этом форуме...

Да вот, на ваши обидки о том, что у вас не купили ваше решение, отвечаю. Вы не против?

(88)
Мы же поставляем свой продукт с качественной документаций и потребности смотреть код просто нет.

Очень рад за вас, так держать.
91. ValeriVP 1016 24.06.19 18:31 Сейчас в теме
(90)
проводили какое-то масштабное исследование спроса и баланса затрат

да, конечно.

(90)
Значит это о вашем решении писали, что есть механизмы обхода

когда-то писали. а мы - читали. и соответственно меняли систему.

(90)
целая вязанка требований к коду (имена переменных, функций и т.п.)

нет, никаких таких требований наша система не предъявляет.

(90)
ваши обидки

у меня нет обидок :) - я просто рассказываю чем любой тиражный продукт лучше самописного.
92. for_sale 815 24.06.19 18:33 Сейчас в теме
(91)
я просто рассказываю чем тиражный продукт лучше самописного.


А я вам рассказал, чем самописный продукт лучше тиражного :) Думаю, на этом можно и закончить обмен мнениями.
14. 🅵🅾️🆇 438 21.06.19 19:42 Сейчас в теме
(12)
Да и вообще - обфускаторы не в 1С придуманы, в джаваскрипте том же самом попробуй ещё найди не обфусцированный код. jQuery тот же, да и практически любая библиотека там идёт обфусцированной.


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


(0)
Маэстро как всегда, снимаю шляпу. В закладки, если судьба сведет с реверс-инжинирингом 1с, обязательно почитаю.
for_sale; +1 Ответить
22. for_sale 815 21.06.19 21:31 Сейчас в теме
(14)
Да, верно подмечено, я выше описал, что я имел в виду.
15. starik-2005 1979 21.06.19 19:50 Сейчас в теме
Маладца! Только это не совсем ассемблер 1С - это байт-код. А вот мнемоника байт-кода - это ассемблер, все верно. Ну это чтобы народ не путал.
ЗЫ:1С-ный байт-код работает примерно в 10 000 раз медленнее, чем ассемблер. Очень плохая ВМ, очень плохая! )))
ЗЫЗЫ: на картинке "hello, world" на асме для Linux. При том с ошибочкой - длина строки на 2 больше, чем есть. Должно упасть.
20. kurdt88 21.06.19 21:14 Сейчас в теме
Спасибо, статья интересная и полезная всем. Узнал о менеджере chocolatey что тоже отлично. Скажи а где почитать более подробно про судьбу и творчество Валерия Агеева?
26. Evil Beaver 6403 21.06.19 23:19 Сейчас в теме
(20)на инфостарте и почитайте, разработки посмотрите
24. fishca 1163 21.06.19 22:06 Сейчас в теме
Юбилейный плюсик (100). Огромное спасибо за подачу материала, бесценного материала, на который было потрачена уйма времени.
25. script 208 21.06.19 23:03 Сейчас в теме
38. dmitry1975 216 22.06.19 08:55 Сейчас в теме
Очень интересно читать! Спасибо!
39. Denis_CFO 35 22.06.19 09:57 Сейчас в теме
ОГРОМЕННОЕ спасибо за статью!
И большой респект AWA, Baton_pk и остальным, кто принимал в этой участие.
40. Dementor 612 22.06.19 10:47 Сейчас в теме
(0) Спасибо за материал и за обработку. Когда-то на ваших "закрытых" обсуждениях нарыл файлик с табличкой от AWA с описания кодов инструкций, но все времени не было погрузится в тему... И никто финансово не предлагал стимулировать :)

У меня вопрос по каркасной обработке в макете. То, что там и в "скомпилированных" обработках после указания правильного пароля, показывает пустой экран с отсутствием исходного кода - это нормально? Хотелось бы все же увидеть результаты "компиляции" в виде 1С-кода.
43. Evil Beaver 6403 22.06.19 13:32 Сейчас в теме
(40)вопрос не понял. В макете лежит болванка внешней обработки, ее модуль пуст потому что именно его вы и пишете на байткоде..
46. Dementor 612 22.06.19 13:56 Сейчас в теме
(43) я открываю в конфигураторе work.epf из темпа, ввожу пароль и вижу пустоту, но при выполнении сообщения выводятся. Сейчас подумал, что это нормально, так как в вашей обработке нет декомпилятора, который создал бы файл module. Нужно подумать над объединением двух обработок. Или трех...

Еще раз спасибо за удобный инструмент.
41. Dementor 612 22.06.19 11:55 Сейчас в теме
Для сравнения, тот же самый код в 1Script выглядит следующим образом:
0 :(LineNum 3)
1 :(PushLoc 0)
2 :(PushIterator 0)
3 :(LineNum 3)

Две строчки с номером 3 - это не баг, а фича?
44. Evil Beaver 6403 22.06.19 13:33 Сейчас в теме
(41) да, это именно фича. LineNum отвечает еще и за точки в которые можно шагать отладчиком. В одной строке текста может быть несколько мест остановки при "шагании"
45. sanjakaiser 22.06.19 13:35 Сейчас в теме
Жизнь слишком коротка, чтобы на всем этом программировать :)
49. Evil Beaver 6403 22.06.19 19:47 Сейчас в теме
(45) это не для программирования, это для обучения
47. Brawler 453 22.06.19 14:25 Сейчас в теме
Про декомпиляторы изволю не согласиться, что с их помощью только воруют. Жизненная ситуация, приобретены доработки в УПП, еще в лохматых годах, а контора разработчик уже сдулась. Код запаролен и обфускатором прогнан. Декомпилятор помог восстановить в каком-то виде код, где мы нашли ошибки и устранили их, после чего система смогла дальше функционировать. Закон это не запрещает делать.
48. PerlAmutor 47 22.06.19 19:19 Сейчас в теме
Было бы интересно преобразовать байткод 1С (BSL - Binary Source Language?) в байткод WebAssembly и сравнить их производительность.
60. starik-2005 1979 24.06.19 10:28 Сейчас в теме
(48)
в байткод WebAssembly и сравнить их производительность.
Ну как бы проект "вебассемблера" был основан, в частности, на проекте Native Client, а он может работать не сильно медленнее нативного ассемблера системы:
Native Client (NaCl) — технология песочницы для запуска кода на платформах x86, x86-64, ARM и MIPS, позволяющая безопасно запускать машинный код непосредственно в браузере независимо от операционной системы со скоростью, приближённой к запуску машинного кода. Эта технология также может быть использована для создания защищённых плагинов для браузера, частей какого-либо приложения либо самих приложений[4], например ZeroVM[en].
Так что 1С со своей реализацией стековой машины типа отдыхает. Даже питон работает в 20 раз быстрее, чем 1С (правда у питона есть PyPy, который еще в 20 раз может ускорить выполнение кода, что уже в 400 раз превосходит 1С), поэтому у 1С нет шансов.
51. Perfolenta 184 22.06.19 21:32 Сейчас в теме
Статья интересная и в принципе может привести к созданию обработок 1С "налету"... например из кода OneScript кросс-компилятором в обработку 1С... благо, Андрей старается сохранить совместимость языка с 1С на высоком уровне...
52. Evil Beaver 6403 23.06.19 08:34 Сейчас в теме
(51) Создание обработок "на лету" уже давно применяется в инструментах тестирования. И для этого необязательно знать байткод
53. Perfolenta 184 23.06.19 11:51 Сейчас в теме
(52) век живи, век учись... не знаю как создать epf файл "на лету"... нагуглить по-быстрому не удалось... если не трудно, намекните хотя бы куда копать...
знать байткод действительно не обязательно, метод Выполнить обычно решает все проблемы... просто интересно..
54. Evil Beaver 6403 23.06.19 13:42 Сейчас в теме
(53) скачайте обработку из статьи и посмотрите, как она это делает. Или скачайте Vanessa Behavior и посмотрите, как она это делает. Если не получится ни так ни эдак - могу проконсультировать вас лично за скромную сумму.
57. Perfolenta 184 24.06.19 00:13 Сейчас в теме
(54) Большое спасибо, разобрался... извините, что лишил вас скромного заработка... :)
59. Evil Beaver 6403 24.06.19 08:53 Сейчас в теме
(57) вот видите как классно я умею мотивировать на саморазвитие!
jif; SirStefan; user811769; +3 Ответить
61. Perfolenta 184 24.06.19 10:30 Сейчас в теме
(59) не мой случай... меня на саморазвитие мотивировал товарищ Самоделкин... если вы в курсе кто это... а затем журналы Юный техник, Юный натуралист, Техника молодежи, Наука и жизнь... и много умных советских людей... включая моих родителей... теперь моя очередь мотивировать молодежь...
а вы просто помогли добыть еще одну маленькую крупинку знаний... за что я вас и поблагодарил...
55. dmarenin 244 23.06.19 17:21 Сейчас в теме
ждем статью по методам оптимизации 1с байткода(source -> byte code). напишем свой 1с интерпретатор.
56. Evil Beaver 6403 23.06.19 18:13 Сейчас в теме
(55) вообще-то он уже написан :) http://oscript.io

А если серьезно то оптимизация байткода вряд ли "стоит выделки" В 1С самая замедляющая часть - это запросы и параллельность. Особенно, если их писать кривыми руками. А байткод - это жалкие процентики, имхо
AllexSoft; Fox-trot; acanta; +3 Ответить
58. Perfolenta 184 24.06.19 00:25 Сейчас в теме
(56) оптимизация байткода мало что даст просто потому, что 1с его очень медленно исполняет... легко написать код, который в 500 и более раз медленнее на 1с выполняется, чем аналогичный код на компилируемом языке... представляете, вместо суток ждать полтора года!
62. starik-2005 1979 24.06.19 10:32 Сейчас в теме
(56)
А байткод - это жалкие процентики, имхо
Ну вот мерили мы в соседней теме производительность простого цикла в цикле - никаких запросов. 1С 27 сек, питон - 1,9 сек(если чуть переписать - 1,16 сек), PHP - 0,3 сек, PyPy - 0,18 сек, С++ - 0,016 сек, ассемблер - 0,05 сек. Так что даже и не знаю, почему ВМ 1С такое УГ...
63. Perfolenta 184 24.06.19 10:48 Сейчас в теме
(62) так это мы с вами еще простой пример рассматривали... когда я добавляю в него немного условных операций и присваиваний, все становится еще печальней...
66. tsukanov 57 24.06.19 13:31 Сейчас в теме
(63) Сравнивал на достаточно емких задачах с Lua. 1С примерно в 40 раз медленнее.
67. starik-2005 1979 24.06.19 13:35 Сейчас в теме
(66)
1С примерно в 40 раз медленнее чем Lua.
Есть мнение, что если написать на 1С в одну строку, то будет сильно быстрее (по крайней мере получается что-то всего в 6 раз медленнее питона, в 25 раз медленнее PHP (7), в 50 раз медленнее PyPy - откомпилированного оттранслированного в С питона. Lua была достаточно быстра в плане JIT-компиляции, так что можно думать, что в 20 раз точно.
69. tsukanov 57 24.06.19 13:38 Сейчас в теме
(67) Не будет. Проверялось неоднократно. Переписывание в одну строку ощутимо влияет только на режим отладки.
Я говорил про интерпретатор Lua.
LuaJit то вообще со скоростью C фигачит в ряде кейсов.
70. starik-2005 1979 24.06.19 13:42 Сейчас в теме
(69)
Переписывание в одну строку ощутимо влияет только на режим отладки.
Это неверное утверждение. Вот конкретный пример прикладываю. 8 секунд в одну строку, 26 - в несколько строк. В итоге в 4 с лишним раза разница.
Прикрепленные файлы:
FIB.epf
71. tsukanov 57 24.06.19 13:46 Сейчас в теме
(70) Это слишком маленький синтетический кейс. На больших задачах это замыливается.
Видимо что-то тормозит еще больше )
72. starik-2005 1979 24.06.19 13:47 Сейчас в теме
(71)
На больших задачах это замыливается.
Как-то занимался паспортами недействительными - 120кк штук. Вот там как раз одна строка очень сильно помогла в плане производительности. Это как раз большая задача была.
73. tsukanov 57 24.06.19 13:49 Сейчас в теме
Ну, значит вы сможете улучшить одну штуку )
Кину вам в личку.

add: блин, а как тут в личку писать?
74. starik-2005 1979 24.06.19 13:51 Сейчас в теме
(73)
вы сможете улучшить одну штуку
Посмотрим...
75. tsukanov 57 24.06.19 13:54 Сейчас в теме
(74) Не отправляются вам сообщения (

Видимо не судьба
79. ValeriVP 1016 24.06.19 15:13 Сейчас в теме
(70) повторил эксперимент, постарался избавиться от загрязняющих результат факторов.

Подтверждаю, этот код (т.е. непосредственно математика) в одну строку работает быстрее. Но не в несколько раз, а на 22%.
При этом выполняемый байт-код не отличается.

Так же эксперимент показал сильное влияние отладчика на результат (разница действительно в несколько раз).

Таким образом можно сделать вывод - разница производительности кода в одну строку и нормального - из-за внутренних механизмов процесса отладки.

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

Пароль: 1
Прикрепленные файлы:
FIB.epf
80. tsukanov 57 24.06.19 15:26 Сейчас в теме
(79)
от загрязняющих результат факторов

Это каких?
81. ValeriVP 1016 24.06.19 15:28 Сейчас в теме
(80) например выполнение на клиенте и не однородность внешних факторов (таких как загрузка процессора остальными задачами, ...)
82. tsukanov 57 24.06.19 15:31 Сейчас в теме
(81) Хех, глаз алмаз ) Я этого не заметил. Спасибо

add: Хм, нууу на сервере результат не изменился. 6 сек. против 40 сек. на моей машине
93. ValeriVP 1016 24.06.19 18:54 Сейчас в теме
94. tsukanov 57 24.06.19 19:12 Сейчас в теме
(93) Нет

Пардон, похоже таки была в тот момент.
Да, разница как вы сказали.
95. ValeriVP 1016 24.06.19 19:21 Сейчас в теме
(94) база файловая?
Если серверная - возможность отладки указывается в параметрах службы. Точно нет отладки?
96. tsukanov 57 24.06.19 19:26 Сейчас в теме
(95) Написал уже. Файловая у меня.
Видимо была таки включена.
Теперь разница небольшая стала
84. Mr.Rm 24.06.19 17:03 Сейчас в теме
(79) Байт-код двух процедур отличается параметрами в командах LineNum. В первой он постоянный, везде {1,3}, а во второй - меняется соответственно номеру строки. Значит, где-то в недрах ВМ 1С есть что-то подобное:
if ( currentLineNum == prevLineNum ) 
{
  // какой-то код
}
else
{
  // другой код, на 22% медленнее
}
Показать

C учётом режима отладки, конечно.
99. starik-2005 1979 24.06.19 21:40 Сейчас в теме
(79)
Подтверждаю, этот код (т.е. непосредственно математика) в одну строку работает быстрее. Но не в несколько раз, а на 22%.
При этом выполняемый байт-код не отличается.
Дома попробовал:
8 102
50 095 301 248 058 391 139 327 916 261
8 110
50 095 301 248 058 391 139 327 916 261
8 125
50 095 301 248 058 391 139 327 916 261
12 743
50 095 301 248 058 391 139 327 916 261
12 682
50 095 301 248 058 391 139 327 916 261
12 659
50 095 301 248 058 391 139 327 916 261
Т.е. первая процедура в одну строку работает повторяемо за 8,1 секунд (высокая производительность), вторая процедура - за 12,6-12,7 секунд, т.е. не на 20%, а на овер 50% быстрее. Предположу, что тормоза - это следствие отслеживания контекста для техжурнала, функции которого вызываются для каждой строки интерпретируемого байт-кода с целью связывания байт-кода и фактической строки.
100. Mr.Rm 25.06.19 10:47 Сейчас в теме
(99) Ещё небольшой эксперимент, в подтверждение очевидного.
Исходно: 8.3.14.1565 x32, локальная файловая база, пустая конфигурация, техжурнала нет, оригинальный FIB.epf, среднее по 5 запускам.
Обычный запуск: Go ~4.17, Go2 ~5.71
Режим отладки: Go ~4.19, Go2 ~50.9 (!)

А теперь убираем из байт-кода все LineNum (разумеется, пересчитав смещения переходов и точки входа).
И получаем ~3.96 для обеих процедур в любом режиме.

Т.е. ускорение составит от незначительных 5% для однострочной процедуры до 30% для многострочной.

Для сравнения, OneScript даёт ~3.91 для Go и ~3.98 для Go2
Evil Beaver; starik-2005; +2 Ответить
101. starik-2005 1979 25.06.19 10:52 Сейчас в теме
(100) теперь мы знаем как учкорить 1С!)))
102. Evil Beaver 6403 25.06.19 11:00 Сейчас в теме
(100) простите мне мое невежество, а что такое Go и Go2?
103. Mr.Rm 25.06.19 11:03 Сейчас в теме
(102) Это процедуры в приведенной выше тестовой обработке FIB.epf.
76. Evil Beaver 6403 24.06.19 14:05 Сейчас в теме
(62) а методику сравнения можно посмотреть? Чтобы код Питона vs код 1С рядом?
78. tsukanov 57 24.06.19 15:02 Сейчас в теме
86. Evil Beaver 6403 24.06.19 17:42 Сейчас в теме
(78) Чует мое сердце, тут меряют что-то сами не понимая что. В кучу и строковые операции и БигДецималы и чопопало ваще...
89. tsukanov 57 24.06.19 18:14 Сейчас в теме
(86) Строковые? Ввод вывод может быть?

Ну в любом случае там сравнение не совсем честное, да. Понятно биг децималы медленнее будут.
Оставьте свое сообщение

См. также

Альтернативный способ добавления элементов и реквизитов на формы 34

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 ERP2 УТ11 Россия Абонемент ($m) Работа с интерфейсом

Предлагаю альтернативный вариант добавления динамически создаваемых элементов и реквизитов на форму.

1 стартмани

09.09.2019    4094    6    bmk74    0       

Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!

29700 руб.

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

Вам нравятся запросы в 1С? 14

Инструменты и обработки Программист Конфигурация (md, cf) v8 v8::Запросы 1cv8.cf Абонемент ($m) Практика программирования Разработка

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    11335    1    m-rv    79       

Модель объекта 10

Инструменты и обработки Программист Конфигурация (md, cf) v8 Абонемент ($m) Инструментарий разработчика

Подсистема позволяет описать модель данных объекта, где описана зависимость между реквизитами, и затем использовать эту модель в разных сценариях работы с объектом. Версия платформы: 8.3.6 и выше. С небольшими доработками будет работать на 8.2.

1 стартмани

30.06.2019    4583    1    vadim1980    0       

Онлайн-интенсив "Бизнес-процессы для подготовки к экзамену 1С:Специалист по платформе" 12 декабря 2019 г. Промо

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

777 рублей

Цифровая подпись Cades-BES для XML средствами 1С с помощью КриптоПро 6

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Россия Windows Абонемент ($m) Защита и шифрование

Обработка иллюстрирует возможность подписания XML SOAP-конверта по стандарту Cades-BES средствами 1С с помощью внешней компоненты КриптоПРО "CAdESCOM" с учетом ГОСТ 2001 и ГОСТ 2012. Стандарт используется в различных механизмах государственных сайтов России, в том числе в СМЭВ и ГИС ЖКХ. Код не привязан к прикладному решению может быть встроен куда угодно, но только на платформе Windows.

1 стартмани

13.05.2019    4366    12    PythonJ    25       

Быстрый запрос 42

Отчеты и формы Программист Пользователь Внешняя обработка (ert,epf) v8 v8::УФ 1cv8.cf Абонемент ($m) Универсальные обработки

Можно ли дать пользователю "удочку", а не "рыбу"? До сих пор ответ на этот вопрос был отрицательным. Всякий инструмент, который мог бы делать с базой данных все или почти все (или хотя бы многое), отвергался пользователями, как слишком сложный. Вспомните тот же SQL, который изначально разрабатывался именно как пользовательский инструмент. "Быстрый запрос" - это попытка устранить сложность, но сохранить при этом универсальность.

1 стартмани

29.04.2019    7428    15    mkalimulin    28       

Программы для исполнения 488-ФЗ: Маркировка товаров Промо

1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.

Безопасная работа с транзакциями во встроенном языке 190

Статья Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    17577    8    tormozit    44       

Трудовой договор, Дополнительное соглашение, Лист ознакомления, Договор о материальной ответственности, Договор о коммерческой тайне, Согласие на обработку персональных данных для ЗУП 3.1 18

Отчеты и формы Бухгалтер Внешняя обработка (ert,epf) v8 v8::СПР ЗУП3.x Россия БУ Зарплата Управление персоналом (HRM) Абонемент ($m) Печатные формы документов

Комплект печатных форм для отдела кадров для документов Прием на работу и Кадровый перевод: Трудовой договор, Доп. соглашение к трудовому договору, Лист ознакомления с локальными нормативными актами, Договор о полной материальной ответственности, Договор о неразглашении коммерческой тайны, Согласие на обработку персональных данных.

2 стартмани

12.03.2019    15056    81    Asenka    5       

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 562

Инструменты и обработки Программист Конфигурация (md, cf) v8 1cv8.cf Абонемент ($m) Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

1 стартмани

31.01.2019    31119    281    bonv    117       

Редактор объектов информационной базы 8.3 44

Инструменты и обработки Программист Пользователь Внешняя обработка (ert,epf) v8 v8::УФ 1cv8.cf Россия Windows Абонемент ($m) Инструментарий разработчика Универсальные обработки

Универсальная внешняя обработка (СДРОбъектУпр) для редактирования реквизитов и табличных частей объектов информационной базы, редактирование движений документов. Доступ ко всем реквизитам объектов, есть возможность выгрузки и загрузки данных (объекты и движения документов) через XML. Платформа 8.3, управляемые формы. Версия 1.1.0.35 от 25.11.2019

2 стартмани

23.01.2019    11991    155    ROL32    28       

1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.

6500 рублей

Расширение "Курсы валют в формулах расчета динамических цен" для УНФ 1.6 5

Инструменты и обработки Программист Пользователь Архив с данными v8 УНФ УУ Ценообразование, анализ цен Абонемент ($m) Ценообразование, прайсы

Расширение "Курсы валют в формулах расчета динамических цен" с автоматическим пересчетом цен при изменении курсов валют для конфигурации "Управление нашей фирмой, редакция 1.6"

5 стартмани

17.01.2019    6669    13    Palmer1976    4       

Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019) 178

Инструменты и обработки Программист Архив с данными v8 v8::Mobile БУ УУ Android Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ Абонемент ($m) Инструментарий разработчика Сканер штрих-кода Терминал сбора данных Мобильная разработка

Simple WMS Client – это визуальный конструктор мобильного клиента для терминала сбора данных(ТСД) или обычного телефона на Android. Приложение работает в онлайн режиме через интернет или WI-FI, постоянно общаясь с базой посредством http-запросов (вариант для 1С-клиента общается с 1С напрямую как обычный клиент). Можно создавать любые конфигурации мобильного клиента с помощью конструктора и обработчиков на языке 1С (НЕ мобильная платформа). Вся логика приложения и интеграции содержится в обработчиках на стороне 1С. Это очень простой способ создать и развернуть клиентскую часть для WMS системы или для любой другой конфигурации 1С (УТ, УПП, ERP, самописной) с минимумом программирования. Например, можно добавить в учетную систему адресное хранение, учет оборудования и любые другие задачи. Приложение умеет работать не только со штрих-кодами, но и с распознаванием голоса от Google. Это бесплатная и открытая система, не требующая обучения, с возможностью быстро получить результат.

5 стартмани

09.01.2019    24836    228    informa1555    187       

Базовый курс по разработке мобильных 1C-приложений для Android-устройств. Третий поток. Онлайн-интенсив с 11 февраля по 05 марта 2020 г. Промо

Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.

7500 рублей

Сравнение pdf-файлов актов сверки 1

Инструменты и обработки Бухгалтер Внешняя обработка (ert,epf) v8 v8::БУ БП2.0 Россия БУ Дебиторская и кредиторская задолженность Абонемент ($m) Универсальные обработки

Обработка сравнивает два pdf-файла, в которых находятся стандартные печатные формы актов сверки, и показывает на экране совпадающие и/или отличающиеся по суммам документы взаиморасчетов.

1 стартмани

19.12.2018    7678    4    Torin99    2       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Проверка VAT номеров 2

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Абонемент ($m) WEB

Обработка для вызова сервиса проверка VAT номера.

1 стартмани

26.11.2018    5192    wtlz    0       

Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.

29700 руб.

Обнуление остатков регистров бухгалтерии и накопления 42

Инструменты и обработки Системный администратор Программист Внешняя обработка (ert,epf) v8 v8::БУ v8::ОУ v8::УФ КА1 БП2.0 ЗУП2.5 УТ10 УПП1 УНФ БГУ ERP2 БП3.0 УТ11 УХ КА2 ЗУП3.x Россия Абонемент ($m) Универсальные обработки Чистка базы

Обработка позволяет обнулить остатки по регистру накопления или бухгалтерии на определенную дату. Поддерживается большинство типовых конфигураций (БП 3, БП 2, УТ 11, УТ 10, ЗУП 3, ЗУП 2, БГУ 2, БГУ 1, ERP, УПП, КА 2, КА 1, УХ 3, УХ 1, УНФ). Гибкая настройка (отборы, заполнение реквизитов и любых полей корр. счета, возможность обнулять ресурсы выборочно). Несколько режимов работы. Два интерфейса: простой и с расширенным набором настроек.

2 стартмани

19.11.2018    11428    186    morozov.sv    30       

Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо

Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!

29700 руб.

Шпаргалка разработчика для работы с формами 24

Отчеты и формы Программист Архив с данными v8 Россия Абонемент ($m) Работа с интерфейсом

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

3 стартмани

31.10.2018    9298    72    ELAM    3       

Навигатор по конфигурации базы 1С 8.3 107

Инструменты и обработки Программист Пользователь Внешняя обработка (ert,epf) v8 v8::УФ 1cv8.cf Россия Windows Абонемент ($m) Инструментарий разработчика Универсальные обработки

Универсальная внешняя обработка (СДРНавигаторУпр) для просмотра метаданных конфигураций баз 1С 8.3. Отображает свойства и реквизиты объектов конфигурации, их количество, основные права доступа и т.д. Отображаемые характеристики объектов: свойства, реквизиты, стандартные рекизиты, реквизиты табличных частей, предопределенные данные, регистраторы для регистров, движения для документов, команды, чужие команды, подписки на события, подсистемы. Отображает структуру хранения объектов базы данных, для регистров доступен сервис "Управление итогами". Небольшой набор сервисных функций для повседневной работы. Для программистов и пользователей. Платформа 8.3, управляемые формы. Версия 1.1.0.47 от 25.11.2019

3 стартмани

28.10.2018    18423    200    ROL32    47       

Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо

Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.

29700 руб.

Открывашка ячеек таблиц 85

Инструменты и обработки Программист Расширение (cfe) v8 1cv8.cf Абонемент ($m) Работа с интерфейсом

Глобальное сочетание клавиш для открытия объекта по ссылке из текущей ячейки любой таблицы в большинстве управляемых форм

1 стартмани

27.10.2018    10582    11    tormozit    28       

Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо

Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.

29700 руб.

Расширение "Интерфейс Плюс" 44

Отчеты и формы Бухгалтер Пользователь Расширение (cfe) v8 v8::ОУ Розница УТ11 Россия УУ Розничная торговля Абонемент ($m) Рабочее место

Расширение для 1С:Розница 2.2 и 1С:Управление Торговлей 11, которое позволит повысить удобство работы!

3 стартмани

22.09.2018    11823    98    RocKeR_13    82       

Отправка электронной почты с помощью локального почтового клиента из 1С, развернутой под удаленным рабочим столом 13

Инструменты и обработки Программист Пользователь Архив с данными v8 КА1 БП2.0 УТ10 УПП1 Windows Абонемент ($m) Печатные формы документов Универсальные функции Email

Решение для интерактивной (нажал-отредактировал) отправки электронных писем и печатных форм через почтовый клиент (Thunderbird, Outlook) находящийся на локальном компьютере, из конфигурации 1С, развернутой под удаленным рабочим столом (RDP, remote-app). Подходит также для локального развертывания 1С. Представлен пример быстрой интеграции с конфигурациями "Управление торговлей 10.3", "Управление производственным предприятием 1.3", "Комплексная автоматизация 1.1", "Бухгалтерия предприятия 2.0".

1 стартмани

21.09.2018    13591    10    stvorl    0