При настройке синхронизации данных между конфигурациями 1С (например, между Управление торговлей 10.3 и Бухгалтерия предприятия 3.0) пользователи часто указывают начальную дату выгрузки «с запасом» или, наоборот, усекают ее. В процессе работы нередко выясняется, что требуется выгрузить документы за более ранний период (например, захватить февраль при установленной дате с 1 марта) или, напротив, сдвинуть дату вперед, чтобы защитить закрытые периоды от случайных изменений.
В этой статье мы подробно разберем, как устроены механизмы регистрации изменений в 1С, почему простое изменение даты в настройках обмена не всегда дает желаемый результат и как правильно решать подобные задачи без риска продублировать данные или нарушить учет.
Для начала проанализируем внутреннее устройство механизмов интеграции 1С. Платформа отслеживает изменения объектов с помощью специального механизма — планов обмена. К каждому плану обмена привязана таблица регистрации изменений. Как только пользователь создает, изменяет или проводит документ, платформа проверяет его на соответствие установленным правилам (включая дату начала обмена) и делает запись в таблицу регистрации: «Объект X изменен и готов к отправке в узел Y».
Если мы просто зайдем в настройки обмена (или непосредственно в узел плана обмена) и поменяем дату начала выгрузки на более раннюю, автоматического сканирования всей базы данных не произойдет. Система не знает, какие именно документы за прошлые периоды нужно отправить, поскольку события их изменения уже давно прошли, и в таблице регистрации записей о них нет. Именно поэтому после изменения даты «задним числом» документы за этот период автоматически не выгружаются.
Рассмотрим ситуацию, когда синхронизация уже работает, но клиенту срочно потребовалось выгрузить документы за прошлый месяц, который изначально не входил в рамки обмена.
Чтобы решить эту задачу, нам необходимо принудительно (вручную) сказать системе, что документы за определенный период требуют отправки. Разберем два основных способа решения этой задачи.
В конфигурациях на обычных формах (таких как Управление торговлей 10.3) этот инструмент доступен через главное меню: Операции -> Обработка -> Регистрация изменений для обмена. В управляемых формах (например, в Управлении торговлей 11 или Бухгалтерии предприятия 3.0) эту обработку можно открыть из настроек синхронизации данных, нажав кнопку с пиктограммой монитора («Состав отправляемых данных»).
Выполним регистрацию по шагам:
Реализация товаров и услуг или Поступление товаров и услуг).Ссылка.Дата. Зададим интервал (например, с 01.02.2019 по 28.02.2019).Если документов слишком много или требуется автоматизировать процесс для разных типов объектов, мы можем написать небольшую внешнюю обработку или выполнить код в консоли кода. Посмотрим на практический пример программной регистрации документов за произвольный период:
// Определим границы необходимого периода
НачалоПериода = '20190201000000'; // 01.02.2019
КонецПериода = '20190228235959'; // 28.02.2019
// Находим узел плана обмена по коду (замените "БП" на код вашего узла)
УзелОбмена = ПланыОбмена.ОбменУправлениеТорговлейБухгалтерияПредприятия.НайтиПоКоду("БП");
Если ЗначениеЗаполнено(УзелОбмена) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И НЕ Реализация.ПометкаУдаления";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Начинаем транзакцию для ускорения процесса регистрации
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Выборка.Ссылка);
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Успешно зарегистрировано документов: " + РезультатЗапроса.Выгрузить().Количество());
Исключение
ОтменитьТранзакцию();
Сообщить("Произошла ошибка при регистрации: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Один из самых частых страхов пользователей — дублирование документов в базе-приемнике при повторной выгрузке или расширении периода. Задвоения данных не произойдет.
Платформа 1С сопоставляет объекты не по их реквизитам (номеру или дате), а по внутреннему уникальному идентификатору — GUID (UUID). Если документ уже когда-то переносился в базу-приемник, то при повторном обмене система найдет его по этому идентификатору и просто обновит его поля (перезапишет объект), а не создаст новую карточку.
Теперь проанализируем обратную ситуацию: обмен был настроен с 01.01.2024, но бухгалтерия закрыла первый квартал. Нам нужно сделать так, чтобы документы до 01.04.2024 гарантированно больше не изменялись в базе-приемнике (например, в Бухгалтерии предприятия), даже если менеджер в Управлении торговлей случайно перепроведет или отредактирует старую накладную.
Попытка просто сдвинуть дату начала обмена в настройках источника на 01.04.2024 сопряжена с несколькими техническими сложностями:
Контрагенты или Договоры контрагентов), программа выдаст предупреждение: «Настройка обмена данными не может быть изменена. Существуют зарегистрированные изменения...». Вам придется сначала полностью очистить таблицу регистрации или завершить все обмены «в ноль».Вместо изменения даты начала обмена на стороне источника (УТ) гораздо надежнее и проще использовать штатный механизм Даты запрета загрузки данных на стороне приемника (БП).
Выполним настройку по шагам на стороне 1С:Бухгалтерии предприятия:
УТ. Установим значение даты, равное дате закрытия периода (например, 31.03.2024).В результате, даже если в базе-источнике менеджеры изменят январский документ, и он принудительно зарегистрируется к обмену и отправится в пакет данных, принимающая база БП 3.0 при импорте проверит дату документа, обнаружит, что она попадает в закрытый период (ранее 31.03.2024), и просто проигнорирует эти изменения, выдав предупреждение в журнале регистрации. Ваши данные в закрытом периоде останутся в полной безопасности.
Выяснив особенности работы планов обмена, подведем итоги: