Почему при загрузке документов через обмен данными в 1С 8.3 в поле "Ответственный" подставляется уволенный сотрудник?

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

При организации регулярного обмена данными между конфигурациями 1С:Зарплата и Управление Персоналом (ЗУП) и 1С:Бухгалтерия предприятия (БП) технические специалисты часто сталкиваются со странным поведением системы. Типичный сценарий: выполняется загрузка документов, открывается свежесозданный или обновленный документ, а в реквизите шапки Ответственный красуется ФИО давно уволенного бухгалтера-расчетчика.

Самое загадочное в этой ситуации — это результаты первичного анализа. Мы открываем переносимый XML-файл выгрузки обычным текстовым блокнотом, ищем поиске фамилию уволенного сотрудника и... ничего не находим. В XML-файле значение реквизита Ответственный либо полностью отсутствует, либо передается пустым. В правилах обмена (в коде обработчиков) жестких привязок "в лоб" тоже нет. Тем не менее при пошаговой отладке кода, как только отрабатывает системная функция чтения объекта, реквизит Ответственный моментально заполняется этой злополучной фамилией.

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

Причина 1. Механизм поиска и замещения существующих объектов базы данных

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

  1. Поиск объекта в базе-приемнике. Система считывает уникальный идентификатор (UUID) объекта или поля поиска, определенные в правилах конвертации объектов (ПКО), и пытается найти этот документ в информационной базе БП.
  2. Чтение существующего объекта в память. Если документ с таким UUID или ключевыми полями уже существует в базе-приемнике, платформа выполняет метод ПолучитьОбъект(). На этом этапе в оперативной памяти сервера создается объект на основании уже записанных в базу данных реквизитов. В этот момент все реквизиты объекта (включая реквизит Ответственный) заполняются теми значениями, которые физически хранятся в БД приемника.
  3. Наложение свойств из XML. Платформа начинает обходить свойства, переданные в XML-файле для данного объекта, и перезаписывать их в созданном в памяти объекте.

Вот здесь и кроется главный секрет. Если в XML-файле свойство Ответственный пустое или вообще не выгружалось, а в правилах конвертации свойств (ПКС) для этого реквизита не установлен флаг "Замещать значение при загрузке", то старое значение реквизита просто остается нетронутым! Система не очищает поле, если в источнике оно пустое, а оставляет то значение, которое было записано в документе исторически.

Именно поэтому в двух разных тестовых базах, развернутых из разных резервных копий (или сделанных в разное время), могут подставляться разные ФИО уволенных бухгалтеров. В этих базах в уже существующих документах когда-то давно авторами были указаны разные сотрудники. При повторном обмене пустой реквизит из XML не затирает старые данные, и каждый документ сохраняет своего исторического создателя.

Причина 2. Автоматическое заполнение по умолчанию в настройках синхронизации

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

В Библиотеке стандартных подсистем (БСП), на базе которой построены современные конфигурации "1С:Бухгалтерия предприятия" и "1С:ЗУП", в настройках узлов обмена предусмотрены специальные таблицы значений по умолчанию. Давайте выясним, где их искать:

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

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

Причина 3. Инициализация в обработчике события "ОбработкаЗаполнения" модуля объекта

Когда в процессе разбора XML-файла платформа понимает, что объекта в базе-приемнике не существует, она выполняет программное создание нового документа в оперативной памяти (метод СоздатьДокумент()). При этом автоматически вызывается системное событие модуля объекта ОбработкаЗаполнения.

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


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

На этом этапе XML-данные еще не наложились на созданный объект. Вспомогательная функция ОпределитьОтветственногоПоУмолчанию() может использовать различные алгоритмы поиска:

Причина 4. Персональные настройки пользователя, выполняющего загрузку

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

В любом случае система может считывать настройки по умолчанию для этого пользователя. Рекомендуется проверить настройки конкретной учетной записи:

  1. Перейдем в раздел Главное — Настройки — Персональные настройки.
  2. Проверим заполнение полей "Основная организация", "Основное подразделение".
  3. В более ранних версиях БП или в специализированных отраслевых решениях в персональных настройках пользователя присутствует явное поле "Основной ответственный" (или "Основной автор документов"). Убедимся, что там не выбрана учетная запись или физическое лицо уволенного сотрудника.

Причина 5. Вариант заполнения ответственного "Из контрагента"

Для некоторых видов документов, отражающих взаиморасчеты или продажи, в 1С:Бухгалтерии реализован алгоритм автоматического заполнения ответственного менеджера на основе данных контрагента. Настройка этого поведения расположена по следующему пути:

Администрирование — Настройки пользователей и прав — Вариант заполнения в документах продаж.

Если в системе установлен вариант заполнения "Из контрагента" (или "Из договора"), то при создании документа в процессе обмена платформа определит контрагента, найдет его карточку в справочнике, прочитает закрепленного за ним менеджера (или ответственное лицо из договора) и подставит его в документ. Если за вашими контрагентами в базе до сих пор числятся старые сотрудники, они будут бесконечно появляться в загружаемых документах.

Как локализовать и решить проблему: пошаговый алгоритм

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

Шаг 1. Поиск правил обмена в конфигурации

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

  1. Откроем базу 1С:ЗУП (или 1С:БП) в режиме Конфигуратор.
  2. В дереве метаданных перейдем по пути: Общие — Планы обмена.
  3. Найдем план обмена, отвечающий за синхронизацию с бухгалтерией (например, ОбменЗарплата30Бухгалтерия30 или аналогичный).
  4. Щелкнем по нему правой кнопкой мыши, выберем пункт Открыть макеты.
  5. Найдем макет с именем ПравилаОбмена или ПравилаОбменаКорреспондента. Обычно это XML-документ, содержащий правила, созданные в программе "Конвертация данных 2.0".
  6. Сохраним этот макет на диск в виде XML-файла.

Шаг 2. Корректировка правил обмена в Конвертации Данных

Для того чтобы пустые значения реквизита Ответственный из источника (ЗУП) принудительно очищали или перезаписывали поле в приемнике (БП), либо для того чтобы передавать туда конкретное значение, мы можем изменить правила обмена:

  1. Загрузим сохраненные правила обмена в базу "Конвертация данных, редакция 2".
  2. Найдем нужное нам Правило конвертации объектов (ПКО) для загружаемого документа (например, ПКО_Документ_ОтражениеЗарплатыВБухучете).
  3. В табличной части настройки свойств найдем строку, где Источник — пусто, а Приемник — Ответственный (или Источник — Ответственный).
  4. В свойствах этой строки установим флаг "Замещать значение при загрузке". Это заставит систему принудительно записывать переданное (даже пустое) значение поверх существующего в базе-приемнике.
  5. При необходимости мы можем написать код в обработчике ПКС ПередВыгрузкой или ПриЗагрузке. Например, если мы хотим принудительно назначать ответственным текущего пользователя, выполняющего загрузку:

// Пример кода в обработчике "При загрузке" правила конвертации свойства Ответственный
Если Не ЗначениеЗаполнено(Значение) Тогда
    Значение = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;

Шаг 3. Анализ обработчиков в правилах обмена

Иногда разработчики пишут жесткие алгоритмы заполнения реквизитов непосредственно в глобальных обработчиках правил обмена. Откройте сохраненные правила обмена и проверьте следующие события:

Ищите строки кода, содержащие обращения к реквизиту ответственного, например:


// Проверка наличия переопределения ответственного в обработчиках правил
Если Объект.Метаданные().Реквизиты.Найти("Ответственный") <> Неопределено Тогда
    Если Не ЗначениеЗаполнено(Объект.Ответственный) Тогда
        Объект.Ответственный = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ...);
    КонецЕсли;
КонецЕсли;

Если подобный код обнаружен, его следует скорректировать под текущие реалии вашей компании.

Шаг 4. Настройка регламентного задания обмена

Если обмен происходит автоматически по расписанию, выясним, под каким пользователем крутится этот процесс на сервере:

  1. Зайдем в базу 1С:Бухгалтерия с правами администратора.
  2. Перейдем в раздел Администрирование — Обслуживание — Регламентные операции — Регламентные и фоновые задания.
  3. Найдем задание, связанное с синхронизацией данных (например, "Синхронизация данных с Зарплата и управление персоналом...").
  4. Посмотрим, какой пользователь указан в колонке Имя пользователя.
  5. Если там указан уволенный сотрудник (или системная учетная запись, ассоциированная с ним), переопределим пользователя, запустив регламентное задание под актуальной системной учетной записью.

Резюме

Загадочное появление уволенного бухгалтера в реквизитах документов при обмене "ЗУП — Бухгалтерия" — это не магия, а логичное следствие работы алгоритмов 1С. В 90% случаев проблема вызвана тем, что в базе-приемнике обновляется уже существующий документ, в котором исторически был записан уволенный сотрудник, а пустое значение из XML-файла не перезаписывает его из-за отсутствия флага "Замещать значение". Остальные 10% приходятся на настройки узлов обмена по умолчанию, "Ответственных лиц организации" в карточке компании и персональные настройки пользователей.

Используя предложенные нами шаги по анализу и исправлению, вы сможете быстро локализовать источник проблемы и настроить корректное заполнение реквизитов при обмене данными.

← На главную