framework/skills/bsl-practices/coding-standards/SKILL.md
Стандарты кодирования BSL (1С). Этот навык учит агента писать код на встроенном языке 1С (BSL) в соответствии со стандартами платформы 1С:Предприятие и рекомендациями ИТС.
npx skillsauth add steelmorgan/1c-agent-based-dev-framework coding-standardsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Стандарт ИТС: «Тексты модулей» — имена на русском, ВерблюжийРегистр.
| Элемент | Формат | Пример |
|---------|--------|--------|
| Переменная | СуществительноеИлиФраза | КоличествоСтрок, ДатаНачалаПериода |
| Процедура | ГлагольнаяФраза | ЗаполнитьТабличнуюЧасть, УстановитьОтбор |
| Функция | СуществительноеИлиВопрос | ПолучитьСписокДокументов, ЭтоНовый |
| Булева переменная | Утвердительная форма | ЭтоНовый, РазрешеноРедактирование, ЕстьОшибки |
| Параметр | КакПеременная | ДокументСсылка, РежимОткрытия |
Процедура ЗаполнитьТабличнуюЧастьТовары(ДокументОбъект, ДанныеЗаполнения)
КоличествоСтрок = ДанныеЗаполнения.Количество();
ЕстьОшибки = Ложь;
Для Каждого СтрокаДанных Из ДанныеЗаполнения Цикл
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = СтрокаДанных.Количество;
КонецЦикла;
КонецПроцедуры
Стандарт ИТС: «Структура модуля» — области (#Область) в определённом порядке.
#Область ПрограммныйИнтерфейс
// Экспортные процедуры и функции — публичный API модуля.
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт
// ...
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Экспортные процедуры для вызова только из других модулей данной подсистемы.
Функция ПересчитатьКурсВнутренний(ПараметрыПересчета) Экспорт
// ...
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Внутренняя реализация. Не экспортные.
Функция СформироватьЗапросКурса(Валюта, Дата)
// ...
КонецФункции
#КонецОбласти
#Область ОписаниеПеременных
Перем МассивИзменённыхРеквизитов;
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// ...
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
// ...
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
#Область Инициализация
МассивИзменённыхРеквизитов = Новый Массив;
#КонецОбласти
При вызове &НаСервере платформа сериализует весь контекст формы туда-обратно. &НаСервереБезКонтекста передаёт только параметры — радикально меньше трафика.
| Директива | Где выполняется | Доступ к данным формы | Когда использовать |
|-----------|----------------|----------------------|-------------------|
| &НаКлиенте | Клиент (тонкий/веб) | Да (клиентская копия) | Интерактивная логика: диалоги, навигация |
| &НаСервере | Сервер | Да (полный контекст формы) | Нужен доступ к реквизитам формы + БД |
| &НаСервереБезКонтекста | Сервер | Нет | Запросы к БД, вычисления без данных формы |
| &НаКлиентеНаСервереБезКонтекста | И клиент, и сервер | Нет | Чистые вычисления, валидация без БД |
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
ДанныеНоменклатуры = ПолучитьДанныеНоменклатуры(Элементы.Товары.ТекущиеДанные.Номенклатура);
ЗаполнитьСтрокуТоваровНаКлиенте(ДанныеНоменклатуры);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеНоменклатуры(НоменклатураСсылка)
Возврат Новый Структура("ЕдиницаИзмерения, Цена, СтавкаНДС",
НоменклатураСсылка.ЕдиницаИзмерения,
НоменклатураСсылка.Цена,
НоменклатураСсылка.СтавкаНДС);
КонецФункции
Локальная переменная с именем глобальной коллекции скрывает менеджер — дальше в коде обращения к нему дадут ошибку.
// Правильно — конкретное имя
МассивДокументовКОбработке = Новый Массив;
СправочникНоменклатура = Справочники.Номенклатура;
Документы, Справочники, Регистры, Перечисления, ПланыОбмена, ПланыВидовХарактеристик, ПланыВидовРасчета, ПланыСчетов, БизнесПроцессы, Задачи, Обработки, Отчеты, Константы, ПараметрыСеанса, РегистрыСведений, РегистрыНакопления, РегистрыБухгалтерии, РегистрыРасчета
В BSL строки иммутабельны. Строка1 + Строка2 в цикле из N итераций даёт O(N^2) по памяти и времени — каждая итерация копирует всё предыдущее.
Стандарт ИТС: «Эффективная работа со строками».
// O(N) — массив + СтрСоединить()
ЧастиСтроки = Новый Массив;
Для Каждого Элемент Из КоллекцияДанных Цикл
ЧастиСтроки.Добавить(Элемент.Наименование);
КонецЦикла;
РезультатСтрока = СтрСоединить(ЧастиСтроки, ", ");
// Для фиксированного числа подстановок — СтрШаблон() (до 10 параметров)
ТекстСообщения = СтрШаблон(
НСтр("ru = 'Документ %1 от %2 на сумму %3 руб.'"),
НомерДокумента,
Формат(ДатаДокумента, "ДЛФ=D"),
Формат(Сумма, "ЧДЦ=2"));
Стандарт ИТС: «Структура модуля» — обязательные стандартные области.
#Область ОписаниеПеременных
#КонецОбласти
#Область ОбработчикиСобытийФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыТовары
#КонецОбласти
#Область ОбработчикиКомандФормы
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
Правила: не вкладывать глубже 2 уровней; не создавать пустые области; использовать стандартные имена из ИТС (IDE и инструменты анализа на них опираются).
Стандарт ИТС: «Описание процедур и функций» — экспортные процедуры ОБЯЗАНЫ иметь комментарий-описание.
// Возвращает курс валюты на указанную дату.
// Если на указанную дату курс не установлен, возвращает курс на ближайшую предыдущую дату.
//
// Параметры:
// Валюта - СправочникСсылка.Валюты - валюта, курс которой нужно получить.
// ДатаКурса - Дата - дата, на которую нужен курс.
// Если не указана, используется текущая дата сеанса.
//
// Возвращаемое значение:
// Число - курс валюты. 0 если курс не найден.
//
Функция ПолучитьКурсВалюты(Валюта, ДатаКурса = Неопределено) Экспорт
// Сумму округляем до копеек, потому что бухгалтерский учёт не допускает дробных копеек,
// а при пересчёте НДС могут возникнуть дроби.
СуммаНДС = Окр(СуммаБезНДС * СтавкаНДС / 100, 2);
Все строки, отображаемые пользователю, оборачиваются в НСтр() — для локализуемости.
Стандарт ИТС: «Использование функции НСтр()».
ТекстПредупреждения = НСтр("ru = 'Документ не может быть проведён. Не заполнена дата.'");
// С параметрами — НСтр() + СтрШаблон()
ТекстСообщения = СтрШаблон(
НСтр("ru = 'Остаток товара ""%1"" на складе: %2 %3'"),
Номенклатура,
Остаток,
ЕдиницаИзмерения);
Процедура свыше 100 строк — сигнал к декомпозиции. Разделение на мелкие функции с говорящими именами делает код самодокументируемым.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ИнициализироватьДанныеДокумента();
ПроверитьЗаполнениеРеквизитов(Отказ);
Если Не Отказ Тогда
СформироватьДвижения(Отказ);
КонецЕсли;
КонецПроцедуры
BSL динамически типизирован. Описание типов в комментарии к экспортной функции — единственный способ документировать контракт.
// Создаёт новый элемент справочника «Номенклатура» с заполнением по умолчанию.
//
// Параметры:
// ДанныеЗаполнения - Структура - содержит поля:
// * Наименование - Строка - наименование номенклатуры (обязательно).
// * ВидНоменклатуры - ПеречислениеСсылка.ВидыНоменклатуры - вид (обязательно).
// * ЕдиницаИзмерения - СправочникСсылка.ЕдиницыИзмерения - ед. изм. Необязательно,
// по умолчанию «шт.».
// * Артикул - Строка - артикул. Необязательно.
//
// Возвращаемое значение:
// СправочникСсылка.Номенклатура - ссылка на созданный элемент.
//
Функция СоздатьНоменклатуру(ДанныеЗаполнения) Экспорт
Угроза безопасности (аналог eval), невидимы для статического анализа, трудны в отладке.
// Правильно — прямой вызов через метаданные
МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(СсылкаНаОбъект);
Захардкоженные значения непонятны, дублируются и не настраиваемы.
// Правильно — перечисление, значение самодокументировано
Если Документ.Статус = Перечисления.СтатусыДокументов.Согласован Тогда
// ...
КонецЕсли;
// Или константа для настраиваемых значений
МаксимальноеКоличествоПопыток = Константы.МаксимальноеКоличествоПопытокОтправки.Получить();
Цепочки ссылок создают неявные JOIN. При составных типах платформа делает JOIN ко всем возможным таблицам.
// Правильно — один запрос с явными JOIN
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| Товары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &ДокументСсылка";
Для Каждого СтрокаТоваров Из Документ.Товары Цикл
ВидНоменклатуры = СтрокаТоваров.Номенклатура.ВидНоменклатуры;
ЕдиницаИзмерения = СтрокаТоваров.Номенклатура.ЕдиницаИзмерения;
КонецЦикла;
ПолучитьФорму() — обычное приложение, не работает в управляемом интерфейсе.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ДокументСсылка);
ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта",
ПараметрыФормы,
ЭтотОбъект,
,
,
,
Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект));
Логику записи и проверок размещайте в модуле объекта — для тестируемости и повторного использования.
// Модуль объекта документа
Процедура ПередЗаписью(Отказ)
Для Каждого Строка Из Товары Цикл
Строка.Сумма = Строка.Количество * Строка.Цена;
КонецЦикла;
КонецПроцедуры
См. error-handling, правило 1.
См. form-patterns.
ask_ai_assistant (шаблон VALIDATE_BSL из buddy-prompting). Отдать фрагмент кода — получить нарушения стандартов и рекомендации по замене на методы БСП/платформы.ask_ai_assistant (шаблон SEARCH_ITS из buddy-prompting). При расхождении навыка с ИТС — приоритет у ИТС.tools
Diagnostics for Vanessa Automation runs. Use when a feature scenario failed, artifacts were not created, or you need to classify a failure after launch.
tools
Creating and refining Vanessa Automation feature scenarios based on real project requirements. Use when you need to write or update a scenario test, not just run it.
tools
--- name: v8-session-manager description: Use when working with the 1С session manager (v8-session-manager) - launch, configuration, connecting 1С clients, reading session_list, calling proxied MCP-tools from 1С extensions, diagnostics. Triggers: mention of `v8-session-manager`, `session_list`, 1С extension MCP showcase, error “no active sessions” / “session_id required”, connecting a client to the manager via `mcpMode=ws`. provides_capabilities: # Built-in manager tools — always available whi
tools
Use when Codex needs to manage v8-runner on local 1C projects through the CLI: configure v8project.yaml, initialize infobases or EDT workspaces, build sources from Designer or EDT, run syntax checks and tests, dump infobase changes, convert source formats, load or export artifacts, launch 1C clients, or choose safe 1C automation command sequences.