Разработка и Конфигурация · 11 мин
Как писать код в 1С 8.3: с чего начать и как не ошибиться
Как писать код в 1С 8.3: конфигуратор, встроенный язык, запросы, модули и типовые ошибки. Пошаговые примеры и советы для начинающих разработчиков.
Написание кода в 1С 8.3 начинается не с самого кода, а с понимания, где он будет работать: в модуле объекта, в модуле формы, в общем модуле или в обработке. От этого зависит контекст исполнения — какие данные доступны, на клиенте или на сервере выполняется процедура и какие ограничения накладывает платформа. Ошибка с выбором места для кода — одна из самых частых причин «нерабочих» решений у новичков.
Встроенный язык 1С синтаксически похож на классические языки программирования, но имеет свою специфику: ключевые слова можно писать на русском или английском, типизация динамическая, а основная работа идёт с объектами конфигурации — справочниками, документами, регистрами. Код пишется в Конфигураторе, а проверяется в режиме Предприятия или через отладчик.
Практический совет: прежде чем писать собственный код, изучите типовую конфигурацию, близкую к вашей задаче. Большинство стандартных операций — проведение документа, запись элемента справочника, формирование отчёта — уже реализованы в типовых модулях, и повторение этих приёмов сокращает путь к рабочему решению.
Где писать код: модули и их назначение
В 1С код существует только внутри модулей, и у каждого типа модуля своя роль. Модуль объекта (например, документа) содержит обработчики событий самого объекта — ПриЗаписи, ОбработкаПроведения. Модуль формы отвечает за поведение интерфейса: обработчики кнопок, изменение полей, события открытия формы. Общие модули хранят переиспользуемые процедуры и функции, доступные из любого места конфигурации.
Ключевое разделение — клиент и сервер. Директивы &НаКлиенте и &НаСервере определяют, где выполняется процедура. На клиенте недоступны прямые запросы к базе данных, на сервере нельзя показывать пользователю диалоговые окна. В тонком клиенте вся работа с данными должна идти через серверные вызовы.
Основы встроенного языка
Встроенный язык 1С поддерживает переменные, условия, циклы, процедуры и функции. Переменные объявляются неявно при первом присваивании, тип определяется значением. Процедура не возвращает значение, функция возвращает его через оператор Возврат. Точка с запятой в конце каждого оператора обязательна — это частая причина синтаксических ошибок у новичков.
Функция РассчитатьСкидку(СуммаПокупки) Экспорт
Если СуммаПокупки >= 100000 Тогда
Возврат СуммаПокупки * 0.1;
ИначеЕсли СуммаПокупки >= 50000 Тогда
Возврат СуммаПокупки * 0.05;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Слово Экспорт делает процедуру или функцию доступной извне модуля. Используйте его осознанно: экспортировать стоит только те методы, которые действительно вызываются из других модулей. Чем меньше публичный интерфейс модуля, тем проще его сопровождать.
Работа с объектами: справочники и документы
Два основных приёма работы с данными — через объект и через ссылку. Ссылка — это «адрес» записи в базе, её можно передавать и сравнивать без чтения данных. Объект — полная копия записи в памяти: его получают методом ПолучитьОбъект(), изменяют и записывают методом Записать(). Чтение реквизита через точку от ссылки (например, Ссылка.Наименование) удобно, но каждое такое обращение — отдельное обращение к базе, что критично в циклах.
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Тестовый товар";
НовыйЭлемент.Записать();
Сообщить("Создан элемент: " + НовыйЭлемент.Ссылка);
При записи документа помните о режиме: Записать() сохраняет документ, а Записать(РежимЗаписиДокумента.Проведение) — проводит его, формируя движения по регистрам. Логику формирования движений размещайте в обработчике ОбработкаПроведения модуля объекта, а не в форме — тогда документ будет корректно проводиться и при интерактивной работе, и при программной записи.
Язык запросов: почему циклы по данным — плохая идея
Для выборки данных в 1С используется собственный язык запросов, похожий на SQL. Запрос выполняется на стороне СУБД и возвращает готовую выборку, тогда как перебор объектов в цикле с обращением к базе на каждой итерации работает на порядки медленнее. Правило простое: если нужно получить или сгруппировать данные — пишите запрос, а не цикл.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.Количество) КАК Количество
|ИЗ
| РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДата()));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Номенклатура);
КонецЦикла;
Параметры запроса всегда передавайте через УстановитьПараметр, а не конкатенацией строк — это защищает от ошибок форматирования дат и чисел и делает текст запроса читаемым. Для построения текста запроса используйте конструктор запроса (правый клик в модуле → «Конструктор запроса»), он избавит от синтаксических ошибок на старте.
Отладка и проверка кода
Отладчик Конфигуратора — главный инструмент проверки. Установите точку останова клавишей F9 на нужной строке, запустите отладку (F5) и выполните действие в режиме Предприятия. Когда выполнение остановится, вы сможете посмотреть значения переменных через табло (Shift+F9) и пройти код по шагам. Для серверного кода убедитесь, что отладка на сервере разрешена: в файловой базе она включена по умолчанию, в клиент-серверной требует запуска сервера 1С с ключом отладки.
Дополнительно используйте синтаксический контроль модуля (кнопка с галочкой в редакторе) — он найдёт ошибки до запуска. Метод ЗаполнитьЗначенияСвойств, конструкция Попытка...Исключение и вывод сообщений через Сообщить() помогают локализовать проблему, когда отладчик недоступен, например в фоновых заданиях.
- 1Откройте Конфигуратор и найдите объект, к которому относится задача (документ, справочник или общий модуль)
- 2Откройте нужный модуль и добавьте процедуру или функцию с осмысленным именем
- 3Напишите код, используя синтакс-помощник (Ctrl+Shift+F1) для проверки имен методов
- 4Выполните синтаксический контроль модуля
- 5Поставьте точку останова, запустите отладку и проверьте значения переменных на каждом шаге
- 6Проверьте результат в базе: созданный объект, движения документа, данные отчёта
Обработчики событий и управляемые формы
В управляемых формах логика строится на событиях: ПриСозданииНаСервере, ПриОткрытии, обработчики элементов формы. Код кнопки, которая должна изменить данные в базе, обычно состоит из двух процедур: клиентская обрабатывает нажатие и вызывает серверную, серверная выполняет работу с данными. Передавайте между ними только простые типы и ссылки — объекты базы данных между клиентом и сервером не передаются.
Для длительных операций (загрузка файлов, массовая обработка) используйте фоновые задания через ДлительныеОперации или ФоновыеЗадания.Выполнить, чтобы интерфейс пользователя не зависал. В файловой базе фоновые задания работают с ограничениями, поэтому тестируйте такой код в целевом режиме работы.
Стандарты разработки и сопровождение кода
Читаемость кода в 1С определяется именованием и структурой. Имена переменных и процедур пишите осмысленно: ТаблицаТоваров вместо Т1. Комментируйте неочевидные решения, а не каждую строку. Желательно придерживаться стандартов разработки фирмы «1С» (система стандартов доступна на портале its.1c.ru) — типовые конфигурации им следуют, и ваш код будет выглядеть единообразно.
При доработке типовой конфигурации по возможности используйте расширения вместо прямого изменения конфигурации: расширение позволяет добавлять обработчики и переопределять процедуры, не снимая объекты с поддержки, что резко упрощает последующие обновления. Прямые изменения типового кода оправданы только там, где расширение технически не справляется.
Расширение или изменение конфигурации
Подходит для добавления обработчиков, форм, печатных макетов и переопределения типовых процедур. Обновление типовой конфигурации остаётся простым. Ограничение: нельзя менять структуру типовых объектов глубоко
Нужна, когда требуется изменить состав реквизитов, движения или логику, недоступную расширению. Минус: усложняется обновление, каждое изменение придётся сопоставлять вручную
Что важно запомнить
Код в 1С 8.3 живёт в модулях и разделяется на клиентский и серверный. Данные выбирайте запросами, изменяйте через объекты с записью, логику проведения держите в модуле объекта. Проверяйте код отладчиком на копии базы, а типовую конфигурацию дорабатывайте через расширения.
Частые вопросы
Можно ли писать код 1С на английском языке?
Да, встроенный язык поддерживает оба синтаксиса, и их можно смешивать в одном модуле. Однако типовые конфигурации написаны на русском синтаксисе, поэтому для сопровождения и чтения типового кода русский вариант практичнее. Выбор синтаксиса задаётся в настройках Конфигуратора.
Чем запрос отличается от обхода объектов в цикле?
Запрос выполняется на стороне СУБД одним обращением и возвращает только нужные поля и строки. Цикл с получением объектов делает отдельное обращение к базе на каждую итерацию и тащит в память полные записи. На десятках записей разница незаметна, на тысячах — кратная.
Почему процедура не видна из другого модуля?
Чаще всего отсутствует ключевое слово Экспорт после заголовка процедуры или функции. Также проверьте, что общий модуль серверный (или клиентский в соответствии с контекстом вызова) и у него не снят флаг доступности для нужного режима исполнения.
Как отладить серверный код в клиент-серверной базе?
Сервер 1С должен быть запущен с ключом отладки (-debug в параметрах службы агента сервера). После перезапуска службы в Конфигураторе включите автоматическое подключение к серверным процессам в настройках отладки. Без ключа точки останова в серверных процедурах просто не сработают.
Где брать примеры кода для обучения?
Лучший источник — типовые конфигурации и демонстрационные базы, а также синтакс-помощник внутри Конфигуратора (Shift+F1 по выделенному слову). Разбор того, как устроено проведение документа или формирование отчёта в типовом решении, даёт больше практики, чем абстрактные примеры.
Что делать, если после доработки конфигурация не обновляется?
Если типовые объекты изменены напрямую, при обновлении мастер покажет конфликты. Сравните изменённые процедуры с новой версией поставщика и перенесите свои правки вручную. Чтобы избежать этого в будущем, вынесите доработки в расширение конфигурации.