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