Генерация BSL и зоны генерации
Куда Studio записывает код, сгенерированный по Spec1C, что происходит с кодом вне зоны генерации и почему код виден только в собранном файле.
Перед чтением
На этой странице
При сборке Studio превращает модель спецификации в процедуру на BSL и записывает её в модуль формы. Код пишется не куда попало, а в отмеченную маркерами зону, и попадает только в собранный файл.
Коротко#
- Генерация выполняется при «Собрать», если в модели есть хотя бы один источник данных. «Применить без сборки» код не генерирует.
- Код записывается в модуль формы с именем «Форма» между строками
// >>> SPEC1C_EMIT_BLANK_BEGINи// <<< SPEC1C_EMIT_BLANK_END. - Содержимое зоны при каждой сборке заменяется целиком. Код вне зоны сохраняется.
- Генерация идёт в копию исходников на стороне сервиса сборки: на этапе Source зона остаётся шаблонной, сгенерированный код есть только в скачанном файле.
- Вид кода зависит от
target:ordinaryилиmanaged.
Зона генерации#
Новый файл, созданный кнопкой «Создать с нуля», содержит в модуле формы заготовку с пустой зоной. Так выглядит модуль формы на этапе Source до и после сборки — исходники проекта не меняются:
Процедура ПриОткрытии()
КонецПроцедуры
Процедура КнопкаОткрытьПультНажатие(Кнопка)
Сформировать(Кнопка);
КонецПроцедуры
// >>> SPEC1C_EMIT_BLANK_BEGIN
// (служебные комментарии)
Процедура Сформировать(Кнопка)
Сообщить("…: Сформировать");
КонецПроцедуры
// <<< SPEC1C_EMIT_BLANK_ENDПравила работы с зоной:
- Внутри маркеров всё заменяется сгенерированным кодом при каждой сборке со спецификацией, где есть источники. Ваши правки внутри зоны в собранный файл не попадут.
- Вне маркеров код переносится в собранный файл без изменений. Здесь можно писать свои процедуры и обработчики — например,
КнопкаОткрытьПультНажатие, которая вызываетСформировать. - Маркеры не удаляйте и не меняйте. Если их в модуле нет, Studio добавит новую зону в конец модуля. Если в модуле уже есть своя процедура
Сформировать, вместе с зоной их окажется две. - Без источников данных генерация не выполняется: собранный файл содержит модуль формы ровно в том виде, в каком он сохранён на этапе Source, включая зону.
В начале зоны генерация пишет служебные комментарии; в них встречаются внутренние пометки и прежнее название продукта. Они не влияют на работу кода.
Почему кода нет на этапе Source#
Сборка в облачной среде копирует сохранённые исходники проекта, записывает сгенерированный код в копию и упаковывает её. Сами исходники проекта остаются прежними. Поэтому:
- на этапе Source между маркерами вы увидите шаблонную процедуру, а не сгенерированный запрос;
- чтобы увидеть результат, скачайте файл и откройте его в 1С: Конфигуратор → открыть обработку → модуль формы;
- если вы хотите доработать сгенерированный код, делайте это в Конфигураторе в скачанном файле. Сама Studio сгенерированный код в исходники проекта не переносит. Если перенести его вручную на этапе Source, следующая сборка со спецификацией всё равно заменит содержимое зоны.
Вид кода: ordinary и managed#
target: ordinary даёт процедуру обычной формы. Фрагмент из живой сборки:
Процедура Сформировать(Кнопка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КлиентскиеДоговора.Ссылка КАК Ссылка,
| КлиентскиеДоговора.Код КАК Код
|ИЗ
| Справочник.КлиентскиеДоговора КАК КлиентскиеДоговора
|";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
н = 0;
Пока Выборка.Следующий() Цикл
н = н + 1;
КонецЦикла;
Сообщить("…: строк " + Строка(н));
КонецПроцедурыЗапрос выполняется, результат — сообщение с числом строк. Макет, табличный документ и вывод на экран не генерируются, даже если в спецификации есть layout.
target: managed даёт пару процедур с директивами &НаКлиенте и &НаСервере, получение макета и заполнение табличного документа:
&НаКлиенте
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере();
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере()
// ... запрос
ТабДок = Новый ТабличныйДокумент;
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Макет = ОбработкаОбъект.ПолучитьМакет("Макет");
ОбластьШапкаМакет = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрокаМакет = Макет.ПолучитьОбласть("Строка");
// ... вывод областей в ТабДок
КонецПроцедурыДля нового файла этот вариант не готов к работе: форма нового файла — обычная, директива &НаКлиенте выведена дважды подряд, макета в файле нет, а табличный документ на форму не выводится. Ожидаемо модуль не скомпилируется в 1С; в 1С это не проверялось. Сравнение вариантов — Профили генерации.
Что ещё нужно знать о сгенерированном запросе#
- Соединение в тексте запроса всегда
ЛЕВОЕ СОЕДИНЕНИЕ, какой бы вид ни был указан в спецификации. - Условие периода использует реквизиты
ДатаНачПериодаиДатаКонПериода. В новом файле их нет — добавьте их на форму в Конфигураторе или не используйтеwhereдля нового файла. format: xlsxкод выгрузки в Excel не создаёт.- Имена объектов и полей Studio не проверяет: опечатка проявится в 1С при выполнении запроса.
Полная таблица «конструкция → код» — Соответствие конструкций и BSL.
Что из этого следует#
- Пишите свой код вне маркеров; внутри зоны его заменит следующая сборка.
- Ищите сгенерированный код в скачанном файле, а не на этапе Source.
- Для нового файла выбирайте
target: ordinaryи дорабатывайте вывод в Конфигураторе: сгенерированный код — черновик запроса, а не готовый отчёт. - Для загруженного файла учтите: код пишется в форму с именем «Форма». Если такой формы в файле нет, генерация не выполнится и сборка остановится.
- Проверяйте результат в 1С по шагам Проверить результат в 1С.
См. также
- Соответствие конструкций и BSL Справочник
- Artifact и облачная сборка Понятие
- Профили генерации Понятие
- Собрать файл по спецификации Руководство
- Проверить результат в 1С Руководство
Сверено с продуктом: 27.10.2026