При разработке отчетов и обработок в программном продукте «1С:Зарплата и Управление Персоналом» разработчики часто сталкиваются со ситуацией, когда запрос к физической таблице регистра накопления возвращает пустую выборку при добавлении условия по периоду, хотя без данного условия записи выгружаются успешно. Рассмотрим подробнее, почему возникают подобные проблемы, как выполнить отладку параметров запроса и какие нюансы работы с регистрами доходов по страховым взносам следует учитывать.
Проанализируем типичный запрос к физической таблице регистра накопления СведенияОДоходахСтраховыеВзносы, в котором возникает ошибка фильтрации по периоду:
ВЫБРАТЬ
СведенияОДоходахСтраховыеВзносы.Начисление КАК Начисление,
СведенияОДоходахСтраховыеВзносы.ФизическоеЛицо КАК ФизическоеЛицо,
СведенияОДоходахСтраховыеВзносы.Сумма КАК Сумма,
СведенияОДоходахСтраховыеВзносы.Регистратор КАК Регистратор,
СведенияОДоходахСтраховыеВзносы.НомерСтроки КАК НомерСтроки,
СведенияОДоходахСтраховыеВзносы.Активность КАК Активность,
СведенияОДоходахСтраховыеВзносы.Период КАК Период
ИЗ
РегистрНакопления.СведенияОДоходахСтраховыеВзносы КАК СведенияОДоходахСтраховыеВзносы
ГДЕ
СведенияОДоходахСтраховыеВзносы.Период МЕЖДУ &НачалоПериода И &КонецПериода
И СведенияОДоходахСтраховыеВзносы.ВидДохода В(&СписокВидовДохода)
И СведенияОДоходахСтраховыеВзносы.ФизическоеЛицо В(&СписокФизЛиц)
ИТОГИ
СУММА(Сумма)
ПО
Начисление,
ФизическоеЛицо
При получении пустого результата первой гипотезой может быть синтаксическая ошибка в операторе МЕЖДУ или неверный порядок передачи дат. Однако оператор МЕЖДУ в языке запросов 1С работает включительно и эквивалентен комбинации условий Период >= &НачалоПериода И Период <= &КонецПериода.
Разберем по шагам алгоритм поиска причины, если условие по периоду отсекает все записи из результата:
ВЫБРАТЬ
&НачалоПериода КАК ПроверкаНачалаПериода,
&КонецПериода КАК ПроверкаКонцаПериода,
СведенияОДоходахСтраховыеВзносы.Период КАК Период
ИЗ
РегистрНакопления.СведенияОДоходахСтраховыеВзносы КАК СведенияОДоходахСтраховыеВзносы
&КонецПериода может оказаться выше &НачалоПериода. Если перепутать их местами и передать конечную дату раньше начальной, условие МЕЖДУ вернет ЛОЖЬ для всех строк.МЕЖДУ на отдельные операции сравнения:
// Сначала проверяем нижнюю границу:
ГДЕ СведенияОДоходахСтраховыеВзносы.Период >= &НачалоПериода
// Затем проверяем верхнюю границу:
ГДЕ СведенияОДоходахСтраховыеВзносы.Период <= &КонецПериода
&КонецПериода меньше реальных дат регистра либо передается без учета времени (например, 01.10.2017 00:00:00 вместо конца дня 01.10.2017 23:59:59).ПереносДанных датой начала учетного месяца (например, 07.11.2017 вместо 01.10.2017). В результате при формировании запроса за октябрь данные физически отсутствуют в базе.Рассмотрим дополнительные технические нюансы, с которыми сталкиваются программисты при работе с регистром СведенияОДоходахСтраховыеВзносы в ЗУП 3.1:
В(&Список). Если параметры &СписокВидовДохода или &СписокФизЛиц передаются как пустые массивы или пустые списки значений, условие В(&Список) принимает значение ЛОЖЬ, и результат запроса будет пустым независимо от фильтров по периоду.ГДЕ необходимо в обязательном порядке добавлять условие СведенияОДоходахСтраховыеВзносы.Активность = ИСТИНА.Период и ДатаПолученияДохода. Поле Период соответствует дате проведения документа-регистратора. При этом доход для расчета страховых взносов может относиться к другому налоговому периоду (поле ДатаПолученияДохода). Если требуется анализировать доходы за определенный период учета, следует проверить, по какому именно полю даты необходимо накладывать условие.Обороты отсутствует необходимый реквизит (например, Начисление), вместо полного обращения к физической таблице эффективнее сделать выборку из виртуальной таблицы с ограничениями по периоду, а затем соединить результат с физической таблицей регистра по полям Регистратор и НомерСтроки.