При ведении учета в 1С мы часто сталкиваемся с задачами массового обновления данных, которые требуют автоматизации. Одна из таких задач – необходимость массовой смены зарплатных карт (лицевых счетов) сотрудников, например, при переходе на новый зарплатный проект или изменении банковских реквизитов. Ручной ввод данных для 150 и более человек является не только трудоемким, но и высокорискованным с точки зрения ошибок. В этом руководстве мы рассмотрим различные подходы к решению этой проблемы, начиная от разработки собственной обработки и заканчивая использованием стандартных средств 1С.
Для начала, давайте разберемся, где в системе 1С хранится информация о зарплатных картах сотрудников. Ключевым объектом, содержащим эти данные, является регистр сведений "Лицевые счета сотрудников по зарплатным проектам". Именно с ним мы будем работать для массового обновления информации.
Этот регистр является периодическим и подчиняется регистратору, что означает, что записи в нем могут иметь разные значения на разные даты и создаваться или изменяться документами. Мы должны учитывать эту особенность при программном изменении.
Разберем его структуру и ключевые поля, которые нам понадобятся:
Сотрудник: Ссылка на элемент справочника "Сотрудники", определяющая, для какого сотрудника предназначен лицевой счет.ЗарплатныйПроект: Ссылка на элемент справочника "ЗарплатныеПроекты", указывающая, к какому зарплатному проекту относится данный лицевой счет.БанковскийСчет: Строковое поле, в котором хранится номер зарплатной карты или банковского счета. Это то поле, которое мы будем массово изменять.Период: Дата, с которой действует запись лицевого счета.Регистратор: Документ, который создал или изменил данную запись. При программной записи мы можем не указывать его или создать фиктивный документ.Важность уникальности и точности данных в этом регистре критически высока, поскольку от нее зависят правильность начисления и выплаты заработной платы. Поэтому к процессу массового изменения мы должны подходить максимально ответственно.
Если стандартные средства 1С не полностью покрывают наши потребности, или нам требуется специфическая логика обработки данных, наиболее гибким решением будет разработка собственной внешней обработки. Этот подход позволит нам точно контролировать процесс загрузки и обновления. Предположим, что мы имеем файл Excel, содержащий данные для замены.
Для нашей обработки мы ожидаем, что файл Excel будет содержать, как минимум, две колонки:
Пример структуры файла Excel:
Разработка обработки будет включать три основных шага, которые мы детально рассмотрим.
Шаг 1: Чтение данных из файла Excel
На первом этапе мы должны прочитать данные из файла Excel и загрузить их во временную структуру в 1С, например, в ТаблицаЗначений. Для этого мы можем использовать COM-объекты для работы с Excel.
Предположим, что у нас есть путь к файлу Excel (ПутьКФайлу). Мы будем читать данные, начиная со второй строки, предполагая, что первая строка содержит заголовки.
// Создаем новую таблицу значений для хранения данных из Excel
ТЗДанные = Новый ТаблицаЗначений;
ТЗДанные.Колонки.Добавить("ФизЛицо"); // Колонка для ФИО сотрудника
ТЗДанные.Колонки.Добавить("БанковскийСчет"); // Колонка для нового банковского счета
Попытка
// Создаем COM-объект Excel.Application для взаимодействия с Excel
ExcelПриложение = Новый COMОбъект("Excel.Application");
// Открываем указанную книгу Excel (файл)
Книга = ExcelПриложение.Workbooks.Open(ПутьКФайлу);
// Получаем первый лист книги
Лист = Книга.Sheets(1);
// Определяем номер последней используемой строки для корректного чтения
ПоследняяСтрока = Лист.UsedRange.Rows.Count;
// Итерируем по строкам Excel, начиная со второй (предполагаем заголовки в первой)
Для НомерСтроки = 2 По ПоследняяСтрока Цикл
// Читаем значения из ячеек: ФИО из первой колонки, счет из второй
ФИО = Лист.Cells(НомерСтроки, 1).Value;
Счет = Лист.Cells(НомерСтроки, 2).Value;
// Проверяем, что ФИО не пустое, чтобы избежать обработки пустых строк
Если Не ПустаяСтрока(ФИО) Тогда
// Добавляем новую строку в нашу таблицу значений
НоваяСтрока = ТЗДанные.Добавить();
НоваяСтрока.ФизЛицо = СокрЛП(ФИО); // Обрезаем пробелы
НоваяСтрока.БанковскийСчет = СокрЛП(Счет); // Обрезаем пробелы
КонецЕсли;
КонецЦикла;
// Закрываем книгу без сохранения изменений
Книга.Close(Ложь);
// Завершаем работу приложения Excel
ExcelПриложение.Quit();
Исключение
// Обработка ошибок при работе с Excel
Сообщить("Ошибка при чтении файла Excel: " + ОписаниеОшибки());
Возврат; // Выходим из процедуры в случае ошибки
КонецПопытки;
// Теперь ТЗДанные содержит все необходимые данные из файла Excel
Мы успешно прочитали данные из файла Excel и сохранили их в ТаблицаЗначений ТЗДанные, которая будет использоваться на следующем шаге.
Шаг 2: Поиск сотрудников и лицевых счетов
После того как мы загрузили данные из Excel, нам необходимо сопоставить ФИО из файла с реальными объектами ФизическиеЛица и Сотрудники в базе 1С, а затем найти соответствующие записи в регистре сведений ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам. Для оптимизации поиска мы используем запрос с временной таблицей.
Запрос = Новый Запрос;
// Передаем нашу таблицу значений как параметр запроса, она будет выступать в роли временной таблицы
Запрос.УстановитьПараметр("ТаблицаДанных", ТЗДанные);
// Также нам понадобится целевой зарплатный проект. Допустим, мы его выбрали на форме обработки.
// Например: ЗарплатныйПроектЦелевой = Справочники.ЗарплатныеПроекты.НайтиПоНаименованию("НазваниеЦелевогоПроекта");
// Для примера, возьмем произвольный зарплатный проект или самый первый, если не указан
Запрос.УстановитьПараметр("ЗарплатныйПроектПараметр", ЗарплатныйПроектЦелевой); // Это должен быть объект СправочникСсылка.ЗарплатныеПроекты
Запрос.Текст =
"ВЫБРАТЬ
| Данные.ФизЛицо КАК ФИОИзФайла,
| Данные.БанковскийСчет КАК НовыйБанковскийСчет,
| ФизЛица.Ссылка КАК ФизЛицоСсылка,
| Сотрудники.Ссылка КАК СотрудникСсылка,
| ЛицевыеСчета.Период КАК ТекущийПериодЛицевогоСчета,
| ЛицевыеСчета.ЗарплатныйПроект КАК ТекущийЗарплатныйПроект,
| ЛицевыеСчета.БанковскийСчет КАК ТекущийБанковскийСчет
|ИЗ
| &ТаблицаДанных КАК Данные
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизЛица
| ПО Данные.ФизЛицо = ФизЛица.Наименование
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники
| ПО ФизЛица.Ссылка = Сотрудники.ФизическоеЛицо
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчета
| ПО Сотрудники.Ссылка = ЛицевыеСчета.Сотрудник
| И ЛицевыеСчета.ЗарплатныйПроект = &ЗарплатныйПроектПараметр // Привязываемся к конкретному зарплатному проекту
|ГДЕ
| НЕ ФизЛица.Ссылка ЕСТЬ NULL
| И НЕ Сотрудники.Ссылка ЕСТЬ NULL
|
|УПОРЯДОЧИТЬ ПО ТекущийПериодЛицевогоСчета УБЫВ"; // Для периодического регистра берем последнюю запись
РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // Получаем результат запроса в таблицу значений
В этом запросе мы объединяем данные из файла Excel с данными справочников ФизическиеЛица, Сотрудники и регистром сведений ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам. Важно, что мы осуществляем отбор по конкретному ЗарплатныйПроект, так как лицевой счет обычно привязан к нему. Если необходимо изменить лицевые счета для *всех* зарплатных проектов сотрудника, логика запроса и обновления будет более сложной.
Шаг 3: Изменение записей регистра сведений
Заключительный этап – непосредственное изменение данных в регистре сведений. Мы будем использовать объект НаборЗаписей, который предназначен для работы с данными регистра сведений.
Предположим, что мы уже определили целевой зарплатный проект (ЗарплатныйПроект), для которого будем изменять лицевые счета. Если зарплатный проект меняется на новый, нам нужно будет найти или создать его.
// Получаем объект регистра сведений
МенеджерРегистра = РегистрыСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам;
// Создаем набор записей для работы с регистром
НаборЗаписей = МенеджерРегистра.СоздатьНаборЗаписей();
// Устанавливаем отбор по зарплатному проекту, чтобы работать только с нужными записями
// Если мы меняем лицевой счет внутри уже существующего зарплатного проекта
НаборЗаписей.Отбор.ЗарплатныйПроект.Установить(ЗарплатныйПроектЦелевой); // Используем ЗарплатныйПроектЦелевой из Шага 2
НаборЗаписей.Прочитать(); // Считываем текущие записи регистра по нашему отбору
// Создаем список для новых записей, если сотрудник не был найден в текущем наборе
СписокНовыхЗаписей = Новый СписокЗначений;
// Итерируем по результатам запроса, полученным на Шаге 2
Для Каждого СтрокаРезультата Из РезультатЗапроса Цикл
// Проверяем, что сотрудник найден в базе 1С
Если СтрокаРезультата.СотрудникСсылка = Неопределено Тогда
Сообщить("Сотрудник не найден в базе 1С по ФИО: " + СтрокаРезультата.ФИОИзФайла);
Продолжить; // Переходим к следующему сотруднику
КонецЕсли;
// Ищем запись для текущего сотрудника в прочитанном наборе
НайденнаяЗапись = Неопределено;
Для Каждого ЗаписьРегистра Из НаборЗаписей Цикл
Если ЗаписьРегистра.Сотрудник = СтрокаРезультата.СотрудникСсылка Тогда
НайденнаяЗапись = ЗаписьРегистра;
Прервать; // Найдена соответствующая запись, прерываем внутренний цикл
КонецЕсли;
КонецЦикла;
Если НайденнаяЗапись <> Неопределено Тогда
// Запись найдена, обновляем банковский счет
Если НайденнаяЗапись.БанковскийСчет <> СтрокаРезультата.НовыйБанковскийСчет Тогда
НайденнаяЗапись.БанковскийСчет = СтрокаРезультата.НовыйБанковскийСчет;
Сообщить("Обновлен счет для сотрудника: " + СтрокаРезультата.ФИОИзФайла);
КонецЕсли;
Иначе
// Запись не найдена, создаем новую
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата(); // Устанавливаем актуальную дату
НоваяЗапись.Сотрудник = СтрокаРезультата.СотрудникСсылка;
НоваяЗапись.ЗарплатныйПроект = ЗарплатныйПроектЦелевой; // Указываем целевой зарплатный проект
НоваяЗапись.БанковскийСчет = СтрокаРезультата.НовыйБанковскийСчет;
Сообщить("Создана новая запись счета для сотрудника: " + СтрокаРезультата.ФИОИзФайла);
КонецЕсли;
КонецЦикла;
// Записываем измененный набор записей в базу данных
Попытка
НаборЗаписей.Записать();
Сообщить("Массовая смена лицевых счетов завершена успешно!");
Исключение
Сообщить("Ошибка при записи набора записей: " + ОписаниеОшибки());
КонецПопытки;
Таким образом, мы написали полноценный алгоритм для массовой смены лицевых счетов. Этот метод требует навыков программирования на встроенном языке 1С, но дает максимальную гибкость и контроль над процессом.
В конфигурациях 1С, таких как "1С:Зарплата и управление персоналом", существуют встроенные инструменты, которые могут помочь нам решить эту задачу без написания сложного кода. Рассмотрим три основных стандартных инструмента.
Для пакетного ввода или изменения лицевых счетов в рамках одного зарплатного проекта мы можем воспользоваться специализированным документом "Ввод лицевых счетов". Этот инструмент предоставляет удобную форму для работы со списком сотрудников.
Разберем по шагам, как использовать этот документ:
ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам с датой документа в качестве периода действия.Преимущество этого метода заключается в его простоте и штатном характере. Однако его основное ограничение — невозможность прямой автоматической загрузки из внешнего файла (например, Excel) без дополнительных доработок. Если у нас есть файл Excel, нам придется вручную переносить данные в форму документа.
Это мощный стандартный инструмент, который позволяет изменять различные реквизиты у выбранных объектов, включая записи в регистрах сведений. Его можно использовать для массовой установки одного и того же значения лицевого счета для группы сотрудников или для очистки существующих счетов.
Разберем по шагам, как использовать эту обработку:
Сотруднику (если у нас есть список сотрудников), по ЗарплатномуПроекту (если мы хотим изменить счета только в рамках одного проекта) или по ТекущемуБанковскомуСчету (если нужно изменить определенные номера). Будьте предельно внимательны с настройкой отбора, чтобы случайно не затронуть лишние записи!Этот метод подходит для установки одного и того же значения для группы лицевых счетов или для их массовой очистки. Для установки разных значений для разных сотрудников он менее подходит напрямую, так как не позволяет загружать индивидуальные значения из внешнего файла. Однако его можно комбинировать: сначала очистить старые счета, а затем загрузить новые другим методом.
Эта универсальная обработка является одним из самых мощных и часто используемых инструментов для массовой загрузки данных из внешних файлов (например, Excel, OpenOffice Calc) в различные объекты 1С: справочники, документы, и, что важно для нас, регистры сведений. Она часто входит в состав дистрибутива информационно-технологического сопровождения (ИТС) или может быть доступна как внешняя обработка.
Разберем по шагам, как использовать эту обработку для нашей задачи:
Сотрудник (или его идентификатор) и БанковскийСчет.Сотрудник мы должны указать, как программа должна искать соответствующего сотрудника в базе 1С. Например, мы выбираем "Поиск по полю" и указываем, что поиск должен производиться по "Наименованию" (для ФИО), "Коду" (для табельного номера) или "ИНН" в справочнике ФизическиеЛица или Сотрудники.ЗарплатныйПроект. Мы можем либо указать его в файле Excel, либо установить единое значение для всех загружаемых записей непосредственно в настройках обработки.Период (даты действия записи) мы можем установить текущую дату или дату из файла Excel, если она там присутствует.Этот метод является одним из наиболее мощных и гибких для массовой загрузки данных в 1С. Он позволяет выполнить задачу без навыков программирования, но требует внимательной подготовки файла Excel и тщательной настройки сопоставлений в самой обработке.
Для пользователей, которые не обладают навыками программирования и не хотят тратить время на детальное изучение стандартных обработок, оптимальным решением может стать использование готовых внешних обработок. Эти обработки, разработанные сообществом 1С-специалистов, часто предлагают более удобный и интуитивно понятный интерфейс.
На различных профессиональных ресурсах, специализирующихся на 1С (например, на площадках для обмена и продажи решений 1С), можно найти множество платных и бесплатных утилит, специально предназначенных для загрузки и обновления лицевых счетов из файлов Excel.
Преимущества использования таких готовых решений:
При выборе готовой обработки мы рекомендуем обращать внимание на ее совместимость с вашей версией конфигурации 1С, наличие инструкций по использованию и отзывы других пользователей.
Независимо от выбранного метода, мы должны соблюдать ряд критически важных рекомендаций, чтобы минимизировать риски и обеспечить корректность данных.
Выбор конкретного метода зависит от версии конфигурации 1С, наличия у пользователя соответствующих прав и навыков, а также от готовности использовать сторонние разработки. Главное — подходить к задаче ответственно и с предварительной подготовкой.