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