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