一键导入
coding-standards
When writing or reviewing BSL, apply 1C standards
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
When writing or reviewing BSL, apply 1C standards
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
При написании или ревью BSL применять стандарты 1С
Orchestrator: routing work and agent phases
Оркестратор: маршрутизация работы и фаз агентов
BSL LSP navigation: definitions, refs, call graph
Rules for using RLM tools for project search and navigation in 1C/BSL
Find an existing equivalent before new BSL code
| name | coding-standards |
| description | When writing or reviewing BSL, apply 1C standards |
| alwaysApply | false |
ITS standard: "Module texts" - names in Russian, CamelCase. For procedures, functions, variables, and parameters, use CamelCase with a capital first letter.
| Element | Format | Example |
|---|---|---|
| Variable | NounOrPhrase | КоличествоСтрок, ДатаНачалаПериода |
| Procedure | VerbPhrase | ЗаполнитьТабличнуюЧасть, УстановитьОтбор |
| Function | NounOrQuestion | ПолучитьСписокДокументов, ЭтоНовый |
| Boolean variable | Affirmative form | ЭтоНовый, РазрешеноРедактирование, ЕстьОшибки |
| Parameter | AsVariable | ДокументСсылка, РежимОткрытия |
ЗаполнитьТабличнуюЧасть, УстановитьОтбор.СписокДокументов, ЭтоНовый.Новый: НовыйПараметрыОтбора.Это, Есть, Используется, Включено, or use a participle: ЭтоНовый, ЕстьОшибки, ЗаполненоЗначение.ПолучитьСписокДокументов.Процедура ЗаполнитьТабличнуюЧастьТовары(ДокументОбъект, ДанныеЗаполнения)
КоличествоСтрок = ДанныеЗаполнения.Количество();
ЕстьОшибки = Ложь;
Для Каждого СтрокаДанных Из ДанныеЗаполнения Цикл
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = СтрокаДанных.Количество;
КонецЦикла;
КонецПроцедуры
ITS standard: "Module structure" - regions (#Region) in a defined order.
#Область ПрограммныйИнтерфейс
// Экспортные процедуры и функции — публичный API модуля.
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт
// ...
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Экспортные процедуры для вызова только из других модулей данной подсистемы.
Функция ПересчитатьКурсВнутренний(ПараметрыПересчета) Экспорт
// ...
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Внутренняя реализация. Не экспортные.
Функция СформироватьЗапросКурса(Валюта, Дата)
// ...
КонецФункции
#КонецОбласти
#Область ОписаниеПеременных
Перем МассивИзменённыхРеквизитов;
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// ...
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
// ...
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
#Область Инициализация
МассивИзменённыхРеквизитов = Новый Массив;
#КонецОбласти
When calling &НаСервере, the platform serializes the entire form context back and forth. &НаСервереБезКонтекста transfers only parameters — radically less traffic.
| Directive | Where it runs | Access to form data | When to use |
|---|---|---|---|
&НаКлиенте | Client (thin/web) | Yes (client copy) | Interactive logic: dialogs, navigation |
&НаСервере | Server | Yes (full form context) | Access to form attributes + database is needed |
&НаСервереБезКонтекста | Server | No | Database queries, calculations without form data |
&НаКлиентеНаСервереБезКонтекста | Both client and server | No | Pure calculations, validation without database |
A local variable with the same name as a global collection hides the manager, so later references to it in code will cause an error.
// Correct — a specific name
МассивДокументовКОбработке = Новый Массив;
СправочникНоменклатура = Справочники.Номенклатура;
Документы, Справочники, Регистры, Перечисления, ПланыОбмена, ПланыВидовХарактеристик, ПланыВидовРасчета, ПланыСчетов, БизнесПроцессы, Задачи, Обработки, Отчеты, Константы, ПараметрыСеанса, РегистрыСведений, РегистрыНакопления, РегистрыБухгалтерии, РегистрыРасчета
+ in loopsIn BSL, strings are immutable. Строка1 + Строка2 in a loop with N iterations gives O(N^2) in memory and time — each iteration copies everything that came before.
ITS standard: "Efficient Working with Strings".
// O(N) — array + СтрСоединить()
ЧастиСтроки = Новый Массив;
Для Каждого Элемент Из КоллекцияДанных Цикл
ЧастиСтроки.Добавить(Элемент.Наименование);
КонецЦикла;
РезультатСтрока = СтрСоединить(ЧастиСтроки, ", ");
// For a fixed number of substitutions — СтрШаблон() (up to 10 parameters)
ТекстСообщения = СтрШаблон(
НСтр("ru = 'Документ %1 от %2 на сумму %3 руб.'"),
НомерДокумента,
Формат(ДатаДокумента, "ДЛФ=D"),
Формат(Сумма, "ЧДЦ=2"));
ITS standard: "Module Structure" — mandatory standard regions.
#Область ОписаниеПеременных
#КонецОбласти
#Область ОбработчикиСобытийФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
#КонецОбласти
#Область ОбработчикиКомандФормы
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
Rules: do not nest deeper than 2 levels; do not create empty regions; use the standard names from ITS (the IDE and analysis tools rely on them).
ITS standard: "Description of procedures and functions" - exported procedures MUST have a descriptive comment.
// Возвращает курс валюты на указанную дату.
// Если на указанную дату курс не установлен, возвращает курс на ближайшую предыдущую дату.
//
// Параметры:
// Валюта - СправочникСсылка.Валюты - валюта, курс которой нужно получить.
// ДатаКурса - Дата - дата, на которую нужен курс.
// Если не указана, используется текущая дата сеанса.
//
// Возвращаемое значение:
// Число - курс валюты. 0 если курс не найден.
//
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса = Неопределено) Экспорт
// Сумму округляем до копеек, потому что бухгалтерский учёт не допускает дробных копеек,
// а при пересчёте НДС могут возникнуть дроби.
СуммаНДС = Окр(СуммаБезНДС * СтавкаНДС / 100, 2);
All strings displayed to the user are wrapped in НСтр() for localization.
ITS standard: "Using the НСтр() function".
ТекстПредупреждения = НСтр("ru = 'Документ не может быть проведён. Не заполнена дата.'");
// С параметрами — НСтр() + СтрШаблон()
ТекстСообщения = СтрШаблон(
НСтр("ru = 'Остаток товара ""%1"" на складе: %2 %3'"),
Номенклатура,
Остаток,
ЕдиницаИзмерения);
A procedure longer than 100 lines is a signal to decompose it. Splitting it into small functions with descriptive names makes the code self-documenting.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ИнициализироватьДанныеДокумента();
ПроверитьЗаполнениеРеквизитов(Отказ);
Если Не Отказ Тогда
СформироватьДвижения(Отказ);
КонецЕсли;
КонецПроцедуры
BSL is dynamically typed. Describing types in a comment for an exported function is the only way to document the contract.
// Создаёт новый элемент справочника «Номенклатура» с заполнением по умолчанию.
//
// Параметры:
// ДанныеЗаполнения - Структура - содержит поля:
// * Наименование - Строка - наименование номенклатуры (обязательно).
// * ВидНоменклатуры - ПеречислениеСсылка.ВидыНоменклатуры - вид (обязательно).
// * ЕдиницаИзмерения - СправочникСсылка.ЕдиницыИзмерения - ед. изм. Необязательно,
// по умолчанию «шт.».
// * Артикул - Строка - артикул. Необязательно.
//
// Возвращаемое значение:
// СправочникСсылка.Номенклатура - ссылка на созданный элемент.
//
Функция СоздатьНоменклатуру(ДанныеЗаполнения) Экспорт
Execute() and Evaluate() unless absolutely necessarySecurity threat (analogous to eval), invisible to static analysis, hard to debug.
// Правильно — прямой вызов через метаданные
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(СсылкаНаОбъект);
Hardcoded values are unclear, duplicated, and not configurable.
// Правильно — перечисление, значение самодокументировано
Если Документ.Статус = Перечисления.СтатусыДокументов.Согласован Тогда
// ...
КонецЕсли;
// Или константа для настраиваемых значений
МаксимальноеКоличествоПопыток = Константы.МаксимальноеКоличествоПопытокОтправки.Получить();
Reference chains create implicit JOINs. For composite types, the platform performs a JOIN to all possible tables.
// Правильно — один запрос с явными JOIN
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| Товары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &ДокументСсылка";
Для Каждого СтрокаТоваров Из Документ.Товары Цикл
ВидНоменклатуры = СтрокаТоваров.Номенклатура.ВидНоменклатуры;
ЕдиницаИзмерения = СтрокаТоваров.Номенклатура.ЕдиницаИзмерения;
КонецЦикла;
ПолучитьФорму() is available in client code of a managed application, but it only creates the form and returns it without showing it, leaving lifecycle management to the developer. To open a form, prefer ОткрытьФорму() - it creates and shows the form in a single call.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ДокументСсылка);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы,
ЭтотОбъект,
,
,
,
Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект));
Place write and validation logic in the object module - for testability and reuse.
// Модуль объекта документа
Процедура ПередЗаписью(Отказ)
Для Каждого Строка Из Товары Цикл
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
КонецПроцедуры
See error-handling, rule 1.
See form-patterns.
ask_ai_assistant (VALIDATE_BSL template from buddy-prompting). Pass the code fragment and get standard violations plus recommendations for replacing them with BSP/platform methods.ask_ai_assistant (SEARCH_ITS template from buddy-prompting). If the skill conflicts with ITS, ITS takes priority.