Перенос данных между старыми редакциями программ (например, 1С:УПП 1.3) и современными конфигурациями на управляемых формах (1С:ЗУП 3.1) часто сопровождается трудностями. Одной из самых распространенных проблем является некорректная идентификация сотрудников, особенно если их персональные данные содержат специфические приставки или в базе нарушена целостность кадровых данных. Разберем по шагам, почему возникают такие ошибки и как правильно программно обновлять документы в ЗУП 3.1, чтобы не терять расчетные данные.
Проанализируем ситуацию, когда сотрудник с фамилией, содержащей приставку «АКИФ ОГЛЫ», не подбирается в документ при загрузке через веб-сервис. Выясним причину такого поведения системы. В 1С:ЗУП 3.1 поиск и идентификация объектов при обмене часто строятся на сопоставлении полей Наименование и Табельный номер (Код).
Рассмотрим основные факторы, влияющие на успех поиска:
Физическому лицу может соответствовать несколько объектов в справочнике Сотрудники (например, при внутреннем совместительстве). Если программный код ищет только по наименованию, он может наткнуться на дубль или «старую» карточку уволенного сотрудника.Если объект в базе существует, но документ все равно не «видит» сотрудника, проанализируем состояние вспомогательных регистров. В ЗУП 3.1 для ускорения работы списков и подборов используется регистр сведений Текущие кадровые данные сотрудников.
Если вы записываете данные программно с установленным флагом ОбменДанными.Загрузка = Истина, типовые механизмы обновления этого регистра могут не сработать. В результате сотрудник есть в справочнике, но его «кадровое состояние» (подразделение, должность) не определено. Чтобы исправить это, попробуйте перепровести последний кадровый документ по этому сотруднику или воспользуйтесь следующим методом:
Рассмотрим пример кода для обновления планового ФОТ и кадровых данных:
// Пример программного обновления кадровых данных
КадровыйУчет.АктуализироватьДанныеСотрудника(СотрудникСсылка);
ЗарплатаКадрыОбщиеАлгоритмы.ОбновитьПлановыйФОТ(СотрудникСсылка);
Часто проблема кроется не в коде, а в действиях пользователей (кадровиков). Если в базе много однофамильцев или у одного человека несколько табельных номеров, стандартное поле выбора может вводить в заблуждение. Чтобы облегчить работу, рекомендуем использовать расширение формы, которое изменит Представление сотрудника.
Посмотрим на пример логики, которую можно внедрить через расширение:
Разберем ситуацию, описанную в теме: при программном обновлении документа на сервере и последующей передаче его на форму через ЗначениеВРеквизитФормы(Док, "Объект"), в табличной части исчезают результаты расчетов (НДФЛ, суммы). Почему это происходит?
Проанализируем архитектуру ЗУП 3.1. Многие колонки в документах (например, результат начисления) являются вычисляемыми. Они не всегда хранятся в основных табличных частях в том виде, в котором мы их видим на экране. Когда вы выполняете Док.Записать(РежимЗаписиДокумента.Проведение), система обновляет записи в регистрах. Но метод ЗначениеВРеквизитФормы выполняет полное перечитывание данных объекта. Если в модуле формы или в процедурах пересчета не заложен механизм восстановления этих динамических колонок при чтении, они останутся пустыми до следующего интерактивного изменения.
Чтобы обновить форму без потери данных, рассмотрим альтернативные варианты:
Вариант 1: Использование ОповеститьОбИзменении
Вместо полной перезаписи реквизита формы, после записи документа на сервере, вызовите оповещение на клиенте:
&НаКлиенте
Процедура ПослеВыгрузки(СсылкаНаДокумент)
ОповеститьОбИзменении(СсылкаНаДокумент);
КонецПроцедуры
Вариант 2: Вызов серверных процедур пересчета
Если необходимо обновить данные именно через ЗначениеВРеквизитФормы, необходимо после этого вызвать экспортную процедуру модуля формы, которая отвечает за расчет строк табличной части. В типовых конфигурациях это могут быть процедуры типа РассчитатьДокумент() или ПересчитатьСтроку().
Рассмотрим правильную последовательность действий в коде:
// 1. Получаем объект из реквизита формы
ДокОбъект = РеквизитФормыВЗначение("Объект");
// 2. Выполняем необходимые действия и записываем
ДокОбъект._Выгружен = Истина;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
// 3. Возвращаем данные на форму
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
// 4. ВАЖНО: вызываем типовой механизм пересчета, чтобы заполнить экранные колонки
// В зависимости от документа, название процедуры может отличаться
ЭтаФорма.РассчитатьДокументНаСервере();
Для стабильного обмена между УПП и ЗУП 3.1 необходимо: