Разработка и Конфигурация · 10 мин
1С: как правильно писать код и запросы
Как правильно писать код на встроенном языке 1С: стандарты оформления, работа с запросами, обработка ошибок, типичные ошибки и проверка результата.
Правильное написание кода в 1С — это не только работающий алгоритм, но и читаемость, предсказуемость и безопасность для данных. Один и тот же результат можно получить десятком способов, но часть из них создаст проблемы при обновлении конфигурации, замедлит работу базы или приведёт к потере данных при ошибке.
Фирма «1С» публикует систему стандартов разработки, которая используется при сертификации продуктов «1С:Совместимо». Даже если вы не готовите решение к сертификации, эти правила экономят время: они описывают, как именовать переменные, оформлять процедуры, работать с транзакциями и писать запросы без избыточных обращений к базе.
Материал ориентирован на тех, кто пишет на встроенном языке 1С:Предприятие 8.3 — во внешних обработках, расширениях и доработках типовых конфигураций. Разберём ключевые правила с примерами и контрольными точками для самопроверки.
Соблюдайте стандарты именования и оформления
Имена переменных, процедур и функций должны отражать смысл, а не тип данных. Переменная ТабДок или Стр1 ничего не говорит читателю; ТабличныйДокументРеализации и СтрокаТовары — говорят. Используйте русский язык, если конфигурация написана на нём: смешение языков в одном модуле затрудняет чтение.
Основные правила оформления:
- процедура или функция решает одну задачу и обычно умещается в один-два экрана;
- параметры с признаком
Значиспользуются осознанно — по умолчанию параметры передаются по ссылке; - экспортные процедуры и функции сопровождаются комментарием: назначение, параметры, возвращаемое значение;
- отступы — табуляция или пробелы последовательно, вложенные блоки смещаются на один уровень;
- закомментированный «мёртвый» код не хранят в модуле — его удаляют, история есть в хранилище конфигурации.
Пишите запросы вместо циклов по выборке
Самая частая причина медленного кода в 1С — обращение к базе данных внутри цикла. Конструкция, где в цикле по строкам таблицы выполняется НайтиПоКоду или запрос, делает столько обращений к СУБД, сколько строк в таблице. На больших объёмах это разница между секундами и минутами.
Правильный подход — получить все нужные данные одним запросом, используя соединения и временные таблицы. Таблицу значений можно передать в запрос как параметр через менеджер временных таблиц и соединить её с данными базы.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| &Товары КАК Товары
|;
|ВЫБРАТЬ
| ВТ_Товары.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Остаток
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки
| ПО ВТ_Товары.Номенклатура = Остатки.Номенклатура";
Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);
Дополнительные правила работы с запросами:
- не используйте
ВЫБРАТЬ *— перечисляйте только нужные поля; - условия накладывайте в виртуальных таблицах (параметры
Остатки,Обороты), а не в секцииГДЕ— это сокращает объём выборки; - обход результата группировкой делайте через
ОбходРезультатаЗапроса.ПоГруппировкам, а не несколькими вложенными запросами; - для проверки существования записи используйте
ВЫБРАТЬ ПЕРВЫЕ 1, а не полную выборку.
Перед оптимизацией измерьте. Замер производительности в конфигураторе (Отладка — Замер производительности) покажет, какие строки реально занимают время. Часто узкое место оказывается не там, где ожидалось.
Обрабатывайте ошибки и используйте транзакции
Любая операция, которая записывает несколько связанных объектов — документ и его движения, несколько элементов справочника — должна выполняться в транзакции. Если на середине операции произойдёт ошибка, база останется в согласованном состоянии: либо записано всё, либо ничего.
НачатьТранзакцию();
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
НоваяЗадача.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ОбменДанными",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
Обратите внимание на детали: ошибка пишется в журнал регистрации с подробным представлением (для диагностики), а наружу выдаётся краткое. «Проглатывать» исключение пустым блоком Исключение КонецПопытки; недопустимо — проблема останется незамеченной, а данные могут оказаться несогласованными.
Работайте с объектами правильно: ссылки, объекты, блокировки
Различайте работу через ссылку и через объект. Если нужно только прочитать реквизит — достаточно обращения через точку к ссылке (платформа выполнит запрос). Если нужно изменить данные — получайте объект методом ПолучитьОбъект(), изменяйте и записывайте. Проверяйте, что объект получен: для битой ссылки ПолучитьОбъект() вернёт Неопределено.
При конкурентной работе пользователей используйте управляемые блокировки данных — в файловом и клиент-серверном режиме платформа поддерживает механизм БлокировкаДанных. Это предотвращает ситуацию, когда два пользователя одновременно изменяют один документ и чьи-то изменения теряются.
Чего следует избегать при записи:
- запись объекта в цикле без необходимости — если меняется один реквизит у многих элементов, рассмотрите пакетную обработку с транзакцией на разумную порцию;
- вызов
Записать()без проверкиПроверитьЗаполнение()для документов с обязательными реквизитами; - использование
ОбменДанными.Загрузка = Истинавне обменов — этот приём отключает проверки и подписки на события, что легко приводит к нарушению целостности данных.
Дорабатывайте типовые конфигурации через расширения
Если задача — изменить поведение типовой конфигурации, первый вариант, который стоит рассмотреть, — расширение конфигурации. Расширение позволяет добавлять свои процедуры, подписываться на события форм и модулей, изменять запросы динамических списков, не снимая типовые модули с поддержки.
Когда расширения недостаточно (например, нужно изменить структуру метаданных, которую расширение не поддерживает), изменения вносятся в конфигурацию с минимальным вмешательством: свои доработки выделяются в отдельные процедуры и области с понятными пометками, чтобы при обновлении их было легко перенести.
Как выбрать действие
Проверяйте код перед передачей в работу
Минимальный контроль — синтаксическая проверка модуля в конфигураторе (Ctrl+F7 по модулю, полная проверка конфигурации через меню «Конфигурация — Проверка конфигурации»). Включите проверку логической целостности и поиск некорректных ссылок — она находит обращения к удалённым объектам метаданных.
Порядок проверки доработки перед переносом в рабочую базу:
- 1Выполните синтаксическую проверку изменённых модулей и всей конфигурации
- 2Прогоните сценарий вручную на копии базы: типовой случай, граничные значения, отмена операции
- 3Проверьте поведение при ошибке: прерванная операция не должна оставлять частично записанные данные
- 4Сделайте замер производительности на объёме данных, близком к реальному
- 5Проверьте журнал регистрации — там не должно быть новых ошибок после теста
Как проверить результат
Нет ошибок, предупреждения осмысленны и объяснимы
Ошибки компиляции модулей или битые ссылки на метаданные
Только ожидаемые информационные записи
Ошибки фоновых заданий или исключения, которых не было в сценарии
Время растёт примерно линейно с ростом данных
Резкий рост времени при увеличении объёма — признак запросов в цикле
Частые вопросы
Нужно ли писать код на английском, если конфигурация на русском?
Нет. Встроенный язык поддерживает оба синтаксиса, но смешение языков в одной конфигурации считается плохой практикой. Следуйте языку конфигурации: для типовых российских решений это русский синтаксис и русские имена.
Чем расширение лучше прямой доработки конфигурации?
Расширение подключается и отключается без изменения основной конфигурации, поэтому обновление типового релиза проходит штатно. Прямые изменения модулей приходится каждый раз сопоставлять и переносить вручную, что занимает часы и чревато потерей доработок.
Когда оправдано ОбменДанными.Загрузка = Истина?
Только в механизмах обмена данными, где проверки выполняются на стороне источника, и при массовой первоначальной загрузке справочников. Для обычной записи документов и элементов этот приём опасен: он отключает контроль заполнения, подписки на события и часть бизнес-логики.
Как найти медленное место в коде без сторонних инструментов?
Встроенный замер производительности конфигуратора показывает время и количество вызовов по строкам модулей. Для запросов полезен технологический журнал с событием DBMSSQL/DBPOSTGRS — он показывает фактические обращения к СУБД и их длительность.
Обязательно ли оформлять комментарии к каждой процедуре?
К экспортным — да: описание назначения, параметров и возвращаемого значения входит в стандарты разработки и формирует документацию модуля. Локальные процедуры с говорящим именем дополнительного описания обычно не требуют.
Что важно запомнить
Правильный код в 1С — это читаемые имена, запросы вместо циклов по базе, транзакции с обработкой ошибок, доработки через расширения и обязательная проверка на копии базы. Стандарты разработки 1С — готовый ориентир для самопроверки.