С выходом обновлений для торговых конфигураций, таких как УТ 11.5.22, КА 2.5.22 и ERP 2.5.22, многие разработчики столкнулись с критической проблемой: перестал работать программный код, отвечающий за создание документов, расчет цен, пересчет сумм и заполнение табличных частей. В этой статье мы подробно разберем, почему это произошло, что именно изменилось в архитектуре конфигураций и как эффективно адаптировать свои расширения и внешние обработки под новые реалии платформы 1С:Предприятие 8.3.27.
Проанализируем ситуацию: фирма «1С» начала планомерный переход на новую модель расчета табличных частей. Основная цель этого изменения — оптимизация производительности, особенно при работе в веб-клиенте и с большими объемами данных. Раньше каждое изменение в строке (например, количества или цены) вызывало цепочку последовательных серверных вызовов. В новых релизах внедряется механизм пакетной обработки, который позволяет обрабатывать изменения массивами структур.
Наиболее заметным внешним проявлением этого рефакторинга стало массовое переименование общих модулей. К названиям глобальных модулей, отвечающих за логику документов, добавилось слово Пакетная. Это привело к тому, что старые обращения к процедурам и функциям теперь вызывают ошибку «Переменная не определена», так как старые модули либо удалены, либо заменены пустыми заглушками.
Рассмотрим примеры наиболее часто используемых модулей, которые подверглись изменениям. Если раньше ваш код обращался к процедурам обработки табличных частей напрямую, теперь необходимо учитывать новые имена:
ОбработкаТабличнойЧастиКлиент — теперь называется ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработкаТабличнойЧастиСервер — теперь называется ПакетнаяОбработкаТабличнойЧастиСервер.ОбщегоНазначенияУТ — во многих местах заменяется на модули с префиксом Пакетная или переносится в модули менеджеров.Важно понимать, что изменились не только названия. Изменились и сигнатуры методов. Многие процедуры теперь ожидают на вход не конкретные значения, а структуры, описывающие пакет изменений. Это означает, что простое переименование модуля в коде может привести к ошибке «Недостаточно фактических параметров».
Посмотрим на пример того, как выглядел вызов раньше, и как он должен выглядеть теперь. Предположим, вы вызывали пересчет суммы в строке:
// Старый вариант (не работает в 11.5.22)
ОбработкаТабличнойЧастиКлиент.РассчитатьСуммуТабличнойЧасти(ТекущаяСтрока, Объект);
// Новый вариант (упрощенно)
ПакетнаяОбработкаТабличнойЧастиКлиент.РассчитатьСуммуТабличнойЧасти(ТекущаяСтрока, Объект);
Однако, если ваше расширение использует аннотацию &Вместо для перехвата процедур в старом модуле ОбработкаТабличнойЧастиКлиент, расширение просто не применится при запуске, так как объект-источник отсутствует в метаданных. В этом случае вам необходимо:
ПакетнаяОбработкаТабличнойЧастиКлиент.Если у вас большое количество внешних обработок и отчетов, которые сложно обновить одномоментно, проанализируем более гибкий подход. Мы можем создать в основной конфигурации (или через расширение) новый общий модуль со старым именем (например, ОбработкаТабличнойЧастиКлиент) и прописать в нем вызовы новых методов.
Рассмотрим пример реализации такого модуля-прослойки:
// В модуле ОбработкаТабличнойЧастиКлиент
Процедура РассчитатьСуммуТабличнойЧасти(СтрокаТабличнойЧасти, ДокументОбъект) Экспорт
// Пробрасываем вызов в новый пакетный модуль
ПакетнаяОбработкаТабличнойЧастиКлиент.РассчитатьСуммуТабличнойЧасти(СтрокаТабличнойЧасти, ДокументОбъект);
КонецПроцедуры
Этот метод позволяет застраховаться от ошибок во внешних компонентах, но требует осторожности, если логика внутренней работы процедуры существенно изменилась (например, стала асинхронной).
Для разработчиков тиражных решений, которые должны работать как на старых (11.5.19), так и на новых (11.5.22) релизах, целесообразно использовать проверку версии конфигурации или проверку существования модуля. Выясним, как это реализовать программно:
Если Метаданные.ОбщиеМодули.Найти("ПакетнаяОбработкаТабличнойЧастиКлиент") <> Неопределено Тогда
Выполнить("ПакетнаяОбработкаТабличнойЧастиКлиент.РассчитатьСумму(Параметры)");
Иначе
Выполнить("ОбработкаТабличнойЧастиКлиент.РассчитатьСумму(Параметры)");
КонецЕсли;
Использование Выполнить() или Вычислить() позволяет избежать ошибок компиляции модуля на разных версиях платформы, так как проверка наличия модуля происходит в момент исполнения кода.
Проанализируем еще один важный аспект: новые пакетные модули тесно завязаны на асинхронные вызовы и длительные операции. Теперь расчеты в табличных частях могут выполняться не мгновенно. Если ваш код ожидает, что сразу после вызова процедуры РассчитатьСумму значение в поле Объект.СуммаДокумента обновится, вы можете столкнуться с тем, что данные еще не рассчитаны.
Рекомендация: При работе с новыми механизмами всегда проверяйте, не требуется ли использование процедур обратного вызова (оповещений), которые стали стандартом для современных конфигураций на базе БСП.
Подведем итог нашему разбору. Переименование модулей — это лишь «верхушка айсберга». Основная сложность заключается в изменении логики взаимодействия с данными. Для успешной адаптации мы рекомендуем следующий алгоритм действий:
ОбработкаТабличнойЧасти... и ОбщегоНазначенияУТ....&Вместо — перенести перехватчики в модули с припиской Пакетная.Такой подход позволит не только исправить текущие ошибки, но и подготовить вашу систему к дальнейшим архитектурным изменениям, которые неизбежно последуют в развитии линейки ERP 2.5/2.6.