Как отключить проверку заполнения аналитики расходов в 1С:ERP для документов на основании

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки или адаптации 1С:ERP под нужды бизнеса часто возникает задача изменить стандартное поведение системы при проверке заполнения реквизитов. Типичный пример: при проведении документа Заказ поставщику система требует обязательного заполнения аналитики расходов в табличной части Товары. Однако, если документ создан на основании специфического внутреннего заказа (например, «Заказ в снабжение»), бизнес-логика может допускать отсутствие этой аналитики на данном этапе.

В этой статье мы подробно разберем, почему стандартные методы платформы 1С могут не срабатывать в конфигурациях на базе ERP и КА 2, и как правильно реализовать программное отключение проверки с учетом прикладной логики системы.

Механизм проверки заполнения: Платформа против Приложения

Для начала проанализируем, как работает проверка заполнения в 1С. Существует два уровня этого процесса, которые работают параллельно:

  1. Платформенная проверка: Она инициируется свойством реквизита «Проверка заполнения» (значение «Выдавать ошибку»). Управлять этим списком можно в процедуре ОбработкаПроверкиЗаполнения модуля объекта, манипулируя массивом ПроверяемыеРеквизиты.
  2. Программная (прикладная) проверка: Это код, написанный разработчиками конфигурации (в данном случае 1С:ERP), который вызывается в той же процедуре ОбработкаПроверкиЗаполнения. Он может выполнять сложные проверки, обращаться к регистрам или общим модулям, и генерировать ошибки независимо от состава массива ПроверяемыеРеквизиты.

В 1С:ERP для проверки аналитик расходов используется специализированный метод ПланыВидовХарактеристик.СтатьиРасходов.ПроверитьЗаполнениеАналитик. Если вы просто удалите реквизит из массива платформенной проверки, этот метод все равно обнаружит пустое значение и заблокирует запись или проведение документа.

Разбор типичной ошибки реализации

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


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Попытка отключить проверку для конкретного основания
    Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.СТ_ЗаказВСнабжение") Тогда
        // Удаляем реквизит из списка проверки платформы
        ПорядковыйНомер = ПроверяемыеРеквизиты.Найти("Товары.АналитикаРасходов");
        Если ПорядковыйНомер <> Неопределено Тогда
            ПроверяемыеРеквизиты.Удалить(ПорядковыйНомер);
        КонецЕсли;
    КонецЕсли;

    // Вызов стандартной проверки ERP, которая игнорирует изменения выше
    ПланыВидовХарактеристик.СтатьиРасходов.ПроверитьЗаполнениеАналитик(ЭтотОбъект, Новый Структура("Товары"), , Отказ);
    
КонецПроцедуры

В данном примере, несмотря на удаление из массива ПроверяемыеРеквизиты, вызов ПроверитьЗаполнениеАналитик все равно «увидит» пустую аналитику и установит параметр Отказ в значение Истина. Это происходит потому, что внутри статьи расходов указан «Тип аналитики расходов», и логика ERP жестко требует соответствия этого типа, если выбрана соответствующая статья.

Правильное решение: Условный пропуск прикладной проверки

Чтобы корректно решить задачу, нам необходимо объединить управление массивом ПроверяемыеРеквизиты и управление вызовом прикладных методов проверки. Разберем правильный алгоритм действий по шагам.

Шаг 1. Определение условия. Выясним, при каких обстоятельствах проверка не должна срабатывать. В нашем случае — это наличие определенного типа документа-основания.

Шаг 2. Модификация массива ПроверяемыеРеквизиты. Это исключит стандартные сообщения платформы.

Шаг 3. Изоляция прикладного метода. Вызов ПроверитьЗаполнениеАналитик должен происходить только тогда, когда условие исключения НЕ выполняется.

Проанализируем итоговый программный код:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // 1. Формируем массив реквизитов, которые мы хотим исключить
    МассивНепроверяемыхРеквизитов = Новый Массив;
    
    // 2. Проверяем условие (наш документ-основание)
    Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.СТ_ЗаказВСнабжение") Тогда
        
        // Добавляем в список исключений для платформы
        МассивНепроверяемыхРеквизитов.Добавить("Товары.АналитикаРасходов");
        
        // Удаляем из общего массива ПроверяемыеРеквизиты
        ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
        
        // ВАЖНО: Мы НЕ вызываем ПроверитьЗаполнениеАналитик здесь
        
    Иначе
        
        // 3. Если условие не выполнено, вызываем штатную проверку ERP
        // Обратите внимание: мы передаем массив исключений (он может быть пустым)
        ПланыВидовХарактеристик.СтатьиРасходов.ПроверитьЗаполнениеАналитик(
            ЭтотОбъект, 
            Новый Структура("Товары"), 
            МассивНепроверяемыхРеквизитов, 
            Отказ
        );
        
    КонецЕсли;

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

В этом коде мы четко разделяем логику. Если документ основан на «Заказе в снабжение», система выполняет только те проверки, которые остались в массиве ПроверяемыеРеквизиты, полностью игнорируя сложную логику проверки аналитик расходов. Во всех остальных случаях (ветка Иначе) отрабатывает стандартный механизм ERP.

Дополнительные аспекты при работе в ERP

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

Использование расширений: Поскольку 1С:ERP — это сложная и часто обновляемая конфигурация, вносить изменения напрямую в модуль объекта крайне не рекомендуется. Используйте расширение конфигурации. Создайте в расширении процедуру-обработчик &Перед или &Вместо для ОбработкаПроверкиЗаполнения. При использовании &Вместо обязательно копируйте важную логику типового кода, чтобы не нарушить работу других механизмов (например, проверку серий или складов).

Проверка при проведении: Процедура ОбработкаПроверкиЗаполнения срабатывает при записи (если нажата кнопка «Провести и закрыть») или при явном вызове метода ПроверитьЗаполнение(). Однако, если реквизит АналитикаРасходов является ключевым для формирования движений по регистрам (например, по регистру «Прочие расходы»), документ может выдать ошибку уже в процессе проведения, в процедуре ОбработкаПроведения. Если бизнес-логика требует отсутствия аналитики, убедитесь, что алгоритмы формирования движений (проведения) корректно обрабатывают пустые значения данного реквизита.

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

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

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

← На главную