Как перенести функционал из УТ 10.3 в КА 2.4 с помощью расширения: решаем проблемы с интерфейсом и сохранением данных

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

Переход с платформы 1С:Предприятие 8.1/8.2 (обычные формы, например, УТ 10.3) на современные конфигурации вроде Комплексная автоматизация 2.4 или ERP (управляемые формы) требует от разработчика коренной смены подхода. Частое использование механизмов расширений без учета архитектуры управляемого приложения приводит к тому, что доработки «не видны» или «не работают». В этой статье мы подробно разберем, как правильно реализовать раскраску списков, добавить новые поля в документы и обеспечить их корректное сохранение.

Проблема 1: Раскраска строк в списке (Условное оформление)

В старых конфигурациях на обычных формах (УТ 10.3) для изменения цвета строки использовалось событие ПриВыводеСтроки. Программист писал код, который выполнялся для каждой отрисовываемой строки. В управляемом приложении (КА 2.4) такого события нет. Попытка перенести этот код «как есть» через расширение не даст результата, так как логика интерфейса теперь отделена от данных.

Рассмотрим, как правильно реализовать раскраску строк в расширении. Для этого используется механизм Условного оформления. Мы можем настроить его программно в модуле формы. Проанализируем пример кода, который нужно разместить в процедуре ПриСозданииНаСервере (используя аннотацию &После):


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем новый элемент условного оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Указываем, какое именно оформление мы хотим применить
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
    
    // Устанавливаем условие: когда СостояниеЗаказа равно "ЗаявкаНаРассмотрении"
    ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Список.СостояниеЗаказа");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементУсловия.ПравоеЗначение = Перечисления.СостоянияЗаказов.ЗаявкаНаРассмотрении;
    
    // Указываем, какие поля формы должны раскрашиваться (или вся строка)
    ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
    ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Список");
    ПолеОформления.Использование = Истина;

КонецПроцедуры

Важный момент: в управляемых формах раскраска выполняется на стороне платформы по заданным правилам, что значительно ускоряет работу интерфейса при больших списках.

Проблема 2: Новые реквизиты не сохраняются в базе данных

Распространенная ошибка — добавление реквизитов только на форму документа в расширении. Реквизиты формы существуют только «в памяти» открытого окна. Чтобы данные сохранялись в таблицах SQL и были доступны после закрытия документа, их необходимо добавить в сам Объект (документ ЗаказКлиента) внутри расширения.

Разберем алгоритм действий по шагам:

  1. Откройте расширение в конфигураторе.
  2. Найдите документ ЗаказКлиента и добавьте его в расширение (если он еще не там).
  3. В ветке «Реквизиты» расширенного документа создайте нужные поля: ДатаАукциона, СостояниеЗаказа и т.д.
  4. Только после этого перетащите эти реквизиты на форму документа.

Выясним причину, почему данные могут не записываться, даже если реквизиты добавлены правильно. Это может быть связано с тем, что в коде расширения предпринимаются попытки обратиться к форме из модуля объекта. Посмотрим на ошибочный пример:


// ТАК ДЕЛАТЬ НЕЛЬЗЯ
Процедура Расш1_ПриЗаписи(Отказ)
    ФормаТендер = ЭтотОбъект.ПолучитьФорму("ФормаДокумента"); // Ошибка!
    ДатаАукциона = ФормаТендер.ЭлементыФормы.ДатаАукциона; 
КонецПроцедуры

В управляемом приложении действует жесткое разделение: Модуль объекта выполняется на сервере и не имеет доступа к Форме (интерфейсу). Если вы добавили реквизиты в объект, они доступны напрямую через ЭтотОбъект.ДатаАукциона. Платформа сама запишет их при сохранении документа, никакие дополнительные процедуры ПриЗаписи для базового сохранения писать не нужно.

Проблема 3: Добавленная страница (вкладка) не видна в режиме пользователя

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

  1. Безопасный режим расширения. По умолчанию расширения подключаются в безопасном режиме. Зайдите в меню «НСИ и Администрирование» -> «Печатные формы, отчеты и обработки» -> «Расширения» и снимите галочку Безопасный режим (и «Защита от опасных действий»). Это часто блокирует сложную логику отображения.
  2. Настройки формы пользователем. 1С сохраняет индивидуальные настройки окон. Если вы ранее открывали этот документ, система может «помнить» старый состав вкладок. Чтобы увидеть изменения, нажмите в форме документа Еще -> Установить стандартные настройки.
  3. Права доступа. Убедитесь, что в расширении созданы или заимствованы роли, дающие права на Просмотр и Редактирование новых реквизитов для вашего пользователя.

Проблема 4: Взаимодействие реквизитов и проведение документа

Если ваша задача — чтобы данные из новых полей попадали в отчеты, то простого добавления реквизитов в документ недостаточно. Нужно реализовать движения по регистрам. Для этого в расширении необходимо перехватить процедуру ОбработкаПроведения.

Рассмотрим пример добавления движений:


&После("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Если нужно записать данные в свой регистр сведений или накопления
    Запись = РегистрыСведений.Расш1_ДанныеАукционов.СоздатьМенеджерЗаписи();
    Запись.Период = Дата;
    Запись.ЗаказКлиента = Ссылка;
    Запись.Состояние = СостояниеЗаказа; // Наш новый реквизит
    Запись.Записать();
    
КонецПроцедуры

Резюмируем: при переносе функционала из УТ 10.3 в КА 2.4 забудьте про ПриВыводеСтроки и ЭлементыФормы в модуле объекта. Используйте Условное оформление для визуала, добавляйте реквизиты в Объект для хранения данных и всегда проверяйте настройки Безопасного режима расширения. Это обеспечит стабильную работу вашей системы и чистоту кода.

← На главную