Как найти процедуру заполнения цены при добавлении номенклатуры в табличную часть 1С:УНФ

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

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

События таблицы против событий конкретной колонки

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

Разберем, почему так происходит. В управляемом приложении 1С 8.3 логика работы с данными распределена между элементами управления. Когда пользователь выбирает товар, срабатывает событие не всей таблицы Запасы, а конкретного поля — Номенклатура. Именно в обработчике ПриИзменении этого поля сосредоточена вся магия первичного заполнения строки: подтягивание цен, единиц измерения, ставок НДС и характеристик.

Для решения задачи нам необходимо найти элемент формы ЗапасыНоменклатура (или аналогичный в вашей версии конфигурации) и проверить его свойства на наличие назначенного обработчика события ПриИзменении. Чаще всего в 1С:УНФ он называется ЗапасыНоменклатураПриИзменении.

Поиск программно назначенных обработчиков

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


Элементы.ЗапасыНоменклатура.УстановитьДействие("ПриИзменении", "ЗапасыНоменклатураПриИзменении");

Если вы столкнулись с такой ситуацией, выполните глобальный поиск (Ctrl+Shift+F) по названию процедуры ЗапасыНоменклатураПриИзменении в модуле формы. Если поиск по модулю формы не дал результатов, попробуйте поискать по фрагменту имени колонки в сочетании со словом ПриИзменении во всей конфигурации.

Последовательность вызова событий при работе с ТЧ

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

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

Особенности отладки: Файловый режим против SQL

Многие разработчики замечают, что отладка ведет себя по-разному в зависимости от типа базы данных. Рассмотрим ситуацию, когда точка останова в процедуре &НаСервере игнорируется в клиент-серверном (SQL) варианте.

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

  1. Служба Агент сервера 1С:Предприятия должна быть запущена с ключом -debug. Без этого флага сервер не будет передавать данные отладчику.
  2. В конфигураторе необходимо зайти в меню Отладка -> Установка параметров отладки и убедиться, что установлен флаг "Отладка серверных вызовов".
  3. В некоторых случаях требуется подключение к серверным сессиям вручную через Отладка -> Подключение.

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

Архитектура ценообразования в 1С:УНФ

Рассмотрим глубже, что происходит внутри процедуры ЗапасыНоменклатураПриИзменении. В УНФ логика редко пишется прямо "в лоб". Проанализируем типичный вызов:


&НаКлиенте
Процедура ЗапасыНоменклатураПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
    
    // Передаем данные на сервер для расчета цены
    СтруктураПараметров = Новый Структура;
    СтруктураПараметров.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
    СтруктураПараметров.Вставить("Дата", Объект.Дата);
    // ... другие параметры (Характеристика, ВидЦен)
    
    РезультатЗаполнения = ПолучитьДанныеНоменклатурыСервер(СтруктураПараметров);
    
    // Заполняем полученные данные в строку
    ЗаполнитьЗначенияСвойств(ТекущаяСтрока, РезультатЗаполнения);
    
    // Вызываем пересчет суммы
    ЗапасыПриИзмененииСуммы(ТекущаяСтрока);
    
КонецПроцедуры

Важно понимать, что сама функция ПолучитьДанныеНоменклатурыСервер обычно обращается к Общим модулям (например, Ценообразование или ОбработкаТабличныхЧастей). Это позволяет системе использовать один и тот же алгоритм расчета цены как в Заказе покупателя, так и в Расходной накладной.

Как правильно реализовать свой пересчет (Использование расширений)

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

Используйте механизм расширений. Создайте расширение и добавьте в него процедуру-обработчик с аннотацией &После:


&После("ЗапасыНоменклатураПриИзменении")
Процедура Расш_ЗапасыНоменклатураПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Ваша кастомная логика пересчета
    Если ТекущаяСтрока.Цена > 1000 Тогда
        ТекущаяСтрока.Цена = ТекущаяСтрока.Цена * 0.9; // Скидка 10%
    КонецЕсли;
    
КонецПроцедуры

Такой подход гарантирует, что ваша логика выполнится сразу после того, как отработает стандартный механизм УНФ, и при этом типовая конфигурация останется "чистой".

Факторы, влияющие на итоговую цену

При отладке и написании своего кода помните, что на цену в УНФ влияет множество факторов, которые нужно учитывать в своих алгоритмах:

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

← На главную