Как управлять регистрацией изменений документов для обмена в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе сопровождения распределенных информационных баз на платформе 1С:Предприятие 7.7 часто возникает задача тонкой настройки регистрации изменений. Штатный механизм Управления распределенными ИБ (УРБД) работает по принципу «регистрируем всё», что не всегда эффективно. Например, при массовом перепроведении документов за прошлые периоды база может сгенерировать огромный объем данных для обмена, который парализует каналы связи. Рассмотрим подробно, какими способами можно программно управлять процессом регистрации изменений, как отсекать лишние события и как работать с системными таблицами обмена.

Использование встроенного метода РегистрацияИзменений

Первым делом проанализируем возможности встроенного языка. Для объектов типа Документ и Справочник существует метод РегистрацияИзменений(). Этот метод позволяет включить или выключить автоматическую регистрацию для конкретного экземпляра объекта. Разберем синтаксис и ключевые особенности его применения.

Синтаксис метода: РегистрацияИзменений(Параметр)

Где Параметр может принимать значения:

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

Рассмотрим пример кода, который отключает регистрацию при программном изменении документов:


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

Как исключить документы при групповом перепроведении

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

Метод ГрупповаяОбработка() возвращает 1, если документ проводится стандартной обработкой «Проведение документов» из меню «Операции». Если же проведение инициировано пользователем вручную из формы, метод вернет 0.

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

Перем глМассоваяОбработка Экспорт;

В самой обработке перед началом цикла проведения установим её значение:


глМассоваяОбработка = 1;
// ... тут цикл проведения документов ...
глМассоваяОбработка = 0;

А в модуле документа, в предопределенной процедуре ПриЗаписи() или ОбработкаПроведения(), добавим проверку этого флага. Это позволит гибко управлять регистрацией в зависимости от контекста выполнения задачи.

Прямое управление системной таблицей 1CUPDTS

Если штатных методов недостаточно или требуется «подчистить» уже зарегистрированные изменения, нам придется обратиться к структуре базы данных. В 1С 7.7 за регистрацию изменений отвечает системная таблица 1CUPDTS (в SQL-версии она называется так же, в DBF-версии — 1CUPDTS.DBF).

Проанализируем структуру этой таблицы:

  1. TYPEID — идентификатор типа объекта (документ, справочник и т.д.).
  2. OBJID — внутренний идентификатор конкретного объекта.
  3. DWNLDID — идентификатор информационной базы, для которой предназначено это изменение.

Рассмотрим ситуацию: документ уже проведен и зарегистрирован, но мы хотим отменить его отправку. В этом случае мы можем программно удалить соответствующие записи из таблицы 1CUPDTS. Если вы работаете с SQL-версией, это можно сделать прямым запросом. Если с DBF — через объект XBase.

Посмотрим на логику «обновления» регистрации. Если в поле DWNLDID уже стоит ID периферийной базы, это означает, что объект был выгружен. Чтобы заставить систему отправить его снова, нужно очистить это поле или удалить запись, чтобы при следующем изменении система создала новую «чистую» запись регистрации.

Метод служебного справочника для кастомных обменов

В случаях, когда стандартный механизм УРБД не используется, а обмен реализован через XML или иные форматы, наиболее стабильным решением будет создание собственной очереди обмена. Разберем этот подход по шагам:

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

Проанализируем пример кода для регистрации события в справочнике:


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

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

Важные замечания по безопасности

При работе с регистрацией изменений следует соблюдать осторожность. Помните следующие правила:

Мы проанализировали основные инструменты управления регистрацией изменений в 1С 7.7. Использование метода РегистрацияИзменений() в сочетании с проверкой контекста (флаги массовой обработки) является наиболее безопасным и рекомендуемым способом решения задачи.

← На главную