При работе с 1С:ERP Управление предприятием программисты часто сталкиваются с задачей расширения типового функционала под требования бизнеса. Одной из самых коварных задач является добавление нового значения в перечисление СтатусыЭтаповПроизводства. На первый взгляд, задача кажется простой: добавить значение в метаданные и обновить форму. Однако конфигурация ERP обладает сложнейшей архитектурой проведения, где логика формирования движений и временных таблиц жестко завязана на конкретные статусы.
В этой статье мы подробно разберем, почему возникает ошибка «Таблица не найдена "ЭкономияМатериалов"», проанализируем влияние статусов на регистры и рассмотрим наиболее безопасные способы реализации задачи, чтобы не «сломать» систему планирования и расчета себестоимости.
Давайте проанализируем ситуацию, с которой сталкивается разработчик при попытке провести документ с новым статусом. Основная проблема кроется в так называемом «Диспетчере проведения». В 1С:ERP процесс проведения документа «Этап производства» разбит на множество этапов в общих модулях и менеджере документа. Программа динамически формирует временные таблицы для расчетов, используя конструкцию ВЫБОР КОГДА по значению статуса.
Если мы добавим новый статус (например, Прекращен), типовой код в запросах просто пропустит блоки формирования данных для этого статуса. В результате, когда последующие механизмы проведения (например, расчет экономии материалов или распределение трудозатрат) попытаются обратиться к ожидаемой временной таблице, они ее не обнаружат, что и приведет к системной ошибке:
Ошибка при вызове метода контекста (Выполнить) по причине: {(146, 3)}: Таблица не найдена "ЭкономияМатериалов"
Это происходит потому, что логика формирования таблицы ЭкономияМатериалов в общем модуле ПроведениеСервер (или аналогичных) не обучена работать с вашим новым статусом. Чтобы исправить это «в лоб», пришлось бы переписывать десятки запросов в ядре системы, что крайне не рекомендуется.
Прежде чем приступать к кодингу, давайте выясним, на что еще влияет статус Этапа производства в ERP. Это критически важно для сохранения целостности данных:
Прекращен, но не опишете его в логике закрытия графиков, система будет продолжать резервировать материалы и занимать рабочие центры под этот этап.Завершен).Рассмотрим наиболее правильный с точки зрения архитектуры подход. Вместо изменения типового перечисления, мы добавим дополнительный признак (флаг) через расширение. Это позволит сохранить типовую логику проведения, но визуально и функционально решить задачу «прекращения» этапа.
Шаг 1. Добавление реквизита. Создадим через расширение реквизит Прекращен (Тип: Булево) для документа ЭтапПроизводства.
Шаг 2. Блокировка формы. Чтобы пользователь не мог редактировать поля после установки признака прекращения, воспользуемся событием ПриЧтенииНаСервере или ПриСозданииНаСервере в форме документа:
&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
Если ТекущийОбъект.Прекращен Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
// Разрешаем только снимать флаг прекращения, если есть права
ЭтаФорма.Элементы.ГруппаПрекращение.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Шаг 3. Обработка проведения. Если при прекращении этапа нужно отменить все движения (освободить резервы и ресурсы), логичнее всего переводить документ в один из начальных статусов (например, Формируется) и устанавливать флаг Прекращен. Типовая логика сама очистит движения по регистрам накопления, а ваш флаг будет служить индикатором для пользователей в списках.
Если бизнес-заказчик настаивает на том, чтобы в поле Статус пользователи видели слово «Прекращен», мы можем применить методику подмены, предложенную опытными разработчиками.
Проанализируем шаги реализации:
ДопСтатусыЭтапов, которое включает все типовые значения плюс Прекращен.Статус и добавляем поле, связанное с нашим новым перечислением.Прекращен, мы можем оставить реальный статус Сформирован (чтобы не ломать логику проведения), но через флаг блокировать документ.Пример программной связки в форме:
&НаКлиенте
Процедура ВиртуальныйСтатусПриИзменении(Элемент)
Если Объект.ВиртуальныйСтатус = ПредопределенноеЗначение("Перечисление.ДопСтатусыЭтапов.Прекращен") Тогда
// Устанавливаем типовой статус, который не требует заполнения всех данных
Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЭтаповПроизводства.Сформирован");
Объект.Прекращен = Истина;
Иначе
// Синхронизируем с типовым перечислением
Объект.Статус = ПолучитьТиповойСтатус(Объект.ВиртуальныйСтатус);
Объект.Прекращен = Ложь;
КонецЕсли;
КонецПроцедуры
Если вы опытный разработчик и осознаете все риски, вам придется внедрить поддержку нового статуса во все механизмы проведения. Рассмотрим, где именно нужно искать вхождения статусов через глобальный поиск по конфигурации:
ЭтапПроизводства2_2: Проверьте функции ТекстЗапросаЗаполненияТаблицПоДаннымДокумента. Именно здесь формируются те самые временные таблицы, которых не хватает системе.ДиспетчированиеЭтаповПроизводства: Здесь описываются условия перехода между состояниями и доступность команд.УправлениеПроизводством: Проверьте логику расчета обеспечения.Важно: При каждом обновлении конфигурации вам придется заново проверять все эти места, так как фирма «1С» часто оптимизирует запросы проведения в ERP.
Подведем итоги нашего исследования. В 1С:ERP статус документа — это не просто строчка текста, а переключатель глобальной логики проведения.
Мы выяснили, что:
Таблица не найдена — это лишь верхушка айсберга, за которой следуют проблемы с НЗП и графиком производства.Прекращен и управлять доступностью формы, не затрагивая ядро проведения.Помните совет опытных архитекторов: прежде чем менять системную логику статусов, попробуйте реализовать задачу через Форма.ТолькоПросмотр = Истина. Это сэкономит вам десятки часов на отладку и обеспечит корректную работу всех подсистем планирования 1С:ERP.