В процессе сопровождения информационных систем на базе 1С программисты и администраторы часто сталкиваются с ситуацией, когда данные из одной базы (например, «1С:Розница») должны мигрировать в другую (например, «1С:Комплексная автоматизация» или «1С:Бухгалтерия»). Одной из самых острых проблем здесь является взаимодействие обмена с механизмом даты запрета изменения данных. Рассмотрим подробно, почему возникают конфликты, как они решались в старых системах и какие современные инструменты предлагает Библиотека стандартных подсистем (БСП).
Типичный сценарий: в базе-источнике администратор или пользователь с расширенными правами изменяет документ прошлым числом (период в этой базе открыт или есть привилегия). При синхронизации этот документ попадает в базу-приемник. Если в базе-приемнике этот период уже закрыт датой запрета, возникают следующие сложности:
В актуальных конфигурациях (ERP 2.5, КА 2.5, УТ 11, БП 3.0), построенных на БСП, логика работы с закрытыми периодами кардинально пересмотрена. Проанализируем основные инструменты.
Проанализируем программный аспект. В 1С существует специальный параметр ОбменДанными.Загрузка = Истина. При установке этого свойства в коде перед записью объекта большинство подписок на события и встроенных проверок (включая дату запрета в некоторых случаях) игнорируются. Однако для полноценного проведения документа этого недостаточно, так как проведение — это всегда активное действие, которое должно подчиняться правилам учета.
Современные системы используют двухэтапную загрузку:
Посмотрим на настройки в пользовательском интерфейсе. В настройках синхронизации данных для конкретного узла обмена часто присутствует флаг «Разрешить загрузку данных в закрытый период». Рассмотрим, как он работает:
Выясним, как администратор может отслеживать такие ситуации. В современных конфигурациях реализован механизм отложенных чеков и регистрации коллизий. Если объект не прошел проверку даты запрета, он попадает в список «Непринятые по дате запрета объекты». Администратор может:
Если вы работаете в старой конфигурации (КА 1.1 или УПП), вам может потребоваться доработка правил обмена. Проанализируем пример кода, который можно вставить в обработчик ПриЗагрузке или ПередЗаписью в правилах обмена (XML):
// Пример проверки даты запрета в правилах обмена (обработчик ПередЗаписью)
ДатаЗапрета = ДатыЗапретаИзменения.ПолучитьДатуЗапрета();
Если Объект.Дата <= ДатаЗапрета Тогда
// Если период закрыт, мы можем либо отменить загрузку,
// либо записать объект без проведения.
Объект.ОбменДанными.ОтправитьНазад = Истина; // Пометка для системы
Сообщить("Документ " + Объект + " находится в закрытом периоде!");
// Важно: устанавливаем режим загрузки, чтобы не вызвать исключение
Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Использование Объект.ОбменДанными.Загрузка = Истина — это критически важный момент. Это позволяет системе управления данными понять, что объект пришел извне, и не нужно запускать стандартные обработчики проверки прав текущего пользователя, под которым запущен фоновый процесс обмена.
Переход на формат обмена EnterpriseData (через XDTO) также помогает решить проблему. В отличие от старых обменов «по правилам», здесь логика обработки данных более гибкая. Мы можем настроить систему так, чтобы при получении объекта из закрытого периода создавалась Задача ответственному бухгалтеру, который должен проверить корректность изменений, прежде чем документ будет проведен.
Для минимизации проблем с датой запрета рекомендуем следовать следующим правилам:
ПолныеПрава или специализированную роль ДобавлениеИзменениеНастроекСинхронизацииДанных, которая в современных конфигурациях позволяет игнорировать дату запрета.Проблема «распроведенных документов» в старых версиях 1С решалась в основном «костылями» в правилах обмена. В современных же системах на базе БСП взаимодействие обменов и даты запрета — это штатный механизм управления коллизиями. Главное — правильно настроить Монитор синхронизации и регулярно проверять список непринятых объектов, чтобы избежать расхождений в учете между базами.