Как обойти ограничение директивы &Вместо в расширении и исправить ошибку даты запрета при пересчете взаиморасчетов?

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

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

Ограничения механизма расширений в режиме совместимости 8.3.8

Проанализируем работу платформы 1С:Предприятие версии 8.3.8. В данном режиме совместимости механизм расширений имел жесткие рамки:

  1. Поддерживался перехват только интерактивных событий (команд и событий форм).
  2. Директивы аннотаций &Вместо, &Перед и &После для процедур и функций серверных общих модулей не поддерживаются — данный функционал полноценно появился только в платформе 8.3.9.
  3. Попытка использовать &Вместо для метода общего модуля в режиме совместимости 8.3.8 приведет к синтаксической ошибке при проверке или применении расширения.

Таким образом, полностью заглушить вызов процедуры общего модуля (например, вставить Возврат; в начало метода ПроверитьДатуЗапрета()) исключительно средствами расширения в режиме совместимости 8.3.8 технически невозможно.

Почему возникает ошибка «Вы печатаете С/Ф по устаревшим данным»

Выясним механику возникновения ошибки в типовых конфигурациях (в частности, в «1С:Управление торговлей 11.3»). Предупреждение о печати счета-фактуры по устаревшим данным неразрывно связано с механизмом отложенного проведения и онлайн-взаиморасчетов:

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

Вариант 1. Корректировка настроек дат запрета (без изменения кода)

Самый безопасный и методически верный подход, не требующий изменения конфигурации и снятия совместимости, — правильная настройка подсистемы «Даты запрета изменения»:

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

Вариант 2. Перехват контекста на уровне формы (если логика завязана на интерактивные действия)

Если требуется отменить выполнение стандартного действия при работе пользователя в форме, в режиме совместимости 8.3.8 доступно управление обработчиками событий формы через специальный метод УстановитьВыполнениеОбработчиковСобытия.

Посмотрим на пример переопределения логики события формы в модуле расширения:


&Вместо("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Отменяем выполнение типового обработчика формы
    УстановитьВыполнениеОбработчиковСобытия(ЭтотОбъект, "ПриСозданииНаСервере", Ложь);
    
    // Выполняем собственную адаптированную логику
    Расш_ИнициализацияФормыСервер();
КонецПроцедуры

Однако данный метод применим только к событиям форм и элементов управления, но не позволяет перехватить фоновые серверные процедуры общих модулей.

Вариант 3. Включение возможности изменения конфигурации

Если настройка дат запрета не решает задачу и требуется гарантированно исключить проверку в фоновом задании до обновления на старшие релизы (УТ 11.4 / 11.5), оптимальным решением является точечная доработка основной конфигурации:

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

Процедура ПроверитьДатуЗапрета(ПараметрыРасчета) Экспорт
    
    // Пропускаем проверку даты запрета при автоматическом фоновом пересчете
    Если ПараметрыРасчета.Свойство("ФоновыйПересчет") И ПараметрыРасчета.ФоновыйПересчет Тогда
        Возврат;
    КонецЕсли;
    
    // Типовой код проверки даты запрета
    // ...
КонецПроцедуры

Вариант 4. Обновление конфигурации

Принудительное изменение режима совместимости конфигурации в свойствах корня (например, выставление 8.3.9 или «Не использовать») не рекомендуется, так как библиотеки стандартных подсистем (БСП) старых версий могут вызывать критические ошибки при вызовах функций проверки прав (таких как РольДоступна()) и динамических списков.

Рекомендуемым долгосрочным решением является плановое обновление конфигурации до актуальных версий линейки УТ 11.4 или УТ 11.5. В них режим совместимости повышен штатно, алгоритмы распределения движений переработаны, а механизм расширений позволяет безопасно модифицировать серверные процедуры любых общих модулей с помощью аннотации &Вместо.

← На главную