Как реализовать групповую обработку реквизитов документов в 1С 8.3?

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

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

Вариант 1. Использование типовых обработок 1С

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

  1. Обработка «Групповое изменение реквизитов» — встроенный инструмент большинства типовых конфигураций (например, 1С:Бухгалтерия 8). Он позволяет выполнять отбор по видам документов и массово менять нужные поля.
  2. Использование произвольных алгоритмов — в типовых обработках группового изменения есть возможность включения режима выполнения произвольного кода на языке 1С. Это позволяет реализовать сложную зависимую логику (например, автозаполнение даты сдачи при установке флага) без создания внешней обработки.
  3. Обработка «Универсальный подбор и обработка объектов» — решение для конфигураций на обычных и управляемых формах, доступное на ресурсах ИТС. Инструмент поддерживает гибкую настройку отборов через компоновку данных и выполнение произвольных алгоритмов над выбранными объектами.

Вариант 2. Программная разработка собственной обработки

Если требуется создать специализированный интерфейс с фиксированным набором отборов и специфической бизнес-логикой, разберем программный алгоритм группового изменения документов.

Для реализации задачи нам понадобятся следующие ключевые методы и свойства платформы 1С:

  1. ПолучитьОбъект() — получает ссылочный объект для возможности его редактирования и записи.
  2. ЗаполнитьЗначенияСвойств() — копирует значения реквизитов из одного объекта/структуры в другой. Третий параметр метода позволяет «прицельно» указать список копируемых реквизитов.
  3. ОбменДанными.Загрузка = Истина — отключает проведение стандартных проверок заполненности и обработчиков событий объекта. Это критически важно при массовом изменении служебных реквизитов в закрытых периодах.
  4. РежимЗаписиДокумента.Запись — позволяет сохранить изменения в документе без его повторного проведения и перерасчета проводок.

Рассмотрим пример кода по обработке выборки документов и изменению их статусов:


Выборка = ЗапросРезультат.Выбрать();

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

КонецЦикла;

Рекомендации по оптимизации и безопасности

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

  1. Учет часовых поясов: Для установки актуального времени рекомендуем использовать функцию ТекущаяДатаСеанса() вместо ТекущаяДата(), чтобы избежать расхождений при работе в клиент-серверном режиме.
  2. Порционная обработка и транзакции: Чтобы предотвратить блокировку таблиц базы данных при изменении большого массива документов, разбивайте выборку на порции (по 50–100 документов) и оборачивайте каждую порцию в блоки НачатьТранзакцию() / ЗафиксироватьТранзакцию().
  3. Обработка ошибок: Всегда оборачивайте вызов метода Записать() в блок Попытка ... Исключение. Это позволит продолжить выполнение обработки, если отдельный документ заблокирован другим пользователем или недоступен для изменения из-за ограничений прав доступа (RLS).
← На главную