Часть 1: 1С Поле HTML документа — Кнопки.
Часть 2: 1С Поле HTML документа — Обмен.
Часть 3: 1С Поле HTML документа — Список.
Часть 4: 1С Поле HTML документа — React Список.
В данной записи, показано как создать простой список используя JavaScript-библиотеку React и внедрить в приложение «1С». React в текущий момент очень популярная JavaScript-библиотека для разработки пользовательских интерфейсов, имеющая целый ряд особенностей, больше всего мне понравилось то что React обновляет только то, что необходимо. React DOM сравнивает элемент и его дочернее дерево с предыдущей версией и вносит в DOM только минимально необходимые изменения.
Подготовительные действия:
Для разработки используется редактор кода VS Code, который можно скачать по адресу: https://code.visualstudio.com установка крайне проста и не требует дополнительных пояснений.
Для разработки непосредственно компонентов с помощью JavaScript-библиотеки React необходимо скачать и установить Node.js по адресу: https://nodejs.org/ru/ установка так же проста и не требует пояснений.
Создание проекта React:
Создание шаблона проекта для JavaScript-библиотеки React выполняется с помощью инструмента «Create React App», который настраивает среду для использования новейших возможностей JavaScript, оптимизирует приложение для продакшена и обеспечивает комфорт во время разработки.
Для этого в командной строке выполните следующую команду:
npx create-react-app@latest react-list
Необходимо дождаться когда все необходимые файлы будут созданы и в результате получим готовую заготовку проекта:

Теперь необходимо удалить не используемые фалы из проекта и отредактировать файлы, как показано на скриншоте:

В папке «node_modules» ничего удалять не нужно, так как в ней находятся необходимые модули для сборки и выполнения проекта, а так же прочие зависимости.
Для создания компонентов React, удобно представить схематично из чего будет состоять список элементов:

В итоге необходимо создать два компонента «ListItems» который представляет из себя список элементов и «Item», который отвечает непосредственно за отрисовку элемента списка. Для этого в папку «src», добавляем папку «сomponents» содержащую папки «list-items» и «item», в которых будет содержаться реализация компонентов React.
В папке «list-items» добавляем два файла «list-items.jsx» и «list-items.css», следующего содержания:
import { Component } from "react";
import Item from "../item/item";
import "./list-items.css";
class ListItems extends Component {
state = {
data: []
}
componentDidMount() {
window.AddItem = (id, name, data1, data2, data3, data4, data5) =>
{
const newItem = {id, name, data1, data2, data3, data4, data5};
this.setState(({data}) => {
const newData = [...data, newItem];
return {
data: newData
}
});
}
}
render() {
const {data} = this.state;
const resultRender = data.map((item) => {
return <Item key={item.id} item={item} />
})
return <div id="list-items">{resultRender}</div>
}
}
export default ListItems;
#list-items {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: stretch;
}
В папке «item» добавляем два файла «item.jsx» и «item.css», следующего содержания:
import "./item.css";
const Item = function (props) {
const {id, name, data1, data2, data3, data4, data5} = props.item;
return (
<>
<div className="item" data-id={id}>
<div className="item-name">{name}</div>
<div className="item-data">{data1}</div>
<div className="item-data">{data2}</div>
<div className="item-data">{data4}</div>
<div className="item-data">{data3}</div>
<div className="item-data">{data5}</div>
</div>
</>
);
}
export default Item;
.item {
padding: 5px;
margin-bottom: 3px;
background-color: #ECEFF4;
border-radius: 5px;
cursor: pointer;
}
.item:hover {
background-color: #E5E9F0;
}
.item:active {
background-color: #f8f9fb;
}
.item-name {
font-size: 14px;
font-weight: bold;
}
.item-data {
display: inline-block;
font-size: 11px;
margin-right: 7px;
}
После внесенных изменений можно произвести запуск React проекта, это осуществляется с помощью команды:
npm start
В результате запуститься браузер (в моем случае Chrome), в котором можно проверить работу проекта, через консоль разработчика (клавиша F12):

Окончательная сборка React проекта выполняется с помощью команды:
npm run build
В результате выполнения сборки, в папке проекта появится новая директория «build», где содержаться готовые собранные файлы, из которых нам понадобится «index.html» и файлы с расширением «css» и «js»:

После сборки проекта, файл «index.html», необходимо доработать, следующим образом:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>React List</title>
<script defer="defer" src="%1"></script>
<style>%2</style>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
Создание конфигурации 1С:
В качестве источника данных используется база из записи Анализ данных и прогнозирование в 1С — Общая статистика, реализация основной логики выполнена в общей форме, которая будет помещена на рабочую область начальной страницы.
1. Макет «МакетReact».
В ветку конфигурации «Общие», добавлен общий макет «МакетReact», тип макета «HTML документ», текст взят из файла «index.html» сборки проекта, папка «build», после соответствующей доработки.
2. Макет «ОсновнойJavaScript».
В ветку конфигурации «Общие», добавлен общий макет «ОсновнойJavaScript», тип макета «Двоичные данные», в качестве источника выбран JavaScript файл из папки «build/static/js».
3. Макет «ОсновнойCSS».
В ветку конфигурации «Общие», добавлен общий макет «ОсновнойCSS», тип макета «Текстовый документ», текст взят из файла стилей, находящегося в папке «build/static/css».
Пояснение:
Была замечена особенность работы элемента «Поле HTML», а именно при загрузке стилей из файла, происходила ошибка работы с кодировкой. В файле стилей используется кодировка UTF-8, но через панель разработчика выводились иероглифы, поэтому было принято решение загружать стили текстом.
4. Форма «ОсновнаяФорма».
В ветку конфигурации «Общие», добавлена общая форма «ОсновнаяФорма», в которой добавлен реквизит «ПолеHTML», тип строка. Далее реквизит переносится на форму и устанавливается вид «Поле HTML документа».
5. Обработчик «ПриОткрытии».
Добавлен обработчик события формы «ПриОткрытии», где использовано ключевое слово Асинх, так как будет использоваться асинхронная функция записи двоичных данных в файл.
&НаКлиенте
Асинх Процедура ПриОткрытии(Отказ)
// Получение текста макета HTML.
ТекстМакета = ТекстМакета("МакетReact");
// Создание файла из макета, содержащего код JavaScript.
ИмяВременногоФайлаJs = ПолучитьИмяВременногоФайла("js");
ОсновнойJavaScript = ДанныеМакета("ОсновнойJavaScript");
Обещание = ОсновнойJavaScript.ЗаписатьАсинх(ИмяВременногоФайлаJs);
Результат = Ждать Обещание;
// Получение текста макета содержащего стили.
ТекстСтилей = ТекстМакета("ОсновнойCSS");
// Редактируем текст макета и загружаем в поле HTML.
ПолеHTML = СтрШаблон(ТекстМакета, ИмяВременногоФайлаJs, ТекстСтилей);
КонецПроцедуры
Пояснение кода:
С помощью вспомогательной функции возвращается текст макета «МакетReact», в котором находится исходный HTML код. Далее, формируется имя временного файла, с расширение «js», в который производится запись скрипта из макета «ОсновнойJavaScript», с помощью функции «ЗаписатьАсинх».
Получение текста стилей происходит с помощью вспомогательной функции. В конце процедуры, выполняется замена текста, а именно подставляется путь к файлу «js» и заполняется тег «style».
6. Обработчик «ДокументСформирован».
Добавлен обработчик события «ДокументСформирован», для элемента формы «Поле HTML», в котором при готовности документа, производится загрузка данных в React компонент с помощью вызова соответствующей функции скрипта, данные берутся из регистра сведений.
&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
Если НЕ Элементы.ПолеHTML.Документ.readyState = "complete" Тогда
Возврат;
КонецЕсли;
ОкноHTML = Элементы.ПолеHTML.Документ.defaultView;
Если ОкноHTML = Неопределено Тогда
Возврат;
КонецЕсли;
МассивПродаж = ДанныеПродаж();
Для каждого Продажа Из МассивПродаж Цикл
//AddItem (id, name, data1, data2, data3, data4, data5)
ОкноHTML.AddItem(
Продажа.ИдентификаторСчетФактуры,
Продажа.ИдентификаторСчетФактуры,
Строка(Формат(Продажа.ДатаПокупки, "ДФ=dd.MM.yyyy"))
+ " " + Строка(Формат(Продажа.ВремяПокупки, "ДФ=ЧЧ:мм:сс; ДЛФ=D")),
Продажа.Город + " (" + Продажа.Филиал + ")",
Продажа.ВидНоменклатуры,
Продажа.ВидОплаты,
Продажа.Сумма
);
КонецЦикла;
КонецПроцедуры
Готовый React-проект можно скачать с GitHub: https://github.com/BlaginKostya/react-list.
💾 Выгрузка базы данных «1С Поле HTML документа — React Список».

Хороший материал.
Отличная статья! Есть похожая задача, буду пробовать.
Очень подробно, отлично!
Спасибо автору!
Приветствую, коллеги.

Поступила следующая информация по работоспособности кода:
«Воспроизвел Вашу разработку. Единственное изменение — React теперь версии 18, на дату написания Вашей статьи версия была меньше, поэтому вместо
import ReactDOM from ‘react-dom’;
теперь
import ReactDOM from ‘react-dom/client’;
и вызов рендера немного другой синтаксис.
Ну и данные запроса 1С естественно мои.
Собственно вопрос в ошибке: Метод объекта не обнаружен (AddItem).
В консоли браузера этот метод отрабатывает (добавляются новые строки), в скомпилированном файле я этот метод нахожу, а 1С его не видит«.
Скорее всего, нужно заново «собрать» приложение и импортировать его в макет
Ну так пишу же: «в скомпилированном файле я этот метод нахожу». Билд выполнен
Дело в том что при сборке проекта, скрипт минимизируется и имена функций меняются ну случайные короткие названия
И каково решение?
Нашли решение?
Если следовать статье, после билда у меня будет 2 .js файла.
В статье же предлагается создать один макет с типом двоичные данные и поместить в него файл .js
Какой из двух?
А как вы будете запускать в WEB клиенте, если работа идет с файлами? Тут решение другое должно быть. Просто код из js файлов сохраняем как код в общих макетах с типом текстовый документ.
Здравствуйте, Олег. Благодарю за замечание, вы правы, для Web-клиента надо по другому.