История изменений объектов информационной базы во внешнем хранилище ElasticSearch

Публикация № 338416 25.03.15

Разработка - Инструментарий разработчика

версионирование быстрый поиск JSON Elastic журнал изменений

ElasticSearch - это opensource решение для очень быстрого поиска данных в больших массивах информации.
Как один из примеров эффективного решения технологической задачи для 1С - использовать ElasticSearch для хранения истории изменений объектов информационной базы.

ElasticSearch разрабатывается крайне успешным стартапом в Калифорнии с 2012 года - https://www.elastic.co/.

Позволяет загрузить в единое хранилище данных разнородную информацию в JSON-формате, а затем производить выборки детальной и агрегированной информации.

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

Основные преимущества для пользователей 1С при хранении истории изменений объектов в ElasticSearch:
1) Не требуется сложного конфигурирования и установки ElasticSearch. Только скачать и распаковать архив, а затем запустить bat-файл (работает поверх JAVA).

2) Вся информация хранится во внешнем, по отношению к информационным базам 1С, хранилище данных. Основная база данных не перегружается "балластом".

3) ElasticSearch индексирует ВСЮ загружаемую информацию. Практически любая небольшая выборка данных с любыми условиями будет выполняться за миллисекунды.

4) При изменении структуры метаданных в 1С не требуется проводить реструктуризацию в ElasticSearch. Удаленные поля будут доступны в предыдущей информации, новые - в новой.

Особенности, которые важно учитывать:
Например:
1) все поступающие строковые поля ElasticSearch автоматически разбивает на слова и индексирует отдельно. т.е. теоретически можно искать информацию по всему массиву разнородных объектов просто указав ключевое слово. На практике это выливается в некоторые проблемы, например, с GUID. Переданные для поиска GUID система разбивает на части по символу "-" и выдает совсем нерелевантный результат. Чтобы этого не происходило нужно отключить "анализ" поля перед записью первых объектов отправив команду на типизацию таких полей для данного вида объектов.
В данном примере мне этого делать не хотелось, поэтому для ключевых полей, по которым происходит выборка версий, из GUID'а удалены тире, что сделало его монолитным "словом". Это решает задачу выборки данных для отчета по версиям. Если нужны иные варианты выборок, то нужно предусмотреть эту особенность.


2) Если объект сериализовать в XML, то платформа в атрибутах указывает тип значения для каждого ссылочного реквизита, в итоге обратная десериализация проблем не вызывает. Аналогичный механизм для JSON появится только в платформе 8.3.7 - http://v8.1c.ru/o7/201501json/index.htm.
В итоге для однозначной идентификации значения в реквизитах объектов мне показалось удачным использовать функцию ЗначениеВСтрокуВнутр.


3) ElasticSearch не поддерживает версии объектов. Поэтому каждую версию нужно хранить как уникальный объект, а логически наборы версий объединять по дополнительному полю.

Отмечу, что выложенный пример конфигурации не является полноценным решением, а лишь демонстрирует способ применения механизма, хотя и вполне применим для продуктивной системы.
Разработано и протестировано на 8.2 и 8.3.
Для сериализации\десериализации в JSON используется разработка Александра Переверзева //infostart.ru/public/119601/

Принципиальная схема работы:
1) В подписке на событие "ПриЗаписи" выполняется сериализация объекта в JSON.

2) Добавляется служебная информация типа даты изменения и автора версии.

3) Данные синхронно записываются в ElasticSearch до окончания транзакции. Т.е. при отмене транзакции версия останется. Это можно решить, переделав механизм на асинхронный: при изменении объекта фиксировать сам факт, а в отдельном фоновом задании выполнять сериализацию в JSON и отправку данных. У обоих вариантов свои плюсы и минусы.

4) В отчете по версиям система выбирает 10 последних версий объекта и отображает их реквизиты. Каждый результат поиска также возвращает общее количество найденных объектов, поэтому всегда можно получить программно все объекты.

Для запуска механизма на своей базе необходимо:
1) Установить на целевой машине JAVA и прописать переменную JAVA_HOME.

2) Скачать и запустить ElasticSearch.

3) Объединить целевую конфигурацию с файлом Elastic.cf (2 общих модуля, 2 константы, 2 подписки на события, 2 обработки).

4) скорректировать подписки на события - указать только те объекты, которые необходимо версионировать. Можно оставить как есть (все объекты), но в крупных базах с интенсивной работой, скорее всего, будут проблемы с быстродействием.

5) В режиме Предприятия заполнить константы.
АдресИнстанса - имя компьютера и порт с ElasticSearch (для локальной машины - localhost:9200).
ПрефиксБазы- произвольный идентификатор текущей ИБ латинскими строчными буквами\цифрами (чтобы данные нескольких баз не перемешивались), например, "buh1".

Попробовать записать любой версионируемый объект и удостовериться через обработку "ElasticSearch_ПросмотрВерсий", что данные записались в ElasticSearch и выдаются обратно.

Список версий по документу:

Статистика по версиям в базе ElasticSearch:

 

По поводу быстродействия - я не тестировал именно журнал изменений объектов на больших данных. Но анализ объемного технологического журнала показал, что скорость выборки 10-20 событий из индекса с парой тысяч записей и с 20'000'000 записей примерно одинакова.

Судя по замеру в данном примере - на выполнение 20 запросов, каждый из которых возвращает 23Кб JSON, потребовалось 0,2 секунды.

 

P.S. На подходе два аналогичных механизма для технологического журнала и журнала регистрации.

Планирую сделать на базе своих существующих разработок:

Периодическая загрузка событий из журналов регистрации в базу MS SQL Server (с исходниками)

Загрузка файлов технологического журнала в базу MS SQL (с исходниками)

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

Наименование Файл Версия Размер
Elastic.cf

.cf 44,84Kb
139
.cf 44,84Kb 139 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. AlX0id 25.03.15 10:33 Сейчас в теме
Интересно, в общем-то )

ЗЫ. Open sourCe все-таки ;)
Aleksey.Bochkov; +1 Ответить
2. Steelvan 281 25.03.15 10:39 Сейчас в теме
Фуууу, в Калифорнии.

Принципиально игнорирую все американское (фу-фу-фу).
18. webester 25 29.03.15 04:03 Сейчас в теме
(2)Ты комментарий то как написал? Из какой операционной системы? А если надо просмотреть офисный документ, ты что используешь? А еще ты пишешь на сайте который находится в интернете, который таки придумали американцы, развили до текущего состояния американцы и контролируют(icann) тоже представь себе американцы.
19. Steelvan 281 31.03.15 09:15 Сейчас в теме
(18) webester,

Поцелуй их теперь в ж.

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

И если есть выбор, то я всегда выбираю российское, или отказываюсь если американское и без этого можно обойтись.
20. pumbaE 31.03.15 10:12 Сейчас в теме
(18) webester, ну зачем кормить тролля...
3. pumbaE 25.03.15 11:05 Сейчас в теме
Производительность - управляемость, в отличии от полнотекстового поиска 1с, шардинг по нескольким серверам.

Для логов, советую kinbana или graphite использовать, для отображения данных, очень удобно.
4. pumbaE 25.03.15 11:06 Сейчас в теме
Если есть более или менее четкая структура, то можно настроить, что-бы не разбивал в индексе по словам, ну или в поиске по uuid обрамлять в кавычки, тогда должен искать полный uuid.
5. fzt 25.03.15 11:15 Сейчас в теме
Очень лыбопытное решение. Радует опенсорс. Думаю многие смогут проверить каково это - жить с историей версий объектов.
6. yukon 83 25.03.15 11:38 Сейчас в теме
Данные синхронно записываются в ElasticSearch до окончания транзакции

Если уж нужно делать синхронно, то есть, как минимум, обработчик ПослеЗаписи который выполняется вне транзакции.
7. minimajack 79 25.03.15 11:45 Сейчас в теме
(6) yukon, не в том контексте интерес

зы в любом случае лучше делать ассинхронно...иначе увеличивается время транзакции
8. Aleksey.Bochkov 3618 25.03.15 12:29 Сейчас в теме
(6) yukon,
Такой обработчик есть только для управляемых форм. т.е. тогда будет работать только при интерактивном изменении данных.
10. artbear 1429 25.03.15 18:47 Сейчас в теме
(8) ИМХО Нужно юзать механизм заданий, которые и будут выполняться вне текущей транзакции.
Т.е. создаешь новое задание (РС или справочник), заносишь нужную инфу и завершаешь транзакцию.
и крутится фоновое задание, которое следит за заданиями, формирует из них очередь (при необходимости), запускаю нужное количество агентов (фоновое задание-обработчик), задание выполняется на агенте и в случае успешной записи выполняет удаление ранее сделанной записи (из РС или справочника).
удобно и довольно мощно.
Мы такую систему юзаем и нам хорошо :)
AzagTot; tormozit; ret-Phoenix; +3 Ответить
12. Aleksey.Bochkov 3618 25.03.15 23:39 Сейчас в теме
(10) artbear,
Да, я согласен.
Смущает только один момент - если версионировать до окончания транзакции, то нет необходимости читать или записывать какие-либо данные. Объект уже в памяти.
При асинхронном версионировании - сначала записать факт изменения в регистр, затем прочитать эти события, прочитать объект из базы и отправить версию в Elastic, затем сделать отметку о том, что обработка данного события завершена.
Имхо, оба варианта имеют право на жизнь.
9. lustin 25.03.15 16:03 Сейчас в теме
(0) я так понимаю следующим ты попробуешь LogStash, Kibana ? И тогда добро пожаловать в наш мир.
myjob1c; shalimski; Aleksey.Bochkov; pumbaE; +4 Ответить
11. Aleksey.Bochkov 3618 25.03.15 23:35 Сейчас в теме
(9) Kibana уже попробовал. Для построения самого разного рода графиков подходит отлично. Но для более глубокого анализа данных мне показалось удобнее писать свои запросы к Elastic, пусть хоть и на 1С.
LogStash - в процессе. Может к разбору технологического журнала получится подключить..
13. minimajack 79 27.03.15 08:02 Сейчас в теме
Все же считаю использование ElasticSearch - стрельбой из пушки по воробьям. Поисковый движок для версионирования по моему слишком
16. pumbaE 27.03.15 10:39 Сейчас в теме
(13) minimajack, ну для логов же их используют, а там вообще простые текстовые файлы на N-гиг.
Тем более, что в данном примере elasticsearch не настраивали на игнорирование разбивку на составляющие некоторых данных (таких как uuid)
Aleksey.Bochkov; +1 Ответить
17. minimajack 79 27.03.15 10:43 Сейчас в теме
(16) pumbaE, я говорю именно про хранение версий.
Во первых поиск на 99% будет выполнятся по гуидам
Во вторых интересует именно различия - а не поиск чего то - где то
В третьих проверил подобный вариант с baseX - сериализация XML быстрее, от стандартного механизма "Версионрования" практически не отличается
14. Dach 361 27.03.15 09:01 Сейчас в теме
А можно поподробнее прокомментировать вот это: "при изменении объекта фиксировать сам факт, а в отдельном фоновом задании выполнять сериализацию в JSON и отправку данных" ?
15. minimajack 79 27.03.15 10:33 Сейчас в теме
(14) Dach, в РС записывать всю информацию, но не пересылать в ElasticSearch.
от сериализации в данном случае не уйти...но таким образом сокращаем время транзакции.
В фоновом задании просто берем пачку новых объектов и передаем в ElasticSearch...после корректной передачи - удаляем из РС запись
21. reflexcompani 19 24.04.15 09:51 Сейчас в теме
Добрый день. Возникли сложности при внедрении данного функционала, в связи с этим хочу уточнить несколько моментов:
1. Скажите, какое значение мне нужно заполнить в графе АдресИнстанса - имя компьютера и порт с ElasticSearch? Работаю по SQL.
2. Установить на целевой машине JAVA и прописать переменную JAVA_HOME. JAVA стоит на машине, а переменную где прописать. И если не затруднить, может укажите ссылку на конкретную JAVA.
22. Aleksey.Bochkov 3618 24.04.15 12:15 Сейчас в теме
(21) reflexcompani,
1) Для константы "ElasticSearch_АдресИнстанса" надо указать хост и порт на котором расположен запущенный ElasticSearch.
Например, "localhost:9200" - это если ElasticSearch установлен на той же машине, где будет исполнятся код.
Если это другая машина - должно быть указано сетевое имя или IP-адрес вместо localhost. Ну и в firewall этот порт должен быть открыт.

2) https://www.google.com/#q=%D0%BA%D0%B0%D0%BA+%D0%BF%D1%80%D0%BE%D0%BF%D0%B8%D1%81%D0­%B0%D1%82%D1%8C+java_home+%D0%B2+windows
скачать JAVA - http://www.oracle.com/technetwork/java/javase/downloads/index.html
23. tormozit 6870 22.05.15 09:21 Сейчас в теме
24. V.Nikonov 119 30.09.15 14:37 Сейчас в теме
Внешнее хранилище - интересно! Но тезис о полном восстановлении предыдущего состояния... это по моему слишком для учетной системы.
В 90% случаев требуется именно сведения об изменениях! Соответственно, только перед записью приходится анализировать различия записанного и нового объекта... Но смена порядка строк в ТЧ так же выдается за изменение большинством систем Верификации! Лично я решал проблему сверткой ТЧ "Товары" и анализировал свернутые Количества и Суммы. Выявляя добавленный и выведенный ассортимент.
Правда, в моей реализации писалось в ЖР и не зависимо от завершения транзакции. Откидывать ошибочные записи приходилось по анализу штатных записей ЖР.
Но для задач расследований, этого вполне достаточно было.
25. Elena_Q 8 13.10.15 11:58 Сейчас в теме
Добрый день! У меня выходит такое сообщение ElasticSearch_ПросмотрВерсий.ПоказатьВерсииНаСервере (IndexMissingException[[versions_BU] missing] )
26. Aleksey.Bochkov 3618 16.10.15 01:01 Сейчас в теме
(25) Elena_Q,
Судя по всему, отсутствует индекс с таким именем. Посмотрите отладчиком как отправляется запрос в ES и какой возвращается результат. Вероятно, при каждой попытке записи версии в базу возникает ошибка, поэтому индекс в ES и не создался.
Чтобы посмотреть статистику по индексам в ES - откройте вот эту ссылку http://localhost:9200/_all/_stats?pretty (только не в IE)
Прикрепленные файлы:
27. Elena_Q 8 19.10.15 12:36 Сейчас в теме
Спасибо за ответ. Посмотрю
28. Elena_Q 8 19.10.15 12:40 Сейчас в теме
Возвращает:

{
"_shards" : {
"total" : 0,
"successful" : 0,
"failed" : 0
},
"_all" : {
"primaries" : { },
"total" : { }
},
"indices" : { }
}


это значит ничего не отправляется?
29. Aleksey.Bochkov 3618 28.10.15 08:41 Сейчас в теме
(28) Elena_Q,
Да, значит в базе ES ничего нет.
Посмотрите отладчиком результат ответа при попытке отправки HTTP-запроса в ES - там должна быть видна ошибка.
30. comol 4830 29.12.15 13:02 Сейчас в теме
Искал механизм на замену стандартному... действительно в специализированную БД лучше бы сохранять XML-ки/JSON-ки

Данные синхронно записываются в ElasticSearch до окончания транзакци
... стало грустно что люди ещё так делают...

Установить на целевой машине JAVA
Собственно погрустнело ещё больше...
31. pumbaE 29.12.15 15:39 Сейчас в теме
(30) пиши в регистр, потом асинхроно переноси в отдельное хранилище - тут имхо проблемы нет подкорректировать.
У меня на распределенных базах так шардинг был настроек, в каждой точке свой elasticsearch, в центральном кластере все логи собираются. Плюс на машинках с java еще и logstash подключаен для журнала регистрации, который так же в elasticsearch скидывается.
32. user597674_ssharshatov 11.05.17 13:05 Сейчас в теме
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [Object_Version] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"versions_tok","node":"1SikbqSxRE-jyaQTSIOjOQ","reason":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [Object_Version] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}}],"caused_by":{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [Object_Version] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."}},"status":400}
У меня вот такую ошибку выдает.
33. nicxxx 249 21.10.17 14:03 Сейчас в теме
(32) Устранить проблему поможет данный скрипт. Проще всего его выполнить в git bash, ну или установить curl отдельно, если гитом не пользуетесь.
Префикс базы у менят "w1", его поменяйте на свой. Также и адрес эластика, я оставил по-умолчанию, смените, если надо, 'localhost:9200' на свой.
Кстати, префикс не может содержать заглавных букв, запросы вылетают с ошибкой.

curl -XPUT 'localhost:9200/versions_w1/_mapping/Object_ID?update_all_types' -H 'Content-Type: application/json' -d'
{
"properties": {
"Object_ID": {
"type": "text",
"fielddata": true
}
}
}
'


curl -XPUT 'localhost:9200/versions_w1/_mapping/Object_DateTime?update_all_types' -H 'Content-Type: application/json' -d'
{
"properties": {
"Object_DateTime": {
"type": "date",
"fielddata": true
}
}
}
'

curl -XPUT 'localhost:9200/versions_w1/_mapping/Object_Name?update_all_types' -H 'Content-Type: application/json' -d'
{
"properties": {
"Object_Name": {
"type": "text",
"fielddata": true
}
}
}
'

curl -XPUT 'localhost:9200/versions_w1/_mapping/Object_User?update_all_types' -H 'Content-Type: application/json' -d'
{
"properties": {
"Object_User": {
"type": "text",
"fielddata": true
}
}
}
'

curl -XPUT 'localhost:9200/versions_w1/_mapping/Object_Version?update_all_types' -H 'Content-Type: application/json' -d'
{
"properties": {
"Object_Version": {
"type": "text",
"fielddata": true
}
}
}
'
34. nicxxx 249 21.10.17 15:26 Сейчас в теме
Мой предыдущий пост актуален для версии 5.6.3.
Похоже, за 2,5 года с момента публикации, в эластике многое изменилось концептуально, т.к. по инструкции автора не взлетает моментально.
Оставьте свое сообщение

См. также

Infostart Toolkit

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Простые и удобные инструменты: Консоль запросов, СКД, Редактор объекта, Поиск ссылок и другие. Редактор запросов и кода с раскраской и контекстной подсказкой. Улучшенный конструктор тонкого клиента и др.

10000 руб.

02.09.2020    80213    393    356    

466

SALE! %

PowerTools

Инструментарий разработчика Обработка документов Инструменты администратора БД Корректировка данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

2400 1920 руб.

14.01.2013    164363    1009    0    

767

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    93236    227    95    

275

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    19645    11    14    

18

Универсальная обработка создания связанных документов (универсальный "ввод на основании")

Инструментарий разработчика Обработка документов Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

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

2500 руб.

02.04.2017    41946    72    27    

128

Заполнение документа "Корректировка регистров" произвольными данными

Закрытие периода Корректировка данных Инструментарий разработчика Обработка документов Платформа 1С v8.3 Система компоновки данных 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 руб.

13.07.2015    46312    155    27    

105

Менеджер конфигураций 1С

Инструментарий разработчика Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1439 руб.

21.02.2023    3034    0    24    

9

Бустер Конвертации данных 3 (Infostart Toolkit)

Инструментарий разработчика 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    11419    2    12    

36

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

Инструментарий разработчика Платформа 1С v8.3 Платформа 1C v8.2 Платформа 1С v8.1 Конфигурации 1cv8 Платные (руб)

Программист - это человек, непрерывно принимающий решения. Написание кода не является процессом принятия решения - это всего лишь трансляция ваших желаний. Если вас периодически тяготит написание сотен строк кода ради решения задач, то прошу обратить внимание. Данный продукт позволит существенно сократить время на рутинные операции при разработке. За счет библиотечной реализации сокращается объём кода, а его читаемость повышается. К библиотеке прилагается документация API и шаблоны кода для наиболее популярных методов.

4200 руб.

16.04.2021    10475    2    9    

7

Шаблон для разработки внешних печатных форм с отладкой

Печатные формы Инструментарий разработчика Платформа 1С v8.3 1С:Управление торговлей 11 Россия Платные (руб)

Внешняя печатная форма печати Расходной Накладной из документа "Реализация Товаров и Услуг" для УТ 11 с возможностью тестирования и отладки программного кода, печати непроведенных документов и открытия формы обработки перед печатью, а также присутствует возможность передачи дополнительных параметров в функцию печати. Обработка полезна программистам, можно использовать как шаблон для создания собственных внешних печатных форм с отладкой кода при разработке. Помогает минимизировать трудозатраты программиста при разработке дополнительных печатных форм для конфигураций, использующих БСП.

2000 руб.

26.02.2020    5066    2    3    

2

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    14879    3    6    

32

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    26039    2    10    

9