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

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

Как писать код в 1С 8.3: с чего начать и как не ошибиться

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

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

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

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

Где писать код: модули и их назначение

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

Ключевое разделение — клиент и сервер. Директивы &НаКлиенте и &НаСервере определяют, где выполняется процедура. На клиенте недоступны прямые запросы к базе данных, на сервере нельзя показывать пользователю диалоговые окна. В тонком клиенте вся работа с данными должна идти через серверные вызовы.

Основы встроенного языка

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

Функция РассчитатьСкидку(СуммаПокупки) Экспорт

Если СуммаПокупки >= 100000 Тогда

Возврат СуммаПокупки * 0.1;

ИначеЕсли СуммаПокупки >= 50000 Тогда

Возврат СуммаПокупки * 0.05;

Иначе

Возврат 0;

КонецЕсли;

КонецФункции

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

Работа с объектами: справочники и документы

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Тестовый товар";

НовыйЭлемент.Записать();

Сообщить("Создан элемент: " + НовыйЭлемент.Ссылка);

При записи документа помните о режиме: Записать() сохраняет документ, а Записать(РежимЗаписиДокумента.Проведение) — проводит его, формируя движения по регистрам. Логику формирования движений размещайте в обработчике ОбработкаПроведения модуля объекта, а не в форме — тогда документ будет корректно проводиться и при интерактивной работе, и при программной записи.

Язык запросов: почему циклы по данным — плохая идея

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

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

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

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

| СУММА(Продажи.Количество) КАК Количество

|ИЗ

| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

|СГРУППИРОВАТЬ ПО

| Продажи.Номенклатура";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Номенклатура);

КонецЦикла;

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

Типичные ошибки начинающих
01
Чтение реквизитов через точку от ссылки внутри цикла — каждый проход обращается к базе, обработка тысячи строк затягивается на минуты
02
Код записи данных в модуле формы вместо модуля объекта — при программной записи логика не срабатывает
03
Игнорирование директив клиент/сервер — код работает в толстом клиенте и падает в тонком или веб-клиенте
04
Попытка обойтись без транзакций при записи нескольких связанных объектов — при сбое база остаётся в несогласованном состоянии

Отладка и проверка кода

Отладчик Конфигуратора — главный инструмент проверки. Установите точку останова клавишей F9 на нужной строке, запустите отладку (F5) и выполните действие в режиме Предприятия. Когда выполнение остановится, вы сможете посмотреть значения переменных через табло (Shift+F9) и пройти код по шагам. Для серверного кода убедитесь, что отладка на сервере разрешена: в файловой базе она включена по умолчанию, в клиент-серверной требует запуска сервера 1С с ключом отладки.

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

Как написать и проверить первую процедуру
  1. 1
    Откройте Конфигуратор и найдите объект, к которому относится задача (документ, справочник или общий модуль)
  2. 2
    Откройте нужный модуль и добавьте процедуру или функцию с осмысленным именем
  3. 3
    Напишите код, используя синтакс-помощник (Ctrl+Shift+F1) для проверки имен методов
  4. 4
    Выполните синтаксический контроль модуля
  5. 5
    Поставьте точку останова, запустите отладку и проверьте значения переменных на каждом шаге
  6. 6
    Проверьте результат в базе: созданный объект, движения документа, данные отчёта

Обработчики событий и управляемые формы

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

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

Стандарты разработки и сопровождение кода

Читаемость кода в 1С определяется именованием и структурой. Имена переменных и процедур пишите осмысленно: ТаблицаТоваров вместо Т1. Комментируйте неочевидные решения, а не каждую строку. Желательно придерживаться стандартов разработки фирмы «1С» (система стандартов доступна на портале its.1c.ru) — типовые конфигурации им следуют, и ваш код будет выглядеть единообразно.

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

Расширение или изменение конфигурации

Расширение конфигурации

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

Прямая доработка конфигурации

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

Итог

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

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

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

Можно ли писать код 1С на английском языке?

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

Чем запрос отличается от обхода объектов в цикле?

Запрос выполняется на стороне СУБД одним обращением и возвращает только нужные поля и строки. Цикл с получением объектов делает отдельное обращение к базе на каждую итерацию и тащит в память полные записи. На десятках записей разница незаметна, на тысячах — кратная.

Почему процедура не видна из другого модуля?

Чаще всего отсутствует ключевое слово Экспорт после заголовка процедуры или функции. Также проверьте, что общий модуль серверный (или клиентский в соответствии с контекстом вызова) и у него не снят флаг доступности для нужного режима исполнения.

Как отладить серверный код в клиент-серверной базе?

Сервер 1С должен быть запущен с ключом отладки (-debug в параметрах службы агента сервера). После перезапуска службы в Конфигураторе включите автоматическое подключение к серверным процессам в настройках отладки. Без ключа точки останова в серверных процедурах просто не сработают.

Где брать примеры кода для обучения?

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

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

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