Почему при изменении даты документа очищаются реквизиты табличной части и как это исправить

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

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

Механизм 1: Связи параметров выбора — главная «невидимая» причина

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

Для проверки выполним следующие шаги:

  1. Откроем конфигуратор и найдем нужную табличную часть документа.
  2. Перейдем в свойства реквизита, который очищается.
  3. Найдем пункт Связи параметров выбора и нажмем на кнопку с многоточием.
  4. Посмотрим, нет ли там связи с полем Отбор.Дата или ссылок на Объект.Дата.

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

Механизм 2: Использование замера производительности для поиска скрытого кода

Если связи параметров выбора отсутствуют, а код в ДатаПриИзменении закомментирован, значит, срабатывает программный код, который находится «вне зоны видимости» основного модуля. Разберем, как его найти. Самый эффективный метод — Замер производительности. Он фиксирует абсолютно все строки кода, которые выполняются в момент взаимодействия с интерфейсом.

Пошаговый алгоритм действий:

  1. Запустим сеанс «1С:Предприятие» в режиме отладки.
  2. Откроем нужный документ, но пока не меняем дату.
  3. В конфигураторе перейдем в меню Отладка — Замер производительности (включим его).
  4. В пользовательском режиме изменим дату документа (произойдет очистка).
  5. Снова нажмем Замер производительности в конфигураторе, чтобы остановить запись и открыть результат.

В открывшемся окне мы увидим список всех процедур и функций. Проанализируем колонку «Количество строк» и «Модуль». Нас должны интересовать вызовы, которые происходят в Общих модулях или модулях с префиксами расширений. Часто очистка зашита в типовые механизмы БСП (Библиотеки стандартных подсистем), которые вызываются неявно.

Механизм 3: Проверка расширений конфигурации

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

Логика очистки может быть реализована в процедуре с аннотацией &После или &Вместо. Пример того, как это может выглядеть в модуле расширения:


&После("ДатаПриИзменении")
Процедура Расш1_ДатаПриИзменении(Элемент)
    // Этот код сработает после выполнения основного обработчика,
    // даже если основной обработчик пустой или закомментирован.
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        СтрокаТЧ.Цена = 0;
        СтрокаТЧ.Сумма = 0;
    КонецЦикла;
КонецПроцедуры

Проанализируем список расширений в базе и поищем в них модуль формы вашего документа. Если нашли — проверьте обработчики событий элементов формы.

Механизм 4: Свойство «Очищать при изменении»

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

Механизм 5: Подписки на события и серверные вызовы

Иногда изменение даты инициирует серверный звонок, который запускает цепочку событий в модуле объекта. Проверим события ОбработкаПроверкиЗаполнения или специфические вызовы в ПриЗаписи, если форма настроена на автоматическое сохранение при изменении ключевых реквизитов. Хотя это редкость для события «При изменении», исключать такой вариант нельзя, особенно в сильно кастомизированных конфигурациях.

Также стоит обратить внимание на событие формы ПриИзмененииДанных. Оно универсально и срабатывает при изменении любых данных в форме. Если логика очистки заложена в нем, то комментирование ДатаПриИзменении не даст никакого эффекта. Рассмотрим пример кода в таком обработчике:


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

Механизм 6: Типовые механизмы БСП (Заполнение объектов)

В современных конфигурациях (УТ 11, ERP, КА 2) очистка или пересчет ТЧ часто вынесены в специализированные общие модули, отвечающие за «пересчет документа». При изменении даты вызывается типовая процедура, например, ОбъектКлиент.ДатаПриИзменении(ЭтотОбъект). Внутри этой процедуры может запускаться целая цепочка проверок. Проанализируем, нет ли подобных вызовов в вашем модуле. Даже если вы закомментировали содержимое, проверьте, не остались ли вызовы в других событиях, таких как ПриСменеДаты (если это программно созданная кнопка или команда).

Подведем итоги

Если вы столкнулись с автоматической очисткой реквизитов ТЧ, действуйте по следующему плану:

  1. Проверьте метаданные: Изучите «Связи параметров выбора» у очищаемых реквизитов.
  2. Используйте отладку: Запустите замер производительности, чтобы увидеть, какой именно модуль и строка кода выполняют очистку.
  3. Ищите в расширениях: Проверьте, нет ли перехвата события ДатаПриИзменении в расширениях конфигурации.
  4. Изучите свойства формы: Проверьте свойство Очищать при изменении у элементов формы.

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

← На главную