Как запретить проведение документа в 1С 8.1 при незаполненных реквизитах, сохранив возможность записи

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

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

Способ 1. Использование процедуры ОбработкаПроведения

Это самый распространенный и простой в реализации метод. Основная идея заключается в том, что платформа 1С сначала записывает объект, а затем инициирует транзакцию проведения. Если внутри обработчика проведения мы установим флаг Отказ = Истина, система отменит транзакцию записи движений по регистрам, но сам документ останется в базе в статусе «Записан».

Рассмотрим пример кода, который проверяет заполнение колонки Размер во всех строках табличной части Товары:


Процедура ОбработкаПроведения(Отказ, Режим)
    Для Каждого ТекСтрока Из Товары Цикл
        Если ТекСтрока.Размер = 0 Или ПустаяСтрока(ТекСтрока.Размер) Тогда
            Сообщить("В строке № " + ТекСтрока.НомерСтроки + " не заполнен размер! Проведение невозможно.");
            Отказ = Истина;
            // Можно использовать Прервать, чтобы не выводить ошибки по каждой строке
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Преимущества этого метода: он гарантирует, что документ никогда не будет проведен с некорректными данными, независимо от того, откуда вызывается проведение (из формы или программно).

Способ 2. Проверка по дополнительным условиям

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

Проанализируем следующий фрагмент кода:


Процедура ОбработкаПроведения(Отказ, Режим)
    Для Каждого ТекСтрока Из Товары Цикл
        // Добавляем условие: проверять размер, только если сумма > 42
        Если ТекСтрока.Сумма > 42 И (ТекСтрока.Размер = 0 Или ПустаяСтрока(ТекСтрока.Размер)) Тогда
            Сообщить("Для товара '" + ТекСтрока.Номенклатура + "' необходимо указать размер!");
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
    Если Отказ Тогда
        Возврат; // Прекращаем выполнение, если найдены ошибки
    КонецЕсли;
КонецПроцедуры

Способ 3. Перехват события ПередЗаписью в модуле документа

Более «продвинутый» способ — использование обработчика ПередЗаписью. Этот метод позволяет изменить логику поведения системы еще до начала транзакции проведения. Мы можем проверить, пытается ли пользователь провести документ, и если данные не заполнены, принудительно сменить режим записи с «Проведение» на обычную «Запись».

Рассмотрим, как это реализовать программно:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        Для Каждого ТекСтрока Из Товары Цикл
            Если ТекСтрока.Размер = 0 Тогда
                Сообщить("Обнаружены ошибки в табличной части. Документ будет просто записан.");
                // Меняем режим на простую запись
                РежимЗаписи = РежимЗаписиДокумента.Запись;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

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

Оптимизация проверки больших табличных частей

Если в документе сотни или тысячи строк, перебор коллекции Для Каждого может замедлять работу. Выясним, как ускорить этот процесс в 1С 8.1. Вместо цикла можно использовать метод НайтиСтроки().

Посмотрим на пример поиска через структуру:


Отбор = Новый Структура;
Отбор.Вставить("Размер", 0); // Предполагаем, что 0 - это незаполненное числовое значение
НайденныеСтроки = Товары.НайтиСтроки(Отбор);

Если НайденныеСтроки.Количество() > 0 Тогда
    Отказ = Истина;
    Сообщить("Не во всех строках заполнен размер!");
КонецЕсли;

Этот метод работает значительно быстрее на больших объемах данных, так как выполняется внутренними механизмами платформы.

Визуальное выделение ошибок для пользователя

Чтобы пользователю было проще ориентироваться, рекомендуется не только выводить текстовые сообщения через Сообщить(), но и использовать визуальные подсказки. В обычных формах 1С 8.1 мы можем использовать событие ПриВыводеСтроки для табличного поля на форме.

Проанализируем пример визуального оформления:


Процедура ТабличнаяЧастьТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.Размер = 0 Тогда
        // Окрашиваем фон ячейки "Размер" в красный цвет, если она не заполнена
        ОформлениеСтроки.Ячейки.Размер.ЦветФона = Новый Цвет(255, 0, 0);
    КонецЕсли;
КонецПроцедуры

Такой подход позволяет пользователю увидеть проблему еще до нажатия кнопок «Записать» или «ОК», что существенно повышает эргономику системы.

Подведем итоги

Мы рассмотрели несколько подходов к решению задачи в 1С 8.1:

  1. Проверка в «ОбработкаПроведения» — самый надежный способ контроля данных перед совершением движений по регистрам.
  2. Подмена режима записи в «ПередЗаписью» — мягкий способ сохранить данные, отменив только сам факт проведения.
  3. Метод «НайтиСтроки» — эффективный инструмент для быстрой проверки заполнения больших табличных частей.
  4. Визуальное оформление — способ предотвратить ошибки ввода данных на этапе редактирования формы.

Выбор конкретного метода зависит от требований бизнеса: нужно ли жестко блокировать проведение с уведомлением об ошибке или достаточно просто сохранять документ как «черновик» до момента исправления данных пользователем.

← На главную