Как задать тип реквизита при выборе и правильно настроить форму выбора в 1С

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

В процессе разработки конфигураций на платформе 1С программисты часто сталкиваются с ситуациями, когда стандартное поведение системы требует тонкой настройки. Типичный пример — ограничение выбора в поле с составным типом данных или программное открытие формы для подбора данных. Рассмотрим подробнее, как решать эти задачи эффективно и профессионально, опираясь на практический опыт участников сообщества.

Ограничение типа реквизита при начале выбора

Часто реквизит документа (например, ДокументОснование) имеет составной тип, включающий несколько видов документов. По умолчанию при нажатии на кнопку выбора 1С предлагает пользователю сначала выбрать тип данных из списка. Если бизнес-логика подразумевает, что в конкретный момент можно выбрать только один определенный тип, это стандартное окно выбора типа становится избыточным.

Для решения этой задачи проанализируем ситуацию: нам необходимо программно «подсказать» полю ввода, какой тип данных мы ожидаем. Разберем по шагам, как это реализовать в обработчике НачалоВыбора:

Во-первых, мы можем использовать объект ОписаниеТипов. Это позволяет жестко задать допустимый тип для элемента формы. Рассмотрим пример кода:


Процедура ДокументОснованиеНачалоВыбора(Элемент, СтандартнаяОбработка)
    // Если значение еще не выбрано, ограничиваем тип
    Если Элемент.Значение = Неопределено Тогда
        // Создаем описание типа для конкретного документа
        НужныйТип = Новый ОписаниеТипов("ДокументСсылка.РеализацияТоваровУслуг");
        
        // Устанавливаем ограничение типа для элемента формы
        Элемент.ОграничениеТипа = НужныйТип;
        
        // Отключаем стандартный выбор типа
        Элемент.ВыбиратьТип = Ложь;
    КонецЕсли;
КонецПроцедуры

Во-вторых, важно помнить о свойстве Ограничение типа в свойствах самого элемента формы. Если логика ограничения статична, можно задать его в конфигураторе, не прибегая к написанию кода. Однако программный метод незаменим, когда тип зависит от условий в документе.

Решение проблемы: Форма открывается, но кнопка «Выбрать» отсутствует

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

Основная причина заключается в том, что форме не указано, что она открыта именно для выбора значения. Для этого используется свойство РежимВыбора. Проанализируем правильный подход к открытию формы выбора в управляемом приложении:


// Пример открытия формы выбора с отбором
ПараметрыФормы = Новый Структура;
// Устанавливаем режим выбора в Истина
ПараметрыФормы.Вставить("РежимВыбора", Истина);

// Формируем отбор по контрагенту
Отбор = Новый Структура("Контрагент", Объект.Контрагент);
ПараметрыФормы.Вставить("Отбор", Отбор);

// Открываем форму, указывая Владельца (Элемент), в который вернется значение
ОткрытьФорму("Документ.ОбъектныйЛист.ФормаВыбора", ПараметрыФормы, Элемент);

В данном примере крайне важно передать Элемент (поле ввода) в качестве третьего параметра функции ОткрытьФорму. В этом случае 1С автоматически поймет, куда нужно передать выбранное значение, и в открытой форме появится стандартная кнопка Выбрать.

Почему не срабатывает точка останова на сервере

Иногда при разработке кода в процедурах с директивой &НаСервере отладчик «пролетает» мимо точек останова. Это вызывает замешательство, так как кажется, что код не выполняется. Разберем основные причины, почему это происходит в клиент-серверном варианте работы:

  1. Отсутствие режима отладки на сервере: Служба 1С:Предприятия должна быть запущена с параметром -debug. Без этого параметра серверные вызовы не доступны для отладчика.
  2. Настройки подключения: Проверьте в Конфигураторе меню Отладка -> Подключение. Убедитесь, что серверные вызовы добавлены в список подключенных предметов отладки.
  3. Кеширование: В некоторых случаях помогает банальная очистка кеша конфигурации или перезапуск сеанса.

Посмотрим на пример диагностического кода, который поможет убедиться, что процедура выполняется, даже если отладка не срабатывает:


&НаСервере
Процедура ПроверитьРаботуНаСервере()
    // Запись в журнал регистрации поможет отследить выполнение без отладчика
    ЗаписьЖурналаРегистрации("Отладка_Сервер", УровеньЖурналаРегистрации.Информация, , , "Процедура выполнена успешно!");
КонецПроцедуры

Как получить текущие (несохраненные) данные табличной части

Часто возникает задача: проверить данные в таблице (например, количество товаров) в процессе изменения строк, когда документ еще не записан в базу данных. Здесь начинающие разработчики совершают ошибку, пытаясь использовать Запрос.

Важно понимать разницу: Запрос всегда обращается к данным на диске (в СУБД). Если пользователь добавил строку в таблицу на экране, но не нажал «Записать», запрос эту строку не увидит. Проанализируем, как получить актуальные данные:

Чтобы получить то, что пользователь видит на экране «здесь и сейчас», необходимо обращаться напрямую к коллекции данных формы. Рассмотрим пример обхода табличной части Товары:


&НаКлиенте
Процедура ПроверитьКоличествоНаЭкране()
    ВсегоКоличество = 0;
    // Обращаемся к коллекции Объект.Товары напрямую
    Для Каждого СтрокаТовара Из Объект.Товары Цикл
        ВсегоКоличество = ВсегоКоличество + СтрокаТовара.Количество;
    КонецЦикла;
    
    Сообщить("Общее количество в текущей форме (до записи): " + ВсегоКоличество);
КонецПроцедуры

Если же вам нужно быстро выгрузить данные табличной части в таблицу значений для дальнейшей сложной обработки на сервере, используйте метод Выгрузить():


&НаСервере
Процедура ОбработатьТаблицуНаСервере()
    // Выгружаем данные ТЧ из объекта в таблицу значений
    ТаблицаДанных = Объект.Товары.Выгрузить();
    // Теперь с ТаблицаДанных можно работать как с обычной ТЗ
    ТаблицаДанных.Свернуть("Номенклатура", "Количество");
КонецПроцедуры

Таким образом, мы выяснили, что для получения оперативных данных следует использовать объектную модель (Объект.Товары), а для получения старых данных, сохраненных до текущего сеанса редактирования — язык запросов к ссылке документа.

Резюме по теме

Мы рассмотрели три фундаментальных аспекта работы с формами и данными. Во-первых, научились ограничивать тип выбираемого значения через ОписаниеТипов. Во-вторых, разобрались в механизме работы РежимаВыбора и важности указания владельца формы. В-третьих, осознали разницу между данными в оперативной памяти (объект формы) и данными в базе (результат запроса). Эти знания помогут вам создавать более отзывчивые и надежные интерфейсы в системе 1С:Предприятие.

← На главную