Часто разработчики 1С сталкиваются с ситуацией, когда программный код в двух разных базах абсолютно идентичен, однако результаты выполнения запросов к регистрам расчета существенно различаются. Рассмотрим, как проанализировать эту проблему и найти причину расхождений, не опираясь на догадки, а используя системный подход к отладке.
Первым делом необходимо убедиться, что проблема не кроется в дублировании записей или некорректной записи движений. Когда мы анализируем РегистрРасчета, важно проверить, как именно документ формирует движения.
Воспользуемся Режимом технического специалиста. Откроем список записей регистра, который формирует документ-регистратор. Если в двух базах данные для одного и того же документа отличаются, сравним состав записей. Часто бывает так, что в рабочей базе случайно возникло задвоение записей (например, из-за ошибки в логике проведения или нескольких проведенных документов), что приводит к умножению результатов в Левом соединении.
В приведенном примере запрос обращается к виртуальной таблице РегистрРасчета.ОсновныеНачисления.ДанныеГрафика. Если при идентичном коде мы получаем разные результаты, значит, внешние данные, на которые опирается эта таблица, не совпадают.
Разберем структуру запроса:
ВЫБРАТЬ
ОсновныеНачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки,
ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДнейПятидневкиФактическийПериодДействия, 0) КАК ДнейОтпуска,
ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК БазаНачислений,
ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ДнейБазовыйПериод, 0) КАК БазаРабочихДней
ИЗ
РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
Регистратор = &Регистратор
И ВидРасчета В (&ВидыРасчета)) КАК ОсновныеНачисленияДанныеГрафика
Виртуальная таблица ДанныеГрафика не является жестко «зашитой» в документ. Она вычисляет значения на основе Графиков работы. Основная причина расхождений в 90% случаев кроется в том, что в справочнике или регистре сведений графиков работы для одной и той же организации/сотрудника установлены разные параметры (например, разное количество рабочих дней в периоде, использование разных производственных календарей или графиков типа «шестидневка» против «пятидневки»).
В ходе разбора ситуации мы выяснили, что причиной стало отсутствие или неверное задание связи с графиком работы в настройках учета или регистре сведений. 1С требует точного соответствия записи в регистре сведений, которая определяет, какой график привязан к конкретному сотруднику или начислению.
Рекомендуем выполнить следующие действия:
ДанныеГрафика вернет другие числа.&ВидыРасчета и &Измерения, передаваемые в запрос, одинаковы в обеих конфигурациях.ЛЕВЫЕ СОЕДИНЕНИЯ. Выполните чистую выборку только из ДанныеГрафика. Если даже на этом этапе цифры расходятся, вы точно знаете, что проблема находится на уровне настроек графиков, а не в логике объединения таблиц.Если код не менялся, а результат изменился, ищите изменения в Нормативно-справочной информации (НСИ). В рассматриваемом случае решение заключалось в корректировке связи с графиком. Когда связь с графиком была исправлена, расчетные показатели (количество дней отпуска и база рабочих дней) пришли в соответствие с эталоном.
Помните: РегистрРасчета — это объект, который критически зависит от времени и настроек производственного календаря. Любое изменение настроек заполнения графиков «задним числом» или наличие расхождений в заполненных графиках между базами всегда будет давать разные результаты при идентичном коде проведения. Всегда начинайте отладку с проверки данных в регистрах сведений, отвечающих за графики работы.