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

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

Как правильно писать код в 1С: практическое руководство

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

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

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

Ниже разобраны практические правила: как именовать объекты и переменные, как структурировать модули, как работать с запросами и обходами данных, как обрабатывать ошибки и как проверять код перед переносом в рабочую базу.

Какие правила задаёт стандарт разработки 1С

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

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

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

Как правильно именовать переменные, процедуры и объекты

Имена должны отвечать на вопрос «что это», а не «какого типа». Переменная ТаблицаТоваров лучше, чем ТЗ1, а РассчитатьСуммуДокумента() лучше, чем Расчет(). Встроенный язык допускает русские и английские идентификаторы, но смешивать их в одном проекте не следует — выберите один стиль и держитесь его.

Имена процедур и функций начинаются с глагола в повелительной форме: ПолучитьОстатки, СформироватьОтчет, ПроверитьЗаполнение. Функция, возвращающая булево, должна читаться как утверждение: ЭтоПолноправныйПользователь(), ДокументПроведен().

Избегайте однобуквенных имён вне коротких циклов, транслитерации (Summa, Kolvo) и сокращений, понятных только вам. Имя длиной 25 символов, которое читается без расшифровки, лучше имени из 5 символов, которое нужно комментировать.

Типичные ошибки именования
01
Транслит вроде Summa или Kolvo — код выглядит непрофессионально и плохо ищется поиском
02
Однобуквенные переменные вне счётчиков циклов — через месяц никто не поймёт, что хранит переменная
03
Имена процедур без глагола: Остатки() вместо ПолучитьОстатки() — непонятно, что делает вызов
04
Смешение русского и английского синтаксиса в одном модуле — затрудняет чтение и поиск

Как структурировать модули и процедуры

Модуль должен иметь предсказуемую структуру: область описания переменных, программный интерфейс (экспортные процедуры и функции), служебный программный интерфейс, служебные процедуры и функции, обработчики событий. В типовых конфигурациях эти области выделены соответствующими секциями #Область — сохраняйте такое же деление в собственных модулях.

Экспортными делайте только те процедуры, которые реально вызываются извне. Всё остальное — служебные, без ключевого слова Экспорт. Это защищает внутреннюю логику от случайного вызова и упрощает анализ зависимостей.

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

Комментарии: что писать, а что нет

Комментарий должен объяснять «зачем», а не пересказывать «что делает строка». Комментарий вида // увеличиваем счетчик на 1 бесполезен, а вот пояснение неочевидного бизнес-правила или ссылка на причину обходного решения — ценны. Устаревшие комментарии, противоречащие коду, хуже их отсутствия: при изменении логики обновляйте и пояснения.

Как правильно работать с данными: запросы против обходов

Запрос почти всегда предпочтительнее программного обхода объектов. Конструкция вида «выбрать все документы, в цикле получить объект, проверить условие» загружает в память каждый объект целиком и выполняет множество обращений к базе. Тот же результат одним запросом с отбором выполняется на стороне СУБД и работает на порядки быстрее.

Метод ПолучитьОбъект() нужен только тогда, когда вы собираетесь изменять данные объекта. Для чтения реквизитов используйте запрос или обращение через ссылку с точкой (Ссылка.Номер читает только нужные поля, но в цикле и это порождает отдельные запросы — поэтому в циклах читайте данные пакетно, через запрос).

В тексте запроса всегда используйте параметры (&Параметр) вместо подстановки значений конкатенацией строк. Прямая вставка значений в текст запроса — это и риск ошибок, и потенциальная уязвимость, и проблема с кэшированием планов запросов на СУБД.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Товары.Номенклатура КАК Номенклатура,
|	СУММА(Товары.Количество) КАК Количество
|ИЗ
|	Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
|	Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|СГРУППИРОВАТЬ ПО
|	Товары.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Результат = Запрос.Выполнить().Выгрузить();

Запрос или обход объектов

Запрос с отбором

Подходит для чтения и агрегации данных. Выполняется на стороне СУБД, быстрый, не блокирует объекты. Ограничение: нельзя изменять данные

ПолучитьОбъект() и запись

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

Обращение через ссылку (Ссылка.Реквизит)

Допустимо для разового чтения одного реквизита. В цикле порождает по запросу на каждую итерацию — заменяйте пакетным запросом

Как обрабатывать ошибки и писать в журнал регистрации

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

В обработчике исключения фиксируйте ошибку в журнале регистрации через ЗаписьЖурналаРегистрации с указанием события, уровня и подробного описания из ОписаниеОшибки() (в новых версиях — ИнформацияОбОшибке()). Пользователю показывайте понятное краткое сообщение через Сообщить или ПоказатьПредупреждение, а технические детали оставляйте в журнале.

Операции, изменяющие несколько связанных объектов, выполняйте в транзакции (НачатьТранзакцию() / ЗафиксироватьТранзакцию() / ОтменитьТранзакцию()). Иначе при сбое посередине часть данных будет записана, а часть — нет, и восстановить согласованность придётся вручную.

Как проверить код перед переносом в рабочую базу

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

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

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

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

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

Синтаксический контроль модуля
Норма

Ошибок и предупреждений нет

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

Есть необработанные предупреждения о неиспользуемых переменных и недоступных вызовах

Поведение на пустых данных
Норма

Код корректно сообщает об отсутствии данных и завершается

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

Ошибка «Значение не является значением объектного типа» или падение на обращении к пустой выборке

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

Нет записей с уровнем «Ошибка» от вашего кода

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

Ошибки фиксируются, но пользователю показывается «всё готово»

Повторный запуск обработки
Норма

Результат идентичен первому запуску, дублей нет

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

Появляются дубли записей или документов

Типичные ошибки начинающих разработчиков 1С

Первая группа ошибок — работа с данными: обходы объектов в цикле вместо запросов, модификация данных без транзакций, запись объектов без проверки заполнения. Вторая группа — игнорирование типовых механизмов: собственные велосипеды вместо БСП, прямые запросы к данным, для которых есть программный интерфейс.

Третья группа — пренебрежение сопровождением: отсутствие комментариев к неочевидным решениям, изменение типовых объектов там, где можно обойтись расширением, хранение доработок только в рабочей базе без выгрузки в хранилище или файлы. Каждый из этих пунктов превращает сопровождение в дорогое и рискованное занятие.

Если доработку можно реализовать через расширение конфигурации — делайте расширение. Даже если это требует чуть больше времени сейчас, экономия при каждом последующем обновлении типовой конфигурации многократно окупает вложения.
ПЗ
Практическое замечание
Итог

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

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

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

Нужно ли писать код на русском или на английском синтаксисе встроенного языка?

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

Когда обязательно нужно использовать транзакцию?

Всегда, когда одна логическая операция изменяет несколько объектов или записей: проведение с движениями по нескольким регистрам, пакетное создание документов, обмен данными. Если операция атомарна (запись одного объекта), платформа сама оборачивает её в транзакцию, и явное управление не требуется.

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

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

Как найти готовую процедуру в БСП, чтобы не писать свою?

Откройте общие модули конфигурации и поищите по имени модуля и экспортных процедур: модули БСП имеют говорящие имена (ОбщегоНазначения, СтроковыеФункцииКлиентСервер, РаботаСФайлами и т. п.). Полезен глобальный поиск по конфигурации (Ctrl+Shift+F) по ключевым словам задачи. Документация по БСП доступна на портале 1С.

Что делать, если доработанная конфигурация не обновляется автоматически?

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

Достаточно ли синтаксического контроля для проверки кода?

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