Instruction file imported from Jeremy344555/rat (
.cursor/rules/bsl-coding-guidelines.mdc). Copyright stays with the author.
description: globs: *.bsl alwaysApply: false
Правила кодирования на 1С
1. Правила именования
1.1 Общие правила
- Имена образуются от терминов предметной области
- Каждое слово пишется с прописной буквы
- Пробелы между словами удаляются
- Предлоги и местоимения из одной буквы также пишутся прописными
- Запрещено начинать с подчеркивания
- Не должны состоять из одного символа (кроме счетчиков циклов)
Примеры правильных имен:
// Правильно
Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом
Перем КоличествоПачекВКоробке; // Количество пачек в коробке
// Неправильно
масРеквизитов, соотвВидИмя, новСтр
1.2 Имена процедур
- Образуются от неопределенной формы глагола
- Примеры:
// Правильно
Процедура ЗагрузитьКонтрагента()
Процедура РассчитатьСуммуДокумента()
Процедура ОбновитьДанныеПоКонтрагенту()
// Неправильно
Процедура ЗагрузкаКонтрагента()
Процедура РасчетСуммыДокумента()
1.3 Имена функций
- Образуются от описания возвращаемого значения
- Для создания объектов используется слово "Новый" в начале
- Для проверок используется "Это" или причастия
Примеры:
// Правильно
Функция ПолноеИмяПользователя()
Функция НовоеПолеФормы()
Функция ДокументПроведен()
Функция ЭтоВнешняяЗадача()
// Неправильно
Функция ПолучитьПолноеИмяПользователя()
Функция СоздатьПолеФормы()
Функция ПроверитьПроведенностьДокумента()
1.4 Флаги состояния
- Называются как истинное значение флага
// Правильно
Перем ЕстьОшибки; // Признак наличия ошибок в процедуре
Перем ЭтоТоварТара; // Признак, что товар относится к возвратной таре
// Неправильно
Перем НетОшибок;
Перем НеТоварТара;
2. Правила структуры кода
2.1 Разделы модуля
#Область ОписаниеПеременных
// Объявление переменных модуля
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Экспортные процедуры и функции
#КонецОбласти
#Область ОбработчикиСобытий
// Обработчики событий объекта
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Внутренние процедуры и функции
#КонецОбласти
#Область Инициализация
// Код инициализации
#КонецОбласти
2.2 Требования к размещению в областях
2.2.1 Область "ОписаниеПеременных"
- Размещаются все переменные модуля
- Переменные группируются по назначению
- Порядок размещения:
- Переменные для хранения основных данных
- Переменные для хранения временных данных
- Переменные для хранения настроек
- Переменные для хранения состояний
- Каждая группа переменных должна быть отделена комментарием
2.2.2 Область "ПрограммныйИнтерфейс"
- Размещаются только основные экспортные процедуры и функции
- Методы должны быть сгруппированы по функциональности
- Каждая группа методов должна быть отделена комментарием или вложена в область
2.2.3 Область "ОбработчикиСобытий"
- Размещаются все обработчики событий объекта
- Обработчики должны быть сгруппированы по объектам
- Каждая группа обработчиков должна быть отделена комментарием
2.2.4 Область "СлужебныеПроцедурыИФункции"
- Размещаются все внутренние процедуры и функции
- Методы должны быть сгруппированы по функциональности
- Каждая группа методов должна быть отделена комментарием
2.2.5 Область "Инициализация"
- Размещается код инициализации модуля
- Каждый блок инициализации должен быть отделен комментарием
2.2.6 Область "СлужебныйПрограммныйИнтерфейс"
- Размещаются вспомогательные экспортные методы
- Используется для методов, которые:
- Не являются основным программным интерфейсом
- Могут быть использованы другими модулями
- Выполняют вспомогательные функции
- Методы должны быть сгруппированы по функциональности
- Каждая группа методов должна быть отделена комментарием
- Все методы в этой области должны быть помечены как Экспорт
2.3 Оформление кода
// Правильно
Процедура ЗаполнитьДанныеПоКонтрагенту(Контрагент)
Если Контрагент = Неопределено Тогда
Возврат;
КонецЕсли;
// Инициализируем переменные для выполнения расчетов
ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату();
ТекущийГод = Год(ТекущаяДата);
ТекущийМесяц = Месяц(ТекущаяДата);
КонецПроцедуры
// Неправильно
Процедура ЗаполнитьДанныеПоКонтрагенту(Контрагент)
Если Контрагент = Неопределено Тогда Возврат; КонецЕсли;
ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату(); ТекущийГод = Год(ТекущаяДата); ТекущийМесяц = Месяц(ТекущаяДата);
КонецПроцедуры
3. Правила работы с параметрами
3.1 Структуры и таблицы значений
// Правильно
Функция ПараметрыЗаполненияЦеныВСтрокеТЧ() Экспорт
ПараметрыЗаполненияЦен = Новый Структура;
ПараметрыЗаполненияЦен.Вставить("Дата", ТекущаяДатаСеанса());
ПараметрыЗаполненияЦен.Вставить("Валюта", ОсновнаяВалюта());
ПараметрыЗаполненияЦен.Вставить("ПересчитыватьСумму", Истина);
Возврат ПараметрыЗаполненияЦен;
КонецФункции
// Неправильно
Функция ПараметрыЗаполненияЦеныВСтрокеТЧ() Экспорт
Возврат Новый Структура("Дата, Валюта, ПересчитыватьСумму",
ТекущаяДатаСеанса(),
ОсновнаяВалюта(),
Истина);
КонецФункции
3.2 Параметры процедур и функций
// Правильно
Процедура ПересчитатьСуммуДокумента(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина)
// Код процедуры
КонецПроцедуры
// Неправильно
Процедура ПересчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина)
// Код процедуры
КонецПроцедуры
4. Правила документирования
4.1 Комментарии
// Правильно
// Инициализируем переменные для выполнения расчетов,
// которые выполняются далее по тексту модуля.
ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату();
ТекущийГод = Год(ТекущаяДата);
// Неправильно
// TODO: доделать расчеты
// Иванов: проверить корректность
ТекущаяДата = ОбщегоНазначения.ПолучитьРабочуюДату();
4.2 Описание параметров
// Правильно
// Параметры:
// СведенияОбОбновлении - Структура:
// * КодАдресногоОбъекта - Структура:
// ** КодРегиона - Число - код региона (длина - 2)
// ** КодНаселенногоПункта - Число - код населенного пункта (длина - 3)
// * Наименование - Строка
// * ОбновлениеДоступно - Булево
Функция ОбновитьАдресныеДанные(СведенияОбОбновлении)
// Код функции
КонецФункции
5. Правила работы с запросами
5.1 Тексты запросов
// Правильно
ТекстЗапроса =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ДатаРегистрации >= &НачалоПериода
| И Контрагенты.ДатаРегистрации <= &КонецПериода";
// Неправильно
ТекстЗапроса = "ВЫБРАТЬ Контрагенты.Ссылка КАК Ссылка, Контрагенты.Наименование КАК Наименование ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ Контрагенты.ДатаРегистрации >= &НачалоПериода И Контрагенты.ДатаРегистрации <= &КонецПериода";
5.2 Временные таблицы
// Правильно
ТекстЗапроса =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ПОМЕСТИТЬ ВременнаяТаблицаКонтрагентов
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ДатаРегистрации >= &НачалоПериода
| И Контрагенты.ДатаРегистрации <= &КонецПериода";
// Неправильно
ТекстЗапроса =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|// ПОМЕСТИТЬ ВременнаяТаблицаКонтрагентов
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Примеры промптов для LLM
Пример 1: Создание процедуры
Создай процедуру на 1С для заполнения данных по контрагенту в документе.
Процедура должна:
1. Принимать параметры: ДокументОбъект, Контрагент
2. Проверять корректность входных данных
3. Заполнять реквизиты документа данными контрагента
4. Обрабатывать ошибки
5. Следовать стандартам кодирования 1С
Пример 2: Создание функции
Напиши функцию на 1С для расчета суммы документа с учетом скидок.
Функция должна:
1. Принимать параметры: ДокументОбъект, ПроцентСкидки
2. Возвращать структуру с суммами: СуммаДокумента, СуммаСкидки, ИтоговаяСумма
3. Учитывать НДС
4. Следовать стандартам кодирования 1С
Пример 3: Создание запроса
Сформируй запрос на 1С для получения списка документов по контрагенту.
Запрос должен:
1. Выбирать документы за период
2. Группировать по типам документов
3. Считать суммы по каждому типу
4. Использовать временные таблицы
5. Следовать стандартам кодирования 1С