EDT 1С (1C:Enterprise Development Tools, 1C:EDT) — среда разработки 1С от фирмы «1С» на базе Eclipse. В отличие от конфигуратора она хранит конфигурацию не в информационной базе, а в файлах проекта: отсюда Git, проверки кода на лету, поиск ссылок и рефакторинг. Поддерживаются платформы 1С 8.3 (начиная с 8.3.8) и 8.5. Вопрос «переходить ли» обычно возникает, когда над конфигурацией работают несколько человек, захваты в хранилище мешают, а заказчик хочет ревью кода и сборку по коммиту.
В конфигураторе источник правды — база. В EDT — проект на диске, а информационная база — место, куда среда выкладывает конфигурацию для запуска и отладки.
| Конфигуратор | 1C:EDT | |
|---|---|---|
| Где живёт конфигурация | В информационной базе, для команды — в хранилище | В файлах проекта (.mdo, .bsl, формы), обычно в Git |
| Командная работа | Захват и помещение объектов | Ветки, слияния, код-ревью |
| Ошибки в коде | По команде проверки модуля | Подсветка при наборе, вычисление типов, строгая типизация |
| Навигация | Поиск ссылок на объект, глобальный поиск | Переход к определению, поиск ссылок на методы и объекты, переименование с правкой обращений |
| Стандарты разработки | Отдельно, например через АПК («Автоматизированная проверка конфигураций») | Встроенные проверки и плагин стандартов |
| Вход в задачу | Открыли базу и правите | Импорт и сборка проекта, на большой типовой — долго |
Формат проекта не совпадает с XML-выгрузкой конфигуратора, где описание лежит в Catalogs/Номенклатура.xml, а модули — в подкаталогах Ext:
trade/ проект конфигурации
├── DT-INF/
│ └── PROJECT.PMF версия платформы проекта
└── src/
├── Configuration/
│ ├── Configuration.mdo свойства конфигурации
│ └── ManagedApplicationModule.bsl
├── Catalogs/
│ └── Номенклатура/
│ ├── Номенклатура.mdo описание справочника
│ ├── ObjectModule.bsl
│ ├── ManagerModule.bsl
│ └── Forms/ФормаЭлемента/
│ ├── Form.form форма
│ └── Module.bsl модуль формы
└── CommonModules/
└── ОбщегоНазначения/
├── ОбщегоНазначения.mdo
└── Module.bsl
Главный минус EDT — память: среда написана на Java и держит модель конфигурации в ОЗУ. Профили из системных требований на edt.1c.ru (ОС только 64-разрядная: Windows 10+, Ubuntu 18.04 LTS+, macOS 10.15+):
| Профиль | ОЗУ | Выделить EDT | Рассчитан на |
|---|---|---|---|
| Минимальный | от 4 ГБ | — | 6 300 объектов, 2 700 форм, 5 800 модулей, 200 ролей |
| Рекомендуемый | от 8 ГБ | 6 ГБ | 8 200 объектов, 4 000 форм, 8 800 модулей, 300 ролей |
| Продвинутый | от 16 ГБ | от 10 ГБ | 12 500 объектов, 6 300 форм, 13 800 модулей, 1 200 ролей |
Для рабочих областей советуют SSD. Свою конфигурацию сравнивают с таблицей по XML-выгрузке («Конфигурация → Выгрузить конфигурацию в файлы»); скрипт считает показатели и берёт первый профиль, в который она укладывается по всем четырём:
# edt-profile.ps1: оценка размера конфигурации для выбора профиля 1C:EDT.
# Методика со страницы системных требований edt.1c.ru: объекты - папки в каталогах
# верхнего уровня выгрузки (кроме Ext), формы - Form.xml, модули - *.bsl, роли - Roles.
# Сохраните файл в UTF-8 с BOM, иначе Windows PowerShell 5.1 исказит кириллицу.
param(
[Parameter(Mandatory = $true)]
[string]$DumpDir # каталог XML-выгрузки конфигурации
)
if (-not (Test-Path -LiteralPath (Join-Path $DumpDir 'Configuration.xml'))) {
throw "В каталоге $DumpDir нет Configuration.xml - это не выгрузка конфигурации"
}
$objects = 0
foreach ($typeDir in Get-ChildItem -LiteralPath $DumpDir -Directory) {
if ($typeDir.Name -eq 'Ext') { continue }
$objects += @(Get-ChildItem -LiteralPath $typeDir.FullName -Directory).Count
}
$forms = @(Get-ChildItem -LiteralPath $DumpDir -Recurse -File -Filter 'Form.xml').Count
$modules = @(Get-ChildItem -LiteralPath $DumpDir -Recurse -File -Filter '*.bsl').Count
$roles = 0
$rolesDir = Join-Path $DumpDir 'Roles'
if (Test-Path -LiteralPath $rolesDir) {
$roles = @(Get-ChildItem -LiteralPath $rolesDir -File -Filter '*.xml').Count
}
# Пороги из таблицы профилей; перед использованием сверьте с актуальной страницей
$profiles = @(
@{ Name = 'минимальный (ОЗУ от 4 ГБ)'; Objects = 6300; Forms = 2700; Modules = 5800; Roles = 200 },
@{ Name = 'рекомендуемый (ОЗУ от 8 ГБ, для EDT 6 ГБ)'; Objects = 8200; Forms = 4000; Modules = 8800; Roles = 300 },
@{ Name = 'продвинутый (ОЗУ от 16 ГБ, для EDT от 10 ГБ)'; Objects = 12500; Forms = 6300; Modules = 13800; Roles = 1200 }
)
"Объектов: $objects; форм: $forms; модулей: $modules; ролей: $roles"
$fit = $profiles | Where-Object {
$objects -le $_.Objects -and $forms -le $_.Forms -and
$modules -le $_.Modules -and $roles -le $_.Roles
} | Select-Object -First 1
if ($fit) {
"Профиль: $($fit.Name)"
} else {
'Больше верхней строки таблицы: продвинутый профиль и память с запасом'
}
Для ориентира мы посчитали так выгрузки УТ 11.4 и КА 2.5. У УТ около 6,6 тыс. объектов, 3,4 тыс. форм, 8,5 тыс. модулей и 790 ролей — по ролям это уже продвинутый профиль. У КА 2.5 около 14,7 тыс. объектов, 9,8 тыс. форм, 22,7 тыс. модулей и 1,7 тыс. ролей — выше верхней строки таблицы, так что для КА и ERP 16 ГБ — нижняя граница, а не запас.
По умолчанию Java-машине EDT отдают не больше 4 ГБ: для больших конфигураций в 1cedt.ini (каталог установленной версии) строку -Xmx4096m меняют на -Xmx8g или больше, в CLI — ключ -vmargs -Xmx8g. Новая версия ставится в свой каталог, так что после обновления настройку повторяют. Первый импорт большой типовой и полная сборка проекта идут ощутимое время.
Дистрибутив — на edt.1c.ru, раздел «Скачать 1C:EDT». Ставится 1C:EDT Start — программа запуска и обновления: она скачивает нужные версии среды и запускает их. Основной дистрибутив небольшой, компоненты докачиваются из интернета; есть вариант для установки без интернета.
Работа с EDT начинается с проекта. Его создают импортом из информационной базы (EDT получит конфигурацию через платформу) или из каталога XML-выгрузки: «Файл → Импорт», а базы удобнее подключать в панели «Информационные базы». Расширение — отдельный проект, привязанный к проекту конфигурации как к базовому; внешние отчёты и обработки — ещё один тип проекта.
Как работать в 1С EDT каждый день: правите проект и запускаете, а перед запуском среда обновляет конфигурацию связанной базы из проекта — сама или с вопросом, по настройке. Правки, внесённые в эту базу через конфигуратор, при обновлении перезапишутся. Отладка привычная (точки останова, вычисление выражений, стек), но идёт по HTTP: сервер клиент-серверной базы запускают с ключами -debug -http, см. отладку на сервере.
Для скриптов и CI есть 1C:EDT CLI — 1cedtcli.exe в каталоге компонента, например C:\Program Files\1C\1CE\components\1c-edt-<версия>-x86_64\. -data задаёт рабочую область, -command — команду и стоит последним. Без -command откроется интерактивный режим, с -file команды берутся из файла. Справка — 1cedtcli -h, коды возврата — help --status-codes.
Первый скрипт делает проект из рабочей базы: выгрузка в XML, импорт, проверка.
@echo off
chcp 65001 >nul
rem edt-from-ib.cmd: проект 1C:EDT из рабочей базы - выгрузка в XML, импорт, проверка.
rem Файл в UTF-8 без BOM. Логин и пароль базы - в переменных V8_USER и V8_PWD.
setlocal
set "V8=C:\Program Files\1cv8\8.3.27.<сборка>\bin\1cv8.exe"
set "EDTCLI=C:\Program Files\1C\1CE\components\1c-edt-<версия>-x86_64\1cedtcli.exe"
set "WORK=D:\edt"
set "XML=%WORK%\xml"
set "WS=%WORK%\workspace"
set "PROJECT=%WORK%\git\trade"
if not exist "%WORK%\git" mkdir "%WORK%\git"
rem 1. Выгрузка конфигурации в XML. Старый каталог удаляем, чтобы не остались файлы удалённых объектов.
rem Для файловой базы вместо /S "srv01\trade" укажите /F "каталог базы"
if exist "%XML%" rd /s /q "%XML%"
"%V8%" DESIGNER /S "srv01\trade" /N "%V8_USER%" /P "%V8_PWD%" /DisableStartupDialogs ^
/DumpConfigToFiles "%XML%" /Out "%WORK%\dump.log"
if errorlevel 1 (
echo Выгрузка не удалась, смотрите %WORK%\dump.log
exit /b 1
)
rem 2. Импорт XML в новый проект. Рабочая область не должна быть открыта в EDT
"%EDTCLI%" -data "%WS%" -vmargs -Xmx8g -command import --configuration-files "%XML%" --project "%PROJECT%"
if errorlevel 1 (
echo Импорт не удался
exit /b 1
)
rem 3. Проверка проекта. Если файл результата уже есть, validate завершится ошибкой
if exist "%WORK%\validate.tsv" del "%WORK%\validate.tsv"
"%EDTCLI%" -data "%WS%" -command validate --file "%WORK%\validate.tsv" --project-list "%PROJECT%"
echo Проверка завершена, код %errorlevel%, результат в %WORK%\validate.tsv
endlocal
Второй — обратный путь, когда заказчику нужен cf: экспорт проекта в XML, загрузка в пустую файловую базу, сохранение cf.
@echo off
chcp 65001 >nul
rem edt-to-cf.cmd: cf-файл из проекта 1C:EDT - экспорт в XML, загрузка в пустую базу, сохранение.
setlocal
set "V8=C:\Program Files\1cv8\8.3.27.<сборка>\bin\1cv8.exe"
set "EDTCLI=C:\Program Files\1C\1CE\components\1c-edt-<версия>-x86_64\1cedtcli.exe"
set "WORK=D:\edt"
set "WS=%WORK%\workspace"
set "PROJECT=%WORK%\git\trade"
set "OUT=%WORK%\export"
set "BUILDIB=%WORK%\build-ib"
rem 1. Экспорт проекта в XML-файлы конфигурации
if exist "%OUT%" rd /s /q "%OUT%"
"%EDTCLI%" -data "%WS%" -command export --project "%PROJECT%" --configuration-files "%OUT%"
if errorlevel 1 (
echo Экспорт не удался
exit /b 1
)
rem 2. Пустая файловая база для сборки - создаётся при первом запуске
if not exist "%BUILDIB%\1Cv8.1CD" (
"%V8%" CREATEINFOBASE File="%BUILDIB%"; /DisableStartupDialogs /Out "%WORK%\create.log"
if errorlevel 1 (
echo Базу сборки создать не удалось, смотрите %WORK%\create.log
exit /b 1
)
)
rem 3. Загрузка XML в конфигурацию базы сборки и сохранение в cf
"%V8%" DESIGNER /F "%BUILDIB%" /DisableStartupDialogs /LoadConfigFromFiles "%OUT%" /Out "%WORK%\load.log"
if errorlevel 1 (
echo Загрузка не удалась, смотрите %WORK%\load.log
exit /b 1
)
"%V8%" DESIGNER /F "%BUILDIB%" /DisableStartupDialogs /DumpCfg "%WORK%\trade.cf" /Out "%WORK%\cf.log"
if errorlevel 1 (
echo Сохранение cf не удалось, смотрите %WORK%\cf.log
exit /b 1
)
echo Готово: %WORK%\trade.cf
endlocal
Проект из Git сначала подключают к рабочей области: import --project <путь>. Для расширения добавьте -Extension ИмяРасширения к /LoadConfigFromFiles и /DumpCfg (файл .cfe), а базу сборки создайте из cf типовой (/UseTemplate) — расширению нужны заимствованные объекты. Код возврата CLI сверяйте с выводом: в трекере EDT были жалобы на ноль при ошибке.
Ошибки видны при наборе, без отдельной проверки модуля. Среда вычисляет типы по коду и документирующим комментариям, поэтому подсказка знает ключи структуры, которую вернула функция. Сверху — проверки: встроенные и из плагина стандартов v8-code-style (в справке — 1C:Code style V8; есть ли он в вашей сборке, видно в списке установленных компонентов). Из других плагинов — 1C:Language Tool для перевода конфигураций и сторонние EDT.Comfort и dt-project-checks; ставьте их под свою версию EDT. Git встроен в среду, а с хранилищем конфигурации его синхронизируют отдельными утилитами вроде GitSync.
Привычный для конфигуратора код EDT пометит проверкой query-in-loop — запрос в цикле:
// Было: запрос на каждую позицию. Конфигуратор промолчит, EDT пометит query-in-loop.
Функция АртикулыНоменклатуры(СписокНоменклатуры) Экспорт
Результат = Новый Соответствие;
Для Каждого Номенклатура Из СписокНоменклатуры Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Результат.Вставить(Номенклатура, Выборка.Артикул);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Тот же код в серверном общем модуле, переписанный под EDT: один запрос, описания по стандарту, строгая типизация.
//@strict-types
#Область ПрограммныйИнтерфейс
// Возвращает артикулы и единицы измерения номенклатуры одним запросом.
//
// Параметры:
// СписокНоменклатуры - Массив из СправочникСсылка.Номенклатура - позиции, по которым нужны данные.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - СправочникСсылка.Номенклатура
// * Значение - см. НовыеДанныеНоменклатуры
//
Функция ДанныеНоменклатуры(СписокНоменклатуры) Экспорт
Результат = Новый Соответствие;
Если СписокНоменклатуры.Количество() = 0 Тогда
Возврат Результат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В (&СписокНоменклатуры)";
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат.Вставить(Выборка.Ссылка,
НовыеДанныеНоменклатуры(Выборка.Артикул, Выборка.ЕдиницаИзмерения));
КонецЦикла;
Возврат Результат;
КонецФункции
// Заполняет колонку Артикул в таблице товаров по данным номенклатуры.
//
// Параметры:
// Товары - ТаблицаЗначений:
// * Номенклатура - СправочникСсылка.Номенклатура
// * Артикул - Строка
//
Процедура ЗаполнитьАртикулы(Товары) Экспорт
Данные = ДанныеНоменклатуры(Товары.ВыгрузитьКолонку("Номенклатура"));
Для Каждого СтрокаТоваров Из Товары Цикл
ДанныеПозиции = Данные.Получить(СтрокаТоваров.Номенклатура);
Если ДанныеПозиции = Неопределено Тогда
Продолжить;
КонецЕсли;
// После "ДанныеПозиции." EDT подсказывает Артикул и ЕдиницаИзмерения
СтрокаТоваров.Артикул = ДанныеПозиции.Артикул;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Конструктор данных одной позиции для функции ДанныеНоменклатуры.
//
// Параметры:
// Артикул - Строка
// ЕдиницаИзмерения - СправочникСсылка.УпаковкиЕдиницыИзмерения
//
// Возвращаемое значение:
// Структура:
// * Артикул - Строка
// * ЕдиницаИзмерения - СправочникСсылка.УпаковкиЕдиницыИзмерения
//
Функция НовыеДанныеНоменклатуры(Артикул, ЕдиницаИзмерения)
Данные = Новый Структура;
Данные.Вставить("Артикул", Артикул);
Данные.Вставить("ЕдиницаИзмерения", ЕдиницаИзмерения);
Возврат Данные;
КонецФункции
#КонецОбласти
//@strict-types в начале модуля включает строгую типизацию: EDT сообщает о несовпадении типов, например если в параметр типа Строка передали Число. Для объекта или проекта её включают из контекстного меню панели «Навигатор». Это проверка только в среде, платформа при выполнении типы не контролирует. Старый код сначала адаптируйте.Массив из СправочникСсылка.Номенклатура — тип элементов: в цикле среда знает, что перебирает.* Значение - см. НовыеДанныеНоменклатуры — ссылка на описание конструктора: после ДанныеПозиции. подсказка предлагает Артикул и ЕдиницаИзмерения. Формат описаний — как в БСП.В (&СписокНоменклатуры) — один запрос на весь список, чего и добивается query-in-loop.ПрограммныйИнтерфейс и СлужебныеПроцедурыИФункции — структура модуля по стандарту, её плагин тоже проверяет.Если запрос в цикле оправдан (порционная обработка), предупреждение снимают комментарием на строке перед вызовом: // @skip-check query-in-loop - порционная обработка. Так сделано в БСП, и там видно, что проверка ловит и вызов в цикле метода с запросом внутри. Сам запрос удобно отладить в консоли запросов.
Разработка 1С в EDT окупается, если:
Остаться в конфигураторе разумно, если:
Мягкий путь — начать с расширения или внешней обработки: отдельный проект в Git, типовая остаётся на поддержке в конфигураторе. Когда процесс приживётся, переносите основную конфигурацию.
-Xmx в 1cedt.ini или через -vmargs; при нехватке физической памяти настройка не спасёт.-debug -http.Платформа нужна обязательно — через неё EDT работает с базами. Конфигуратор остаётся для администрирования (выгрузка .dt, «Тестирование и исправление»), а типовую на новый релиз многие обновляют в нём и забирают результат в проект.
Напрямую нет, форматы разные. Экспортируйте проект в XML (из EDT или 1cedtcli export) и загрузите через «Конфигурация → Загрузить конфигурацию из файлов» или ключом /LoadConfigFromFiles.
Нет, командная работа в EDT строится на Git, историю хранилища переносят в него отдельными утилитами. Как устроено само хранилище — в статье о хранилище конфигурации.
Да, с этого удобно начинать: типовая — проект конфигурации, расширение — отдельный проект с ней в роли базового (в CLI — параметр --base-project-name у import). Типовую обновляют как раньше, а базовый проект освежают повторным импортом.
Если нужно перевести доработки в EDT, настроить сборку cf/cfe из Git или сделать задачу в привычном для команды инструменте, разместите её на площадке. Оценка бесплатная, ответ в течение рабочего дня; другие направления — на странице услуг.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.