Как добавить новый статус в документ Этап производства в 1С:ERP и избежать ошибок проведения?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

В этой статье мы подробно разберем, почему возникает ошибка «Таблица не найдена "ЭкономияМатериалов"», проанализируем влияние статусов на регистры и рассмотрим наиболее безопасные способы реализации задачи, чтобы не «сломать» систему планирования и расчета себестоимости.

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

Давайте проанализируем ситуацию, с которой сталкивается разработчик при попытке провести документ с новым статусом. Основная проблема кроется в так называемом «Диспетчере проведения». В 1С:ERP процесс проведения документа «Этап производства» разбит на множество этапов в общих модулях и менеджере документа. Программа динамически формирует временные таблицы для расчетов, используя конструкцию ВЫБОР КОГДА по значению статуса.

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

Ошибка при вызове метода контекста (Выполнить) по причине: {(146, 3)}: Таблица не найдена "ЭкономияМатериалов"

Это происходит потому, что логика формирования таблицы ЭкономияМатериалов в общем модуле ПроведениеСервер (или аналогичных) не обучена работать с вашим новым статусом. Чтобы исправить это «в лоб», пришлось бы переписывать десятки запросов в ядре системы, что крайне не рекомендуется.

Анализ влияния статуса на смежные подсистемы

Прежде чем приступать к кодингу, давайте выясним, на что еще влияет статус Этапа производства в ERP. Это критически важно для сохранения целостности данных:

  1. График производства: Статус определяет, считается ли потребность этапа актуальной. Если вы установите статус Прекращен, но не опишете его в логике закрытия графиков, система будет продолжать резервировать материалы и занимать рабочие центры под этот этап.
  2. Трудозатраты: Данные о выполненных работах попадают в документ «Выработка сотрудников» только при определенных статусах (обычно Завершен).
  3. Себестоимость: Модуль закрытия месяца ориентируется на статусы для определения момента списания НЗП (незавершенного производства). Некорректный статус может привести к тому, что затраты «зависнут» на остатках навсегда.
  4. Состояние Заказа на производство: Состояние основного заказа рассчитывается динамически на основе статусов всех его этапов. Неизвестный статус может заблокировать возможность закрытия всего заказа.

Вариант 1. Реализация через дополнительный реквизит (Безопасный путь)

Рассмотрим наиболее правильный с точки зрения архитектуры подход. Вместо изменения типового перечисления, мы добавим дополнительный признак (флаг) через расширение. Это позволит сохранить типовую логику проведения, но визуально и функционально решить задачу «прекращения» этапа.

Шаг 1. Добавление реквизита. Создадим через расширение реквизит Прекращен (Тип: Булево) для документа ЭтапПроизводства.

Шаг 2. Блокировка формы. Чтобы пользователь не мог редактировать поля после установки признака прекращения, воспользуемся событием ПриЧтенииНаСервере или ПриСозданииНаСервере в форме документа:


&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    Если ТекущийОбъект.Прекращен Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
        // Разрешаем только снимать флаг прекращения, если есть права
        ЭтаФорма.Элементы.ГруппаПрекращение.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Шаг 3. Обработка проведения. Если при прекращении этапа нужно отменить все движения (освободить резервы и ресурсы), логичнее всего переводить документ в один из начальных статусов (например, Формируется) и устанавливать флаг Прекращен. Типовая логика сама очистит движения по регистрам накопления, а ваш флаг будет служить индикатором для пользователей в списках.

Вариант 2. Имитация нового статуса через «Виртуальное перечисление»

Если бизнес-заказчик настаивает на том, чтобы в поле Статус пользователи видели слово «Прекращен», мы можем применить методику подмены, предложенную опытными разработчиками.

Проанализируем шаги реализации:

  1. Создаем новое перечисление ДопСтатусыЭтапов, которое включает все типовые значения плюс Прекращен.
  2. В форме документа скрываем типовой реквизит Статус и добавляем поле, связанное с нашим новым перечислением.
  3. При изменении нашего «виртуального» статуса программно меняем реальный статус документа. Например, если выбран Прекращен, мы можем оставить реальный статус Сформирован (чтобы не ломать логику проведения), но через флаг блокировать документ.

Пример программной связки в форме:


&НаКлиенте
Процедура ВиртуальныйСтатусПриИзменении(Элемент)
    Если Объект.ВиртуальныйСтатус = ПредопределенноеЗначение("Перечисление.ДопСтатусыЭтапов.Прекращен") Тогда
        // Устанавливаем типовой статус, который не требует заполнения всех данных
        Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЭтаповПроизводства.Сформирован");
        Объект.Прекращен = Истина;
    Иначе
        // Синхронизируем с типовым перечислением
        Объект.Статус = ПолучитьТиповойСтатус(Объект.ВиртуальныйСтатус);
        Объект.Прекращен = Ложь;
    КонецЕсли;
КонецПроцедуры

Вариант 3. «Хардкорный» метод (Если вы все же решили менять перечисление)

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

  1. Менеджер документа ЭтапПроизводства2_2: Проверьте функции ТекстЗапросаЗаполненияТаблицПоДаннымДокумента. Именно здесь формируются те самые временные таблицы, которых не хватает системе.
  2. Общий модуль ДиспетчированиеЭтаповПроизводства: Здесь описываются условия перехода между состояниями и доступность команд.
  3. Общий модуль УправлениеПроизводством: Проверьте логику расчета обеспечения.

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

Рекомендации и выводы

Подведем итоги нашего исследования. В 1С:ERP статус документа — это не просто строчка текста, а переключатель глобальной логики проведения.

Мы выяснили, что:

Помните совет опытных архитекторов: прежде чем менять системную логику статусов, попробуйте реализовать задачу через Форма.ТолькоПросмотр = Истина. Это сэкономит вам десятки часов на отладку и обеспечит корректную работу всех подсистем планирования 1С:ERP.

← На главную