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

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

Системные перечисления в 1С: что это такое и как с ними работать

Что такое системные перечисления в 1С:Предприятие 8, чем отличаются от обычных перечислений, как обращаться к ним в коде и какие ошибки допускают разработчики.

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

Типичные примеры — ВидДвиженияНакопления (Приход/Расход), ВидДвиженияБухгалтерии (Дебет/Кредит), ВидСчета (Активный/Пассивный/АктивноПассивный), РежимПроведенияДокумента, ВидПериодаРегистраРасчета. Эти значения нельзя изменить, удалить или дополнить — они жёстко определены платформой, потому что отражают фундаментальную логику работы учётных механизмов.

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

Чем системные перечисления отличаются от обычных

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

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

КритерийОбычное перечислениеСистемное перечисление
Где создаётсяВ конфигураторе, ветка «Перечисления»Встроено в платформу
Изменение значенийМожно добавлять и удалятьНевозможно
Обращение в кодеПеречисления.ИмяПеречисления.ЗначениеИмяПеречисления.Значение (без менеджера)
Зависимость от конфигурацииСуществует только в своей конфигурацииДоступно в любой базе
Использование в запросахЧерез ЗНАЧЕНИЕ(Перечисление.Имя.Значение)Через ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) и т.п.

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

Основные системные перечисления и где они применяются

Платформа содержит несколько десятков системных перечислений. На практике чаще всего встречаются те, что связаны с учётными регистрами и проведением документов.

  • ВидДвиженияНакопления — Приход и Расход. Используется при формировании движений по регистрам накопления и в виртуальных таблицах оборотов.
  • ВидДвиженияБухгалтерии — Дебет и Кредит. Применяется в записях регистра бухгалтерии и в корреспонденциях счетов.
  • ВидСчета — Активный, Пассивный, АктивноПассивный. Определяет поведение счёта при расчёте сальдо.
  • РежимПроведенияДокумента — Оперативный и Неоперативный. Передаётся в метод Записать() документа.
  • ВидПериодаРегистраРасчета — ФактическийПериодДействия, ПериодДействия, БазовыйПериод. Используется в механизмах расчёта зарплаты.
  • ВидТочкиМаршрутаБизнесПроцесса, ИспользованиеРежимаПроведения, СпособВыборки и другие — для более специфических механизмов.

Также к системным перечислениям относятся значения, управляющие интерфейсом и поведением форм: РежимОткрытияОкнаФормы, Клавиша, ОриентацияСтраницы, ТипФайлаТабличногоДокумента. Они нужны при программной работе с формами, печатью и выгрузкой документов.

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

Обращение строится по шаблону: имя перечисления, точка, имя значения. Например, при программном формировании движения по регистру накопления вид движения задаётся так:

Движение = Движения.ОстаткиНоменклатуры.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Номенклатура = ТекНоменклатура;

Движение.Количество = КоличествоПриход;

При проведении документа программно режим передаётся вторым параметром метода Записать():

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение,

РежимПроведенияДокумента.Оперативный);

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

bsl
Если Движение.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
    Остаток = Остаток + Движение.Количество;
Иначе
    Остаток = Остаток - Движение.Количество;
КонецЕсли;

Сравнение значений и проверка типа

Значения системных перечислений сравниваются напрямую оператором равенства — это быстрее и читабельнее, чем сравнение строковых представлений. Никогда не сравнивайте через Строка(Движение.ВидДвижения) = "Приход": такой код ломается при смене языка представления и работает медленнее.

Системные перечисления в запросах

В языке запросов обращение к системному перечислению выполняется функцией ЗНАЧЕНИЕ() с указанием имени перечисления и значения без префикса «Перечисление»:

ВЫБРАТЬ

Обороты.Номенклатура,

Обороты.КоличествоОборот

ИЗ

РегистрНакопления.ОстаткиНоменклатуры.Обороты(&Начало, &Конец, , ) КАК Обороты

ВЫБРАТЬ

Движения.Номенклатура

ИЗ

РегистрНакопления.ОстаткиНоменклатуры КАК Движения

ГДЕ

Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)

Для регистров бухгалтерии аналогично используется ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет). В виртуальных таблицах оборотов регистра бухгалтерии вид движения часто передаётся как параметр самой виртуальной таблицы — проверяйте сигнатуру конкретной таблицы в синтакс-помощнике.

Как найти нужное системное перечисление
  1. 1
    Откройте конфигуратор и вызовите синтакс-помощник (Ctrl+Shift+F1)
  2. 2
    Разверните ветку «Системные перечисления» в дереве разделов
  3. 3
    Найдите перечисление по смыслу задачи: движения, проведение, формы
  4. 4
    Посмотрите список значений и примеры использования в описании
  5. 5
    Проверьте код в отладчике: значение отображается в табло как ИмяПеречисления.Значение

Типичные ошибки при работе с системными перечислениями

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

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

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

Типичные ошибки
01
Обращение Перечисления.ВидДвиженияНакопления.Приход — ошибка компиляции, системные перечисления вызываются без менеджера
02
Сравнение значения со строкой "Приход" вместо сравнения с ВидДвиженияНакопления.Приход — код ломается при смене языка
03
Оперативное проведение документа прошлой датой — исключение платформы и прерванная обработка
04
Попытка добавить своё значение в системное перечисление — невозможно по определению, нужно заводить обычное перечисление
05
Передача строки вместо значения перечисления в параметр метода Записать() — ошибка несоответствия типов

Когда системного перечисления недостаточно

Системные перечисления закрывают только базовые механизмы платформы. Если прикладной задаче нужен свой набор статусов, категорий или режимов — создавайте обычное перечисление в конфигурации. Типичный пример: системное перечисление не может описать статусы заказа «Согласование», «Оплачен», «Отгружен» — это прикладная логика.

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

Маршрут решения

Как выбрать подход

Нужно управлять движением регистра, проведением или поведением счётаИспользуйте соответствующее системное перечисление платформы
Нужен фиксированный список прикладных статусов, который меняет только разработчикСоздайте обычное перечисление в конфигурации
Пользователи должны сами добавлять значенияИспользуйте справочник, а не перечисление
Значения нужны в нескольких конфигурациях без доработкиПроверьте, не покрывает ли задачу системное перечисление платформы

Как проверить корректность использования

После написания кода с системными перечислениями проверьте результат в отладчике: значение переменной должно отображаться в табло как ВидДвиженияНакопления.Приход, а не как строка или число. Если в табло видно пустое значение или Неопределено — реквизиту не присвоено значение, и движение запишется некорректно.

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

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

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

Значение переменной в отладчике
Норма

Отображается как ИмяПеречисления.Значение

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

Строка, число или Неопределено

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

Вид движения соответствует хозяйственной операции

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

Приход вместо Расхода или наоборот

Проведение документа программно
Норма

Записывается без исключений в нужном режиме

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

Ошибка оперативного проведения для старой даты

Запрос с ЗНАЧЕНИЕ()
Норма

Возвращает отфильтрованные строки

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

Пустой результат при заведомо существующих данных

Частые вопросы о системных перечислениях

Можно ли создать своё системное перечисление?

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

Почему код Перечисления.ВидДвиженияНакопления.Приход выдаёт ошибку?

Потому что коллекция «Перечисления» содержит только перечисления, созданные в конфигурации. Системные перечисления доступны напрямую по имени: ВидДвиженияНакопления.Приход, без префикса менеджера.

Видны ли системные перечисления в дереве конфигурации?

Нет, в дереве метаданных они не отображаются. Их описание находится в синтакс-помощнике конфигуратора в разделе «Системные перечисления», где перечислены все значения и приведены примеры использования.

Меняется ли состав системных перечислений при обновлении платформы?

Существующие значения не удаляются — это гарантирует совместимость кода. При обновлениях платформы могут добавляться новые системные перечисления или значения, поэтому при переходе на новую версию полезно просмотреть соответствующий раздел синтакс-помощника.

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

Через УстановитьПараметр: Запрос.УстановитьПараметр("ВидДв", ВидДвиженияНакопления.Приход). В тексте запроса также доступна конструкция ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) без передачи параметра.

Чем системное перечисление отличается от предопределённых данных справочника?

Предопределённые элементы справочника создаются разработчиком в конфигурации и хранятся в базе данных как обычные записи. Системные перечисления встроены в платформу, не хранятся в таблицах данных и не могут быть изменены ни разработчиком, ни пользователем.

Итог

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

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