Как массово заменить зарплатный проект в лицевых счетах сотрудников в 1С:ЗУП 3.1?

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

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

Анализ структуры данных

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

Важный нюанс: поскольку ЗарплатныйПроект — это измерение, мы не можем просто перезаписать его значение в существующей записи. Технически изменение измерения означает удаление старой записи и создание новой. Если мы попытаемся изменить измерение в существующем наборе записей без понимания этой логики, мы можем столкнуться с ошибками уникальности данных.

Способ 1: Использование типовой обработки «Групповое изменение реквизитов»

Рассмотрим самый доступный вариант, не требующий программирования. Многие пользователи ошибочно полагают, что типовая обработка Групповое изменение реквизитов не работает с регистрами сведений, так как их нет в списке выбора. Выясним, как это исправить.

  1. Перейдем в раздел Администрирование — Обслуживание — Корректировка данных и откроем Групповое изменение реквизитов.
  2. В поле «Выбирать элементы типа» нажмем на гиперссылку для выбора объекта.
  3. В открывшемся окне нажмем кнопку Дополнительные настройки и установим флажок Показывать служебные объекты.
  4. Теперь в списке станет доступен регистр сведений Лицевые счета сотрудников по зарплатным проектам. Выберем его.
  5. В поле «Отбор» настроим условия: Зарплатный проект Равно [СтароеЗначение] И Номер лицевого счета Начинается с [Цифры].
  6. В табличной части «Изменяемые реквизиты» найдем поле Зарплатный проект и установим новое значение.

Однако стоит помнить, что в некоторых версиях платформы прямая правка измерений регистра через эту обработку может быть заблокирована программно для обеспечения целостности данных. В таком случае перейдем к программным методам.

Способ 2: Написание собственной обработки (программный код)

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

Рассмотрим пример кода, который автоматизирует этот процесс:


// 1. Получим данные, которые нужно изменить, с помощью запроса
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ЛицевыеСчета.ФизическоеЛицо КАК ФизическоеЛицо,
    |   ЛицевыеСчета.Организация КАК Организация,
    |   ЛицевыеСчета.НомерЛицевогоСчета КАК НомерЛицевогоСчета
    |ИЗ
    |   РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчета
    |ГДЕ
    |   ЛицевыеСчета.ЗарплатныйПроект = &СтарыйПроект
    |   И ЛицевыеСчета.НомерЛицевогоСчета ПОДОБНО &МаскаСчета";

Запрос.УстановитьПараметр("СтарыйПроект", Объект.СтарыйПроект);
Запрос.УстановитьПараметр("МаскаСчета", Объект.МаскаЦифр + "%");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // 2. Для каждой записи создаем набор с отбором по ключевым полям (кроме изменяемого измерения)
    НЗ = РегистрыСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СоздатьНаборЗаписей();
    НЗ.Отбор.ФизическоеЛицо.Установить(Выборка.ФизическоеЛицо);
    НЗ.Отбор.Организация.Установить(Выборка.Организация);
    НЗ.Отбор.ЗарплатныйПроект.Установить(Объект.СтарыйПроект);
    
    // Прочитаем текущую запись, чтобы сохранить номер счета
    НЗ.Прочитать();
    Если НЗ.Количество() > 0 Тогда
        НомерСчета = НЗ[0].НомерЛицевогоСчета;
        
        // Удаляем старую запись
        НЗ.Очистить();
        НЗ.Записать();
        
        // 3. Создаем новую запись с измененным проектом
        НовыйНЗ = РегистрыСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам.СоздатьНаборЗаписей();
        НовыйНЗ.Отбор.ФизическоеЛицо.Установить(Выборка.ФизическоеЛицо);
        НовыйНЗ.Отбор.Организация.Установить(Выборка.Организация);
        НовыйНЗ.Отбор.ЗарплатныйПроект.Установить(Объект.НовыйПроект);
        
        НоваяЗапись = НовыйНЗ.Добавить();
        НоваяЗапись.ФизическоеЛицо = Выборка.ФизическоеЛицо;
        НоваяЗапись.Организация = Выборка.Организация;
        НоваяЗапись.ЗарплатныйПроект = Объект.НовыйПроект;
        НоваяЗапись.НомерЛицевогоСчета = НомерСчета;
        
        НовыйНЗ.Записать();
    КонецЕсли;
КонецЦикла;

Проанализируем этот код: мы используем метод «удалить-создать». Это гарантирует, что в регистре не останется «хвостов» и не возникнет конфликта измерений. Обратите внимание на использование объекта НаборЗаписей — это более производительный и правильный способ работы с регистрами в 1С, чем использование менеджера записи в цикле.

Решение проблемы с модальными окнами

Часто при запуске старых внешних обработок в современных версиях ЗУП 3.1 возникает ошибка: «Использование модальных окон в данном режиме запрещено!». Выясним причину: в современных конфигурациях на платформе 8.3 параметр «Режим использования модальности» установлен в значение «Не использовать» для поддержки работы в веб-клиенте.

Рассмотрим пути решения этой проблемы:

  1. Запуск в толстом клиенте: Если вам нужно разово выполнить обработку, попробуйте запустить информационную базу в режиме «Толстый клиент (управляемое приложение)». Это иногда помогает обойти жесткие ограничения интерфейса, но не всегда отменяет проверку модальности.
  2. Использование Инструментов разработчика: Профессиональные консоли (например, ИР или универсальные редакторы реквизитов) адаптированы под асинхронные вызовы и позволяют редактировать данные без возникновения ошибок модальности.
  3. Временное изменение свойств конфигурации: В крайнем случае, на копии базы в конфигураторе можно изменить свойство «Режим использования модальности» на «Использовать», выполнить обработку и вернуть значение обратно. Внимание: не делайте этого в рабочей базе без крайней необходимости, так как это может повлиять на стабильность других типовых механизмов.

Важная взаимосвязь с регистром «Места выплаты зарплаты»

Важно понимать, что просто изменить запись в регистре лицевых счетов может быть недостаточно для корректного формирования ведомостей. В ЗУП 3.1 существует вспомогательный регистр — МестаВыплатыЗарплатыСотрудников. Именно в нем хранится настройка, которая определяет, какой именно способ выплаты (через кассу, через банк по проекту №1 или через банк по проекту №2) является для сотрудника основным. Для контроля перечислений с разделением по проектам подойдёт отчет по ведомостям на выплату зарплаты в банк с отбором по способу выплаты.

Если мы заменим проект в лицевых счетах, но не обновим МестоВыплаты, то при заполнении документа Ведомость в банк по новому проекту программа просто «не увидит» сотрудников, так как по документам у них все еще закреплен старый способ выплаты. Рассмотрим, как это исправить массово:

В справочнике Сотрудники выделим нужных нам людей (используя Ctrl+A или Shift), нажмем правую кнопку мыши и выберем команду Изменить выплату зарплаты. В открывшемся окне мы сможем централизованно установить новый зарплатный проект. Это действие автоматически обновит данные в регистре Места выплаты зарплаты сотрудников, что является наиболее безопасным и корректным с точки зрения логики программы путем.

Заключение

Мы рассмотрели различные подходы к задаче изменения зарплатных проектов. Выяснили, что для разовых правок идеально подходит Групповое изменение реквизитов с включенными служебными объектами. Для сложных условий фильтрации (например, по маске номера счета) лучше использовать программный скрипт, основанный на объекте НаборЗаписей. И, наконец, не забывайте про регистр Места выплаты зарплаты, который является ключевым для автоматического заполнения ведомостей. Сочетание этих методов позволит вам быстро и без ошибок навести порядок в зарплатных данных вашей организации.

← На главную