При переносе данных между базами 1С или организации периодического обмена часто возникает задача передать не все данные целиком, а только информацию за определенный промежуток времени — например, за текущий квартал или с конкретной даты. Если просто выгрузить базу или включить стандартную авторегистрацию, в пакет могут попасть исторические документы прошлых периодов, что нередко приводит к изменению движений и нарушению оборотно-сальдовой ведомости (ОСВ) в базе-приемнике.
Разберем основные практические способы, позволяющие отфильтровать и зарегистрировать к обмену объекты конфигурации за нужный период.
В типовой обработке Регистрация изменений для обмена на обычных формах (доступной в конфигурациях линейки БП 2.0, УПП 1.3, КА 1.1) заложена возможность выборочной регистрации с помощью языка запросов. Рассмотрим по шагам, как задействовать эту функцию:
РегистрацияИзмененийДляОбмена и выбираем нужный узел плана обмена.Посмотрим на пример текста запроса, который можно использовать для выборки документов с определенной даты:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата >= &ДатаНачала
И РеализацияТоваровУслуг.Проведен = ИСТИНА
После выполнения запроса платформа добавит к узлу обмена только те ссылки, которые попали в результат выборки, полностью пропуская документы закрытых периодов.
Если требуется автоматизировать процесс или зарегистрировать большой перечень различных типов документов по единой дате, напишем собственную обработку. Для регистрации объектов в планах обмена используется метод ПланыОбмена.ЗарегистрироватьИзменения().
Разберем пример программного кода, выполняющего выборку и регистрацию документов за период:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Док
|ГДЕ
| Док.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата("20170401")));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
КонецЦикла;
Этот подход удобен тем, что мы можем программно обойти коллекцию Метаданные.Документы и применить фильтр ко всем видам документов в цикле.
Проанализируем ситуацию, когда стандартный механизм уже зарегистрировал множество документов за старые периоды. Чтобы не передавать их в обмен, снимем их с регистрации с помощью обращения к виртуальным таблицам изменений платформы 1С.
Посмотрим на программный код очистки устаревших изменений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Изм.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Изменения КАК Изм
|ГДЕ
| Изм.Узел = &Узел
| И Изм.Ссылка.Дата < &ДатаГраницы";
Запрос.УстановитьПараметр("Узел", УзелОбмена);
Запрос.УстановитьПараметр("ДатаГраницы", Дата("20170401"));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Выборка.Ссылка);
КонецЦикла;
Если обмен должен работать на постоянной основе, ручная регистрация становится неудобной. В таких случаях применяются следующие решения:
Состав для нужных документов переводим свойство Авторегистрация в положение Запретить.ПриЗаписи для документов. В процедуре-обработчике проверяем дату документа: если дата больше заданной границы, вызываем ПланыОбмена.ЗарегистрироватьИзменения(Узел, Источник).Выясним причину, почему при переносе документов по периоду в базе-приемнике все равно могут измениться данные прошлых периодов: