Работа со статусами в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и пользователей системы. Без правильно настроенных статусов невозможно организовать ни документооборот, ни контроль бизнес-процессов, ни даже элементарное ведение справочников. Но как именно создать статус, где его хранить, и как привязать к документам или задачам? Эта статья поможет разобраться во всех нюансах — от базовых настроек до программного управления статусами через встроенный язык 1С 8.3.
Мы рассмотрим не только стандартные механизмы платформы, но и неочевидные приёмы, которые экономят время. Например, как автоматически менять статус при выполнении условий или как вывести историю изменений статусов для анализа. Особое внимание уделим типичным ошибкам, которые допускают новички — от неправильной привязки к регистрам до конфликтов при одновременной работе нескольких пользователей.
Если вы никогда не работали со статусами в 1С, начните с первых разделов — там объяснены основы на примере справочника Номенклатура. Опытным разработчикам будет полезен раздел про динамические статусы и интеграцию с бизнес-процессами. В конце статьи вы найдёте FAQ с ответами на самые частые вопросы и таблицу сравнения способов хранения статусов.
1. Что такое статус в 1С и зачем он нужен
В контексте 1С:Предприятие статус — это признак, который описывает текущее состояние объекта: документа, справочника, задачи или даже строки регистра. Например, у документа Заказ покупателя могут быть статусы «Черновик», «На согласовании», «Оплачен», «Отгружен». Без статусов невозможно:
- 📌 Контролировать этапы выполнения заказа или задачи
- 🔄 Автоматизировать переходы между состояниями (например, после оплаты — менять статус на «Оплачен»)
- 📊 Строить отчёты по текущему состоянию объектов (например, «Сколько заказов в статусе ‘Отгружен’»)
- 🚫 Ограничивать действия пользователей (например, запретить редактирование документа со статусом «Закрыт»)
В платформе 1С статусы можно реализовать несколькими способами:
| Способ хранения | Примеры использования | Плюсы | Минусы |
|---|---|---|---|
| Реквизит справочника/документа | Статус номенклатуры («Активна», «Удалена»), статус заказа («Новый», «Выполнен») | Простота настройки, не требует программирования | Ограниченная функциональность, нет истории изменений |
| Перечисление | Фиксированный набор статусов (например, для задач: «В работе», «Приостановлена») | Контроль возможных значений, удобно для отчётов | Нельзя добавить новый статус без изменения конфигурации |
| Регистр сведений | История изменений статусов, сложные условия перехода | Гибкость, поддержка версий, возможность аналитики | Требует программирования, сложнее в поддержке |
| Бизнес-процессы | Сложные маршруты согласования (например, статус «На утверждении у директора») | Визуальное моделирование, уведомления, интеграция с задачами | Высокая нагрузка на систему, сложность настройки |
Критическая ошибка новичков: использовать для статусов реквизит типа «Строка» вместо «Перечисление» или «Справочник». Это приводит к опечаткам (например, «Оплачено» vs «Оплачен») и усложняет построение отчётов.
2. Создание статуса через реквизит справочника (для начинающих)
Самый простой способ добавить статус — создать реквизит в справочнике или документе. Рассмотрим на примере справочника Контрагенты, где нужно отслеживать статус партнёра («Активный», «Неактивный», «Чёрный список»).
Шаги:
- Откройте конфигуратор (
Файл → Конфигуратор). - Найдите справочник
Контрагентыв дереве объектов. - Добавьте новый реквизит:
- Имя:
СтатусКонтрагента - Тип:
ПеречислениеСсылка.СтатусыКонтрагентов(предварительно создайте перечисление с нужными значениями) - Длина: оставьте по умолчанию
- Имя:
Теперь в форме справочника появится поле для выбора статуса. Чтобы ограничить действия пользователей в зависимости от статуса, используйте прав доступа или условное оформление:
Если СтатусКонтрагента = Перечисления.СтатусыКонтрагентов.ЧерныйСписок Тогда
ЭлементыФормы.КнопкаРедактировать.Видимость = Ложь;
КонецЕсли;
Создано перечисление с нужными значениями|Реквизит добавлен в справочник/документ|Тип реквизита — ссылка на перечисление|Права доступа настроены для разных статусов-->
⚠️ Внимание: Если вы используете управляемые формы, не забудьте добавить реквизит в клиентскую часть формы через свойство «Реквизиты». Иначе поле не отобразится в интерфейсе.
3. Динамические статусы с регистром сведений
Когда статусы нужно хранить с привязкой ко времени или анализировать их историю (например, «Когда заказ перешёл в статус ‘Отгружен’»), обычного реквизита недостаточно. Здесь поможет регистр сведений.
Пример: отслеживаем статус документа ЗаказПокупателя с фиксацией даты и автора изменения.
Шаги:
- Создайте регистр сведений
СтатусыЗаказовс измерениями:Заказ(тип:ДокументСсылка.ЗаказПокупателя)
Статус(тип:ПеречислениеСсылка.СтатусыЗаказов)ДатаИзменения(тип:Дата)Пользователь(тип:Ссылка.Пользователь)
Процедура ПриЗаписи(Отказ)
РегистрыСведений.СтатусыЗаказов.Записать(
Новый Структура("Заказ, Статус, ДатаИзменения, Пользователь",
ЭтотОбъект.Ссылка, ЭтотОбъект.Статус, ТекущаяДата(), Пользователи.ТекущийПользователь())
);
КонецПроцедуры
Теперь вы можете построить отчёт по истории статусов или настроить уведомления при смене статуса. Например, отправить email менеджеру, когда заказ перешёл в статус «Оплачен»:
Если ЭтотОбъект.Статус = Перечисления.СтатусыЗаказов.Оплачен Тогда
Почта.Отправить("manager@example.com", "Заказ оплачен", "Заказ №" + ЭтотОбъект.Номер);
КонецЕсли;
Используйте отбор по периоду в регистре сведений, чтобы получить актуальный статус на любую дату. Например: РегистрыСведений.СтатусыЗаказов.Последний(, Заказ = ЭтотОбъект.Ссылка)
4. Статусы в бизнес-процессах 1С
Для сложных маршрутов согласования (например, «Заявка на отпуск» с этапами «Создана», «На согласовании у руководителя», «Утверждена кадрами») удобно использовать бизнес-процессы. Они визуально моделируются в конфигураторе и поддерживают:
- 📍 Точки принятия решений (например, «Если сумма заказа > 100 000, то на согласование к директору»)
- ⏳ Тайм-ауты (автоматическое изменение статуса, если задача не выполнена за 3 дня)
- 🔔 Уведомления (email, сообщения в 1С)
- 🔄 Параллельные ветки (например, одновременное согласование в бухгалтерии и на складе)
Пример настройки:
- Создайте бизнес-процесс
СогласованиеЗаказа. - Добавьте точки маршрута (статусы) и свяжите их действиями (например, «Отправить на согласование»).
- В карточке задачи укажите исполнителя (роль или конкретного пользователя).
- Настройте условия перехода между статусами (например, «Если сумма > 50 000, то на согласование к финансовому директору»).
Код для запуска бизнес-процесса из документа:
Процедура НачалоСогласования()
БизнесПроцессы.СоздатьОбъект("СогласованиеЗаказа").Заполнить();
БизнесПроцессы.СогласованиеЗаказа.Заказ = ЭтотОбъект.Ссылка;
БизнесПроцессы.СогласованиеЗаказа.Записать();
БизнесПроцессы.СогласованиеЗаказа.Запустить();
КонецПроцедуры
Реквизит справочника/документа|Перечисление|Регистр сведений|Бизнес-процессы|Другой вариант-->
⚠️ Внимание: Бизнес-процессы сильно нагружают систему при большом количестве одновременно запущенных экземпляров. Если у вас более 1000 активных процессов, рассмотрите альтернативы (например, регистры сведений + фоновые задания).
5. Автоматическое изменение статусов по условиям
Часто статусы нужно менять автоматически при выполнении определённых условий. Например:
- 💰 Если поступил платёж — поменять статус заказа на «Оплачен»
- ⏱️ Если документ не редактировался 30 дней — перевести в статус «Архивный»
- 📦 Если со склада списаны все позиции — статус «Отгружен»
Реализовать это можно через:
- Обработку проведения документа (для статусов, связанных с движениями):
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Если ЭтотОбъект.СуммаОплаты >= ЭтотОбъект.СуммаДокумента Тогда
ЭтотОбъект.Статус = Перечисления.СтатусыЗаказов.Оплачен;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
- Фоновое задание (для проверки по расписанию):
Процедура ВыполнитьПроверкуСтатусов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказы.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК Заказы
|ГДЕ
| Заказы.Дата < ТЕКУЩАЯДАТА() - 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С и сайтом на WordPress?
Варианты интеграции:
- REST API:
- В 1С: отправляйте статусы через
HTTPЗапросна эндпоинт WordPress. - На сайте: используйте плагин WP REST API для приёма данных.
- В 1С: отправляйте статусы через
- Промежуточная база:
- Настройте обмен через 1С:Коннектор или CommerceML.
- Статусы будут синхронизироваться вместе с другими данными.
- На сайте настройте вебхук, который будет вызывать HTTP-сервис 1С при изменении статуса.
Пример кода для отправки статуса из 1С:
Адрес = "https://ваш-сайт.ru/wp-json/custom/v1/status";
Запрос = Новый HTTPЗапрос(Адрес);
Запрос.УстановитьТекст(Формат(JSON.Записать(Новый Структура("order_id, status", ЭтотОбъект.Номер, ЭтотОбъект.Статус)), ""));
Запрос.УстановитьЗаголовок("Authorization", "Bearer ваш_токен");
Ответ = Новый HTTPСоединение().Получить(Запрос);