Как обеспечить правильную последовательность проведения документов при конвертации данных

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

При переносе кадровых и зарплатных данных между конфигурациями (например, из ЗУП в ЗИК или наоборот) разработчики часто сталкиваются с проблемой нарушения логической последовательности проведения документов. Типичная ситуация: документ Прием на работу не может быть проведен, так как в базе-приемнике еще не «прошло» Увольнение этого же сотрудника по предыдущему сроку работы, либо документы загружаются в порядке, не соответствующем реальной хронологии событий. Разберем, как решить эту задачу в рамках программного комплекса «Конвертация данных 2.0».

Проблема стандартного порядка ПВД

Многие начинающие специалисты пытаются решить проблему простым перемещением правил выгрузки данных (ПВД) в списке. Однако этот метод ненадежен по нескольким причинам:

  1. Документы разных типов могут быть связаны сложной цепочкой (Прием — Перевод — Увольнение — Снова прием). Простое перемещение ПВД «Увольнение» выше «Приема» поможет только в части случаев.
  2. Стандартная выгрузка ориентируется на физический порядок объектов в базе или на дату документа, в то время как кадровый учет критически зависит от даты события (даты начала действия кадрового приказа).
  3. При использовании ссылочной целостности объекты могут создаваться в момент загрузки других объектов, что полностью нарушает планируемую очередь.

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

Метод 1: Использование коллекции в обработчике «После загрузки данных»

Это самый гибкий и надежный способ. Суть его заключается в том, чтобы не проводить документы сразу в момент их появления в базе-приемнике, а собрать их в специальную таблицу, отсортировать по нужным критериям и провести в самом конце процесса обмена.

Рассмотрим пошагово реализацию этого алгоритма:

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


// Обработчик "Перед загрузкой данных"
Параметры.Вставить("ТаблицаДокументовДляПроведения", Новый ТаблицаЗначений);
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("Ссылка");
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("ДатаСобытия");
Параметры.ТаблицаДокументовДляПроведения.Колонки.Добавить("Приоритет");

Шаг 2. Сбор документов. В правилах конвертации объектов (ПКО) для каждого типа документа (Прием, Перевод, Увольнение) в обработчике После загрузки пропишем добавление объекта в нашу таблицу. Важно: мы не вызываем метод Записать() с режимом проведения, а просто фиксируем ссылку.


// Обработчик "После загрузки" в ПКО ПриемНаРаботу
Если ОбъектМодифицирован Тогда // или другое условие
    НоваяСтрока = Параметры.ТаблицаДокументовДляПроведения.Добавить();
    НоваяСтрока.Ссылка = Объект.Ссылка;
    НоваяСтрока.ДатаСобытия = Объект.ДатаПриема; // Используем дату события!
    НоваяСтрока.Приоритет = 2; // Приемы после увольнений с той же датой
КонецЕсли;

Шаг 3. Финальная обработка. В глобальном обработчике После загрузки данных (выполняется один раз в конце файла) мы производим сортировку и проведение.


// Обработчик "После загрузки данных"
ТЗ = Параметры.ТаблицаДокументовДляПроведения;
ТЗ.Сортировать("ДатаСобытия Возр, Приоритет Возр");

Для Каждого СтрокаТЗ Из ТЗ Цикл
    ДокОбъект = СтрокаТЗ.Ссылка.ПолучитьОбъект();
    Если ДокОбъект <> Неопределено Тогда
        Попытка
            ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            Сообщить("Не удалось провести: " + СтрокаТЗ.Ссылка + " - " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Метод 2: Сортировка на этапе выгрузки (Произвольный запрос в ПВД)

Если мы хотим, чтобы документы попадали в XML-файл уже в правильном порядке, проанализируем использование ПВД с типом выборки «Произвольный запрос». Этот метод хорош тем, что стандартный механизм загрузки в 1С будет пытаться проводить документы сразу, и если они идут в хронологическом порядке, то ошибок не возникнет.

Разберем логику построения такого запроса. Нам необходимо объединить данные из нескольких таблиц и упорядочить их:


ВЫБРАТЬ
    Документ.Ссылка КАК Ссылка,
    Документ.ДатаПриема КАК ДатаСобытия,
    1 КАК Приоритет
ИЗ
    Документ.ПриемНаРаботу КАК Документ
ГДЕ
    Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Документ.Ссылка,
    Документ.ДатаУвольнения,
    0
ИЗ
    Документ.Увольнение КАК Документ

УПОРЯДОЧИТЬ ПО
    ДатаСобытия,
    Приоритет

В самом обработчике ПВД при обходе результата запроса нужно вызывать функцию ВыгрузитьПоПравилу. Таким образом, мы жестко задаем последовательность записи объектов в файл обмена.

Метод 3: Использование «Даты события» и приоритетов

Выясним причину, почему обычная сортировка по дате документа часто подводит. В кадровом учете документ может быть создан 25-го числа, но описывать событие (прием), которое произойдет 1-го числа следующего месяца. Или наоборот — «задним числом».

Посмотрим на важные реквизиты, которые следует использовать для сортировки:

Проанализируем ситуацию с одинаковыми датами. Если сотрудник увольняется и принимается в один и тот же день (например, переход из одного подразделения в другое через увольнение), важно, чтобы Увольнение имело более высокий приоритет в очереди проведения, чем Прием. Именно для этого в Меhelper-таблицу (Метод 1) мы добавляли колонку Приоритет.

Дополнительные рекомендации по проведению

При массовой загрузке данных рекомендуется отключать автоматическое проведение в правилах (устанавливать РежимЗаписи = "Записать" в ПКО) и использовать отложенное проведение. Рассмотрим несколько нюансов:

  1. Исправительные документы: Если в вашей базе есть документы-исправления, они должны идти в связке. Сначала загружается и проводится «сторнирующий» документ, затем новый «исправляющий».
  2. Транзакции: Проведение большого объема документов в одном цикле в обработчике После загрузки данных может привести к длительной транзакции и блокировкам. Если база большая, рассмотрите возможность проведения документов порциями.
  3. Типовые механизмы: Проверьте, нет ли в конфигурации-приемнике типовой процедуры для массового перепроведения кадровых документов. Иногда проще вызвать ПроцедурыУправленияПерсоналом.ПерепровестиДокументыПоСотруднику(Сотрудник), чем вручную выстраивать очередь каждого документа.

Таким образом, мы рассмотрели основные технические приемы управления последовательностью объектов. Выбор метода зависит от сложности ваших кадровых данных и требований к скорости загрузки, но использование глобальной таблицы значений в обработчиках КД 2.0 остается наиболее универсальным решением для программиста 1С.

← На главную