В процессе сопровождения конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникают задачи по массовой корректировке данных в регистрах сведений. Одной из наиболее трудоемких является замена зарплатного проекта для группы сотрудников. Например, когда компания переходит на новый банковский договор, и нам требуется изменить привязку лицевых счетов, отобрав их по конкретной маске (начальным цифрам номера счета). В этой статье мы подробно разберем, как решить эту задачу несколькими способами: от использования встроенных инструментов до написания собственного кода.
Прежде чем приступать к изменениям, проанализируем объект нашей работы. Регистр сведений ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам является непериодическим и хранит информацию в разрезе трех ключевых измерений: ФизическоеЛицо, Организация и ЗарплатныйПроект. Номер лицевого счета при этом является ресурсом.
Важный нюанс: поскольку ЗарплатныйПроект — это измерение, мы не можем просто перезаписать его значение в существующей записи. Технически изменение измерения означает удаление старой записи и создание новой. Если мы попытаемся изменить измерение в существующем наборе записей без понимания этой логики, мы можем столкнуться с ошибками уникальности данных.
Рассмотрим самый доступный вариант, не требующий программирования. Многие пользователи ошибочно полагают, что типовая обработка Групповое изменение реквизитов не работает с регистрами сведений, так как их нет в списке выбора. Выясним, как это исправить.
Лицевые счета сотрудников по зарплатным проектам. Выберем его.Зарплатный проект Равно [СтароеЗначение] И Номер лицевого счета Начинается с [Цифры].Зарплатный проект и установим новое значение.Однако стоит помнить, что в некоторых версиях платформы прямая правка измерений регистра через эту обработку может быть заблокирована программно для обеспечения целостности данных. В таком случае перейдем к программным методам.
Разберем ситуацию, когда нам нужно программно обойти все записи, подходящие под фильтр, и заменить проект. Проанализируем наиболее надежный алгоритм: использование объекта НаборЗаписей с установкой фильтра по физлицу.
Рассмотрим пример кода, который автоматизирует этот процесс:
// 1. Получим данные, которые нужно изменить, с помощью запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЛицевыеСчета.ФизическоеЛицо КАК ФизическоеЛицо,
| ЛицевыеСчета.Организация КАК Организация,
| ЛицевыеСчета.НомерЛицевогоСчета КАК НомерЛицевогоСчета
|ИЗ
| РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчета
|ГДЕ
| ЛицевыеСчета.ЗарплатныйПроект = &СтарыйПроект
| И ЛицевыеСчета.НомерЛицевогоСчета ПОДОБНО &МаскаСчета";
Запрос.УстановитьПараметр("СтарыйПроект", Объект.СтарыйПроект);
Запрос.УстановитьПараметр("МаскаСчета", Объект.МаскаЦифр + "%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// 2. Для каждой записи создаем набор с отбором по ключевым полям (кроме изменяемого измерения)
НЗ = РегистрыСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СоздатьНаборЗаписей();
НЗ.Отбор.ФизическоеЛицо.Установить(Выборка.ФизическоеЛицо);
НЗ.Отбор.Организация.Установить(Выборка.Организация);
НЗ.Отбор.ЗарплатныйПроект.Установить(Объект.СтарыйПроект);
// Прочитаем текущую запись, чтобы сохранить номер счета
НЗ.Прочитать();
Если НЗ.Количество() > 0 Тогда
НомерСчета = НЗ[0].НомерЛицевогоСчета;
// Удаляем старую запись
НЗ.Очистить();
НЗ.Записать();
// 3. Создаем новую запись с измененным проектом
НовыйНЗ = РегистрыСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СоздатьНаборЗаписей();
НовыйНЗ.Отбор.ФизическоеЛицо.Установить(Выборка.ФизическоеЛицо);
НовыйНЗ.Отбор.Организация.Установить(Выборка.Организация);
НовыйНЗ.Отбор.ЗарплатныйПроект.Установить(Объект.НовыйПроект);
НоваяЗапись = НовыйНЗ.Добавить();
НоваяЗапись.ФизическоеЛицо = Выборка.ФизическоеЛицо;
НоваяЗапись.Организация = Выборка.Организация;
НоваяЗапись.ЗарплатныйПроект = Объект.НовыйПроект;
НоваяЗапись.НомерЛицевогоСчета = НомерСчета;
НовыйНЗ.Записать();
КонецЕсли;
КонецЦикла;
Проанализируем этот код: мы используем метод «удалить-создать». Это гарантирует, что в регистре не останется «хвостов» и не возникнет конфликта измерений. Обратите внимание на использование объекта НаборЗаписей — это более производительный и правильный способ работы с регистрами в 1С, чем использование менеджера записи в цикле.
Часто при запуске старых внешних обработок в современных версиях ЗУП 3.1 возникает ошибка: «Использование модальных окон в данном режиме запрещено!». Выясним причину: в современных конфигурациях на платформе 8.3 параметр «Режим использования модальности» установлен в значение «Не использовать» для поддержки работы в веб-клиенте.
Рассмотрим пути решения этой проблемы:
Важно понимать, что просто изменить запись в регистре лицевых счетов может быть недостаточно для корректного формирования ведомостей. В ЗУП 3.1 существует вспомогательный регистр — МестаВыплатыЗарплатыСотрудников. Именно в нем хранится настройка, которая определяет, какой именно способ выплаты (через кассу, через банк по проекту №1 или через банк по проекту №2) является для сотрудника основным. Для контроля перечислений с разделением по проектам подойдёт отчет по ведомостям на выплату зарплаты в банк с отбором по способу выплаты.
Если мы заменим проект в лицевых счетах, но не обновим МестоВыплаты, то при заполнении документа Ведомость в банк по новому проекту программа просто «не увидит» сотрудников, так как по документам у них все еще закреплен старый способ выплаты. Рассмотрим, как это исправить массово:
В справочнике Сотрудники выделим нужных нам людей (используя Ctrl+A или Shift), нажмем правую кнопку мыши и выберем команду Изменить выплату зарплаты. В открывшемся окне мы сможем централизованно установить новый зарплатный проект. Это действие автоматически обновит данные в регистре Места выплаты зарплаты сотрудников, что является наиболее безопасным и корректным с точки зрения логики программы путем.
Мы рассмотрели различные подходы к задаче изменения зарплатных проектов. Выяснили, что для разовых правок идеально подходит Групповое изменение реквизитов с включенными служебными объектами. Для сложных условий фильтрации (например, по маске номера счета) лучше использовать программный скрипт, основанный на объекте НаборЗаписей. И, наконец, не забывайте про регистр Места выплаты зарплаты, который является ключевым для автоматического заполнения ведомостей. Сочетание этих методов позволит вам быстро и без ошибок навести порядок в зарплатных данных вашей организации.