- Особенности работы табличного поля с колонками динамических списков
- Работа табличного поля с динамическими списками
- Особенности работы полосы прокрутки
- Множественное выделение строк
- Особенности использования свойств ТекущиеДанные и ТекущаяСтрока
- Особенности работы в режиме отображения дерева
- Работаем с таблицей значений программно
- Создание таблицы значений
- Колонки таблицы значений
- Свойства колонки таблицы значений
- Методы коллекции колонок таблицы значений
- Строки таблицы значений
- Добавление и удаление строк
- Перебор строк таблицы значений
- Поиск строк
- Все методы таблицы значений:
- Добавление колонки в Динамический список (ОсновнаяТаблица)
Особенности работы табличного поля с колонками динамических списков
Динамическими списками называются списки , использующие при обращении к базе данных механизм динамической выборки . Особенностью механизма динамической выборки является то , что данные считываются не полностью , а блоками , уменьшая время загрузки всего списка и размер отводимой для него памяти . Примерами динамических списков являются списки справочников , документов , регистров .
При считывании блока данных динамический список выполняет обращение к базе данных . Табличное поле для уменьшения объема выбираемых данных управляет набором полей , считываемых из базы данных . Считываются только те поля таблицы , которые связаны с соответствующими видимыми колонками табличного поля , поля, по которым выполняется упорядочивание, и поля , используемые табличным полем для отображения картинки и контроля удаления ( поля ЭтоГруппа , ПометкаУдаления ).
Отметим следующие особенности работы табличного поля с колонками динамических списков :
- При создании табличное поле инициализирует связанный с ним динамический список набором видимых колонок . Всем колонкам , добавляемым табличным полем, устанавливается свойство колонки списка АвтоУдаление = Истина .
- Специальная форма » Настройка списка «, открываемая через контекстное меню или через меню командной панели , позволяет управлять набором видимых колонок . После установки видимости колонок табличное поле установит новый набор колонок в связанный с ним динамический список , при этом колонки динамического списка, не видимые в табличном поле и у которых свойство АвтоУдаление = Истина, будут удалены из списка .
Следовательно , связанный с табличным полем динамический список содержит в себе только те поля базы данных , которые связаны с видимыми колонками табличного поля , а также поля, необходимые для отображения картинки и других служебных целей .
Иногда может потребоваться обратиться к колонкам динамического списка , не связанными с видидимыми только колонки Номенклатура и Сумма ( будет заполняться при обработке события табличного поля ПриВыводеСтроки ). Так как по умолчанию табличное поле устанавливает в динамический список только видимые колонки , то динамический список не будет содержать колонки Количество и Цена . Следовательно , при обработке события ПриВыводеСтроки возникнет ошибка времени выполнения . Для решения этой проблемы предлагаются следующие способы :
- Если колонки не являются видимыми или не существуют в динамическом списке , то при обработке события формы ПриОткрытии необходимо добавить их в динамический список и запретить им удаление :
Копировать в буфер обмена
- Можно необходимые колонки сделать видимыми и запретить им изменять видимость . Для это необходимо соответствующим колонкам в палитре свойств установить свойство » Видимость » и сбросить свойство » Изменять видимость «.
Источник
Работа табличного поля с динамическими списками
Особенности работы полосы прокрутки
Табличное поле может отображать два типа данных : динамические списки и статические данные . Особенностью динамических списков является использование при обращении к базе данных механизма динамической выборки , при которой данные считываются не полностью , а блоками . Особенностью статических данных является хранение в памяти всех данных . Примерами динамических списков являются списки справочников , документов , регистров , а примерами статических данных — таблица значений , дерево значений , табличная часть , наборы записей .
При отображении динамических списков табличное поле особым образом отображает полосу прокрутки — в ней бегунок отображается только в трех положениях : вверху , в центре и внизу , и имеет постоянный размер . Такое поведение связано с тем , что табличное поле для уменьшения объема выбираемых данных загружает из базы данных только часть списка , причем, считывание может происходить начиная с любой записи, в том числе и из середины списка . Тем самым табличное поле содержит только видимую часть списка и , следовательно , не имеет информации об положении строки в списке и количестве строк в списке . Поэтому бегунок не отражает положение видимой части списка и используется только для перемещения в начало и конец списка , а также к текущей строке списка . Также положение бегунка указывает на достижение начала или конца списка , это происходит если пользователь попытался выйти за границы списка .
Множественное выделение строк
При выделении группы строк в табличном поле ( например , при нажатии Shift+Home или Shift+End) выделяются только первая и последняя строка списка . Такое поведение характерно для табличных полей , отображающих динамические списки . Как уже было сказано выше , табличное поле при работе с динамическими списками оперирует только видимой частью списка и не имеет информации о положении строки в списке . Следовательно , при выборе группы записей , невозможно однозначно определить, какая из выбранных строк является первой , а какая последней . Следовательно , невозможно определить направление выделения строк , что не позволяет быстро определить диапазон строк .
Поэтому при множественном выделении в динамических списках выполняется выделение только отдельных строк и выделение соседних строк при движении вверх и вниз, но не выполняется выделение диапазонов строк .
Особенности использования свойств ТекущиеДанные и ТекущаяСтрока
Табличное поле предоставляет свойства ТекущиеДанные и ТекущаяСтрока . Отличие между этими свойствами состоит в том , что свойство ТекущиеДанные содержит значения считанных данных текущей строки табличного поля , а свойство ТекущаяСтрока содержит значение , идентифицирующее строку . Следует отметить , что свойство ТекущиеДанные содержит коллекцию значений текущей строки , соответствующую коллекции колонок отображаемого динамического списка , при этом если нужного поля нет в текущих данных , то его можно добавить в коллекцию полей списка используя метод » Добавить » коллекции колонок списка .
Свойство ТекущиеДанные предназначено для получения значений колонок текущей строки , а свойство ТекущаяСтрока для получения и установки текущей строки табличного поля.
Следует заметить, что для объектных данных (Справочник, Документ и т.д.) в качестве значения свойства ТекущаяСтрока используется ссылка на объект базы данных. Соответственно при обращении к свойствам этого значения будет выполняться считывание объекта базы данных.
Типичной ошибкой является обращение к данным строки с использованием свойства ТекущаяСтрока . В этом случае будет выполняться считывание данных объекта из базы данных, что может существенно снизить производительность работы табличного поля . Например , приведенный ниже фрагмент текста программы является неэффективным :
Рекомендуется для обращения к данным объекта использовать свойство ТекущиеДанные.
Правильный фрагмент приведен ниже :
Особенности работы в режиме отображения дерева
В режиме отображения дерева табличное поле , отображающее динамические списки , особым образом отображает кнопки раскрытия узлов . Используется два цвета отображения кнопки : черный и серый . Если при попытке открытия узла дерева было обнаружено, что дочерних узлов нет , то кнопка рисуется серым цветом , иначе — черным . Такое поведение обусловлено тем , что определение наличия подчиненных узлов требует дополнительных ресурсов и при считывании данных не происходит . Поэтому для удобства пользователя узлы , у которых не было обнаружено дочерних узлов , запоминаются табличным полем . Также стоит отметить , что цвет кнопки никак не влияет на последующее раскрытие узлов дерева .
Источник
Работаем с таблицей значений программно
ТаблицаЗначений — это программный объект встроенного языка, позволяющий строить произвольные наборы данных в памяти компьютера, отображать их в табличном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать).
Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Таблица значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками таблицы, добавляя и удаляя их, но и колонками.
Таблица значений может использоваться явно при создании в коде необходимого количества переменных типа ТаблицаЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с таблицей значений.
Создание таблицы значений
Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :
Колонки таблицы значений
Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
- Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
- Заголовок — представление колонки в диалогах (может содержать произвольные символы);
- ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
- Ширина — ширина колонки в диалогах;
Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений . Для добавления новой колонки используется метод Добавить():
Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():
Перебор колонок выполняется следующим образом:
Для удаления колонки используется метод Удалить():
Свойства колонки таблицы значений
Имя | Тип | Описание |
---|---|---|
Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода |
Заголовок | Строка | строковое представление колонки на форме |
ТипЗначения | ОписаниеТипов | свойство органичивает пространство доступных значений, которые можно указать в данной колонке |
Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Методы коллекции колонок таблицы значений
Вставить() | Вставляет новую колонку в указанную позицию коллекции |
Добавить() | Добавляет новую колонку в конец коллекции |
Количество() | Возвращает количество колонок в коллекции |
Найти() | Ищет колонку в коллекции по имени |
Очистить() | Удаляет все колонки из коллекции |
Сдвинуть() | Сдвигает колонку влево или вправо |
Удалить() | Удаляет колонку из коллекции |
Строки таблицы значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки таблицы значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
Добавление и удаление строк
Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():
Для удаления строки используется метод Удалить() объекта ТаблицаЗначений . Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:
Перебор строк таблицы значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Поиск строк
В отличие от платформы 1С:Предприятие 7.7 в 8-ке расширен функционал работы с таблицей значений. Поиск можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк):
Все методы таблицы значений:
Вставить() | Вставляет строку на указанное место |
ВыбратьСтроку() | Позволяет интерактивно выбрать строку в диалоговом окне |
ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки в массив значений |
Добавить() | Добавлет новую строку в таблицу значений |
ЗагрузитьКолонку() | Загружает значения в ячейки указанной колонки из массива |
ЗаполнитьЗначения() | Заполняет ячейки указанных колонок определенным значением |
Индекс() | Возвращает индекс строки таблицы значений |
Итог() | Возвращает просуммированный итог по колонке таблицы значений |
Количество() | Возвращает количество строк в таблице значений |
Найти() | Выполняет поиск строки по значению |
НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
Очистить() | Очищает строки таблицы значений |
Получить() | Возвращает строку по ее индексу |
Свернуть() | Выполняет сжатие строк и колонок таблицы значений |
Сдвинуть() | Сдвигает строку вверх или вниз по таблице |
Скопировать() | Создает новую таблицу значений копированием текущей |
СкопироватьКолонки() | Создает новую пустую таблицу значений путем копирования колонок текущей таблицы |
Сортировать() | Выполняет сортировку строк таблицы значений по указанным колонкам |
Удалить() | Удаляет строку таблицы значений |
Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:
Источник
Добавление колонки в Динамический список (ОсновнаяТаблица)
Пытаюсь решить казалось бы простую задачу.
Берем любую конфу на 8.3.
Требуется добавить колонку в форму списка и заполнять ее произвольным текстом.
Деталь состоит в том, что для Динамического списка задана ОсновнаяТаблица.
И вот в таком случае у меня проблема, не понимаю как обойти ограничение, колонка не добавляется, не появляется.
Задача легко решается для случая Произвольного запроса, но я не хочу изменять это свойство.
Неужели никак не обойти это ограничение?
(1) Так что за колонка? Если это не поле основной таблицы, не реквизит какого-либо поля, а также не значение характеристики, то действительно, добавить не меняя запрос не получится.
Можно разве что попробовать подменить одно значение другим. Вытянуть на форму любую возможную колонку, а в обработчике события «ПриПолученииДанныхНаСервере» динамического списка получить нужные значения и подставить их в новую колонку.
(2) Воооот. Все так, я пытался таким способом делать.
Но в событии СписокПриПолученииДанныхНаСервере не могу добраться до колонки.
пытаюсь добраться кодом
(6) Не понимаю, где именно возникла сложность с использованием обработчика события «ПриПолученииДанныхНаСервере». Приведу свой пример.
Основная таблица: регистр сведений «УчетнаяПолитика». Единственное измерение — организация. Требуется вывести ее префикс с использованием вышеобозначенного события.
Итак, при создании формы добавляем элемент для вывода своего значения. В качестве примера я взял колонку ссылочного типа (что только усложнило задачу):
Я понял.. подменяемая колонка, должна содержать значение еще не выведенного реквизита.
К примеру если в форме списка уже Номер выведен, то через него сделать колонку, а потом подменить не получится. Нужно чтобы был какой то другой еще не выведенный, но сидящей в основной таблице реквизит.
(17) Т.е. Запрос изменили в самой конфигурации, сняв с поддержки, а потом в расширении заполнили колонку своим значением?
Полностью в расширении не получилось?
Просто хочется всё реализовать в расширении, не трогая саму конфигурацию.
У меня наподобе задача, добавить колонку в список Счетов в ФормуСписка и заполнять её значениями из РС, который заполняется обработкой от СБИС.
Пояснение:
В Бухгалтерия 3.0 открывают обработку для 1С от СБИС и получают статусы документов ЭДО от СБИС (РС заполняется в 1С) — нужно было руководителю для визуального контроля документов, чтобы не открывать саму обработку от СБИС. (директор есть директор 🙂 ).
(18) В запросе динамического списка ФормыСписка документа ПоступлениеТоваровУслуг есть:
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ДокументПоступлениеТоваровУслуг
.
<ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияЭД КАК СостоянияЭД
ПО ДокументПоступлениеТоваровУслуг.Ссылка = СостоянияЭД.СсылкаНаОбъект>
.
У вас данные из СБИС хранятся в каком-то регистре? Если нет, то откуда вы их хотите вытаскивать? Если да, то просто добавьте такое же соединение с тем регистром:
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияДокументооборота КАК СостоянияДокументооборота
ПО (СостоянияДокументооборота.ОбъектДокументооборота = ДокументРеализацияТоваровУслуг.Ссылка)
и выше в запросе, например:
ВЫБОР
КОГДА (НЕ ДокументРеализацияТоваровУслуг.Проведен)
ТОГДА ЗНАЧЕНИЕ(Перечисление.СостояниеДокументооборота.ПустаяСсылка)
ИНАЧЕ
ЕСТЬNULL(СостоянияДокументооборота.СостояниеДокументооборота, ЗНАЧЕНИЕ(Перечисление.СостояниеДокументооборота.ПустаяСсылка))
КОНЕЦ КАК СостояниеДокументооборота,
В этом примере у нас есть независимый регистр состояний внутреннего документооборота, в который пишутся состояния, перечисленные в Перечисления.СостоянияДокументооборота. Регистр и Перечисление добавлены в расширении
(20) Значение я выцепил (нашёл в самой обработке от СБИС, куда они сохраняют данные), попробовал в существующую колонку записывать СостояниеЭД — всё удачно, но потом менеджеры не могут исправлять документ — выдаёт ошибку. Поэтому я и хотел создать в Расширении программно колонку с типом Строка и записывать туда значения от СБИС.
(Конфигурация Бухгалтерия 3.0.86.16, платформа 8.3.15.2107, документ СчетНаОплатуПокупателю, Форма Списка.)
Как получилось:
Создал отдельную Функцию:
Вот пока не получается создать колонку программно в Расширении с типом Строка.
Есть мысли?
Далее, в форме списка в расширении добавляете этот реквизит на форму (предварительно в расширение нужно добавить все реквизиты, которые будете использовать в запросе). В форме у вас будет две процедуры:
(25) Тогда все просто, делаете по описанному мной (23) и берете свою функцию ПрочитатьПараметрыДокументаСБИС:
(26)
1. По Запросу:
Конфигурация полностью на поддержке без редактирования — не хотелось бы снисать её в режим редактирования, хотелось бы полностью в расширении всё сделать. Обошёлся пока существующей колонкой Состояние ЭДО.
Попробую на копиях конечно, ради спортивного интереса.
2. Возникла другая проблема:
Когда у пользователя в списке документов не включена колонка состояние ЭДО, тогда выдаётся ошибка и в список вообще нельзя войти:
Ошибка в этой строке: ОформлениеЯчейки = Элемент.Значение.Оформление[«СостояниеВерсииЭД»];
По разному искал, как программно включить колонку пользователю — пока безрезультатно.
Еще раз, по порядку. Вся. доработка происходит в расширении. В основной конфе делать ничего не надо.
1. В расширение добавляете документ СчетНаОплатуПокупателю, Форма Списка.
2. В расширение добавляете:
— реквизиты Организация, Контрагент, Комментарий, ВалютаДокумента, СуммаДокумента документа СчетНаОплатуПокупателю;
— перечисления СостоянияВерсийЭД, СтатусОплатыСчета, СтатусыОтгрузки;
— измерение СсылкаНаОбъект и ресурс СостояниеВерсииЭД регистра сведений СостоянияЭД;
— измерения Организация, Документ и ресурсы Статус, ДополнительныйСтатус регистра сведений СтатусыДокументов;
— измерение Документ регистра сведений ДокументыСОшибкамиПроверкиКонтрагентов;
— измерение ОбъектСФайлами и ресурс ЕстьФайлы регистра сведений НаличиеФайлов;
3. В форме списка в расширении меняете запрос динамического списка (Список-Объект-Настройка списка-Открыть) на следующий:
2. Возникла другая проблема:
Когда у пользователя в списке документов не включена колонка состояние ЭДО, тогда выдаётся ошибка и в список вообще нельзя войти:
Ошибка в этой строке: ОформлениеЯчейки = Элемент.Значение.Оформление[«СостояниеВерсииЭД»];
По разному искал, как программно включить колонку пользователю — пока безрезультатно.
Источник