К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как правильно писать код и запросы

Как правильно писать код на встроенном языке 1С: стандарты оформления, работа с запросами, обработка ошибок, типичные ошибки и проверка результата.

Правильное написание кода в 1С — это не только работающий алгоритм, но и читаемость, предсказуемость и безопасность для данных. Один и тот же результат можно получить десятком способов, но часть из них создаст проблемы при обновлении конфигурации, замедлит работу базы или приведёт к потере данных при ошибке.

Фирма «1С» публикует систему стандартов разработки, которая используется при сертификации продуктов «1С:Совместимо». Даже если вы не готовите решение к сертификации, эти правила экономят время: они описывают, как именовать переменные, оформлять процедуры, работать с транзакциями и писать запросы без избыточных обращений к базе.

Материал ориентирован на тех, кто пишет на встроенном языке 1С:Предприятие 8.3 — во внешних обработках, расширениях и доработках типовых конфигураций. Разберём ключевые правила с примерами и контрольными точками для самопроверки.

Соблюдайте стандарты именования и оформления

Имена переменных, процедур и функций должны отражать смысл, а не тип данных. Переменная ТабДок или Стр1 ничего не говорит читателю; ТабличныйДокументРеализации и СтрокаТовары — говорят. Используйте русский язык, если конфигурация написана на нём: смешение языков в одном модуле затрудняет чтение.

Основные правила оформления:

  • процедура или функция решает одну задачу и обычно умещается в один-два экрана;
  • параметры с признаком Знач используются осознанно — по умолчанию параметры передаются по ссылке;
  • экспортные процедуры и функции сопровождаются комментарием: назначение, параметры, возвращаемое значение;
  • отступы — табуляция или пробелы последовательно, вложенные блоки смещаются на один уровень;
  • закомментированный «мёртвый» код не хранят в модуле — его удаляют, история есть в хранилище конфигурации.

Пишите запросы вместо циклов по выборке

Самая частая причина медленного кода в 1С — обращение к базе данных внутри цикла. Конструкция, где в цикле по строкам таблицы выполняется НайтиПоКоду или запрос, делает столько обращений к СУБД, сколько строк в таблице. На больших объёмах это разница между секундами и минутами.

Правильный подход — получить все нужные данные одним запросом, используя соединения и временные таблицы. Таблицу значений можно передать в запрос как параметр через менеджер временных таблиц и соединить её с данными базы.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Номенклатура КАК Номенклатура,

| Товары.Количество КАК Количество

|ПОМЕСТИТЬ ВТ_Товары

|ИЗ

| &Товары КАК Товары

|;

|ВЫБРАТЬ

| ВТ_Товары.Номенклатура КАК Номенклатура,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| ВТ_Товары КАК ВТ_Товары

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки

| ПО ВТ_Товары.Номенклатура = Остатки.Номенклатура";

Запрос.УстановитьПараметр("Товары", ТаблицаТоваров);

Дополнительные правила работы с запросами:

  • не используйте ВЫБРАТЬ * — перечисляйте только нужные поля;
  • условия накладывайте в виртуальных таблицах (параметры Остатки, Обороты), а не в секции ГДЕ — это сокращает объём выборки;
  • обход результата группировкой делайте через ОбходРезультатаЗапроса.ПоГруппировкам, а не несколькими вложенными запросами;
  • для проверки существования записи используйте ВЫБРАТЬ ПЕРВЫЕ 1, а не полную выборку.
Перед оптимизацией измерьте. Замер производительности в конфигураторе (Отладка — Замер производительности) покажет, какие строки реально занимают время. Часто узкое место оказывается не там, где ожидалось.
ПЗ
Практическое замечание

Обрабатывайте ошибки и используйте транзакции

Любая операция, которая записывает несколько связанных объектов — документ и его движения, несколько элементов справочника — должна выполняться в транзакции. Если на середине операции произойдёт ошибка, база останется в согласованном состоянии: либо записано всё, либо ничего.

НачатьТранзакцию();

Попытка

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

НоваяЗадача.Записать();

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ИнформацияОбОшибке = ИнформацияОбОшибке();

ЗаписьЖурналаРегистрации("ОбменДанными",

УровеньЖурналаРегистрации.Ошибка, , ,

ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));

ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке);

КонецПопытки;

Обратите внимание на детали: ошибка пишется в журнал регистрации с подробным представлением (для диагностики), а наружу выдаётся краткое. «Проглатывать» исключение пустым блоком Исключение КонецПопытки; недопустимо — проблема останется незамеченной, а данные могут оказаться несогласованными.

Работайте с объектами правильно: ссылки, объекты, блокировки

Различайте работу через ссылку и через объект. Если нужно только прочитать реквизит — достаточно обращения через точку к ссылке (платформа выполнит запрос). Если нужно изменить данные — получайте объект методом ПолучитьОбъект(), изменяйте и записывайте. Проверяйте, что объект получен: для битой ссылки ПолучитьОбъект() вернёт Неопределено.

При конкурентной работе пользователей используйте управляемые блокировки данных — в файловом и клиент-серверном режиме платформа поддерживает механизм БлокировкаДанных. Это предотвращает ситуацию, когда два пользователя одновременно изменяют один документ и чьи-то изменения теряются.

Чего следует избегать при записи:

  • запись объекта в цикле без необходимости — если меняется один реквизит у многих элементов, рассмотрите пакетную обработку с транзакцией на разумную порцию;
  • вызов Записать() без проверки ПроверитьЗаполнение() для документов с обязательными реквизитами;
  • использование ОбменДанными.Загрузка = Истина вне обменов — этот приём отключает проверки и подписки на события, что легко приводит к нарушению целостности данных.
Типичные ошибки
01
Запрос в цикле — кратное замедление при росте объёма данных
02
Пустой обработчик исключения — ошибки не видны, данные расходятся
03
Запись с ОбменДанными.Загрузка = Истина ради скорости — пропускаются проверки и бизнес-логика
04
Имена переменных вроде ТЗ1 и Стр — код нечитаем уже через месяц
05
Изменение типовых модулей вместо расширения — конфигурация слетает с поддержки и не обновляется

Дорабатывайте типовые конфигурации через расширения

Если задача — изменить поведение типовой конфигурации, первый вариант, который стоит рассмотреть, — расширение конфигурации. Расширение позволяет добавлять свои процедуры, подписываться на события форм и модулей, изменять запросы динамических списков, не снимая типовые модули с поддержки.

Когда расширения недостаточно (например, нужно изменить структуру метаданных, которую расширение не поддерживает), изменения вносятся в конфигурацию с минимальным вмешательством: свои доработки выделяются в отдельные процедуры и области с понятными пометками, чтобы при обновлении их было легко перенести.

Маршрут решения

Как выбрать действие

Нужно добавить печатную форму или отчёт к типовой конфигурацииИспользуйте механизм внешних печатных форм и отчётов (БСП) — без изменения конфигурации
Нужно изменить логику типовой процедуры или формуСоздайте расширение конфигурации и используйте аннотации &ИзменениеИКонтроль, &После, &Вместо
Требуется новый объект метаданных или изменение, недоступное расширениямДорабатывайте конфигурацию с пометками изменённых областей и фиксируйте изменения для обновлений

Проверяйте код перед передачей в работу

Минимальный контроль — синтаксическая проверка модуля в конфигураторе (Ctrl+F7 по модулю, полная проверка конфигурации через меню «Конфигурация — Проверка конфигурации»). Включите проверку логической целостности и поиск некорректных ссылок — она находит обращения к удалённым объектам метаданных.

Порядок проверки доработки перед переносом в рабочую базу:

Порядок действий
  1. 1
    Выполните синтаксическую проверку изменённых модулей и всей конфигурации
  2. 2
    Прогоните сценарий вручную на копии базы: типовой случай, граничные значения, отмена операции
  3. 3
    Проверьте поведение при ошибке: прерванная операция не должна оставлять частично записанные данные
  4. 4
    Сделайте замер производительности на объёме данных, близком к реальному
  5. 5
    Проверьте журнал регистрации — там не должно быть новых ошибок после теста
Контрольные точки

Как проверить результат

Проверка конфигурации
Норма

Нет ошибок, предупреждения осмысленны и объяснимы

Тревожный признак

Ошибки компиляции модулей или битые ссылки на метаданные

Журнал регистрации после теста
Норма

Только ожидаемые информационные записи

Тревожный признак

Ошибки фоновых заданий или исключения, которых не было в сценарии

Скорость выполнения
Норма

Время растёт примерно линейно с ростом данных

Тревожный признак

Резкий рост времени при увеличении объёма — признак запросов в цикле

Частые вопросы

Нужно ли писать код на английском, если конфигурация на русском?

Нет. Встроенный язык поддерживает оба синтаксиса, но смешение языков в одной конфигурации считается плохой практикой. Следуйте языку конфигурации: для типовых российских решений это русский синтаксис и русские имена.

Чем расширение лучше прямой доработки конфигурации?

Расширение подключается и отключается без изменения основной конфигурации, поэтому обновление типового релиза проходит штатно. Прямые изменения модулей приходится каждый раз сопоставлять и переносить вручную, что занимает часы и чревато потерей доработок.

Когда оправдано ОбменДанными.Загрузка = Истина?

Только в механизмах обмена данными, где проверки выполняются на стороне источника, и при массовой первоначальной загрузке справочников. Для обычной записи документов и элементов этот приём опасен: он отключает контроль заполнения, подписки на события и часть бизнес-логики.

Как найти медленное место в коде без сторонних инструментов?

Встроенный замер производительности конфигуратора показывает время и количество вызовов по строкам модулей. Для запросов полезен технологический журнал с событием DBMSSQL/DBPOSTGRS — он показывает фактические обращения к СУБД и их длительность.

Обязательно ли оформлять комментарии к каждой процедуре?

К экспортным — да: описание назначения, параметров и возвращаемого значения входит в стандарты разработки и формирует документацию модуля. Локальные процедуры с говорящим именем дополнительного описания обычно не требуют.

Итог

Что важно запомнить

Правильный код в 1С — это читаемые имена, запросы вместо циклов по базе, транзакции с обработкой ошибок, доработки через расширения и обязательная проверка на копии базы. Стандарты разработки 1С — готовый ориентир для самопроверки.