Разработка и Конфигурация · 13 мин
Как писать код в 1С: практическое руководство
Как писать код в 1С: встроенный язык, модули, запросы, отладка и типичные ошибки. Пошаговое руководство с примерами для начинающих разработчиков.
Код в 1С пишется на встроенном языке платформы — он синтаксически похож на смесь Pascal и BASIC с русскоязычными ключевыми словами. Вся разработка ведётся в конфигураторе: программной среде, где создаются объекты конфигурации (справочники, документы, отчёты) и к ним прикрепляются программные модули. Чтобы начать писать код, не нужно ставить отдельную IDE — достаточно установленной платформы 1С:Предприятие и базы для экспериментов.
Главное отличие 1С от классических языков — код почти всегда работает с прикладными объектами: документами, регистрами, справочниками. Поэтому эффективное обучение строится не на абстрактных алгоритмах, а на реальных задачах: провести документ, подобрать товары запросом, вывести отчёт. В этой статье разобраны места размещения кода, базовый синтаксис, работа с запросами, отладка и типичные ошибки начинающих.
Материал ориентирован на тех, кто уже знаком с интерфейсом 1С как пользователь и хочет перейти к доработкам: написать обработку, изменить печатную форму, добавить проверку при проведении документа. Все примеры безопасны для учебной базы, но перед применением в рабочей системе обязательно делайте резервную копию.
Где физически размещается код в 1С
Код в 1С не хранится в отдельных файлах проекта — он привязан к модулям внутри конфигурации. Основные места размещения: модуль объекта (логика документа или справочника), модуль формы (реакция на действия пользователя в интерфейсе), общие модули (переиспользуемые процедуры и функции), модуль менеджера объекта, модуль приложения и модули команд. Понимание, куда поместить код, — половина правильной архитектуры решения.
Простое правило выбора: код, который должен срабатывать при записи или проведении объекта независимо от интерфейса, размещается в модуле объекта. Код, отвечающий за внешний вид и поведение формы, — в модуле формы. Функции, которые вызываются из нескольких мест, выносятся в общий модуль с включённым признаком «Сервер» или «Клиент» в зависимости от контекста исполнения.
Отдельный путь для новичка — внешние обработки (файлы с расширением .epf). Это самодостаточные программы, которые открываются через «Файл → Открыть» и не требуют изменения конфигурации. Именно с внешней обработки безопаснее всего начинать: ошибка в ней не сломает рабочую базу, а код остаётся полноценным — доступны запросы, обращения к справочникам и документам.
Базовый синтаксис встроенного языка
Встроенный язык 1С регистронезависим и допускает как русские, так и английские ключевые слова, но в практике принят русский вариант. Переменные объявляются неявно при первом присваивании, типы динамические: одна переменная может сначала хранить число, а затем строку. Инструкции завершаются точкой с запятой, блоки выделяются ключевыми словами «Если...Тогда...КонецЕсли», «Пока...Цикл...КонецЦикла».
Минимальная процедура выглядит так:
Процедура РассчитатьСкидку(СуммаДокумента) Экспорт
Если СуммаДокумента > 100000 Тогда
Скидка = 10;
ИначеЕсли СуммаДокумента > 50000 Тогда
Скидка = 5;
Иначе
Скидка = 0;
КонецЕсли;
Сообщить("Скидка: " + Скидка + "%");
КонецПроцедуры
Разница между процедурой и функцией: функция возвращает значение через оператор «Возврат» и может использоваться в выражениях, процедура — нет. Параметры передаются через скобки, ключевое слово «Знач» перед параметром означает передачу по значению (копия), без него — по ссылке, и изменения параметра внутри будут видны снаружи.
Для коллекций чаще всего используются массивы, структуры, соответствия и таблицы значений. Структура — аналог объекта с именованными полями, соответствие — словарь «ключ-значение» с произвольным типом ключа, таблица значений — двумерная таблица в памяти, удобная для промежуточных данных перед выводом в отчёт.
Функция ПолучитьКурсВалюты(Валюта, Дата) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Курс ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта)";
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Валюта", Валюта);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.Курс;
Иначе
Возврат 0;
КонецЕсли;
КонецФункцииРабота с данными: объектная модель и запросы
В 1С есть два способа доступа к данным. Объектная модель — работа через ссылки и объекты: «Справочники.Номенклатура.НайтиПоКоду()», «Документы.РеализацияТоваров.СоздатьДокумент()». Она удобна для создания и изменения отдельных объектов, потому что при записи срабатывают все обработчики и проверки. Минус — медленно при обходе больших выборок и чтении «по точкам» через обращения к полям ссылки.
Язык запросов — декларативный, похож на SQL, и предназначен для чтения данных. Запрос выполняется на сервере одним обращением к СУБД, поэтому для выборок, отчётов и анализа всегда предпочтительнее. Конструктор запроса в конфигураторе позволяет собрать текст мышкой: выбрать таблицы, поля, условия, группировки, а затем доработать текст вручную.
Ключевые приёмы запросов: виртуальные таблицы («СрезПоследних» для периодических регистров сведений, «Остатки» и «Обороты» для регистров накопления), параметры через «УстановитьПараметр», пакетные запросы с временными таблицами («ПОМЕСТИТЬ») для сложной выборки в несколько этапов. Результат обрабатывается через «Выбрать()» (последовательный обход) или «Выгрузить()» (таблица значений целиком).
Первая практика: внешняя обработка за 15 минут
Лучший первый проект — внешняя обработка, которая выводит список документов за период. Она не требует изменения конфигурации, легко отлаживается и даёт полный цикл: форма, кнопка, запрос, вывод результата. Создайте её в конфигураторе через «Файл → Новый → Внешняя обработка», добавьте форму и разместите на ней поле периода и таблицу результата.
- 1Откройте конфигуратор и создайте новую внешнюю обработку через меню «Файл»
- 2Добавьте форму обработки, разместите на ней поля «ДатаНачала», «ДатаОкончания» и команду «Заполнить»
- 3В модуле формы напишите процедуру команды: создайте запрос к документам с условием по дате и параметрами
- 4Выгрузите результат запроса в таблицу значений и присвойте её реквизиту формы
- 5Сохраните обработку в файл .epf, откройте её в режиме предприятия и проверьте работу на учебной базе
Проверка результата: обработка открывается в режиме «1С:Предприятие», после нажатия кнопки таблица заполняется документами именно за указанный период. Если таблица пустая — проверьте, что в базе есть проведённые документы в этих датах и что параметры запроса передаются с правильными типами (дата, а не строка).
Следующий шаг после первой обработки — добавить в неё изменение данных: например, массовую установку скидки или перепроведение документов. Здесь впервые появляется необходимость транзакций: оборачивайте массовые изменения в «НачатьТранзакцию()...ЗафиксироватьТранзакцию()» с обработкой исключений через «Попытка...Исключение», чтобы при ошибке не осталось частично изменённых данных.
Отладка и поиск ошибок
Отладчик встроен в конфигуратор и работает без дополнительной настройки для файловых баз. Поставьте точку останова кликом по полю слева от строки, запустите отладку клавишей F5, выполните действие в режиме предприятия — выполнение остановится на нужной строке. Дальше доступны пошаговое выполнение (F11 — с заходом в процедуры, F10 — через), просмотр значений переменных по наведению мыши и окно «Вычислить выражение» (Shift+F9).
Для отладки серверного кода на клиент-серверной базе нужно включить отладку на сервере (параметр запуска службы агента сервера) и разрешить отладку в свойствах информационной базы в консоли кластера. Без этого точки останова в серверных модулях будут просто игнорироваться — частая причина «отладчик не останавливается».
Как проверить результат
Типы соответствуют ожиданию: дата — датой, ссылка — ссылкой, а не строкой
Неопределено там, где должна быть ссылка, или строка вместо даты
Выборка содержит строки, поля заполнены
Пустая выборка при заведомо существующих данных — проверьте параметры и условия
Записать() завершается без исключения, объект появляется в списке
Ошибка блокировки или проверки заполнения — читайте текст исключения
Кроме отладчика полезны «Сообщить()» для быстрой диагностики и журнал регистрации — туда попадают ошибки фоновых заданий и регламентных операций, которые нельзя поймать интерактивно. В типовых конфигурациях также есть встроенный механизм протоколирования через «ЗаписьЖурналаРегистрации» — используйте его в коде, который будет работать без присмотра.
Изменение типовой конфигурации: расширения против доработки
Когда учебные обработки освоены, возникает задача доработать рабочую конфигурацию. Здесь есть принципиальный выбор: править типовой код напрямую или использовать расширение конфигурации. Прямая правка снимает конфигурацию с полной поддержки и превращает каждое обновление в ручное слияние изменений — при активной доработке это часы работы на каждый релиз.
Расширение — надстройка, которая позволяет добавлять свои объекты, перехватывать процедуры типовых модулей (аннотации «&Перед», «&После», «&Вместо») и изменять формы, не трогая основную конфигурацию. Обновление типовой при этом проходит штатно, а расширение либо продолжает работать, либо требует точечной адаптации. Для большинства доработок — добавить кнопку, проверку, печатную форму — расширения достаточно.
Сравнение вариантов
Подходит для разовых операций, загрузок, учебных задач. Ограничение: не участвует в проведении документов, запускается вручную.
Основной способ доработки типовых решений: формы, печать, проверки. Ограничение: нельзя менять структуру данных типовых объектов произвольно.
Когда возможностей расширения не хватает: новые измерения регистров, глубокая переработка механизмов. Цена — сложные обновления и снятие с поддержки.
Ограничения, риски и границы самостоятельной работы
Главный риск при написании кода в 1С — порча данных в рабочей базе. Код, который изменяет или удаляет объекты, выполняется с правами текущего пользователя, и ошибка в условии отбора может затронуть тысячи документов. Поэтому любой код, модифицирующий данные, сначала прогоняется на копии базы, а перед запуском в рабочей среде делается резервная копия (выгрузка .dt для файловой базы или бэкап средствами СУБД для клиент-серверной).
Второй риск — производительность. Запросы в цикле, отсутствие индексов по полям условий, выгрузка огромных таблиц в память способны «повесить» рабочую базу для всех пользователей. Перед запуском массовой обработки оцените объём данных и тестируйте на копии с реальным объёмом, а не на пустой учебной базе.
Как развиваться дальше
После освоения обработок, запросов и отладки логичный путь — система компоновки данных (СКД) для отчётов без ручного вывода, работа с регистрами и понимание механизма проведения, затем управляемые формы и клиент-серверное взаимодействие. Параллельно полезно изучить стандарты разработки фирмы «1С» — они описывают именование переменных, структуру модулей и типовые приёмы, и код, написанный по стандартам, проще читать и сопровождать.
Практика важнее чтения: берите реальные задачи из рабочего учёта — автоматизировать заполнение, сделать сверку, собрать нестандартный отчёт. Каждая такая задача заставляет освоить новый объект метаданных или приём, и через несколько десятков решённых задач складывается уверенное владение платформой.
Что важно запомнить
Код в 1С пишется в конфигураторе внутри модулей объектов, форм и общих модулей. Начинайте с внешних обработок, читайте данные запросами, изменяйте — через объектную модель с транзакциями. Типовые конфигурации дорабатывайте расширениями, а любой код, меняющий данные, проверяйте на копии базы.
Частые вопросы
Нужно ли знать другой язык программирования перед изучением 1С?
Нет, встроенный язык 1С вполне подходит как первый: синтаксис простой, среда одна, результат виден сразу в прикладной системе. Знание основ SQL заметно ускорит освоение языка запросов, но и его можно изучать параллельно на практических задачах.
Чем учебная версия платформы отличается от рабочей?
Учебная версия бесплатна и полностью подходит для обучения синтаксису, запросам и отладке. Ограничения касаются коммерческой эксплуатации и ряда возможностей: нет работы с COM, ограничен объём данных, недоступны некоторые механизмы. Для первых месяцев практики этого достаточно.
Почему мой код в общем модуле не виден из формы?
Чаще всего причина в одном из трёх: у процедуры или функции не указано ключевое слово «Экспорт», у общего модуля не включён нужный флажок контекста (клиент/сервер), либо модуль компилируется только на сервере, а вызов идёт из клиентского контекста. Проверьте свойства общего модуля и директивы компиляции в модуле формы.
Как выполнить код по расписанию без участия пользователя?
Используйте регламентные задания: в конфигураторе создаётся объект «Регламентное задание» с расписанием и привязкой к методу общего модуля. В файловой базе задания выполняются при работающем сеансе, в клиент-серверной — сервером автоматически. Код регламентного задания должен быть серверным и не обращаться к интерактивным элементам.
Что делать, если после моей доработки конфигурация перестала обновляться?
Если типовой код правился напрямую, при обновлении платформа предложит сопоставление изменений — их нужно вручную переносить в новую версию. Чтобы не повторять это каждый раз, перенесите доработки в расширение конфигурации и верните основную конфигурацию на полную поддержку через сравнение с конфигурацией поставщика.