После обновления конфигураций 1С:Комплексная автоматизация 2 или 1С:ERP Управление предприятием до версии 2.4.11.63 (и смежных релизов этой ветки) многие пользователи столкнулись с неприятным поведением системы. При попытке сформировать и распечатать документ Акт сверки взаиморасчетов, суммы начального и конечного сальдо в печатной форме оказываются увеличенными ровно в два или более раз. При этом в самом документе на вкладках расчетов суммы отображаются корректно.
В этой статье мы подробно разберем техническую причину возникновения этой ошибки, проанализируем структуру запроса и рассмотрим несколько способов решения проблемы: от быстрой «чистки» данных до полноценного исправления программного кода.
Давайте проанализируем ситуацию. Начиная с версии 2.4.11, разработчики 1С существенно переработали механизмы работы с взаиморасчетами, особенно для режима Онлайн-взаиморасчеты. Вместе с архитектурой изменились и запросы, формирующие данные для печатных форм. В модуле менеджера документа АктСверкиВзаиморасчетов появился объемный многостраничный запрос, который собирает данные из нескольких регистров накопления и сведений.
Проанализируем работу этого запроса. Проблема кроется в механизме получения курсов валют. Запрос выполняет соединение таблиц расчетов с регистром сведений КурсыВалют. Если в вашей базе данных в регистре КурсыВалют для валюты взаиморасчетов (чаще всего это рубль) создано несколько записей на одну и ту же дату или присутствуют технические дубли, запрос отрабатывает некорректно.
Вместо того чтобы получить одну актуальную запись курса, система выполняет левое соединение, которое из-за наличия нескольких подходящих записей в регистре курсов приводит к так называемому «декартову произведению». Каждая строка расчетов умножается на количество найденных записей в курсах валют, что и приводит к кратному увеличению итоговых сумм (сальдо) в печатной форме.
Как показывает практика и обсуждения на форумах, самым быстрым способом «вылечить» печатную форму без изменения кода является проверка данных регистра сведений. Рассмотрим, как это сделать по шагам:
Важно: После удаления лишних записей в регистре КурсыВалют, переформируйте печатную форму акта сверки. В большинстве случаев суммы сразу придут в норму.
Поскольку проблема носит массовый характер и признана разработчиками 1С (ошибка EF_00150247), компания выпустила официальное исправление. Если у вас включена автоматическая загрузка патчей, система должна была предложить установку расширения-исправления.
Разберем, как проверить наличие патча вручную:
Если вы не можете обновить конфигурацию или установить патч, рассмотрим вариант исправления кода. Нам необходимо доработать модуль менеджера документа АктСверкиВзаиморасчетов. Основная задача — обеспечить выборку курса через СрезПоследних или добавить жесткое условие в соединение таблиц.
Проанализируем фрагмент проблемного запроса. Обычно он выглядит примерно так:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&МоментВремени, ) КАК КурсыВалют
ПО (ДанныеРасчетов.Валюта = КурсыВалют.Валюта)
В сложных пакетных запросах внутри типовых модулей 1С иногда вместо виртуальной таблицы СрезПоследних используется обращение к физической таблице с последующей фильтрацией. Чтобы устранить задвоение, мы можем добавить в условие соединения проверку на максимальную дату или использовать вложенный запрос.
Рассмотрим пример того, как можно ограничить выборку в расширении, перехватив процедуру печати:
&Вместо("СформироватьЗапросДляПечатиАктаСверки")
Функция Мой_СформироватьЗапросДляПечатиАктаСверки(ПараметрыПечати)
// Получаем стандартный текст запроса
ТекстЗапроса = ПродолжитьВызов(ПараметрыПечати);
// Вносим правки в текст запроса, добавляя ГРУППИРОВКУ
// или уточняя условия соединения с курсами валют,
// чтобы исключить дублирование строк при левом соединении.
Возврат ТекстЗапроса;
КонецФункции
Однако наиболее правильным программным методом будет использование временной таблицы, в которую заранее помещаются уникальные курсы валют на нужные даты, и последующее соединение основной таблицы данных именно с этой временной таблицей.
Выясним, почему проблема чаще проявляется при включенном режиме Онлайн-взаиморасчеты. В этом режиме система использует регистры РасчетыСКлиентамиПланОплат и РасчетыСКлиентамиПоДокументам. Новая печатная форма пытается сопоставить данные из этих регистров с историческими данными. Если в базе есть «хвосты» от старых документов или расхождения в копейках между регистрами, запрос может пытаться «подтянуть» дополнительные строки, которые при наложении на некорректные курсы валют создают огромные суммы сальдо.
Посмотрим на ситуацию со стороны настроек документа. Иногда помогает изменение детализации. Если в настройках печати акта сверки установлена галочка Разделять по партнерам, попробуйте ее снять и проверить результат. Это изменит структуру группировок в запросе и может временно скрыть проблему до момента установки полноценного исправления.
Подводя итог, можно сказать, что ошибка задвоения сальдо в 1С:КА 2.4.11.63 — это классический пример «недокументированной особенности» сложного SQL-запроса при соединении с данными, имеющими дубли в измерениях времени.
Рекомендованный порядок действий:
КурсыВалют для валюты "Рубль".EF_00150247.