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

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

При переносе данных между базами 1С или организации периодического обмена часто возникает задача передать не все данные целиком, а только информацию за определенный промежуток времени — например, за текущий квартал или с конкретной даты. Если просто выгрузить базу или включить стандартную авторегистрацию, в пакет могут попасть исторические документы прошлых периодов, что нередко приводит к изменению движений и нарушению оборотно-сальдовой ведомости (ОСВ) в базе-приемнике.

Разберем основные практические способы, позволяющие отфильтровать и зарегистрировать к обмену объекты конфигурации за нужный период.

Способ 1. Использование произвольного запроса в обработке регистрации изменений

В типовой обработке Регистрация изменений для обмена на обычных формах (доступной в конфигурациях линейки БП 2.0, УПП 1.3, КА 1.1) заложена возможность выборочной регистрации с помощью языка запросов. Рассмотрим по шагам, как задействовать эту функцию:

  1. Открываем обработку РегистрацияИзмененийДляОбмена и выбираем нужный узел плана обмена.
  2. В дереве метаданных находим требуемый объект (например, нужный документ).
  3. Нажимаем на объект правой кнопкой мыши и выбираем пункт Добавить регистрацию.
  4. В появившемся диалоговом окне с вопросом «Добавить регистрацию для всех?» нажимаем Нет.
  5. В открывшемся окне конструктора условий вводим произвольный текст запроса с ограничением по дате и нажимаем выполнить.

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


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Дата >= &ДатаНачала
    И РеализацияТоваровУслуг.Проведен = ИСТИНА

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

Способ 2. Программная регистрация изменений через встроенный язык

Если требуется автоматизировать процесс или зарегистрировать большой перечень различных типов документов по единой дате, напишем собственную обработку. Для регистрации объектов в планах обмена используется метод ПланыОбмена.ЗарегистрироватьИзменения().

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Док.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.ПоступлениеТоваровУслуг КАК Док
    |ГДЕ
    |   Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата("20170401")));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));

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

Пока Выборка.Следующий() Цикл
    ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
КонецЦикла;

Этот подход удобен тем, что мы можем программно обойти коллекцию Метаданные.Документы и применить фильтр ко всем видам документов в цикле.

Способ 3. Очистка регистрации прошлых периодов через таблицы изменений

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

Посмотрим на программный код очистки устаревших изменений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Изм.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Изменения КАК Изм
    |ГДЕ
    |   Изм.Узел = &Узел
    |   И Изм.Ссылка.Дата < &ДатаГраницы";

Запрос.УстановитьПараметр("Узел", УзелОбмена);
Запрос.УстановитьПараметр("ДатаГраницы", Дата("20170401"));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Выборка.Ссылка);
КонецЦикла;

Способ 4. Настройка подписок на события и правил регистрации

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

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

Особенности регистрации регистров и ссылочной целостности

Выясним причину, почему при переносе документов по периоду в базе-приемнике все равно могут измениться данные прошлых периодов:

  1. Подчиненные регистры: Регистры бухгалтерии и накопления привязаны к документу-регистратору. Если документ старого периода не был зарегистрирован и не передавался, его движения также не перезапишутся. Однако если новый документ ссылается на документ прошлого периода (например, документ расчетов или корректируемый документ), типовая выгрузка может выгрузить старый документ по ссылке.
  2. Защита базы-приемника: Чтобы исключить случайное перепроведение и перезапись движений документов прошлых периодов, в базе-приемнике обязательно устанавливается Дата запрета изменения данных.
  3. Независимые регистры сведений: Записи независимых регистров регистрируются не по отдельным датам, а по наборам ключевых измерений. Для таких регистров фильтрацию по периоду необходимо настраивать индивидуально в правилах обмена или переносить их специализированными обработками.
← На главную