Ошибка в типовой

13 февраля 2013

Жалоба пользователя

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

Конфигурация эта "Управление Производственным Предприятием" (УПП), версия релиза 1.3.31.1. Неработающим отчетом оказался "Регистр-расчет амортизации основных средств" из раздела налогового учета.

При формировании отчета за октябрь прошлого 2012 года появлялась ошибка преобразования значения к числу и вывод отчета прекращался.

Ошибка при формировании отчета

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

Подсказка по ошибке

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

Суть ошибки

Платформа подсказывала, что ошибка возникает в функции "РаспределитьПропорционально" общего модуля "ОбщегоНазначения". Но проанализировав в отладке момент непосредственного возникновения ошибки сразу пришел к выводу, что возникает она из-за некорректно переданных параметров. Посмотрим, какое значение получает платформа из переданного в данную функцию массива "МассивКоэф" по значению переменной "К" (см. следующий скриншот).

Значение переменной, из-за которого происходит ошибка преобразования к числу

Более того, все значения в массиве имеют подобный тип данных.

Некорректный параметр "МассивКоэф" переданный в функцию "РаспределитьПропорционально"

Перейдем в модуль объекта отчета, в процедуру "ВывестиСтроку", из которой вызывается процедура общего модуля "РаспределитьПропорционально".

Формирование массива для передачи в функцию "РаспределитьПропорционально"

Массив, формируемый для передачи, заполняется значениями из полученного способа распределения расходов. Значит, что некорректные данные получаются именно при получении необходимого способа распределения. В данной процедуре переменная "СпособыРаспределенияРасходов" - это таблица значений, содержащая способы распределения для конкретных направлений начисления амортизации. Не будем рассматривать их получение. Переменная "Опер" - это строка выборки из результата запроса, для которой производится вывод в табличный документ. Соответственно, из данной переменной мы можем получить конкретный способ отражения расходов и по нему найти нужный способ распределения.

Следовательно, либо таблица значений "СпособыРаспределенияРасходов" не содержит связанных данных для текущего способа отражения расходов, либо запрос отчета вернул некорректное значение способа отражения расходов. Решил сначала проверить запрос и не ошибся!

Не буду приводить весь текст запроса отчета, покажу лишь суть ошибки. Проблема заключалась в этой части запроса:

Ошибка в условии соединения двух таблиц

В случаях, когда движения по регистру "Хозрасчетный" были сделаны в первый день месяца в ровно в 00:00:00, и с таким же периодом записи из присоединяемой таблицы регистра, тогда результат вернет некорректные данные.

Некорректное условие на соединение двух таблиц

Подобная ошибка находится во всех условиях запроса отчета "Регистр-расчет амортизации основных средств".

Конкретная ситуация

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

Принятие к учету ОС и установка способов отражения расходов в "один момент"

Соответственно, периоды движения в регистрах по данному основному средству были одинаковые, и запрос не мог получить корректные данные для отчета.

Исправляем!

Исправить ошибку очень просто! Нужно в запросе отчета "Регистр-расчет амортизации основных средств"поменять условия с"<" на "<="в условиях соединений таблиц.В результате, текст условия соединения таблиц будут выглядеть следующим образом:

Исправление ошибки в запросе

Даже в том случае, когда была найдена ошибка в типом отчете, в который до этого не вносились изменения, не решился исправлять самостоятельно. Создал внешний отчет на основе типового и прикрепил к базе. Будем надеяться  что в последующих версиях УПП ошибку исправят.

Что же так...

Может это не ошибка и что-то не было учтено? Тогда напишите в комментариях.

А так, очень настораживает качество написания типовых конфигураций. Уже не первый раз сталкиваюсь со странным поведением внутренних механизмов конфигураций от фирмы "1С", причем не только УПП. А об оптимальности работы вообще не стоит говорить, по крайней мере в этой статье.


comments powered by Disqus