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

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

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

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

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

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

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

Где писать код: конфигуратор и типы модулей

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

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

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

Базовый синтаксис: переменные, процедуры и условия

Переменные в 1С объявляются неявно — достаточно присвоить значение. Типизация динамическая: одна переменная может последовательно хранить строку, число или ссылку на объект. Основные типы: Строка, Число, Дата, Булево, Неопределено, а также ссылки на объекты базы данных.

Код организуется в процедуры (ничего не возвращают) и функции (возвращают значение через Возврат). Условия записываются через Если ... Тогда ... Иначе ... КонецЕсли;, циклы — через Для ... Цикл ... КонецЦикла и Пока ... Цикл ... КонецЦикла. Каждый блок обязательно закрывается, а оператор завершается точкой с запятой.

bsl
Функция РассчитатьСкидку(СуммаДокумента)
	Если СуммаДокумента > 100000 Тогда
		Возврат СуммаДокумента <em> 0.1;
	ИначеЕсли СуммаДокумента > 50000 Тогда
		Возврат СуммаДокумента </em> 0.05;
	Иначе
		Возврат 0;
	КонецЕсли;
КонецФункции

Обратите внимание на оператор сравнения: в 1С равенство проверяется одинарным знаком =, а не двойным, как в C-подобных языках. Логические операторы — И, Или, Не. Комментарии начинаются с двойного слэша //. Перед публикацией функции в общем модуле добавьте слово Экспорт после списка параметров — иначе она будет недоступна извне.

Работа с объектами базы данных

Данные в 1С делятся на ссылочные (справочники, документы) и регистры (накопления, сведений, расчёта). Чтобы изменить существующий элемент справочника, получите его объект методом ПолучитьОбъект() у ссылки, измените реквизиты и вызовите Записать(). Для создания нового элемента используйте Справочники.Номенклатура.СоздатьЭлемент().

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

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

Типичные ошибки при работе с данными
01
Чтение реквизитов через ссылку внутри цикла — сотни лишних запросов к базе и падение производительности
02
Изменение объекта без вызова Записать() — изменения теряются молча
03
Запись документа вместо проведения — движения по регистрам не формируются, отчёты показывают нули
04
Отсутствие проверки на Неопределено и пустые ссылки — код падает на незаполненных данных

Запросы: как выбирать данные правильно

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

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

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

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

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

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

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

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

Как проверить, что код работает

Проведение документа
Норма

Документ проводится, движения видны в регистрах

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

Ошибка при проведении или пустые движения

Работа формы
Норма

Форма открывается, реквизиты пересчитываются

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

Ошибка компиляции модуля формы при открытии

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

Выборка содержит ожидаемые строки

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

Пустой результат при наличии данных — проверьте параметры и отборы

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

Отладка включается в конфигураторе: «Отладка → Подключение» для выбора сеанса и «Сервис → Параметры» для разрешения отладки. Точки останова ставятся кликом по полю слева от строки. В режиме отладки доступны просмотр значений переменных (F9 на выражении), табло, стек вызовов и пошаговое выполнение. Это главный инструмент поиска ошибок — освойте его раньше, чем начнёте писать сложную логику.

Любые изменения сначала делайте на копии базы. Создайте копию через выгрузку информационной базы («Администрирование → Выгрузить информационную базу») или средствами СУБД. Только после проверки на копии переносите изменения в рабочую базу — через сравнение и объединение конфигураций или через механизм расширений.

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

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

Частые ошибки и ограничения языка

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

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

Итог

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

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

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

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

Нет, встроенный язык 1С самодостаточен и часто становится первым языком разработчика. Знание основ SQL помогает при написании запросов, а общее понимание алгоритмов — при построении логики, но начинать можно с нуля, опираясь на синтаксис-помощник и типовой код конфигурации.

Можно ли писать код на английском синтаксисе?

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

Что выбрать: расширение или изменение типовой конфигурации?

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

Почему код работает в файловой базе, но падает на сервере?

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

Как быстро найти, где в типовой конфигурации выполняется нужная логика?

Используйте глобальный поиск по конфигурации (Ctrl+Shift+F) по названию процедуры, реквизита или строке сообщения об ошибке. Также помогает отладчик: поставьте точку останова в обработчике события и пройдите по стеку вызовов, чтобы увидеть цепочку вызовов типового кода.

Чем отличается обработка от отчёта?

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