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