Переход с платформы 1С:Предприятие 8.1/8.2 (обычные формы, например, УТ 10.3) на современные конфигурации вроде Комплексная автоматизация 2.4 или ERP (управляемые формы) требует от разработчика коренной смены подхода. Частое использование механизмов расширений без учета архитектуры управляемого приложения приводит к тому, что доработки «не видны» или «не работают». В этой статье мы подробно разберем, как правильно реализовать раскраску списков, добавить новые поля в документы и обеспечить их корректное сохранение.
В старых конфигурациях на обычных формах (УТ 10.3) для изменения цвета строки использовалось событие ПриВыводеСтроки. Программист писал код, который выполнялся для каждой отрисовываемой строки. В управляемом приложении (КА 2.4) такого события нет. Попытка перенести этот код «как есть» через расширение не даст результата, так как логика интерфейса теперь отделена от данных.
Рассмотрим, как правильно реализовать раскраску строк в расширении. Для этого используется механизм Условного оформления. Мы можем настроить его программно в модуле формы. Проанализируем пример кода, который нужно разместить в процедуре ПриСозданииНаСервере (используя аннотацию &После):
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем новый элемент условного оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
// Указываем, какое именно оформление мы хотим применить
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
// Устанавливаем условие: когда СостояниеЗаказа равно "ЗаявкаНаРассмотрении"
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Список.СостояниеЗаказа");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = Перечисления.СостоянияЗаказов.ЗаявкаНаРассмотрении;
// Указываем, какие поля формы должны раскрашиваться (или вся строка)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Список");
ПолеОформления.Использование = Истина;
КонецПроцедуры
Важный момент: в управляемых формах раскраска выполняется на стороне платформы по заданным правилам, что значительно ускоряет работу интерфейса при больших списках.
Распространенная ошибка — добавление реквизитов только на форму документа в расширении. Реквизиты формы существуют только «в памяти» открытого окна. Чтобы данные сохранялись в таблицах SQL и были доступны после закрытия документа, их необходимо добавить в сам Объект (документ ЗаказКлиента) внутри расширения.
Разберем алгоритм действий по шагам:
ЗаказКлиента и добавьте его в расширение (если он еще не там).ДатаАукциона, СостояниеЗаказа и т.д.Выясним причину, почему данные могут не записываться, даже если реквизиты добавлены правильно. Это может быть связано с тем, что в коде расширения предпринимаются попытки обратиться к форме из модуля объекта. Посмотрим на ошибочный пример:
// ТАК ДЕЛАТЬ НЕЛЬЗЯ
Процедура Расш1_ПриЗаписи(Отказ)
ФормаТендер = ЭтотОбъект.ПолучитьФорму("ФормаДокумента"); // Ошибка!
ДатаАукциона = ФормаТендер.ЭлементыФормы.ДатаАукциона;
КонецПроцедуры
В управляемом приложении действует жесткое разделение: Модуль объекта выполняется на сервере и не имеет доступа к Форме (интерфейсу). Если вы добавили реквизиты в объект, они доступны напрямую через ЭтотОбъект.ДатаАукциона. Платформа сама запишет их при сохранении документа, никакие дополнительные процедуры ПриЗаписи для базового сохранения писать не нужно.
Вы добавили страницу «Аукцион» в расширение, разместили на ней поля, но в режиме «1С:Предприятие» ничего не изменилось. Проанализируем возможные причины:
Еще -> Установить стандартные настройки.Если ваша задача — чтобы данные из новых полей попадали в отчеты, то простого добавления реквизитов в документ недостаточно. Нужно реализовать движения по регистрам. Для этого в расширении необходимо перехватить процедуру ОбработкаПроведения.
Рассмотрим пример добавления движений:
&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
// Если нужно записать данные в свой регистр сведений или накопления
Запись = РегистрыСведений.Расш1_ДанныеАукционов.СоздатьМенеджерЗаписи();
Запись.Период = Дата;
Запись.ЗаказКлиента = Ссылка;
Запись.Состояние = СостояниеЗаказа; // Наш новый реквизит
Запись.Записать();
КонецПроцедуры
Резюмируем: при переносе функционала из УТ 10.3 в КА 2.4 забудьте про ПриВыводеСтроки и ЭлементыФормы в модуле объекта. Используйте Условное оформление для визуала, добавляйте реквизиты в Объект для хранения данных и всегда проверяйте настройки Безопасного режима расширения. Это обеспечит стабильную работу вашей системы и чистоту кода.