Переход с обычного интерфейса (платформа 8.2) на управляемый (8.3) часто вызывает трудности у разработчиков, привыкших к прямой работе с объектами метаданных на форме. Одной из классических задач является программное чтение текущих отборов списка документов и передача их в другую форму. Разберем по шагам, как адаптировать старый код под требования управляемого приложения.
В обычных формах основным реквизитом формы списка был объект с типом ДокументСписок. В управляемых формах на смену ему пришел более мощный и гибкий механизм — Динамический список. Рассмотрим типичную ошибку, когда при переносе кода система выдает сообщение: «Переменная не определена (ДокументСписок)».
Проанализируем ситуацию: в управляемой форме реквизит, отвечающий за отображение данных в таблице, по умолчанию называется Список. Если вы переименовывали его в свойствах формы, необходимо использовать ваше имя. В большинстве случаев достаточно заменить обращение к ДокументСписок на Список.
Однако просто заменить имя недостаточно, так как структура объектов Отбор в этих типах существенно различается. Если в 8.2 мы могли обратиться к значению через Список.Отбор.Дата.Значение, то в 8.3 работа с фильтрами строится через Компоновщик настроек.
Следующая ошибка, с которой столкнулся автор темы: «Процедура или функция с указанным именем не определена (ОткрытьФорму)». Это происходит из-за несоблюдения принципов разделения контекста «Клиент-Сервер».
Выясним причину: в управляемом приложении программный код может исполняться либо на стороне клиента (в браузере или тонком клиенте), либо на стороне сервера. Метод ОткрытьФорму является интерфейсным, он создает окно на экране пользователя, поэтому его вызов допустим только в процедурах с директивой &НаКлиенте. Если вы пытаетесь открыть форму из серверного метода, система выдаст ошибку компиляции.
Рассмотрим правильную структуру вызова:
&НаКлиенте
Процедура ДействияФормыКопировать(Кнопка)
// Подготавливаем параметры для открытия
ПараметрыФормы = Новый Структура;
// Получаем данные периода (рассмотрим этот механизм ниже)
ЗаполнитьПараметрыПериода(ПараметрыФормы);
// Вызываем открытие формы на клиенте
ОткрытьФорму("ОбщаяФорма.КопироватьНаСледующийМесяц", ПараметрыФормы);
КонецПроцедуры
В современных конфигурациях для управления периодом в списках часто используется стандартный элемент формы. Посмотрим на пример того, как быстро получить дату начала и дату окончания, установленные пользователем. Как было замечено в обсуждении, доступ к этим данным можно получить через свойства элемента управления:
Вариант 1: Через элемент формы «Период»
Если на вашей форме вынесен стандартный период, данные извлекаются следующим образом:
ДатаНачала = Элементы.Список.Период.ДатаНачала;
ДатаОкончания = Элементы.Список.Период.ДатаОкончания;
Вариант 2: Через Компоновщик настроек (универсальный способ)
Если же нам нужно программно проанализировать все отборы, установленные пользователем (в том числе через расширенный поиск), нам придется обратиться к компоновщику настроек. Это более сложный, но надежный путь. Разберем по шагам, как найти конкретное поле отбора:
&НаСервере
Функция ПолучитьЗначениеОтбора(ИмяПоля)
Для Каждого ЭлементОтбора Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ОтборКомпоновкиДанных") Тогда
Для Каждого ПунктОтбора Из ЭлементОтбора.Элементы Цикл
Если Строка(ПунктОтбора.ЛевоеЗначение) = ИмяПоля Тогда
Возврат ПунктОтбора.ПравоеЗначение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Важно помнить, что в управляемых формах СтандартныйПериод — это объект, который может содержать не только конкретные даты, но и вариант периода (например, "Этот месяц"). При обращении к ДатаНачала и ДатаОкончания платформа автоматически вычисляет фактические границы периода на основе текущей даты. Однако, если период не установлен, значения будут содержать пустую дату ('00010101'). Рекомендуем всегда добавлять проверку на заполненность дат перед передачей их в другие формы или запросы.
Проанализируем итоговый правильный код для реализации задачи копирования данных на основании текущего фильтра списка в управляемом приложении 8.3:
&НаКлиенте.Элементы.Список.Период для получения дат.ОткрытьФорму, передавая в нее подготовленную структуру.Пример реализации:
&НаКлиенте
Процедура КопироватьНаСледующийМесяц(Команда)
// Получаем значения периода из элементов формы
Начало = Элементы.Список.Период.ДатаНачала;
Конец = Элементы.Список.Период.ДатаОкончания;
// Проверяем, задан ли период
Если Начало = '00010101' Или Конец = '00010101' Тогда
Сообщить("Пожалуйста, установите период в списке документов!");
Возврат;
КонецЕсли;
// Формируем параметры для передачи в общую форму
ПараметрыПерехода = Новый Структура;
ПараметрыПерехода.Вставить("ДатаС", Начало);
ПараметрыПерехода.Вставить("ДатаПо", Конец);
// Открываем форму
ОткрытьФорму("ОбщаяФорма.КопироватьНаСледующийМесяц", ПараметрыПерехода);
КонецПроцедуры
Таким образом, мы успешно адаптировали логику 8.2 под требования управляемого интерфейса, учитывая разделение контекста и новую архитектуру динамических списков. Помните, что динамический список — это не просто таблица, а по сути визуализированный запрос, настройки которого (отборы, группировки, сортировки) всегда доступны через КомпоновщикНастроек.