Работа со статусами в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и пользователей системы. Без правильно настроенных статусов невозможно организовать ни документооборот, ни контроль бизнес-процессов, ни даже элементарное ведение справочников. Но как именно создать статус, где его хранить, и как привязать к документам или задачам? Эта статья поможет разобраться во всех нюансах — от базовых настроек до программного управления статусами через встроенный язык 1С 8.3.

Мы рассмотрим не только стандартные механизмы платформы, но и неочевидные приёмы, которые экономят время. Например, как автоматически менять статус при выполнении условий или как вывести историю изменений статусов для анализа. Особое внимание уделим типичным ошибкам, которые допускают новички — от неправильной привязки к регистрам до конфликтов при одновременной работе нескольких пользователей.

Если вы никогда не работали со статусами в 1С, начните с первых разделов — там объяснены основы на примере справочника Номенклатура. Опытным разработчикам будет полезен раздел про динамические статусы и интеграцию с бизнес-процессами. В конце статьи вы найдёте FAQ с ответами на самые частые вопросы и таблицу сравнения способов хранения статусов.

1. Что такое статус в 1С и зачем он нужен

В контексте 1С:Предприятие статус — это признак, который описывает текущее состояние объекта: документа, справочника, задачи или даже строки регистра. Например, у документа Заказ покупателя могут быть статусы «Черновик», «На согласовании», «Оплачен», «Отгружен». Без статусов невозможно:

  • 📌 Контролировать этапы выполнения заказа или задачи
  • 🔄 Автоматизировать переходы между состояниями (например, после оплаты — менять статус на «Оплачен»)
  • 📊 Строить отчёты по текущему состоянию объектов (например, «Сколько заказов в статусе ‘Отгружен’»)
  • 🚫 Ограничивать действия пользователей (например, запретить редактирование документа со статусом «Закрыт»)

В платформе 1С статусы можно реализовать несколькими способами:

Способ хранения Примеры использования Плюсы Минусы
Реквизит справочника/документа Статус номенклатуры («Активна», «Удалена»), статус заказа («Новый», «Выполнен») Простота настройки, не требует программирования Ограниченная функциональность, нет истории изменений
Перечисление Фиксированный набор статусов (например, для задач: «В работе», «Приостановлена») Контроль возможных значений, удобно для отчётов Нельзя добавить новый статус без изменения конфигурации
Регистр сведений История изменений статусов, сложные условия перехода Гибкость, поддержка версий, возможность аналитики Требует программирования, сложнее в поддержке
Бизнес-процессы Сложные маршруты согласования (например, статус «На утверждении у директора») Визуальное моделирование, уведомления, интеграция с задачами Высокая нагрузка на систему, сложность настройки

Критическая ошибка новичков: использовать для статусов реквизит типа «Строка» вместо «Перечисление» или «Справочник». Это приводит к опечаткам (например, «Оплачено» vs «Оплачен») и усложняет построение отчётов.

2. Создание статуса через реквизит справочника (для начинающих)

Самый простой способ добавить статус — создать реквизит в справочнике или документе. Рассмотрим на примере справочника Контрагенты, где нужно отслеживать статус партнёра («Активный», «Неактивный», «Чёрный список»).

Шаги:

  1. Откройте конфигуратор (Файл → Конфигуратор).
  2. Найдите справочник Контрагенты в дереве объектов.
  3. Добавьте новый реквизит:
    • Имя: СтатусКонтрагента
    • Тип: ПеречислениеСсылка.СтатусыКонтрагентов (предварительно создайте перечисление с нужными значениями)
    • Длина: оставьте по умолчанию
  • Сохраните конфигурацию и обновите базу данных.
  • Теперь в форме справочника появится поле для выбора статуса. Чтобы ограничить действия пользователей в зависимости от статуса, используйте прав доступа или условное оформление:

    Если СтатусКонтрагента = Перечисления.СтатусыКонтрагентов.ЧерныйСписок Тогда
    

    ЭлементыФормы.КнопкаРедактировать.Видимость = Ложь;

    КонецЕсли;

    Создано перечисление с нужными значениями|Реквизит добавлен в справочник/документ|Тип реквизита — ссылка на перечисление|Права доступа настроены для разных статусов-->

    ⚠️ Внимание: Если вы используете управляемые формы, не забудьте добавить реквизит в клиентскую часть формы через свойство «Реквизиты». Иначе поле не отобразится в интерфейсе.

    3. Динамические статусы с регистром сведений

    Когда статусы нужно хранить с привязкой ко времени или анализировать их историю (например, «Когда заказ перешёл в статус ‘Отгружен’»), обычного реквизита недостаточно. Здесь поможет регистр сведений.

    Пример: отслеживаем статус документа ЗаказПокупателя с фиксацией даты и автора изменения.

    Шаги:

    1. Создайте регистр сведений СтатусыЗаказов с измерениями:
      • Заказ (тип: ДокументСсылка.ЗаказПокупателя)
  • Добавьте ресурсы:
    • Статус (тип: ПеречислениеСсылка.СтатусыЗаказов)
    • ДатаИзменения (тип: Дата)
    • Пользователь (тип: Ссылка.Пользователь)
    • Напишите обработчик изменения статуса в модуле документа:
      Процедура ПриЗаписи(Отказ)
      

      РегистрыСведений.СтатусыЗаказов.Записать(

      Новый Структура("Заказ, Статус, ДатаИзменения, Пользователь",

      ЭтотОбъект.Ссылка, ЭтотОбъект.Статус, ТекущаяДата(), Пользователи.ТекущийПользователь())

      );

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

    Теперь вы можете построить отчёт по истории статусов или настроить уведомления при смене статуса. Например, отправить email менеджеру, когда заказ перешёл в статус «Оплачен»:

    Если ЭтотОбъект.Статус = Перечисления.СтатусыЗаказов.Оплачен Тогда
    

    Почта.Отправить("manager@example.com", "Заказ оплачен", "Заказ №" + ЭтотОбъект.Номер);

    КонецЕсли;

    💡

    Используйте отбор по периоду в регистре сведений, чтобы получить актуальный статус на любую дату. Например: РегистрыСведений.СтатусыЗаказов.Последний(, Заказ = ЭтотОбъект.Ссылка)

    4. Статусы в бизнес-процессах 1С

    Для сложных маршрутов согласования (например, «Заявка на отпуск» с этапами «Создана», «На согласовании у руководителя», «Утверждена кадрами») удобно использовать бизнес-процессы. Они визуально моделируются в конфигураторе и поддерживают:

    • 📍 Точки принятия решений (например, «Если сумма заказа > 100 000, то на согласование к директору»)
    • ⏳ Тайм-ауты (автоматическое изменение статуса, если задача не выполнена за 3 дня)
    • 🔔 Уведомления (email, сообщения в 1С)
    • 🔄 Параллельные ветки (например, одновременное согласование в бухгалтерии и на складе)

    Пример настройки:

    1. Создайте бизнес-процесс СогласованиеЗаказа.
    2. Добавьте точки маршрута (статусы) и свяжите их действиями (например, «Отправить на согласование»).
    3. В карточке задачи укажите исполнителя (роль или конкретного пользователя).
    4. Настройте условия перехода между статусами (например, «Если сумма > 50 000, то на согласование к финансовому директору»).

    Код для запуска бизнес-процесса из документа:

    Процедура НачалоСогласования()
    

    БизнесПроцессы.СоздатьОбъект("СогласованиеЗаказа").Заполнить();

    БизнесПроцессы.СогласованиеЗаказа.Заказ = ЭтотОбъект.Ссылка;

    БизнесПроцессы.СогласованиеЗаказа.Записать();

    БизнесПроцессы.СогласованиеЗаказа.Запустить();

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

    Реквизит справочника/документа|Перечисление|Регистр сведений|Бизнес-процессы|Другой вариант-->

    ⚠️ Внимание: Бизнес-процессы сильно нагружают систему при большом количестве одновременно запущенных экземпляров. Если у вас более 1000 активных процессов, рассмотрите альтернативы (например, регистры сведений + фоновые задания).

    5. Автоматическое изменение статусов по условиям

    Часто статусы нужно менять автоматически при выполнении определённых условий. Например:

    • 💰 Если поступил платёж — поменять статус заказа на «Оплачен»
    • ⏱️ Если документ не редактировался 30 дней — перевести в статус «Архивный»
    • 📦 Если со склада списаны все позиции — статус «Отгружен»

    Реализовать это можно через:

    1. Обработку проведения документа (для статусов, связанных с движениями):
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    

    Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда

    Если ЭтотОбъект.СуммаОплаты >= ЭтотОбъект.СуммаДокумента Тогда

    ЭтотОбъект.Статус = Перечисления.СтатусыЗаказов.Оплачен;

    КонецЕсли;

    КонецЕсли;

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

    1. Фоновое задание (для проверки по расписанию):
    Процедура ВыполнитьПроверкуСтатусов()
    

    Запрос = Новый Запрос;

    Запрос.Текст =

    "ВЫБРАТЬ

    | Заказы.Ссылка КАК Ссылка

    |ИЗ

    | Документ.ЗаказПокупателя КАК Заказы

    |ГДЕ

    | Заказы.Дата < ТЕКУЩАЯДАТА() - 30

    | И Заказы.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Архивный)";

    Результат = Запрос.Выполнить();

    Пока Результат.Следующий() Цикл

    Док = Результат.Ссылка.ПолучитьОбъект();

    Док.Статус = Перечисления.СтатусыЗаказов.Архивный;

    Док.Записать();

    КонецЦикла;

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

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

    Как отладить автоматическое изменение статусов?

    Используйте точку останова в обработчике ПриЗаписи или ОбработкаПроведения. Проверяйте значения переменных через Сообщить():

    Сообщить("Текущий статус: " + ЭтотОбъект.Статус);
    

    Сообщить("Сумма оплаты: " + ЭтотОбъект.СуммаОплаты);

    Если статус не меняется, проверьте:

    1. Права доступа на запись документа.

    2. Наличие транзакций (иногда изменения откатываются).

    3. Логику условий (например, сравнение дат с учётом времени).

    6. Типичные ошибки и как их избежать

    Даже опытные разработчики допускают ошибки при работе со статусами. Вот самые распространённые:

    Ошибка Последствия Как исправить
    Использование строки вместо перечисления для статуса Опечатки, дубли статусов, сложности в отчётах Замените тип реквизита на ПеречислениеСсылка
    Отсутствие истории изменений статусов Невозможно отследить, кто и когда изменил статус Используйте регистр сведений или бизнес-процессы
    Неправильные права доступа Пользователи видят или редактируют статусы, которые не должны Настройте RLS (разграничение доступа) на уровне статусов
    Игнорирование блокировок при изменении статуса Конфликты при одновременной работе нескольких пользователей Используйте БлокировкаДанных или транзакции
    Жёсткое кодирование статусов в коде При изменении статусов нужно править код Храните статусы в перечислениях или справочниках

    ⚠️ Внимание: Если вы используете распределённую информационную базу (РИБ), убедитесь, что статусы синхронизируются между узлами. Иначе возможны расхождения (например, в одном узле заказ «Оплачен», а в другом — «В обработке»).

    Ещё одна частая проблема — зацикливание статусов. Например, если в бизнес-процессе настроено правило «Если статус ‘На согласовании’, то вернуть на доработку», а в задаче «Доработка» снова стоит переход на согласование. Чтобы избежать этого:

    • 🔹 Проверяйте логику переходов на бумаге перед настройкой.
    • 🔹 Используйте счётчик итераций (например, «Если задача возвращалась на доработку > 3 раз, то статус ‘Отклонён’»).
    • 🔹 Настройте максимальное время выполнения для бизнес-процессов.

    7. Продвинутые техники: динамические статусы и интеграция

    Для сложных систем требуются гибкие решения. Рассмотрим несколько продвинутых подходов:

    1. Динамические статусы на основе данных

    Иногда статус зависит от нескольких условий. Например, статус заказа «Готов к отгрузке» устанавливается, только если:

    • 📋 Документ проведён
    • 💰 Оплачено ≥ 50%
    • 📦 На складе достаточно товара

    Реализуйте это через вычисляемый реквизит:

    Функция ПолучитьДинамическийСтатус()
    

    Если НЕ ЭтотОбъект.Проведен Тогда

    Возврат Перечисления.СтатусыЗаказов.Черновик;

    ИначеЕсли ЭтотОбъект.СуммаОплаты < ЭтотОбъект.СуммаДокумента * 0.5 Тогда

    Возврат Перечисления.СтатусыЗаказов.ОжидаетОплаты;

    ИначеЕсли НЕ ОстаткиНаСкладеДостаточны() Тогда

    Возврат Перечисления.СтатусыЗаказов.ОжидаетТовар;

    Иначе

    Возврат Перечисления.СтатусыЗаказов.ГотовКОтгрузке;

    КонецЕсли;

    КонецФункции

    2. Интеграция статусов с внешними системами

    Если статусы нужно синхронизировать с CRM, сайтом или Bitrix24, используйте HTTP-сервисы или обмен данными. Пример кода для отправки статуса в внешнюю систему:

    Процедура ОтправитьСтатусВоВнешнююСистему(Статус)
    

    Запрос = Новый HTTPЗапрос("https://api.example.com/status");

    Запрос.УстановитьТекст(

    Формат(JSON.Записать(Новый Структура("order_id, status", ЭтотОбъект.Номер, Статус)), "")

    );

    Ответ = Новый HTTPСоединение().Получить(Запрос);

    Если Ответ.КодСостояния <> 200 Тогда

    ЗаписатьЖурналРегистрации("Ошибка отправки статуса: " + Ответ.ПолучитьТекст());

    КонецЕсли;

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

    3. Визуализация статусов на дашбордах

    Чтобы менеджеры быстро видели актуальные статусы, настройте отчёты с условным оформлением или интерактивные панели (доступны в 1С:ERP или через расширения). Пример запроса для дашборда:

    ВЫБРАТЬ
    

    Статус КАК Статус,

    КОЛИЧЕСТВО(*) КАК Количество

    ИЗ

    Документ.ЗаказПокупателя

    ГДЕ

    Дата > НАЧАЛОПЕРИОДА(ТекущаяДата(), МЕСЯЦ)

    СГРУППИРОВАТЬ ПО

    Статус

    💡

    Для динамических статусов всегда используйте функции вместо жёсткой логики в коде. Это упростит поддержку и модификацию правил в будущем.

    FAQ: Частые вопросы по статусам в 1С

    Как сделать так, чтобы статус автоматически менялся при проведении документа?

    Используйте обработчик ОбработкаПроведения в модуле документа. Пример:

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    

    Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда

    ЭтотОбъект.Статус = Перечисления.СтатусыДокументов.Проведен;

    КонецЕсли;

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

    Не забудьте добавить реквизит Статус в документ и создать соответствующее перечисление.

    Можно ли хранить историю изменений статусов без регистра сведений?

    Да, но с ограничениями. Варианты:

    1. Журнал регистрации: пишите изменения через ЗаписатьЖурналРегистрации().
    2. Комментарии к документу: добавляйте запись при каждом изменении статуса.
    3. Внешняя таблица: создайте отдельный справочник или документ для логов.

    Однако регистр сведений остаётся самым надёжным способом, особенно если нужна аналитика по статусам.

    Как запретить пользователю менять статус вручную?

    Способы:

    • Скрыть поле статуса в форме через свойство Видимость = Ложь.
    • Настроить права доступа: в ролях пользователя убрать право на редактирование реквизита Статус.
    • Использовать обработчик ПередЗаписью для отмены изменений:
      Процедура ПередЗаписью(Отказ)
      

      Если ЭтотОбъект.Статус <> ЭтотОбъект.ТекущийСтатус Тогда

      Сообщить("Изменение статуса запрещено!");

      Отказ = Истина;

      КонецЕсли;

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

    Как сделать цветовую индикацию статусов в списке документов?

    Используйте условное оформление:

    1. Откройте форму списка документа.
    2. В свойствах формы найдите УсловноеОформление.
    3. Добавьте правило, например:
      Если Статус = Перечисления.СтатусыЗаказов.Оплачен Тогда
      

      ЦветФона = ВебЦвета.Зеленый;

      КонецЕсли;

    Для управляемых форм настройка аналогична, но делается через свойство УсловноеОформление в палитре свойств.

    Как синхронизировать статусы между 1С и сайтом на WordPress?

    Варианты интеграции:

    1. REST API:
      • В 1С: отправляйте статусы через HTTPЗапрос на эндпоинт WordPress.
      • На сайте: используйте плагин WP REST API для приёма данных.
    2. Промежуточная база:
      • Настройте обмен через 1С:Коннектор или CommerceML.
      • Статусы будут синхронизироваться вместе с другими данными.
  • Webhooks:
    • На сайте настройте вебхук, который будет вызывать HTTP-сервис 1С при изменении статуса.

    Пример кода для отправки статуса из 1С:

    Адрес = "https://ваш-сайт.ru/wp-json/custom/v1/status";
    

    Запрос = Новый HTTPЗапрос(Адрес);

    Запрос.УстановитьТекст(Формат(JSON.Записать(Новый Структура("order_id, status", ЭтотОбъект.Номер, ЭтотОбъект.Статус)), ""));

    Запрос.УстановитьЗаголовок("Authorization", "Bearer ваш_токен");

    Ответ = Новый HTTPСоединение().Получить(Запрос);