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