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