Как выполнить отбор по реквизиту в регистре накопления 1С

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

В практике разработчика 1С часто возникает задача массовой корректировки записей в регистрах накопления. Однако при попытке установить отбор в объекте НаборЗаписей по полю, которое не является измерением, система выдает ошибку. Рассмотрим подробнее, почему это происходит, как правильно обойти это ограничение платформы и какие риски следует учитывать при ручной правке регистров в конфигурации 1С:Зарплата и управление персоналом 3.1.

Почему не работает стандартный отбор?

Разберем фундаментальное ограничение платформы 1С. Объект РегистрНакопленияНаборЗаписей позволяет устанавливать значения в свойстве Отбор только для тех полей, которые являются измерениями. Это связано с тем, что индексы в таблицах базы данных строятся именно по измерениям для обеспечения высокой скорости выборки. Реквизиты и ресурсы регистра не входят в состав ключа записей, поэтому метод Установить() для них недоступен.

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

Алгоритм решения задачи через запрос

Для того чтобы изменить данные в записях, отобранных по реквизиту, нам необходимо сначала найти все документы (регистраторы), которые создали эти записи. Проанализируем пошагово правильный программный код:

  1. Создаем запрос к таблице регистра накопления.
  2. В условии запроса ГДЕ указываем нужный нам реквизит.
  3. Группируем результат по полю Регистратор, чтобы получить список уникальных документов.
  4. В цикле по результатам запроса создаем НаборЗаписей для каждого конкретного регистратора.
  5. Прочитываем набор, модифицируем записи и записываем его обратно.

Рассмотрим пример кода, который решает проблему автора темы:


Процедура ВыполнитьИзменениеНалоговогоОргана()
    
    СсылкаПодразделение = ЭтаФорма.Подразделение;
    НоваяРегистрация = Справочники.РегистрацииВНалоговомОргане.НайтиПоКоду("6188");
    
    // Шаг 1: Получаем список регистраторов через запрос
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |   СведенияОДоходахНДФЛ.Регистратор КАК Регистратор
        |ИЗ
        |   РегистрНакопления.СведенияОДоходахНДФЛ КАК СведенияОДоходахНДФЛ
        |ГДЕ
        |   СведенияОДоходахНДФЛ.Подразделение = &Подразделение";
    
    Запрос.УстановитьПараметр("Подразделение", СсылкаПодразделение);
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    // Шаг 2: Обход найденных документов и модификация записей
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
        Набор = РегистрыНакопления.СведенияОДоходахНДФЛ.СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
        Набор.Прочитать();
        
        ИзмененияВнесены = Ложь;
        Для Каждого Движение Из Набор Цикл
            // Дополнительная проверка внутри набора, если в одном документе 
            // могут быть разные подразделения
            Если Движение.Подразделение = СсылкаПодразделение Тогда
                Движение.РегистрацияВНалоговомОргане = НоваяРегистрация;
                ИзмененияВнесены = Истина;
            КонецЕсли;
        КонецЦикла;
        
        Если ИзмененияВнесены Тогда
            Набор.Записать();
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

Важные нюансы работы с регистрами в ЗУП 3.1

Проанализируем ситуацию, описанную в обсуждении. Автор столкнулся с тем, что после переноса данных из версии 2.5 пропали сведения о дате регистрации в налоговом органе. Выясним, почему ручная правка регистра СведенияОДоходахНДФЛ может быть опасной:

1. Рассинхронизация документа и регистра. В системе 1С данные в документе-регистраторе и движениях по регистрам должны быть идентичны. Если мы меняем данные только в регистре, то при открытии формы документа пользователь увидит старые значения (из табличных частей документа). Хуже того, при любом перепроведении документа ваши ручные изменения в регистре будут полностью перезаписаны данными из документа.

2. Связи между регистрами НДФЛ. В ЗУП 3.1 учет НДФЛ ведется параллельно в нескольких регистрах:

Если вы измените налоговый орган (ИФНС) только в одном регистре, отчетность (например, 6-НДФЛ) может сформироваться некорректно: доход "уйдет" в одну налоговую, а налог останется в другой.

Рекомендованные способы решения без прямого кода

Вместо написания обработки по исправлению записей, рассмотрим более "чистые" способы, предусмотренные методологией 1С:

Использование документа "Перенос данных". Если нужно точечно подправить регистры без перепроведения документов, лучше создать документ Перенос данных (в разделе Администрирование). В нем можно выбрать нужные регистры и внести корректировки. Это позволит сохранить историю изменений и видеть их в общем списке документов системы.

Исправление истории регистрации. Как отметил автор темы в сообщении 12, проблема часто кроется в справочнике Подразделения. Если правильно установить дату в поле "Сведения о регистрации действуют с", то система сама начнет подставлять нужную ИФНС. Для применения этих изменений к старым периодам документы все же придется перепроводить. Чтобы минимизировать риск "пересторнирования" начислений, можно использовать типовую обработку Групповое изменение реквизитов, выбрав режим "Записывать объекты без проверок" (доступно в дополнительных параметрах).

Заключение: Прямая правка регистра через НаборЗаписей с отбором по регистратору — это эффективный инструмент, но он требует от программиста четкого понимания структуры метаданных и взаимосвязей объектов в конфигурации. Всегда делайте резервную копию базы перед выполнением подобных манипуляций в регистрах учета зарплаты.

← На главную