При организации регулярного обмена данными между конфигурациями 1С:Зарплата и Управление Персоналом (ЗУП) и 1С:Бухгалтерия предприятия (БП) технические специалисты часто сталкиваются со странным поведением системы. Типичный сценарий: выполняется загрузка документов, открывается свежесозданный или обновленный документ, а в реквизите шапки Ответственный красуется ФИО давно уволенного бухгалтера-расчетчика.
Самое загадочное в этой ситуации — это результаты первичного анализа. Мы открываем переносимый XML-файл выгрузки обычным текстовым блокнотом, ищем поиске фамилию уволенного сотрудника и... ничего не находим. В XML-файле значение реквизита Ответственный либо полностью отсутствует, либо передается пустым. В правилах обмена (в коде обработчиков) жестких привязок "в лоб" тоже нет. Тем не менее при пошаговой отладке кода, как только отрабатывает системная функция чтения объекта, реквизит Ответственный моментально заполняется этой злополучной фамилией.
В этой статье мы подробно разберем, почему так происходит, изучим внутренние механизмы платформы 1С:Предприятие 8.3 и Библиотеки стандартных подсистем (БСП), а также рассмотрим пошаговые инструкции по устранению этой проблемы.
Давайте проанализируем, как ведет себя платформа 1С при чтении данных из XML-файла во время работы универсального обмена или синхронизации данных. Процесс разбора XML-пакета для каждого объекта состоит из нескольких последовательных этапов:
ПолучитьОбъект(). На этом этапе в оперативной памяти сервера создается объект на основании уже записанных в базу данных реквизитов. В этот момент все реквизиты объекта (включая реквизит Ответственный) заполняются теми значениями, которые физически хранятся в БД приемника.Вот здесь и кроется главный секрет. Если в XML-файле свойство Ответственный пустое или вообще не выгружалось, а в правилах конвертации свойств (ПКС) для этого реквизита не установлен флаг "Замещать значение при загрузке", то старое значение реквизита просто остается нетронутым! Система не очищает поле, если в источнике оно пустое, а оставляет то значение, которое было записано в документе исторически.
Именно поэтому в двух разных тестовых базах, развернутых из разных резервных копий (или сделанных в разное время), могут подставляться разные ФИО уволенных бухгалтеров. В этих базах в уже существующих документах когда-то давно авторами были указаны разные сотрудники. При повторном обмене пустой реквизит из XML не затирает старые данные, и каждый документ сохраняет своего исторического создателя.
Если загружаются абсолютно новые документы, реквизиты которых в базе-приемнике изначально отсутствовали, система не может прочитать их исторические значения. В этом случае 1С задействует стандартные механизмы заполнения пустых реквизитов значениями по умолчанию.
В Библиотеке стандартных подсистем (БСП), на базе которой построены современные конфигурации "1С:Бухгалтерия предприятия" и "1С:ЗУП", в настройках узлов обмена предусмотрены специальные таблицы значений по умолчанию. Давайте выясним, где их искать:
В этих настройках часто задаются такие реквизиты, как "Склад по умолчанию", "Подразделение по умолчанию" и, конечно же, "Ответственный по умолчанию". Если при первоначальной настройке обмена несколько лет назад там был выбран бухгалтер, который впоследствии уволился, система при создании каждого нового документа через этот узел обмена будет автоматически подставлять его в качестве ответственного.
Когда в процессе разбора XML-файла платформа понимает, что объекта в базе-приемнике не существует, она выполняет программное создание нового документа в оперативной памяти (метод СоздатьДокумент()). При этом автоматически вызывается системное событие модуля объекта ОбработкаЗаполнения.
Давайте посмотрим на пример того, как обычно выглядит этот обработчик в типовых конфигурациях:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Заполнение стандартных реквизитов при создании нового документа
Если Не ЗначениеЗаполнено(Ответственный) Тогда
Ответственный = ОпределитьОтветственногоПоУмолчанию();
КонецЕсли;
КонецПроцедуры
На этом этапе XML-данные еще не наложились на созданный объект. Вспомогательная функция ОпределитьОтветственногоПоУмолчанию() может использовать различные алгоритмы поиска:
Если обмен данными запускается регламентным заданием (в фоновом режиме на сервере), оно выполняется от имени конкретного пользователя информационной базы, указанного в настройках этого задания. Если же обмен запускается интерактивно пользователем вручную, то используется текущий сеанс.
В любом случае система может считывать настройки по умолчанию для этого пользователя. Рекомендуется проверить настройки конкретной учетной записи:
Для некоторых видов документов, отражающих взаиморасчеты или продажи, в 1С:Бухгалтерии реализован алгоритм автоматического заполнения ответственного менеджера на основе данных контрагента. Настройка этого поведения расположена по следующему пути:
Администрирование — Настройки пользователей и прав — Вариант заполнения в документах продаж.
Если в системе установлен вариант заполнения "Из контрагента" (или "Из договора"), то при создании документа в процессе обмена платформа определит контрагента, найдет его карточку в справочнике, прочитает закрепленного за ним менеджера (или ответственное лицо из договора) и подставит его в документ. Если за вашими контрагентами в базе до сих пор числятся старые сотрудники, они будут бесконечно появляться в загружаемых документах.
Рассмотрим пошагово действия, которые необходимо выполнить техническому специалисту для гарантированного устранения проблемы автозаполнения уволенного сотрудника.
Если вы хотите понять, как именно сопоставляются и переносятся свойства, вам необходимо проанализировать правила конвертации. В типовых конфигурациях правила обмена часто хранятся непосредственно внутри макетов планов обмена. Выясним, как их извлечь:
ОбменЗарплата30Бухгалтерия30 или аналогичный).Для того чтобы пустые значения реквизита Ответственный из источника (ЗУП) принудительно очищали или перезаписывали поле в приемнике (БП), либо для того чтобы передавать туда конкретное значение, мы можем изменить правила обмена:
ПКО_Документ_ОтражениеЗарплатыВБухучете).Ответственный (или Источник — Ответственный).ПередВыгрузкой или ПриЗагрузке. Например, если мы хотим принудительно назначать ответственным текущего пользователя, выполняющего загрузку:
// Пример кода в обработчике "При загрузке" правила конвертации свойства Ответственный
Если Не ЗначениеЗаполнено(Значение) Тогда
Значение = ПараметрыСеанса.ТекущийПользователь;
КонецЕсли;
Иногда разработчики пишут жесткие алгоритмы заполнения реквизитов непосредственно в глобальных обработчиках правил обмена. Откройте сохраненные правила обмена и проверьте следующие события:
ПослеЗагрузкиОбъекта (в ПКО конкретного документа)ПослеЗагрузкиДанных (в глобальных параметрах правил обмена)Ищите строки кода, содержащие обращения к реквизиту ответственного, например:
// Проверка наличия переопределения ответственного в обработчиках правил
Если Объект.Метаданные().Реквизиты.Найти("Ответственный") <> Неопределено Тогда
Если Не ЗначениеЗаполнено(Объект.Ответственный) Тогда
Объект.Ответственный = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ...);
КонецЕсли;
КонецЕсли;
Если подобный код обнаружен, его следует скорректировать под текущие реалии вашей компании.
Если обмен происходит автоматически по расписанию, выясним, под каким пользователем крутится этот процесс на сервере:
Загадочное появление уволенного бухгалтера в реквизитах документов при обмене "ЗУП — Бухгалтерия" — это не магия, а логичное следствие работы алгоритмов 1С. В 90% случаев проблема вызвана тем, что в базе-приемнике обновляется уже существующий документ, в котором исторически был записан уволенный сотрудник, а пустое значение из XML-файла не перезаписывает его из-за отсутствия флага "Замещать значение". Остальные 10% приходятся на настройки узлов обмена по умолчанию, "Ответственных лиц организации" в карточке компании и персональные настройки пользователей.
Используя предложенные нами шаги по анализу и исправлению, вы сможете быстро локализовать источник проблемы и настроить корректное заполнение реквизитов при обмене данными.