Почему запрос к регистру накопления в ЗУП 3.1 возвращает пустой результат по периоду и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Налоговый учет IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в программном продукте «1С:Зарплата и Управление Персоналом» разработчики часто сталкиваются со ситуацией, когда запрос к физической таблице регистра накопления возвращает пустую выборку при добавлении условия по периоду, хотя без данного условия записи выгружаются успешно. Рассмотрим подробнее, почему возникают подобные проблемы, как выполнить отладку параметров запроса и какие нюансы работы с регистрами доходов по страховым взносам следует учитывать.

Анализ исходной проблемы и текста запроса

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


ВЫБРАТЬ
	СведенияОДоходахСтраховыеВзносы.Начисление КАК Начисление,
	СведенияОДоходахСтраховыеВзносы.ФизическоеЛицо КАК ФизическоеЛицо,
	СведенияОДоходахСтраховыеВзносы.Сумма КАК Сумма,
	СведенияОДоходахСтраховыеВзносы.Регистратор КАК Регистратор,
	СведенияОДоходахСтраховыеВзносы.НомерСтроки КАК НомерСтроки,
	СведенияОДоходахСтраховыеВзносы.Активность КАК Активность,
	СведенияОДоходахСтраховыеВзносы.Период КАК Период
ИЗ
	РегистрНакопления.СведенияОДоходахСтраховыеВзносы КАК СведенияОДоходахСтраховыеВзносы
ГДЕ
	СведенияОДоходахСтраховыеВзносы.Период МЕЖДУ &НачалоПериода И &КонецПериода
	И СведенияОДоходахСтраховыеВзносы.ВидДохода В(&СписокВидовДохода)
	И СведенияОДоходахСтраховыеВзносы.ФизическоеЛицо В(&СписокФизЛиц)
ИТОГИ
	СУММА(Сумма)
ПО
	Начисление,
	ФизическоеЛицо

При получении пустого результата первой гипотезой может быть синтаксическая ошибка в операторе МЕЖДУ или неверный порядок передачи дат. Однако оператор МЕЖДУ в языке запросов 1С работает включительно и эквивалентен комбинации условий Период >= &НачалоПериода И Период <= &КонецПериода.

Пошаговая методика отладки параметров запроса

Разберем по шагам алгоритм поиска причины, если условие по периоду отсекает все записи из результата:

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

Важные особенности запросов к регистрам учета доходов и взносов

Рассмотрим дополнительные технические нюансы, с которыми сталкиваются программисты при работе с регистром СведенияОДоходахСтраховыеВзносы в ЗУП 3.1:

  1. Передача пустых списков в условия В(&Список). Если параметры &СписокВидовДохода или &СписокФизЛиц передаются как пустые массивы или пустые списки значений, условие В(&Список) принимает значение ЛОЖЬ, и результат запроса будет пустым независимо от фильтров по периоду.
  2. Фильтрация по активности записей. При обращении к физической таблице регистра (в отличие от виртуальных таблиц) платформа 1С не отсекает неактивные движения автоматически. Чтобы исключить сторнированные или недействительные записи, в секцию ГДЕ необходимо в обязательном порядке добавлять условие СведенияОДоходахСтраховыеВзносы.Активность = ИСТИНА.
  3. Различие полей Период и ДатаПолученияДохода. Поле Период соответствует дате проведения документа-регистратора. При этом доход для расчета страховых взносов может относиться к другому налоговому периоду (поле ДатаПолученияДохода). Если требуется анализировать доходы за определенный период учета, следует проверить, по какому именно полю даты необходимо накладывать условие.
  4. Получение реквизитов через виртуальную таблицу. Если в виртуальной таблице Обороты отсутствует необходимый реквизит (например, Начисление), вместо полного обращения к физической таблице эффективнее сделать выборку из виртуальной таблицы с ограничениями по периоду, а затем соединить результат с физической таблицей регистра по полям Регистратор и НомерСтроки.
← На главную