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

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

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

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

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

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

Материал ориентирован на тех, кто уже знаком с интерфейсом 1С как пользователь и хочет перейти к доработкам: написать обработку, изменить печатную форму, добавить проверку при проведении документа. Все примеры безопасны для учебной базы, но перед применением в рабочей системе обязательно делайте резервную копию.

Где физически размещается код в 1С

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

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

Отдельный путь для новичка — внешние обработки (файлы с расширением .epf). Это самодостаточные программы, которые открываются через «Файл → Открыть» и не требуют изменения конфигурации. Именно с внешней обработки безопаснее всего начинать: ошибка в ней не сломает рабочую базу, а код остаётся полноценным — доступны запросы, обращения к справочникам и документам.

Базовый синтаксис встроенного языка

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

Минимальная процедура выглядит так:

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

Если СуммаДокумента > 100000 Тогда

Скидка = 10;

ИначеЕсли СуммаДокумента > 50000 Тогда

Скидка = 5;

Иначе

Скидка = 0;

КонецЕсли;

Сообщить("Скидка: " + Скидка + "%");

КонецПроцедуры

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

Для коллекций чаще всего используются массивы, структуры, соответствия и таблицы значений. Структура — аналог объекта с именованными полями, соответствие — словарь «ключ-значение» с произвольным типом ключа, таблица значений — двумерная таблица в памяти, удобная для промежуточных данных перед выводом в отчёт.

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

Работа с данными: объектная модель и запросы

В 1С есть два способа доступа к данным. Объектная модель — работа через ссылки и объекты: «Справочники.Номенклатура.НайтиПоКоду()», «Документы.РеализацияТоваров.СоздатьДокумент()». Она удобна для создания и изменения отдельных объектов, потому что при записи срабатывают все обработчики и проверки. Минус — медленно при обходе больших выборок и чтении «по точкам» через обращения к полям ссылки.

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

Ключевые приёмы запросов: виртуальные таблицы («СрезПоследних» для периодических регистров сведений, «Остатки» и «Обороты» для регистров накопления), параметры через «УстановитьПараметр», пакетные запросы с временными таблицами («ПОМЕСТИТЬ») для сложной выборки в несколько этапов. Результат обрабатывается через «Выбрать()» (последовательный обход) или «Выгрузить()» (таблица значений целиком).

Первая практика: внешняя обработка за 15 минут

Лучший первый проект — внешняя обработка, которая выводит список документов за период. Она не требует изменения конфигурации, легко отлаживается и даёт полный цикл: форма, кнопка, запрос, вывод результата. Создайте её в конфигураторе через «Файл → Новый → Внешняя обработка», добавьте форму и разместите на ней поле периода и таблицу результата.

Порядок действий
  1. 1
    Откройте конфигуратор и создайте новую внешнюю обработку через меню «Файл»
  2. 2
    Добавьте форму обработки, разместите на ней поля «ДатаНачала», «ДатаОкончания» и команду «Заполнить»
  3. 3
    В модуле формы напишите процедуру команды: создайте запрос к документам с условием по дате и параметрами
  4. 4
    Выгрузите результат запроса в таблицу значений и присвойте её реквизиту формы
  5. 5
    Сохраните обработку в файл .epf, откройте её в режиме предприятия и проверьте работу на учебной базе

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

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

Отладка и поиск ошибок

Отладчик встроен в конфигуратор и работает без дополнительной настройки для файловых баз. Поставьте точку останова кликом по полю слева от строки, запустите отладку клавишей F5, выполните действие в режиме предприятия — выполнение остановится на нужной строке. Дальше доступны пошаговое выполнение (F11 — с заходом в процедуры, F10 — через), просмотр значений переменных по наведению мыши и окно «Вычислить выражение» (Shift+F9).

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

Контрольные точки

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

Значения переменных в точке останова
Норма

Типы соответствуют ожиданию: дата — датой, ссылка — ссылкой, а не строкой

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

Неопределено там, где должна быть ссылка, или строка вместо даты

Результат запроса
Норма

Выборка содержит строки, поля заполнены

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

Пустая выборка при заведомо существующих данных — проверьте параметры и условия

Запись объекта
Норма

Записать() завершается без исключения, объект появляется в списке

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

Ошибка блокировки или проверки заполнения — читайте текст исключения

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

Изменение типовой конфигурации: расширения против доработки

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

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

Сравнение вариантов

Внешняя обработка

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

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

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

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

Когда возможностей расширения не хватает: новые измерения регистров, глубокая переработка механизмов. Цена — сложные обновления и снятие с поддержки.

Ограничения, риски и границы самостоятельной работы

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

Второй риск — производительность. Запросы в цикле, отсутствие индексов по полям условий, выгрузка огромных таблиц в память способны «повесить» рабочую базу для всех пользователей. Перед запуском массовой обработки оцените объём данных и тестируйте на копии с реальным объёмом, а не на пустой учебной базе.

Типичные ошибки
01
Запрос внутри цикла — вместо одного запроса с соединением выполняются сотни обращений к базе, код работает в сотни раз медленнее
02
Забытое «Экспорт» у процедуры общего модуля — код недоступен извне, ошибка «Процедура или функция не обнаружена»
03
Сравнение ссылок через «=» со строковым представлением — ссылки сравниваются только с ссылками, иначе условие молча не срабатывает
04
Изменение данных без транзакции — при ошибке на середине обработки часть объектов изменена, часть нет, данные рассогласованы
05
Прямая правка типовых модулей вместо расширения — каждое обновление конфигурации превращается в ручное слияние изменений

Как развиваться дальше

После освоения обработок, запросов и отладки логичный путь — система компоновки данных (СКД) для отчётов без ручного вывода, работа с регистрами и понимание механизма проведения, затем управляемые формы и клиент-серверное взаимодействие. Параллельно полезно изучить стандарты разработки фирмы «1С» — они описывают именование переменных, структуру модулей и типовые приёмы, и код, написанный по стандартам, проще читать и сопровождать.

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

Итог

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

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

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

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

Нет, встроенный язык 1С вполне подходит как первый: синтаксис простой, среда одна, результат виден сразу в прикладной системе. Знание основ SQL заметно ускорит освоение языка запросов, но и его можно изучать параллельно на практических задачах.

Чем учебная версия платформы отличается от рабочей?

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

Почему мой код в общем модуле не виден из формы?

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

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

Используйте регламентные задания: в конфигураторе создаётся объект «Регламентное задание» с расписанием и привязкой к методу общего модуля. В файловой базе задания выполняются при работающем сеансе, в клиент-серверной — сервером автоматически. Код регламентного задания должен быть серверным и не обращаться к интерактивным элементам.

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

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