При переносе кадровых и зарплатных данных между конфигурациями (например, из ЗУП в ЗИК или наоборот) разработчики часто сталкиваются с проблемой нарушения логической последовательности проведения документов. Типичная ситуация: документ Прием на работу не может быть проведен, так как в базе-приемнике еще не «прошло» Увольнение этого же сотрудника по предыдущему сроку работы, либо документы загружаются в порядке, не соответствующем реальной хронологии событий. Разберем, как решить эту задачу в рамках программного комплекса «Конвертация данных 2.0».
Многие начинающие специалисты пытаются решить проблему простым перемещением правил выгрузки данных (ПВД) в списке. Однако этот метод ненадежен по нескольким причинам:
Для решения этой проблемы мы проанализируем три основных подхода: использование глобального списка для отложенного проведения, сортировку на этапе выгрузки через произвольный запрос и использование механизмов конфигурации-приемника.
Это самый гибкий и надежный способ. Суть его заключается в том, чтобы не проводить документы сразу в момент их появления в базе-приемнике, а собрать их в специальную таблицу, отсортировать по нужным критериям и провести в самом конце процесса обмена.
Рассмотрим пошагово реализацию этого алгоритма:
Шаг 1. Инициализация таблицы. В глобальном обработчике конвертации Перед загрузкой данных создадим таблицу значений, которая будет доступна на протяжении всего процесса загрузки через структуру Параметры.
// Обработчик "Перед загрузкой данных"
Параметры.Вставить("ТаблицаДокументовДляПроведения", Новый ТаблицаЗначений);
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("Ссылка");
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("ДатаСобытия");
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("Приоритет");
Шаг 2. Сбор документов. В правилах конвертации объектов (ПКО) для каждого типа документа (Прием, Перевод, Увольнение) в обработчике После загрузки пропишем добавление объекта в нашу таблицу. Важно: мы не вызываем метод Записать() с режимом проведения, а просто фиксируем ссылку.
// Обработчик "После загрузки" в ПКО ПриемНаРаботу
Если ОбъектМодифицирован Тогда // или другое условие
НоваяСтрока = Параметры.ТаблицаДокументовДляПроведения.Добавить();
НоваяСтрока.Ссылка = Объект.Ссылка;
НоваяСтрока.ДатаСобытия = Объект.ДатаПриема; // Используем дату события!
НоваяСтрока.Приоритет = 2; // Приемы после увольнений с той же датой
КонецЕсли;
Шаг 3. Финальная обработка. В глобальном обработчике После загрузки данных (выполняется один раз в конце файла) мы производим сортировку и проведение.
// Обработчик "После загрузки данных"
ТЗ = Параметры.ТаблицаДокументовДляПроведения;
ТЗ.Сортировать("ДатаСобытия Возр, Приоритет Возр");
Для Каждого СтрокаТЗ Из ТЗ Цикл
ДокОбъект = СтрокаТЗ.Ссылка.ПолучитьОбъект();
Если ДокОбъект <> Неопределено Тогда
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Не удалось провести: " + СтрокаТЗ.Ссылка + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Если мы хотим, чтобы документы попадали в XML-файл уже в правильном порядке, проанализируем использование ПВД с типом выборки «Произвольный запрос». Этот метод хорош тем, что стандартный механизм загрузки в 1С будет пытаться проводить документы сразу, и если они идут в хронологическом порядке, то ошибок не возникнет.
Разберем логику построения такого запроса. Нам необходимо объединить данные из нескольких таблиц и упорядочить их:
ВЫБРАТЬ
Документ.Ссылка КАК Ссылка,
Документ.ДатаПриема КАК ДатаСобытия,
1 КАК Приоритет
ИЗ
Документ.ПриемНаРаботу КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Документ.Ссылка,
Документ.ДатаУвольнения,
0
ИЗ
Документ.Увольнение КАК Документ
УПОРЯДОЧИТЬ ПО
ДатаСобытия,
Приоритет
В самом обработчике ПВД при обходе результата запроса нужно вызывать функцию ВыгрузитьПоПравилу. Таким образом, мы жестко задаем последовательность записи объектов в файл обмена.
Выясним причину, почему обычная сортировка по дате документа часто подводит. В кадровом учете документ может быть создан 25-го числа, но описывать событие (прием), которое произойдет 1-го числа следующего месяца. Или наоборот — «задним числом».
Посмотрим на важные реквизиты, которые следует использовать для сортировки:
ДатаПриема.ДатаУвольнения.ДатаНачала (или аналогичный период регистрации).Проанализируем ситуацию с одинаковыми датами. Если сотрудник увольняется и принимается в один и тот же день (например, переход из одного подразделения в другое через увольнение), важно, чтобы Увольнение имело более высокий приоритет в очереди проведения, чем Прием. Именно для этого в Меhelper-таблицу (Метод 1) мы добавляли колонку Приоритет.
При массовой загрузке данных рекомендуется отключать автоматическое проведение в правилах (устанавливать РежимЗаписи = "Записать" в ПКО) и использовать отложенное проведение. Рассмотрим несколько нюансов:
После загрузки данных может привести к длительной транзакции и блокировкам. Если база большая, рассмотрите возможность проведения документов порциями.ПроцедурыУправленияПерсоналом.ПерепровестиДокументыПоСотруднику(Сотрудник), чем вручную выстраивать очередь каждого документа.Таким образом, мы рассмотрели основные технические приемы управления последовательностью объектов. Выбор метода зависит от сложности ваших кадровых данных и требований к скорости загрузки, но использование глобальной таблицы значений в обработчиках КД 2.0 остается наиболее универсальным решением для программиста 1С.