Как создать обработку для отмены проведения всех документов в 1С?

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

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

Анализ задачи и выбор инструментов

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

  1. Использование стандартной обработки «Групповое изменение реквизитов».
  2. Интерактивная отмена через форму списка.
  3. Разработка собственной обработки на встроенном языке 1С.

Способ 1: Стандартные средства системы (БСП)

Если вы работаете в современной конфигурации (например, Бухгалтерия предприятия 3.0, ERP или УТ 11), разберем самый безопасный путь, не требующий программирования. В составе Библиотеки стандартных подсистем (БСП) есть мощный инструмент.

Рассмотрим пошагово, как им воспользоваться:

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных.
  2. Выберем пункт Групповое изменение реквизитов.
  3. В поле «Выбирать элементы» укажем те типы документов, проведение которых нужно отменить. Можно выбрать как один тип, так и все сразу.
  4. Нажмем на гиперссылку «Дополнительные параметры». Здесь крайне важно установить флажок в режиме записи на значение Отмена проведения.
  5. После настройки фильтров (например, по дате или организации), нажмем кнопку «Изменить реквизиты».

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

Способ 2: Интерактивная отмена из списка

Проанализируем ситуацию, когда нам нужно обработать документы только одного вида за короткий промежуток времени. В этом случае создавать отдельный код нецелесообразно. Рассмотрим простой алгоритм:

  1. Откроем журнал или список нужных документов.
  2. Настроим список, установив отбор по периоду или другим критериям.
  3. Выделим все документы в списке, нажав комбинацию клавиш Ctrl + A.
  4. Нажмем правую кнопку мыши и выберем команду Отменить проведение.

Этот способ хорош своей наглядностью, однако он может быть медленным при работе с очень большими объемами данных (десятки тысяч строк).

Способ 3: Создание программной обработки

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

Для начала создадим новую внешнюю обработку через меню Файл — Новый. В модуле обработки создадим процедуру, которая будет перебирать все виды документов.

Посмотрим на пример универсального кода:


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

Разбор ключевых технических моментов

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

  1. Режим «Загрузка = Истина»: Мы используем свойство ОбменДанными.Загрузка. Это критически важно при массовых операциях. Данный флаг сообщает системе, что документ записывается «как есть», отключая сложные проверки в модуле объекта. Это предотвращает остановку процесса, если в старых документах не заполнены новые обязательные реквизиты.
  2. Конструкция «Попытка...Исключение»: Мы оборачиваем метод Записать в блок обработки ошибок. Если какой-то конкретный документ заблокирован другим пользователем или вызывает критический сбой, наша обработка не прервется, а просто пропустит его и перейдет к следующему.
  3. Использование метаданных: Коллекция Метаданные.Документы позволяет нам не перечислять РеализацияТоваровУслуг, ПоступлениеТоваровУслуг и прочие типы вручную. Код сам определит, какие документы существуют в конфигурации.

Оптимизация при больших объемах данных

Если в вашей базе миллионы документов, выполнение кода в одной транзакции может привести к переполнению лога транзакций SQL-сервера. Разберем, как оптимизировать этот процесс. Вместо одного глобального цикла, рекомендуется фиксировать транзакции порциями.

Рассмотрим пример логики с фиксацией порций:


// Пример порционной обработки (фрагмент)
Счетчик = 0;
Пока Выборка.Следующий() Цикл
    // ... логика получения объекта ...
    ОбъектДокумента.Записать(РежимЗаписиДокумента.ОтменаПроведения);
    Счетчик = Счетчик + 1;
    
    // Каждые 1000 документов принудительно фиксируем изменения
    Если Счетчик % 1000 = 0 Тогда
        // В некоторых случаях здесь можно делать паузу или фиксировать транзакцию
    КонецЕсли;
КонецЦикла;

Меры предосторожности

Прежде чем запускать любые массовые обработки по отмене проведения, необходимо выполнить следующие действия:

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

← На главную