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

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

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

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

Алгоритм в 1С — это последовательность инструкций на встроенном языке платформы, которая выполняется при наступлении определённого события: проведении документа, нажатии кнопки, записи элемента справочника или вызове из другого модуля. Чтобы прописать алгоритм, нужно понимать три вещи: где именно размещается код, как устроены процедуры и функции, и как проверить, что логика работает правильно.

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

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

Где размещается код: виды модулей

Встроенный язык 1С не существует «сам по себе» — любой фрагмент кода живёт в конкретном модуле. От выбора модуля зависит, когда и в каком контексте выполнится алгоритм.

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

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

Как открыть модуль и создать первую процедуру

Запустите конфигуратор, откройте конфигурацию (меню «Конфигурация» → «Открыть конфигурацию») и найдите нужный объект в дереве. Например, чтобы прописать алгоритм при проведении документа «РеализацияТоваров», щёлкните по нему правой кнопкой и выберите «Открыть модуль объекта».

Базовая структура процедуры выглядит так:

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

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

ПроцентСкидки = 10;

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

ПроцентСкидки = 5;

Иначе

ПроцентСкидки = 0;

КонецЕсли;

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

Ключевые элементы синтаксиса: блок начинается словом Процедура или Функция, завершается КонецПроцедуры / КонецФункции. Условия оформляются конструкцией Если ... Тогда ... ИначеЕсли ... Иначе ... КонецЕсли;, циклы — Для ... Цикл ... КонецЦикла; или Пока ... Цикл. Каждый оператор заканчивается точкой с запятой. Ключевое слово Экспорт делает процедуру доступной из других модулей.

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

Работа с данными внутри алгоритма

Большинство прикладных алгоритмов сводятся к чтению данных, их обработке и записи результата. Для чтения из базы используются запросы — конструкция Запрос = Новый Запрос("...") с текстом на языке запросов 1С. Запросы предпочтительнее перебора объектов в цикле: они выполняются на стороне сервера СУБД и работают быстрее на больших объёмах.

Обход табличных частей документа выполняется циклом:

Для Каждого СтрокаТовара Из Товары Цикл

СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;

КонецЦикла;

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

Проверка и отладка алгоритма

Первый уровень проверки — синтаксический контроль модуля (Ctrl+F7 или меню «Текст» → «Синтаксический контроль»). Он ловит опечатки, незакрытые блоки и неверные конструкции, но не проверяет логику.

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

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

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

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

Вызов процедуры
Норма

Точка останова срабатывает при ожидаемом событии

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

Код не выполняется — проверьте модуль и обновление конфигурации

Значения переменных
Норма

Данные соответствуют входным условиям на каждом шаге

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

Пустые или неожиданные значения — ошибка в запросе или источнике данных

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

Объект записан, движения по регистрам сформированы

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

Объект записан без движений — неверный режим записи

Повторный запуск
Норма

Результат идентичен, дублей нет

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

Дубли строк или движений — нет проверки на повторную обработку

Типовые сценарии: примеры алгоритмов

Проведение документа и движения по регистрам

Алгоритм проведения размещается в обработчике ОбработкаПроведения модуля объекта документа. Типовая схема: сформировать запрос по табличной части, обойти выборку, для каждой строки добавить запись в набор записей регистра через Движения.ИмяРегистра.Добавить(). В конце обязательно установите Движения.ИмяРегистра.Записывать = Истина;, иначе движения не сохранятся.

Обработчик события формы

Если нужно реагировать на изменение поля на форме, создайте обработчик через палитру свойств поля — например, ЦенаПриИзменении. Внутри обычно пересчитывают зависимые поля: сумму, НДС, итоги. Помните, что код формы выполняется на клиенте, и обращение к запросам из клиентского контекста требует вызова серверной процедуры.

Фоновое или регламентное выполнение

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

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

Ограничения и безопасная работа

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

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

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

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

Можно ли прописать алгоритм без доступа к конфигуратору?

Частично. Если конфигурация разрешает запуск внешних обработок, можно написать внешнюю обработку (.epf) с собственным кодом и выполнять её из пользовательского режима. Но изменить поведение типовых объектов без конфигуратора или расширений нельзя.

Чем процедура отличается от функции?

Функция возвращает значение через оператор Возврат и может использоваться в выражениях, например: Скидка = РассчитатьСкидку(Сумма). Процедура ничего не возвращает и вызывается отдельным оператором. Если алгоритм должен выдать результат — пишите функцию.

Почему код из общего модуля не виден в других местах?

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

Как прописать алгоритм, не снимая типовую конфигурацию с поддержки?

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

Что делать, если алгоритм работает медленно?

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

Нужно ли знать SQL для написания запросов в 1С?

Нет. Язык запросов 1С похож на SQL по синтаксису, но работает с объектами конфигурации, а не с таблицами СУБД напрямую. Достаточно понимать конструкции ВЫБРАТЬ, ИЗ, ГДЕ и соединения — конструктор запросов в конфигураторе помогает собрать текст визуально.

Итог

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

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