Как узнать имя колонки в табличной части 1с
Мы ВКонтакте
JS: 2.14.23
CSS: 4.9.13
jQuery: 3.6.0
DataForLocalStorage: 2022-05-11 08:16:01-standard
jQuery
jQuery UI
Bootstrap
Font Awesome
[неизвестный]
[неизвестная рассылка]
Вопрос по 1С 7.7. Как в табличной части документа при редактировании строки узнать номер или имя колонки (если возможно, стандартыми средствами, если нет - посоветуйте внешние компоненты). Заранее спасибо.
Выдержка из синтаксис-помощника:
Форма.ТекущаяКолонка();
Синтаксис:
Форма.ТекущаяКолонка()
Назначение:
Возвращает строковое значение - идентификатор текущей колонки многострочной части.
Замечание:
Доступ к методу возможен только в контексте Модуля формы через атрибут Форма.
Соотвестственно:
Получить можем примерно так:
ПриРедактированииНовой строки ставить смысла нет. Так как в момент срабатывания события
Текущая колонка это НомерСтроки, потом становится активной первая видимая колонка
Piter
Посетитель
14.10.2009, 12:33
Дополню ответ от Piter.
Если нужно не просто узнать имя колонки, но и обратиться к ней (например, чтобы определить доступность или видимость), используя метод формы "ПолучитьАтрибут()":
Лялин Виталий Владимирович
Посетитель
14.10.2009, 12:46
Здравствуйте, Boorkov.
Так бы сразу и сказали, что при открытии документа определенным пользователем надо давать ему те или иные права.
В общем виде это можно реализовать следующим образом см.приложение.
или можно вобще для определенных пользователей открывать документ только в режиме просмотра ( синтаксис - Форма.ТолькоПросмотр())
P.S. Проверку на пользователя лучше реализовать в глобальном модуле,а в модуле формы просто вызывать её.
Сайко Владимир Владимирович
Посетитель
14.10.2009, 23:29
Здравствуйте, Boorkov.
Все что предложили эксперты в двух предыдущих ответах работает.
Но только когда срабатывает обработчик. Т.е. при первом изменении одного из реквизитов табличной части.
При редактировании остальных реквизитов той же строки, обработчик не будет вызываться.
Для точного ответа на вопрос подробнее опишите цель действий. Возможно
задачу удасться решить другими методами.
ATan:
В данном случае меня вполне устраивает срабатывание обработчика на редактирование строки. Но Ваше замечание вполне существенно и реально. Буду благодарен, если сможете обозначить пути решения данной проблемы при изменении колонки табличной части в процессе редактирования.
А можно конкретизировать вопрос, что Вы хотите вообще получить т.к. наименование колонки оно в семерке и так видно. А получить название реквизита табличной части при редактирование его самого конечно можно но смысл этого . Так же и зачем нужен номер строки при редактировании табличной части.
Сайко Владимир Владимирович:
Все просто.
Мне надо запрещать редактирование отдельных колонок в табличной части .
В "ПриНачалеРедактированияСтроки()" получаю текущую колонку. Если пользователь меняет колонку - словить это событие не получается.
Boorkov:
А сразу установить доступность колонок документа при открытии формы
Процедура ПриОткрытии()
Форма..Доступность(0);
КонецПроцедуры
Такой вариант вас не устраивает?
ОткрытьФорму(Документ, СписокПараметров) вернет в СписокПараметров контекст открытой формы.
СписокПараметров.АктивизироватьСтроку(5)
СписокПараметров.Форма.Активизировать("Контрагент") еще и установит курсор в колонку контрагента
КонецПроцедуры//ОбработкаЯчейкиТаблицы
Есть процедура, которая вызывается при изменении реквизита колонки табличного поля. В процедуру передается сам элемент управления, т.е. "ПолеВвода".
А как определить имя колонки?
(вариант с обращением к имени ТекущейКолонки НЕ предлагать! Не тот случай, т.к. процедура не всегда вызывается интерактивно)
Вопрос остается: как по элементу управления получить колонку табличного поля, с которой этот элемент связан.
реквизита колонки табличного поля - как не интерактивно? может реквизит не табличного поля, а чего то другого?
Да, к данным привязан.
Я уже сам запутался. На пальцах попытаюсь озвучить.
Есть документ с табличной частью. Табличная часть содержит колонки (реквизиты документа, вроде номенклатура, цена, кол-во, сумма. Все просто.). Есть процедура "РасчетСумм", которая вызывается при изменении реквизитов в табличной части.
В эту процедуру передается элемент управления.
Нужно узнать, какой реквизит вызвал процедуру.
В документе есть кнопка Заполнить, с ней связана процедура "Заполнить". Из нее тоже вызывается "РасчетСумм".
Задача сводится к следующей:
До элемента управления я достучаться могу:
А вот как имея "ЭлементУправления" получить его родителя, в приведенном примере "Номенклатура"
(11) не катит. Нет у поля ввода такого свойства и метода.
(12) да, похоже, что этот способ и остается. Делать через 2 процедуры, а не через 1. Спасибо.
А вот еще один способ додумал:
(15) Нужно, чтобы во всех ячейках стояла ОДНА процедура, а не 15 штук для каждой ячейки. Так удобнее при связанных расчетах, когда предыдущая ячейка вызывает пересчет последующих.
(17)Сделай одну БОЛЬШУЮ процедуру пересчета всего что там у тебя есть, а в процедурах ПриИзменении ячеек просто ее вызывай.
(18) Ух ты, уже и принюхался. Поздравляю с хорошим обонянием. Или ты на вкус определил? В любом случае приятного аппетита.
(19) Все, работает. Спасибо за помощь. Код из поста (14) катит. И из поста (12) тоже.
(19) Так так и сделано в самом начале. Одна БОЛЬШАЯ процедура, которая вызывается ПриИзменении ячеек. НО засада была в том, что эта же процедура вызывается не интерактивно при автопересчете по отдельной кнопке
(23) НЕТ не все. Только ячейки с 3й по 15ю, или например с 10й по 15ю. В зависимости от того, на какой ячейке стартанули
как вариант, если сильно надо:
Процедура ОднаБольшаяПроцедура(ОткудаВызвана="")
.
ОднаБольшаяПроцедура("Номенклатура")
(21) Просто ты нарушаешь базовые принципы.
Любая дочерняя функция или процедура должна быть предельно "тупой".
Всё, что можно посчитать\задать в родительской процедуре, должно быть задано в ней.
В твоём случае - это имя колонки.
"Откуда считать" должно определяться не в "одной БОЛЬШОЙ процедуре", а там, откуда она вызывается.
(28) мммм, чтобы не вдаваться в полемику лучше приведу свою проблему:
Есть 15 колонок. На каждой колонке своя формула. Меняем значение 1й колонки, должны пересчитаться все до 15й. Меняем 2ю, должны пересчитаться со 2й по 15ю и т.д.
Вполне логично иметь ОДНУ процедуру, описывающую логику расчета всего документа.
В результате этот алгоритм расчета можно вызывать как интерактивно (пользователь меняет значение ячейки), так и при неких общих расчетах для всех строк табличной части.
В результате не плодится множество процедур, вся логика в одном месте и в нее при необходимости просто вносить изменения.
------
Может я действительно мудрю, предложи вариант, как это реализовать проще.
Как получить имя реквизита табличной части, а именно выбранной колонки.
Задача обойти все элементы табличной части по определенному реквизиту.
Простой 1 комментарий
Пока буду использовать такой изврат.
Надеюсь что вскоре появится правильный ответ.
Ответ зависит от варианта разрабатываемого интерфейса.
Обычный интерфейс:
Элемент формы связанный с табличной частью "ТаблицаДанных" - ЭлементыФормы.ТаблицаДанных
Текущая колонка - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка
Имя реквизита формы для колонки - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Имя
Имя реквизита табличной части, который связан с колонкой - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Данные
Управляемый интерфейс
Элемент формы связанный с табличной частью "ТаблицаДанных" - Элементы.ТаблицаДанных
Текущая колонка - Элементы.ТаблицаДанных.ТекущийЭлемент
Имя реквизита формы для колонки - Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Имя реквизита табличной части, который связан с колонкой - Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)
Но имя реквизита находится в конце данного пути, то есть необходимо разбить строку что бы получить имя реквизита. Другого варианта нет?
Верно. В обоих блоках это именно имя элемента формы.
Но имя реквизита находится в конце данного пути, то есть необходимо разбить строку что бы получить имя реквизита. Другого варианта нет?
А в чем сложность? Однотипные строки типа Таблица.Реквизит - разбивать БСП-шной функцией на массив или самостоятельно сделать поиск точки и взять подстроку от следующего за точкой символа.
А в чем сложность? Однотипные строки типа Таблица.Реквизит - разбивать БСП-шной функцией на массив или самостоятельно сделать поиск точки и взять подстроку от следующего за точкой символа.
Дмитрий Кинаш, честно говоря я считал что это костыль, а нет, видимо это фишка 1С.
Значит буду использовать свой вариант доступа, он как раз такой же как вы описали.
ТаблицаЗначений — это программный объект встроенного языка, позволяющий строить произвольные наборы данных в памяти компьютера, отображать их в табличном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать).
Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Таблица значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками таблицы, добавляя и удаляя их, но и колонками.
Таблица значений может использоваться явно при создании в коде необходимого количества переменных типа ТаблицаЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с таблицей значений.
Создание таблицы значений
Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :
Колонки таблицы значений
Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
- Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
- Заголовок — представление колонки в диалогах (может содержать произвольные символы);
- ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
- Ширина — ширина колонки в диалогах;
Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений . Для добавления новой колонки используется метод Добавить():
Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():
Перебор колонок выполняется следующим образом:
Для удаления колонки используется метод Удалить():
Свойства колонки таблицы значений
Имя | Тип | Описание |
---|---|---|
Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода |
Заголовок | Строка | строковое представление колонки на форме |
ТипЗначения | ОписаниеТипов | свойство органичивает пространство доступных значений, которые можно указать в данной колонке |
Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Методы коллекции колонок таблицы значений
Вставить() | Вставляет новую колонку в указанную позицию коллекции |
Добавить() | Добавляет новую колонку в конец коллекции |
Количество() | Возвращает количество колонок в коллекции |
Найти() | Ищет колонку в коллекции по имени |
Очистить() | Удаляет все колонки из коллекции |
Сдвинуть() | Сдвигает колонку влево или вправо |
Удалить() | Удаляет колонку из коллекции |
Строки таблицы значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки таблицы значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
Добавление и удаление строк
Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():
Для удаления строки используется метод Удалить() объекта ТаблицаЗначений . Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:
Перебор строк таблицы значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Поиск строк
Все методы таблицы значений:
Вставить() | Вставляет строку на указанное место |
ВыбратьСтроку() | Позволяет интерактивно выбрать строку в диалоговом окне |
ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки в массив значений |
Добавить() | Добавлет новую строку в таблицу значений |
ЗагрузитьКолонку() | Загружает значения в ячейки указанной колонки из массива |
ЗаполнитьЗначения() | Заполняет ячейки указанных колонок определенным значением |
Индекс() | Возвращает индекс строки таблицы значений |
Итог() | Возвращает просуммированный итог по колонке таблицы значений |
Количество() | Возвращает количество строк в таблице значений |
Найти() | Выполняет поиск строки по значению |
НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
Очистить() | Очищает строки таблицы значений |
Получить() | Возвращает строку по ее индексу |
Свернуть() | Выполняет сжатие строк и колонок таблицы значений |
Сдвинуть() | Сдвигает строку вверх или вниз по таблице |
Скопировать() | Создает новую таблицу значений копированием текущей |
СкопироватьКолонки() | Создает новую пустую таблицу значений путем копирования колонок текущей таблицы |
Сортировать() | Выполняет сортировку строк таблицы значений по указанным колонкам |
Удалить() | Удаляет строку таблицы значений |
Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:
Таблица значений в 1С 8.3 позволяет строить динамические наборы значений. При этом каких-либо жестких ограничений на тип данных не накладывается. Таблица значений создается в памяти и не сохраняется в базе данных, имеет множество полезных возможностей и работает очень быстро.
Свойствами таблиц значений являются:
- индексы (коллекция индексов таблицы значений)
- колонки (коллекция колонок таблицы значений).
Элементом коллекции является строка таблицы значений. Но необходимо учитывать тот факт, что с таблицей значений можно работать только на сервере.
Работа с таблицей значений в 1С 8.3 на примерах
Создать новую таблицу значений
Добавить колонку в таблицу значений
Добавить колонку с описанием типа
Добавить строку в таблицу значений
Заполнить строку значениями
Вставить строку
Сортировка
//Сортирует таблицу значение по нужным колонкам и направлению сортировки
ТЗ.Сортировать(«Цвет Убыв, Вес Возр»);
Получить значение
Удалить строку
Найти одну строку
Найти несколько строк
Свернуть таблицу значений
Скопировать таблицу
Скопировать таблицу без данных
Узнать количество строк
Очистить
Обход таблицы значения
Обход коллекции с выбором элемента осуществляется с помощью цикла >, где оператор цикла Для предназначен для циклического повторения операторов, находящихся внутри конструкции, в данном случае таблицы значений. Так же можно обращаться к элементу коллекции посредством оператора [ ] ([аргумент]), где аргументом является индекс строки. Нумерация индексов строк начинается с нуля [0].
Прямой обход
Обратный обход таблицы (снизу вверх)
Чаще всего применяется для удаления строк в таблице.
Обход колонок
Можно перечислить все колонки в таблице значений в 1с 8.3 с помощю цикла >:
Читайте также: