Переход с платформы 1С:Предприятие 7.7 на 8.3 (особенно на управляемые формы) часто вызывает сложности у разработчиков из-за принципиально иной модели обработки событий. Одной из типовых задач является необходимость пересчета цены или подстановки специфических данных в новую строку табличной части при выборе товара. В этой статье мы подробно разберем, как отследить момент заполнения полей, почему стандартные события таблицы могут "молчать" и как правильно настроить отладку, чтобы увидеть весь процесс изнутри.
Проанализируем типичную ошибку начинающего разработчика: поиск логики заполнения данных в событиях самой таблицы, таких как ЗапасыПередНачаломДобавления или ЗапасыПриНачалеРедактирования. На этом этапе платформа только подготавливает строку или открывает форму выбора, но сама номенклатура еще не выбрана. Следовательно, данных для расчета цены в этот момент просто не существует.
Разберем, почему так происходит. В управляемом приложении 1С 8.3 логика работы с данными распределена между элементами управления. Когда пользователь выбирает товар, срабатывает событие не всей таблицы Запасы, а конкретного поля — Номенклатура. Именно в обработчике ПриИзменении этого поля сосредоточена вся магия первичного заполнения строки: подтягивание цен, единиц измерения, ставок НДС и характеристик.
Для решения задачи нам необходимо найти элемент формы ЗапасыНоменклатура (или аналогичный в вашей версии конфигурации) и проверить его свойства на наличие назначенного обработчика события ПриИзменении. Чаще всего в 1С:УНФ он называется ЗапасыНоменклатураПриИзменении.
Иногда при просмотре свойств элемента формы в конфигураторе поле события может оказаться пустым. Это не означает, что кода нет. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) широко применяется программное назначение действий. Это делается в процедуре ПриСозданииНаСервере с помощью метода:
Элементы.ЗапасыНоменклатура.УстановитьДействие("ПриИзменении", "ЗапасыНоменклатураПриИзменении");
Если вы столкнулись с такой ситуацией, выполните глобальный поиск (Ctrl+Shift+F) по названию процедуры ЗапасыНоменклатураПриИзменении в модуле формы. Если поиск по модулю формы не дал результатов, попробуйте поискать по фрагменту имени колонки в сочетании со словом ПриИзменении во всей конфигурации.
Для понимания архитектуры процесса рассмотрим последовательность событий, которые генерирует платформа при добавлении строки:
Многие разработчики замечают, что отладка ведет себя по-разному в зависимости от типа базы данных. Рассмотрим ситуацию, когда точка останова в процедуре &НаСервере игнорируется в клиент-серверном (SQL) варианте.
Выясним причину: в файловой базе клиентское приложение и серверный контекст работают в рамках одного процесса. В клиент-серверном варианте это разные процессы, зачастую на разных физических машинах. Чтобы "поймать" код, выполняющийся на стороне сервера приложений, необходимо выполнить следующие настройки:
-debug. Без этого флага сервер не будет передавать данные отладчику.Именно поэтому для быстрой разработки и поиска нужных процедур часто рекомендуют использовать локальную файловую копию базы — там отладка работает "из коробки" и позволяет мгновенно перемещаться между клиентским и серверным кодом.
Рассмотрим глубже, что происходит внутри процедуры ЗапасыНоменклатураПриИзменении. В УНФ логика редко пишется прямо "в лоб". Проанализируем типичный вызов:
&НаКлиенте
Процедура ЗапасыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
// Передаем данные на сервер для расчета цены
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
СтруктураПараметров.Вставить("Дата", Объект.Дата);
// ... другие параметры (Характеристика, ВидЦен)
РезультатЗаполнения = ПолучитьДанныеНоменклатурыСервер(СтруктураПараметров);
// Заполняем полученные данные в строку
ЗаполнитьЗначенияСвойств(ТекущаяСтрока, РезультатЗаполнения);
// Вызываем пересчет суммы
ЗапасыПриИзмененииСуммы(ТекущаяСтрока);
КонецПроцедуры
Важно понимать, что сама функция ПолучитьДанныеНоменклатурыСервер обычно обращается к Общим модулям (например, Ценообразование или ОбработкаТабличныхЧастей). Это позволяет системе использовать один и тот же алгоритм расчета цены как в Заказе покупателя, так и в Расходной накладной.
Если ваша задача — изменить стандартную логику (например, добавить дополнительную скидку в зависимости от специфического реквизита контрагента), крайне не рекомендуется править типовой код напрямую. Это существенно усложнит обновление конфигурации в будущем.
Используйте механизм расширений. Создайте расширение и добавьте в него процедуру-обработчик с аннотацией &После:
&После("ЗапасыНоменклатураПриИзменении")
Процедура Расш_ЗапасыНоменклатураПриИзменении(Элемент)
ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
// Ваша кастомная логика пересчета
Если ТекущаяСтрока.Цена > 1000 Тогда
ТекущаяСтрока.Цена = ТекущаяСтрока.Цена * 0.9; // Скидка 10%
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что ваша логика выполнится сразу после того, как отработает стандартный механизм УНФ, и при этом типовая конфигурация останется "чистой".
При отладке и написании своего кода помните, что на цену в УНФ влияет множество факторов, которые нужно учитывать в своих алгоритмах:
Проанализировав все вышеперечисленные аспекты, вы сможете не только быстро найти место заполнения данных, но и грамотно встроить свою логику в экосистему 1С:Управление нашей фирмой.