Почему в 1С:ЗУП 3.1 данные физического лица сохраняются только со второго раза?

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

Рассмотрим весьма специфичную, но часто встречающуюся проблему при работе в конфигурации 1С:Зарплата и Управление Персоналом (ЗУП 3.1). Ситуация выглядит следующим образом: мы открываем карточку физического лица, вносим изменения в данные (например, корректируем ФИО, паспортные данные или адреса), нажимаем кнопку «Записать и закрыть». Окно закрывается, но при повторном открытии карточки мы видим, что данные не сохранились. Однако, если мы сделаем всё то же самое повторно (со второго раза), программа успешно записывает изменения.

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

Выясним причину: влияние расширений конфигурации

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

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

Технические причины сбоя при сохранении

Платформа 1С использует четкую последовательность событий при записи объектов и взаимодействии с формой. Разберем три основные технические ошибки в коде расширений, которые приводят к сохранению «со второго раза»:

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

Диагностируем проблему по шагам

Если мы столкнулись с подобным поведением ЗУП 3.1, проанализируем ситуацию системно. Выполним следующие шаги диагностики:

  1. Отключение расширений: Зайдем в меню «Администрирование» -> «Печатные формы, отчеты и обработки» -> «Расширения». Временно снимем флажок «Активно» для расширения, которое связано с учетом физических лиц (в нашем случае — расширение для мигрантов). Перезапустим сеанс 1С и попробуем сохранить карточку. Если сохранилось с первого раза — причина локализована, виновато именно это расширение.
  2. Анализ журнала регистрации: Посмотрим журнал регистрации за тот момент времени, когда мы пытались сохранить данные в первый раз. Возможно, там зафиксированы ошибки уровня базы данных или неявные отказы в доступе.
  3. Отладка в Конфигураторе: Откроем Конфигуратор 1С. Поставим точки останова (breakpoints) в модуле формы физического лица на обработчиках ПередЗаписью, ПриЗаписиНаСервере и ПослеЗаписи. Пройдем по шагам и посмотрим, в какой момент переменная Отказ меняет свое значение на Истина или на каком этапе сбрасывается Модифицированность формы.

Типовые альтернативы: как обойтись без расширений

Многие ошибки возникают из-за попыток «дописать» систему там, где уже существуют готовые типовые механизмы. Рассмотрим, как можно решить задачу учета сроков регистрации мигрантов (ради которой и создавалось проблемное расширение) штатными средствами 1С:ЗУП 3.1.

Вариант 1. Использование механизма дополнительных реквизитов.
Если кадровой службе нужно просто фиксировать некую дату окончания регистрации, нет нужды писать код. Мы можем зайти в раздел «Администрирование» -> «Общие настройки» -> «Дополнительные реквизиты и сведения». Создадим новый дополнительный реквизит с типом Дата и назначим его для справочника «Физические лица». Он автоматически появится в карточке, его данные будут корректно сохраняться без каких-либо сбоев с первого раза, и его можно будет выводить во все типовые кадровые отчеты.

Вариант 2. Ввод данных через «Иные документы».
В типовой карточке физического лица есть раздел для ввода удостоверяющих документов. Там можно выбрать тип «Иные документы, выдаваемые органами МВД». Для них предусмотрены штатные поля: дата выдачи, срок действия и кем выдан документ. Мы можем вносить данные миграционных карт непосредственно туда.

Вариант 3. Полноценный штатный учет иностранных граждан.
Самый правильный путь — включить типовую поддержку учета иностранцев. Если в настройках кадрового учета ЗУП 3.1 активировать эту опцию, в карточке сотрудника появится полноценный раздел «Страхование». В нем можно указать:

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

Подводя итог: если вы заметили, что данные справочника сохраняются в 1С:ЗУП 3.1 только со второго раза, в 99% случаев проблема кроется в алгоритмах подключенных расширений. Рекомендуем провести аудит кода расширения, а также проанализировать возможность переноса логики на мощные типовые механизмы программы.

← На главную