При переходе на новые релизы 1С:Комплексная автоматизация 2.5 (например, 2.5.8.х или 2.5.9.х) пользователи часто сталкиваются с критической ошибкой во время выполнения регламентной операции «Закрытие месяца». На этапе «Актуализация движений документов по данным взаиморасчетов» система прерывает работу с сообщением: «Преобразование значения к типу Число не может быть выполнено». Ошибка локализуется в общем модуле ОперативныеВзаиморасчетыСервер. В этой статье мы подробно разберем, как диагностировать причину сбоя и какими методами можно восстановить работоспособность системы.
Проанализируем текст ошибки, который указывает на конкретную строку кода:
{ОбщийМодуль.ОперативныеВзаиморасчетыСервер.Модуль(683)}: СуммаСписанияРегл = Окр(ДолгРегл + ДолгРаспределеноРегл - Окр(ДолгРаспределеноРегл,2),2);
В языке 1С такая ошибка однозначно говорит о том, что одна из переменных в арифметическом выражении (в данном случае ДолгРегл или ДолгРаспределеноРегл) имеет тип, отличный от числового. Чаще всего это значение NULL или Неопределено. Это происходит, когда запрос к базе данных, собирающий остатки по взаиморасчетам, не находит соответствия по ключам аналитики или натыкается на «битую» запись в регистрах, возвращая пустое значение вместо нуля.
Многие специалисты сталкиваются с проблемой: точка останова в конфигураторе не срабатывает, хотя код явно выполняется. Это происходит потому, что «Закрытие месяца» всегда запускается в фоновом задании. Чтобы поймать ошибку «вживую», выполним следующие действия:
/Debug) включен режим отладки.ОперативныеВзаиморасчетыСервер в процедуре ЗаполнитьОперативныеВзаиморасчеты или непосредственно на строке 683.После этого запустим операцию закрытия месяца заново. Когда система остановится на ошибке, мы сможем через табло вычислить, какая именно переменная содержит NULL, и посмотреть стек вызовов, чтобы понять, по какому документу или объекту расчетов происходит сбой.
Если закрыть месяц нужно срочно, а поиск «битых» данных затягивается, можно применить программный «костыль» с помощью расширения конфигурации. Мы добавим проверку типов данных перед выполнением вычислений. Рассмотрим, как это реализовать:
ОперативныеВзаиморасчетыСервер.&Вместо.Пример кода для расширения:
&Вместо("ИсправитьОстаткиВзаиморасчетов")
Процедура Расш_ИсправитьОстаткиВзаиморасчетов(Параметры)
// Копируем логику типовой процедуры и модифицируем проблемный участок
Попытка
ДолгРегл = Число(ДолгРегл);
Исключение
ДолгРегл = 0;
КонецПопытки;
Попытка
ДолгРаспределеноРегл = Число(ДолгРаспределеноРегл);
Исключение
ДолгРаспределеноРегл = 0;
КонецПопытки;
// Далее следует оригинальный расчет
СуммаСписанияРегл = Окр(ДолгРегл + ДолгРаспределеноРегл - Окр(ДолгРаспределеноРегл, 2), 2);
// ...
КонецПроцедуры
Важно: Это решение является временным. Оно позволяет завершить процедуру закрытия месяца, но не устраняет причину — некорректные данные в регистрах.
Проанализируем ситуацию: почему в коде появляется NULL? В 1С:КА 2.5 механизмы взаиморасчетов опираются на несколько ключевых регистров накопления: РасчетыСКлиентами, РасчетыСПоставщиками и РасчетыСПартнерамиПоМирам. Также критически важен регистр сведений АналитикаУчетаПоПартнерам.
Выясним возможные причины повреждения данных:
ОбъектРасчетов не заполнено. Это может произойти при некорректном переносе данных или использовании самописных обработок.АналитикаУчетаПоПартнерам для одного и того же партнера и организации создано две разные записи, запросы системы могут работать непредсказуемо.Рассмотрим способ очистки очереди расчетов. Перейдем в регистр сведений «Очередь движений по расчетам». Часто ошибка вызвана тем, что в очереди «зависла» запись по документу, который был удален или помечен на удаление некорректно. Очистите записи в этом регистре за проблемный месяц и запустите закрытие заново — система заново сформирует очередь, что может решить проблему.
Если программные методы не помогают, проанализируем состояние базы с помощью стандартных сервисных инструментов. Разберем шаги:
Корректировка взаиморасчетов и Ввод остатков. Именно в них чаще всего допускаются ошибки ручного ввода, приводящие к отсутствию необходимых числовых значений в полях сумм.Стоит отметить, что в релизах ветки 2.5.10 и выше фирма «1С» внесла множество правок в модуль ОперативныеВзаиморасчетыСервер, добавив проверку ЕСТЬNULL в запросах. Если ваша версия конфигурации позволяет произвести обновление, это может стать самым правильным и долгосрочным решением проблемы. Если же вы вынуждены оставаться на версии 2.5.9, используйте методику создания расширения, описанную выше, но обязательно совмещайте ее с аудитом данных по регистру АналитикаУчетаПоПартнерам.
Таким образом, мы рассмотрели комплексный подход к решению проблемы: от оперативного «костыля» в коде до глубокого анализа аналитики взаиморасчетов. Помните, что стабильность работы закрытия месяца в 1С:Комплексная автоматизация напрямую зависит от чистоты данных в регистрах расчетов с партнерами.