Instruction file imported from dojomojo132/Public_Trade_Module (
.github/instructions/bsl.instructions.md). Copyright stays with the author.
--- description: "Use when writing, editing, or reviewing BSL (1C:Enterprise) code. Covers syntax rules, naming conventions, async patterns, directives, transactions, queries, and common anti-patterns for platform 8.3.27." applyTo: "**/*.bsl"
Стандарты BSL-кода (1С:Предприятие 8.3.27)
Директивы компиляции
Каждый метод ОБЯЗАН иметь директиву на отдельной строке ПЕРЕД сигнатурой:
| Директива | Контекст |
|---|---|
&НаКлиенте |
UI-логика, оповещения |
&НаСервере |
Работа с реквизитами формы |
&НаСервереБезКонтекста |
Чистые функции, запросы |
&НаКлиентеНаСервереБезКонтекста |
Утилиты, форматирование |
Области (обязательно)
Весь код внутри областей. Код вне областей — ЗАПРЕЩЁН.
#Область ОписаниеПеременных
#Область ПрограммныйИнтерфейс
#Область ОбработчикиСобытийФормы
#Область ОбработчикиСобытийЭлементовШапкиФормы
#Область ОбработчикиСобытийЭлементовТаблицы<Имя>
#Область ОбработчикиКомандФормы
#Область СлужебныеПроцедурыИФункции
#Область Инициализация
Именование
- Русский ВерблюжийРегистр:
ПолучитьОстатокТовара,ЗаполнитьТаблицуТоваров - Максимум 80 символов в имени
- Методы = Глагол+Существительное
- НЕ snake_case, НЕ camelCase
Конструктор Новый — АБСОЛЮТНОЕ ПРАВИЛО
ВСЕГДА Новый — НИКОГДА Новая или Новое:
// ✅ Правильно:
Новый Массив
Новый Запрос
Новый Структура
Новый Соответствие
Новый ТаблицаЗначений
Новый БлокировкаДанных
// ❌ Ошибка:
Новая Структура // НЕ существует
Новое Соответствие // НЕ существует
Асинхронность (платформа 8.3.24+)
ТОЛЬКО Асинх/Ждать на клиенте. Модальные вызовы ЗАПРЕЩЕНЫ:
| ❌ Запрещено | ✅ Замена |
|---|---|
Вопрос() |
ВопросАсинх() |
Предупреждение() |
ПредупреждениеАсинх() |
ОткрытьФормуМодально() |
ОткрытьФормуАсинх() |
ВвестиЧисло() |
ВвестиЧислоАсинх() |
ВвестиСтроку() |
ВвестиСтрокуАсинх() |
ВвестиДату() |
ВвестиДатуАсинх() |
Запрещённые / устаревшие конструкции
| ❌ Не использовать | ✅ Правильно |
|---|---|
ЗначениеВСтроку() |
ЗначениеВСтрокуВнутр() |
СтрокаВЗначение() |
ЗначениеИзСтрокиВнутр() |
ТекущаяДата() |
ТекущаяДатаСеанса() |
Найти() |
СтрНайти() |
ЭтаФорма |
ЭтотОбъект |
ПолучитьФорму() |
ОткрытьФорму() |
Сообщить() |
СообщениеПользователю с привязкой к полям |
РольДоступна() |
ПравоДоступа() |
Запросы
- ВСЕГДА псевдонимы для каждого поля в SELECT
ЕСТЬNULLдля LEFT/RIGHT/FULL соединений- НИКОГДА
ВЫБРАТЬ ПЕРВЫЕбезУПОРЯДОЧИТЬ ПО - НИКОГДА запросы в циклах
ОБЪЕДИНИТЬ ВСЕвместоОБЪЕДИНИТЬ- Параметры через
Запрос.УстановитьПараметр() - НЕ соединять с подзапросами или виртуальными таблицами
Транзакции
НачатьТранзакцию();
Попытка
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("...");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
БлокировкаДанных.Заблокировать();
// ... операции ...
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Безопасность
| Запрещено | Риск |
|---|---|
Выполнить() с переменной |
Произвольное выполнение кода |
Вычислить() с внешними данными |
Инъекция кода |
| Хардкод паролей/IP/путей | Потеря переносимости |
УстановитьПривилегированныйРежим(Истина) |
Обход прав |
УстановитьБезопасныйРежим(Ложь) |
Обход безопасности |
Форматирование
- Табуляция = 4 пробела
- Максимум 120 символов в строке
- Пробелы вокруг операторов:
Сумма = Количество * Цена - Пробел после запятой:
Метод(П1, П2, П3) - Каждый оператор заканчивается
;
Проведение документов
- Первая строка:
Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; - Инициализация:
Движения.<Регистр>.Записывать = Истина; - Добавление:
Движение = Движения.<Регистр>.Добавить();
HTMLDocumentField — обработка кликов
ЕДИНСТВЕННЫЙ рабочий паттерн (тонкий клиент, MSHTML). Не использовать URLClick, data-action, JS-обработчики.
Form.xml:
<Events>
<Event name="OnClick">ПолеHTMLПриНажатии</Event>
</Events>
Module.bsl:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Попытка
Ссылка = ДанныеСобытия.Href;
Исключение
Возврат;
КонецПопытки;
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда Возврат; КонецЕсли;
Префикс = "v8:";
Если Лев(Ссылка, СтрДлина(Префикс)) <> Префикс Тогда Возврат; КонецЕсли;
СтандартнаяОбработка = Ложь;
Остаток = Сред(Ссылка, СтрДлина(Префикс) + 1);
Части = СтрРазделить(Остаток, "/", Истина);
Действие = ?(Части.Количество() > 0, Части[0], "");
ИД = ?(Части.Количество() > 1, Части[1], "");
// далее — диспетчеризация по Действие
КонецПроцедуры
HTML-разметка:
<a href="v8:open/123">Открыть</a>
<a href="v8:selectDate/20260310">10.03</a>
Префикс v8: обязателен — MSHTML без него считает URL внешним и пытается открыть в браузере. Идентификаторы объектов передавать через ПоместитьВоВременноеХранилище(Соответствие, УникальныйИдентификатор) и резолвить на сервере.
Обязательная проверка
После ЛЮБОГО изменения BSL-файла — вызвать get_errors и исправить все найденные проблемы.