В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает необходимость кастомизации стандартных механизмов выбора объектов (справочников, документов). Стандартная форма выбора, генерируемая платформой по умолчанию, не всегда удовлетворяет требованиям бизнеса: в ней могут отсутствовать нужные колонки, или она может требовать специфических фильтров. В этой статье мы разберем, как программно управлять формами выбора, как обходить ограничения «закрытых» конфигураций и какими методами можно добавить «невидимые» реквизиты в список.
Рассмотрим ситуацию, когда нам нужно вместо стандартной формы справочника открыть свою собственную (например, форму из внешней обработки или специально созданную форму внутри объекта). Самый гибкий способ — это перехват события НачалоВыбора у элемента формы, в котором пользователь инициирует выбор.
Разберем алгоритм действий по шагам:
НачалоВыбора.СтандартнаяОбработка в значение Ложь. Это скажет платформе, что стандартное окно выбора открывать не нужно.ОткрытьФорму(), указав путь к нашей кастомной форме.Пример кода для реализации этого метода:
&НаКлиенте
Процедура КонтрагентНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартное открытие формы выбора справочника
СтандартнаяОбработка = Ложь;
// Параметры для новой формы (фильтры, отборы)
ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("Отбор", Новый Структура("ЮридическоеФизическоеЛицо", ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо")));
// Открываем свою форму (например, форму из расширения или другую форму справочника)
ОткрытьФорму("Справочник.Контрагенты.Форма.ФормаВыбораСпециальная", ПараметрыВыбора, Элемент);
КонецПроцедуры
Этот метод позволяет полностью контролировать процесс: мы можем передать любые параметры, установить специфические отборы и даже открыть форму совсем другого объекта, если это необходимо по логике процесса.
Проанализируем ситуацию, описанную в сообщениях форума: на форме видны только Дата и Номер, а остальные реквизиты скрыты или отсутствуют. Если мы работаем с управляемыми формами, то данные в формах выбора обычно отображаются с помощью объекта ДинамическийСписок.
Даже если форма создана платформой автоматически, мы можем программно вмешаться в её структуру при создании. Рассмотрим, как добавить новые поля в запрос динамического списка и вывести их на форму.
Для этого используется событие ПриСозданииНаСервере. Выясним, как добавить поле программно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Изменяем текст запроса динамического списка, чтобы включить нужные поля
ТекстЗапроса = Список.ТекстЗапроса;
// Предположим, нам нужно добавить поле "ИНН" для контрагента
// Если запрос основной таблицы, платформа сама подтянет поля, если они есть в метаданных.
// Если запрос произвольный, его нужно переписать:
Список.ТекстЗапроса = "ВЫБРАТЬ Ссылка, Код, Наименование, ИНН ИЗ Справочник.Контрагенты";
// 2. Программно добавляем элемент формы (колонку в таблицу)
НоваяКолонка = Элементы.Добавить("ИНН", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Список.ИНН";
НоваяКолонка.Заголовок = "ИНН организации";
КонецПроцедуры
Использование метода Элементы.Добавить() позволяет динамически формировать интерфейс в зависимости от прав пользователя или условий задачи, что критически важно в сложных системах.
Если конфигурация находится на поддержке и изменения в основной код вносить нельзя (или она является «закрытой»), на помощь приходят Расширения конфигурации. Это наиболее современный и безопасный способ модификации системы.
Посмотрим, как решить задачу через расширение:
Номенклатура).&Вместо, &Перед или &После для перехвата процедур сервера.Например, мы можем использовать аннотацию &Вместо("ПриСозданииНаСервере"), чтобы изменить видимость стандартных реквизитов, которые платформа скрывает по умолчанию.
Как справедливо отмечено в сообщении №10, не всегда требуется написание кода. В управляемом приложении 1С предусмотрен мощный механизм настройки интерфейса самим пользователем. Выясним, как это сделать:
Ссылка и нажмем Добавить поля. Здесь можно выбрать любой реквизит объекта (например, артикул, ИНН, комментарий).Важный момент для администраторов: эти настройки можно сохранить и программно или через консоль администрирования «раздать» всем пользователям системы. Это избавляет от необходимости вносить изменения в программный код и упрощает обновление конфигурации.
Если реквизиты на форме присутствуют, но они скрыты, мы можем управлять их отображением через свойство Видимость. Проанализируем разницу между видимостью и доступностью:
Элементы.ИмяЭлемента.Видимость = Ложь; — элемент полностью исчезает с экрана, место под него не резервируется.Элементы.ИмяЭлемента.Доступность = Ложь; — элемент виден, но пользователь не может его редактировать или нажать.В форме выбора часто используется именно управление видимостью колонок в зависимости от параметров, переданных при открытии формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем параметр, переданный при открытии
Если Параметры.Свойство("РежимКраткогоСписка") И Параметры.РежимКраткогоСписка Тогда
Элементы.СписокКод.Видимость = Ложь;
Элементы.СписокИНН.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Стоит помнить, что в Базовых версиях конфигураций 1С (например, Бухгалтерия предприятия Базовая) возможности программирования и использования расширений сильно ограничены. В таких случаях программное создание форм невозможно. Единственный путь — использование встроенных механизмов настройки «Изменить форму» или внешних обработок, которые запускаются отдельно.
Подводя итог, можно сказать, что хотя формы как объекты метаданных нельзя «создать» из кода в режиме 1С:Предприятие, программист имеет полный набор инструментов для динамического конструирования интерфейса, подмены одних форм другими и настройки отображения данных в динамических списках через расширения или программный интерфейс управляемых форм.