1с ключевое поле не может использоваться для выбора

Обновлено: 07.07.2024

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

Что я делаю не так, 2 дня ломаю голову уже. Не может же быть что программно нельзя установить значение в поле вводу с имеющимся списком выбора.

P.S. Если отключить список выбора все записывается и считывается как по маслу.

(0)Убрать "птичку" РежимВыбораИзСписка, поставить "птичку" КнопкаСпискаВыбора.
Спасибо, помогло. Как оно работает тогда при птичке РежимВыбораИзСписка? Почему не дает программно работать с полем ввода?

при установленной галке "РежимВыбораИзСписка" сохраненные данные при отображении подвязываются к списку, т.е. значение реквизита ищется в списке и найденный элемент списка отображается в поле ввода. Если галка не установлена, то список существует как-бы сам по себе.

Поэтому заполнять его надо ДО того, как будет произведен вывод данных, например в процедуре ПередОткрытием(), а не перед выбором из списка.

Эта переменная - в реквизитах формы и указана как данные для одноименного элемента формы "поле ввода".
Я ее не объявляю а записываю в нее значение первого элемента из списка выбора, что б данные из этой переменной отобразились в форме.

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

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

у элемента стоит галка "Режим выбора из списка"?
типы реквизита формы = строка?

если все так, я не знаю чем помочь, попробуй нарисовать форму заново.

Работа с полем выбора

Элемент управления "Поле выбора" предназначен для хранения и быстрого выбора одного из значений, входящих в его список выбора. Список выбора для поля выбора есть список значений. Значением поля выбора является одно единственное значение, а не весь список выбора.

Установка значения в поле выбора

В Поле выбора можно установить любое значение. В процессе установки значения будет выполнен его поиск среди значений, входящих в список выбора. Если устанавливаемое значение найдено в списке выбора, оно будет сохранено в поле выбора, иначе в поле выбора будет установлено значение "Неопределено". Исключение составляет значение "Неопределено", которое можно установить в поле выбора в любом случае, независимо от того, какие значения при этом хранятся в списке выбора.

Например, если список выбора имеет значениями числа 1, 2 и 3, тогда в поле выбора удастся установить любое из этих значений. При установке других значений, хотя ошибки времени выполнения и не произойдет, они сохранены не будут.

Представление значения, хранящегося в поле выбора

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

Поиск значения в поле выбора по введенному тексту

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

Связь поля выбора с данными

Поле выбора можно связывать по данным с выбираемым значением, а не со списком значений. Например, если мы хотим, чтобы в поле выбора можно было выбирать число, и оно было связано по данным со значением некоторого реквизита, типом данных для реквизита должно быть число, а не список значений.

Особенности инициализации и использования списка выбора

Для правильного отображения в поле выбора данных, с которыми он связан, список выбора должен формироваться в теле модуля формы. Формировать список выбора для поля выбора в обработчике любого из событий формы – поздно. Это приведет к тому, что в поле выбора будет установлено значение "Неопределено", хотя в реквизите при этом может быть любое значение.

Такая ситуация возникает из-за того, что данные устанавливаются в элементы управления формы, связанные с ними, в процессе создания формы. А обработчики событий ПередОткрытием(), ПриОткрытии() вызываются после создания самой формы, в процессе инициализации ее визуальной части. Получается, что при создании формы полю выбора поставили некоторое значение в момент, когда его список выбора пустой. При этом, поскольку список выбора пустой, вместо устанавливаемого значения в поле выбора будет сохранено значение "Неопределено".

При смене типа значения (свойство "ТипЗначения") для списка выбора, у которого есть элементы, будет выполнено преобразование их значений к новому типу. Может быть следующая ситуация: после смены типа значения для списка выбора некоторое значение, которое раньше удавалось успешно установить в поле выбора, после смены типа значения установить не получается. Причина такой ситуации в том, что в процессе установки типа значения для списка выбора, успешно устанавливаемое ранее значение было конвертировано в другое значение (в соответствии с новым типом значения). Соответственно, устанавливаемое значение в списке выбора больше найдено не будет.

Использование поля выбора: пример 1

Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: число, длина = 10, точность = 0). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:

Открыв такую форму в режиме 1С:Предприятие, можно видеть, как будут устанавливаться значения в поле выбора:

1. В начальном состоянии поле выбора - пустое, поле ввода содержит значение 0.

2. Выбираем в поле выбора в выпадающем списке строку с надписью "Один": в поле ввода помещается значение 1. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку "Один", значение для которой равно 1. Оно и отобразилось в поле ввода.

3. Выбираем в поле выбора в выпадающем списке строку с надписью "Два": в поле ввода помещается значение 2.

Перейдем в поле ввода и попробуем редактировать значения в нем:

1. Введем в поле ввода значение 3 и сойдем с поля ввода. В поле выбора запишется значение 3 и установится значение из соответствующей строки списка выбора поля выбора ("Три").

2. Вернемся в поле ввода и введем в нем значение 4. Перейдем с поля ввода к следующему элементу управления. В поле ввода будет сохранено введенное значение "4", а поле выбора станет пустым. В данном случае введенное в поле ввода значение 4 будет сохранено в связанных с полем ввода данных, после чего выставлено из них в поле выбора. Поскольку поле выбора в списке выбора значения 4 не имеет, оно установлено в поле выбора не будет.

Использование поля выбора: пример 2

Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: СправочникСсылка.Номенклатура). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:

Открыв такую форму в режиме 1С:Предприятие, можно видеть, как будут устанавливаться значения в поле выбора:

1. В начальном состоянии поле выбора и поле ввода - пустые:

2. Выбираем в поле выбора в выпадающем списке строку с надписью "Один": в поле ввода помещается значение. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку "Один", значение для которой равно ссылке на на элемент справочника Справочники.Номенклатура.Элемент1. Оно и отобразилось в поле ввода.

3. Выбираем в поле выбора в выпадающем списке строку с надписью "Два": в поле ввода помещается ссылка на элемент справочника Справочники.Номенклатура.Элемент2:

Перейдем в поле ввода и попробуем редактировать значения в нем:

1. Выберем в поле ввода значение Справочники.Номенклатура.Элемент1. В поле выбора запишется значение Справочники.Номенклатура.Элемент1 и установится значение из соответствующей строки списка выбора поля выбора ("Один").

2. Выберем в поле ввода значение Справочники.Номенклатура.Элемент2. В поле выбора запишется значение Справочники.Номенклатура.Элемент2 и установится значение из соответствующей строки списка выбора поля выбора ("Два").

3. Выберем в поле ввода значение Справочники.Номенклатура.Элемент3. В поле выбора значение Справочники.Номенклатура.Элемент3 записано не будет, поскольку оно не было добавлено в список выбора. Значением в поле ввода будет "Неопределено":

Использование поля выбора: пример 3

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

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

В правой колонке - внешний вид второй формы внешней обработки. В ней размещены поле выбора и поле ввода; они оба связаны с реквизитом внешней обработки Реквизит1 по данным. Приведем текст модуля формы:

Мы видим,. что в модуле формы инициализируется список выбора для поля выбора: поле выбора может принимать значения Справочники.Номенклатура.Элемент1, Справочники.Номенклатура.Элемент2, Неопределено. При этом для двух первых значений явно указаны их представления - "Один" и "Два".

Посмотрим, как будет выглядеть вторая форма в зависимости от того, какое значение сохранено предварительно в реквизите внешней обработки Реквизит1.

Значение реквизита - пустая ссылка:

В данном случае в поле ввода значением будет пустая ссылка на элемент справочника, а в поле выбора - Неопределено . Поскольку в списке выбора для поля выбора пустая ссылка на элемент справочника в значения не входит, ее установить нельзя - при установке значения в виде пустой ссылки поле выбора примет значение Неопределено .

Значение реквизита - одно из значений, имеющихся в списке выбора для поля выбора:

В данном случае и в поле ввода, и в поле выбора значением будет ссылка на Элемент1 справочника. При этом для представления значения поле выбора воспользуется представлением установленного значения из списка выбора - строкой "Один".

Значение реквизита в списке выбора для поля выбора отсутствует:

В данном случае в открываемой форме в поле выбора и поле ввода будет произведена попытка установить в качестве значения ссылку на Элемент3 справочника. В поле ввода такое значение будет нормально установлено, а вот в поле выбора после его установки сохранится значение Неопределено , поскольку ссылка на Элемент3 справочника в значения из списка выбора не входит.

Заметим, что в данном примере в случае переноса инициализации списка выбора для поля выбора в любой из обработчиков событий открываемой формы в каждом из рассмотренных случаев поле выбора будет принимать значение Неопределено , поскольку на момент установки значения в него список выбора будет еще пустой.

Динамический список в 1С – это интерфейсный объект встроенного языка, который используется для отображения различных списков объектов базы данных или необъектных данных. Кроме того, он предоставляет возможность задавать произвольный текст запроса, который будет использован для считывания данных.

1. Настройки списка в 1С

Чтобы в динамическом списке 1С начать работу с произвольным запросом, необходимо в свойствах его объекта установить флаг «Произвольный запрос 1С». Далее можно перейти к настройке через «Настройку списка 1С».



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



С помощью команды «Конструктор запроса 1С» можно получить доступ к редактору текста запроса.

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

Свойство «Динамическое считывание данных» определяет необходимость считывать данные порциями приближенно равными количеству видимых строк в таблице. При отключении данного свойства будут считаны все данные. Также в официальной документации можно найти информацию об изменении поведения данного свойства при установке дополнительных настроек.

Свойство «Автозаполнение доступных полей» позволяет системе установить доступные поля для отбора, порядка, выбора, группировки.

2. Программное изменение запроса 1С


3. Рекомендации к запросам в динамических списках

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

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

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

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

Вместе с тем для эффективного использования запросов стоит ознакомиться с требованиями по разработке оптимальных запросов.

Анна Викулина

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

  • Установка отбора в пользовательском режиме
  • Установка отбора в конфигураторе
    • Фиксированный отбор
    • Динамический (программный) отбор

    Установка отбора в пользовательском режиме

    Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.

    Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

    На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.

    Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.

    Отбор также можно группировать по логическим условиям «И», «ИЛИ».

    Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

    Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

    При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.

    Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.

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

    Установка отбора в конфигураторе

    Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.

    Фиксированный отбор

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

    Отбор задается так же, как в пользовательском режиме.

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

    Динамический (программный) отбор

    Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.

    Методы

    Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:

    Сигнатура данного метода:

    ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

    ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

    ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

    ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

    Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

    Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

    РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

    • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
    • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
    • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

    ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

    Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:

    Сигнатура данного метода:

    ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.

    ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

    Представление Тип: Строка – представление поля компоновки.

    В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.

    Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

    Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных

    Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

    Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».

    Для этого к тексту запроса добавляем условие «ГДЕ Истина»…

    Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:

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

    ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

    Тут ФИО – массив.

    Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

    Читайте также: