При обработке документов в конфигурации «Зарплата и управление персоналом» часто возникает необходимость укрупнить аналитику — например, заменить подразделения нижнего уровня на их родительские группы (подразделения верхнего уровня). Рассмотрим, как правильно реализовать такой алгоритм и избежать частых ошибок начинающих разработчиков.
Разберем типичные ошибки, которые могут возникнуть при попытке перебрать строки табличной части и изменить подразделения через поиск по коду или работу с объектами:
ПолныйКод(): Возникает, если в строке табличной части реквизит Подразделение незаполнен (содержит пустую ссылку или значение Неопределено). Вызов методов у незаполненной ссылки приводит к исключению.ПолучитьОбъект() непосредственно у менеджера Справочники.ПодразделенияОрганизаций вызывает ошибку, так как данный метод доступен только у конкретной ссылки типа СправочникСсылка.НайтиПоКоду(): Метод возвращает ссылку на найденный элемент или пустую ссылку, но не число. Сравнение результата с единицей (= 1) является ошибочным. Для проверки найденного значения следует использовать функцию ЗначениеЗаполнено().ПолучитьОбъект() и проверять его уровень. Свойство Родитель доступно напрямую из ссылки СправочникСсылка.Если справочник является двухъярусным или требуется просто поднять аналитику на уровень выше, нет необходимости искать элементы по коду. Достаточно обратиться к свойству Родитель текущей ссылки.
Рассмотрим пример кода для обработки табличной части НачисленнаяЗарплатаИВзносы документа ОтражениеЗарплатыВБухучете:
&НаСервере
Процедура ЗаменитьПодразделенияНаСервере(СсылкаНаДокумент)
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Для Каждого Стр Из ДокументОбъект.НачисленнаяЗарплатаИВзносы Цикл
// Проверяем, заполнено ли подразделение и есть ли у него родитель
Если ЗначениеЗаполнено(Стр.Подразделение) И ЗначениеЗаполнено(Стр.Подразделение.Родитель) Тогда
Стр.Подразделение = Стр.Подразделение.Родитель;
КонецЕсли;
КонецЦикла;
// Если документ ранее был проведен, записываем его с перепроведением
Если ДокументОбъект.Проведен Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Иначе
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
При работе с документом ОтражениеЗарплатыВБухучете в 1С:ЗУП 3.1 важно учитывать следующие технические нюансы:
Записать() без указания режима проведения обновит данные в табличной части, но движения в регистрах останутся со старыми значениями подразделений. Чтобы обновить учетные данные, проведенный документ необходимо записывать в режиме РежимЗаписиДокумента.Проведение.НачисленнаяЗарплатаИВзносы, но и в других табличных частях: Взносы, УдержаннаяЗарплата, ПособияЗаСчетФСС, НачисленныеНДФЛ. При смене подразделения рекомендуется обрабатывать все табличные части документа для сохранения целостности данных.