1с как найти номер строки табличной части

Как получить номер текущей строки в табличной части в управляемой форме?

Я
   popcorn

20.07.11 — 07:32

Пишу так:

ТекСтрока=Объект.ТЧасть[Элементы.Tabl.ТекущаяСтрока];

При этом если удалить выше несколько строк, то нумерация сбивается (первая строка может иметь номер больше 1, смотря сколько строк перед ней было удалено)

   Necessitudo

1 — 20.07.11 — 07:39

Мб ТекущиеДанные? А индекс строки не пробовали применить?

   popcorn

2 — 20.07.11 — 07:40

(1) а где взять индекс строки?

   popcorn

3 — 20.07.11 — 07:45

На сервере код выполняется. ТекущиеДанные не доступны

   popcorn

4 — 20.07.11 — 07:56

Придется передавать номер строки с клеента… (((

   Necessitudo

5 — 20.07.11 — 07:59

Индекс равен номеру строки -1

   popcorn

6 — 20.07.11 — 08:21

(5) а номер строки только на клиенте можно получить?

   Asmody

7 — 20.07.11 — 08:36

ПолучитьИдентификатор, НайтиПоИдентификатору, далее — СП

   popcorn

8 — 20.07.11 — 09:00

(7) что к чему вообще не понял

   Necessitudo

9 — 20.07.11 — 09:04

(6) Контейнер Элементы доступен  в тонком клиенте пля)

   guitar_player

10 — 20.07.11 — 09:14

(7) получить идентификатор строки, найти по идентификатору.

   popcorn

11 — 20.07.11 — 09:20

(9) значит в (5) бесполезняк (((

   guitar_player

12 — 20.07.11 — 09:23

(11)чем 7 не устраивает? через этот способ можно сделать?

   Asmody

13 — 20.07.11 — 09:25

А если ещё в СП прочитать, что такое в УФ ТекущаяСтрока…

   Necessitudo

14 — 20.07.11 — 09:35

у каждой задачки в 1С куча способов решения.

   popcorn

15 — 20.07.11 — 10:08

(12) кто сказал что (7) не устраивает? Вполне годится.

Только не понятно что он подразумевал под СП, но и без этого думаю будет работать.

   Asmody

16 — 20.07.11 — 11:33

(15) объясните мне, как люди работают без СП?

   popcorn

17 — 20.07.11 — 13:10

(16) без какого еще СП. Сперва расшифруй

   marty0701

18 — 20.07.11 — 13:15

Синтакс помощник. Ваш К.О.

З.Ы. Сам сначала мозг ломал, читая сообщения тут=)

   marty0701

19 — 20.07.11 — 13:16

*Синтакс-Помощник, да простят меня боги одноэса

   Aprobator

20 — 20.07.11 — 13:17

определенно пятница уже начинается

   Asmody

21 — 20.07.11 — 13:34

   Asmody

22 — 20.07.11 — 13:44

а чтобы мозг больше не ломали, вот так должна выглядеть строка из (0):

ТекСтрока=Объект.ТЧасть.НайтиПоИдентификатору(Элементы.Tabl.ТекущаяСтрока);

   popcorn

23 — 20.07.11 — 13:45

Так и писали бы по-понятному — Ctrl+F1, а то СП какой-то, хрен догадаешься…

   popcorn

24 — 20.07.11 — 13:45

(22) именно так я и сделал.

  

popcorn

25 — 20.07.11 — 13:46

(7) Спасибо!

На чтение 11 мин Просмотров 2.5к. Опубликовано 01.12.2020

Содержание

  1. Синтаксис
  2. Параметры
  3. Возвращаемое значение
  4. Описание
  5. Доступность
  6. Пример использования
  7. Как обойти табличную часть
  8. Как получить и обойти выделенные строки табличной части
  9. Как программно выделить строки табличной части (табличного поля) и снять выделение
  10. Как очистить табличную часть
  11. Как получить текущую строку табличной части
  12. Как добавить новую строку в табличную часть
  13. Как программно заполнить реквизиты строки табличной части
  14. Работа с табличной частью объектов в 1С : 7 комментариев
  15. Справочник
  16. Основные индексы
  17. Дополнительные индексы для подчиненного справочника (вне зависимости от иерархичности справочника)
  18. Дополнительные индексы для иерархического неподчиненного справочника
  19. Дополнительные индексы для иерархического подчиненного справочника

Возвращает индекс строки таблицы значений

Синтаксис

Метод Индекс() имеет следующий синтаксис:

А также альтернативный англоязычный синтаксис:

Параметры

Описание параметров метода Индекс() :

Имя параметра Тип Описание
Строка СтрокаТаблицыЗначений Строка таблицы значений, для которой нужно определить индекс.
Жирным шрифтом выделены обязательные параметры

Возвращаемое значение

Число
Индекс указанной строки таблицы значений.

Описание

Метод Индекс() возвращает индекс указанной строки в коллекции строк таблицы значений. Если строка не найдена, возвращается -1.

Доступность

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).

Пример использования

Пример кода с использованием метода Индекс() :

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить ( Строка . РеквизитТабличнойЧасти ) ;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Для получения перечня выделенных строк используется следующий код:

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

ВыделенныеСтроки = ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки ;

Для каждого Строка из ВыделенныеСтроки Цикл

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

Чтобы программно выделить все строки табличного поля:

Как очистить табличную часть

Как получить текущую строку табличной части

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

Для обычных форм код будет выглядеть так:

Для управляемых форм:

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока = ТабличнаяЧасть . Вставить ( Индекс )
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока . Реквизит 1 = «Значение» ;

Как программно заполнить реквизиты строки табличной части

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования ( Элемент , НоваяСтрока , Копирование )

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат ;
КонецЕсли ;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент . ТекущиеДанные ; //Получили текущую строку табличной части
ТекСтрока . СчетУчета = ПланыСчетов . Хозрасчетый . НужныйСчетУчета ;
КонецПроцедуры

Работа с табличной частью объектов в 1С : 7 комментариев

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

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

Я бы порекомендовал сделать запрос к табличной части документа (именно к табличной части, а не к документу). Выбрать там ваш столбец Стоимость и другие столбцы, если нужно. И применить функцию СУММА к этому столбцу. Подробнее и с примерами смотрите в статье Группировки в запросах 1С http://chel1c.ru/querry_group/

Спасибо!
Буду пробовать.

А может это подойдет?

Табличная часть (Tabular section)
Итог (Total)
Синтаксис:

Тип: Число; Строка.
Индекс либо имя колонки, по которой подсчитывается итог.
Возвращаемое значение:

Тип: Число; Неопределено.

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

Сервер, толстый клиент, внешнее соединение.
Пример:

Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.

Добрый день!
Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?

Не совсем понял, о чем конкретно вопрос.
Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.

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

В приведенных ниже таблицах имена индексных полей приведены так, как они описаны в разделе документации «Таблицы запросов».
Для измерений, реквизитов и т.д. применяются условные имена Измерение1, Реквизит1 и т.д.
Для общих реквизитов, являющихся разделителями в режиме «независимо», будем использовать имена ОРНР (ОРНР1, ОРНР2, и т.д.).
Для общих реквизитов, являющихся разделителями в режиме «независимо и совместно», будем использовать имена ОРСР.
Если режим разделения не имеет значения, то для общих реквизитов, являющихся разделителями, будем использовать имена ОРР.
Если в конфигурации определены разделители, то в индексы может входит поле, которое содержит значение хэш-функции набора значений разделителей. Такое поле будем обозначать именем ОРРХ.
Те индексные поля, которые не являются обязательными приведены в квадратных скобках, а если в индексе присутствует набор однотипных полей, это описывается многоточием, например: Реквизит + Измерение1 + [Измерение2 +. ].

Данным материалом следует руководствоваться при написании текстов запросов с целью оптимизации времени их исполнения.

Справочник

Основные индексы

[ОРНР1 + . +] Ссылка (Кластерный)

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

[ОРРХ | ОРНР1 +] Код + Ссылка

Свойство «Длина кода» не равно 0.
Если справочник разделяется одним независимым разделителем, тип которого не Строка, то индекс содержит поле этого разделителя.
Если тип разделителя — Строка, или разделитель независимый и совместный, или разделителей больше одного, то индекс содержит поле значения хэш-функции значений разделителей.
Это правило справедливо для всех индексов, в составе которых указано [ОРРХ | ОРНР1 +].

Свойство «Длина наименования» не равно 0.

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать».

[ ОРРХ | ОРНР1 +] Реквизит + Код + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина кода» не равно 0, а свойство «Основное представление» равно «В виде кода».

[ ОРРХ | ОРНР1 +] Реквизит + Наименование + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина наименования» не равно 0, а свойство «основное представление» равно «В виде наименования».

Справочник включен в критерий отбора через реквизит «Реквизит».

Индекс по идентификатору предопределенного объекта метаданных.

Дополнительные индексы для подчиненного справочника (вне зависимости от иерархичности справочника)

Свойство «Длина кода» равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Код + Ссылка

Свойство «Длина кода» не равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Наименование + Ссылка

Свойство «Длина наименования» не равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать».

[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Код + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина кода» не равно 0, а свойство «Основное представление» равно «В виде кода».

[ ОРРХ | ОРНР1 +] Владелец + Реквизит + Наименование + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина наименования» не равно 0, а свойство «основное представление» равно «В виде наименования».

Дополнительные индексы для иерархического неподчиненного справочника

Если для справочника установлено свойство «Размещать группы сверху», то в индексах, наряду с полем Родитель, участвует поле ЭтоГруппа. Состав индексов соответствует приведенной ниже таблице.

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Ссылка

Свойство «Длина кода» равно 0 и свойство «Длина наименования» равно 0.

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Код + Ссылка

Свойство «Длина кода» не равно 0.

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Наименование + Ссылка

Свойство «Длина наименования» не равно 0.

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать».

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Код + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина кода» не равно 0, а свойство «Основное представление» равно «В виде кода».

[ ОРРХ | ОРНР1 +] Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина наименования» не равно 0, а свойство «основное представление» равно «В виде наименования».

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

Дополнительные индексы для иерархического подчиненного справочника

Если для справочника установлено свойство «Размещать группы сверху», то в индексах, наряду с полем Родитель, участвует поле ЭтоГруппа. Состав индексов соответствует приведенной ниже таблице.

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Ссылка

Свойство «Длина кода» равно 0 и свойство «Длина наименования» равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Код + Ссылка

Свойство «Длина кода» не равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Наименование + Ссылка

Свойство «Длина наименования» не равно 0.

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать».

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Код + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина кода» не равно 0, а свойство «Основное представление» равно «В виде кода».

[ ОРРХ | ОРНР1 +] Владелец + Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка

Для реквизита «Реквизит» свойство «Индексировать» установлено в значение «Индексировать с доп. упорядочиванием» и при этом свойство «Длина наименования» не равно 0, а свойство «основное представление» равно «В виде наименования».

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

  1. Никак не могу найти метод получить номер колонки и строки табличной части. Извините, что не привожу примеры попыток (какие-то они не хорошие), если не сложно подскажите пожалуйста.


  2. Itsys

    Offline

    Itsys
    Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    2
    Баллы:
    26

    У строки «НомерСтроки»
    А зачем нужен номер колонки?


  3. Dvdovin

    Offline

    Dvdovin

    Регистрация:
    9 сен 2010
    Сообщения:
    18
    Симпатии:
    0
    Баллы:
    1

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

    А что касается номера колонуи: Вы могли бы более подробно объяснить задачу. для чего и т.д. Может там и не обязательно знать номер колонки?

  4. Подробнее не получится, попробую объясниться проще:
    — Процедура: ТабличноеПоле1ПриАктивизацииЯчейки(Элемент);
    Грубо говоря, надо чтобы при активизации ячейки, сообщился номер колонки (название) и номер строки.


  5. uza

    Offline

    uza
    1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29

     Процедура ТабличноеПоле1ПриАктивизацииЯчейки(Элемент)
    ВыбКолонка = Элемент.ТекущаяКолонка.Данные;
    ВыбСтрокаТЗ= Элемент.ТекущаяСтрока;
    Если ВыбСтрокаТЗ = Неопределено Тогда
    НомерСтроки = "строка не выбранна";
    Иначе
    Сч = 0;
    Для каждого СтрокаТЗ Из ТабличноеПоле1 Цикл
    Сч = Сч + 1;
    Если СтрокаТЗ = ВыбСтрокаТЗ Тогда
    НомерСтроки = "Строка "+Сч+" (программный номер "+(Сч-1)+")";
    Прервать;
    КонецЕсли; 
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 		
    КонецЕсли; 
    Сообщить("Колонка = "+ВыбКолонка+" Строка="+НомерСтроки);
    КонецПроцедуры
    
    

  6. Itsys

    Offline

    Itsys
    Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    2
    Баллы:
    26

    Зачем так сложно?

    Процедура ТабличноеПоле1ПриАктивизацииЯчейки(Элемент)
    Если Элемент.ТекущаяСтрока <> Неопределено Тогда
    Сообщить("Колонка: " + Элемент.ТекущаяКолонка.Данные + " строка: " + (Элемент.Значение.Индекс(Элемент.ТекущаяСтрока) + 1));
    КонецЕсли;
    КонецПроцедуры
    
    

  7. mialord

    Offline

    mialord
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.460
    Симпатии:
    53
    Баллы:
    54

    Разберитесь пожалуйста что такое табличное поле и табличная часть, а то в заблуждения вводите.


  8. uza

    Offline

    uza
    1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29

    Я наверное уже старый пердун, но когда я учился в институте (академии, а затем в универе) — нас несчадно пиз… били
    по голове за такие длинные строки кода. Так то да, можно сказать «зачем так сложно и просто в одну
    строку переписать сотню строчек кода ;)

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

    P.S.
    К тому функция вложенная в параемтр функции… Декстра ворочается в гробу а Вирт смотрит на тебя как на…
    Вот почитай на досуге


  9. Itsys

    Offline

    Itsys
    Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    2
    Баллы:
    26

    Когда я учился перлу, то считалось, что чем короче программа, тем круче :)

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

    Красиво будет вот так:

    Процедура ТабличноеПоле1ПриАктивизацииЯчейки(Элемент)
    Если Элемент.ТекущаяСтрока <> Неопределено Тогда //Проверим активирована ли строка
    НазваниеКолонки = Элемент.ТекущаяКолонка.Данные;
    ТекущаяСтрока = Элемент.ТекущаяСтрока;
    ИндексСтроки = Элемент.Значение.Индекс(ТекущаяСтрока);
    НомерСтрокиПоПорядку = ИндексСтроки + 1;
    Сообщить("Колонка: " + НазваниеКолонки + " строка: " + НомерСтрокиПоПорядку);
    КонецЕсли; //Проверим активирована ли строка
    КонецПроцедуры
    
    

  10. uza

    Offline

    uza
    1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29

    Ну да, про цикл — это честно затупил (вечер, усталость и еще с десяток оправданий).

    А по поводу короткости программы — разницы нет, что записать:
    а = Функция1();
    б = Функция2(а);
    в = Функция3(б);

    или

    в = Функция3(Функция2(Функция1()));

    На уровне нулей и единиц прога будет испольняться в виде первой конструкции. А вот читабельность падает и отладка усложняется.


  11. Itsys

    Offline

    Itsys
    Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    2
    Баллы:
    26

    А как же выделение памяти по а и б?
    Тогда уж так:

    а = Функция1();
    б = Функция2(а);
    в = Функция3(б);
    a = Неопределено;
    б = Неопределено;
    
    

  12. uza

    Offline

    uza
    1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29

    Ну я уж не настолько олдфагер, чтобы мандражить над парой байт/килобайт оперативы. Да и это, сборщик мусора сам все соберет — уж это то было уже и когда я учился (не считая начальных этапов си и прочих паскелей)


  13. mialord

    Offline

    mialord
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.460
    Симпатии:
    53
    Баллы:
    54

    Да к тому же это и не поможет, НЕОПРЕДЕЛЕНО это тип.


  14. Itsys

    Offline

    Itsys
    Опытный в 1С

    Регистрация:
    3 янв 2010
    Сообщения:
    1.394
    Симпатии:
    2
    Баллы:
    26

    mialord, Неопределено тип, но вопрос в том, сколько на него отводится памяти, а сколько на ТЗ из 200 строк :)
    uza, а Вы уверены, что сборщик мусора в 1С хорошо работает, я очень сильно в этом сомневаюсь, о чем говорят ошибки о нехватке памяти :)
    Ладно, тему лучше закрыть, а то пошел сплошной офтопик…


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Есть табличная часть, из которой мне надо перебрать все документы, но не циклом типа «Для Каждого», а через номер строки, и еще должно учитываться то, что строки когда-нибудь закончатся, т.е. программа может вылететь с ошибкой, если не проверить существование следующей строки в таб.части.
В регистре расчетов тоже надо получить строки по номерам с проверкой, но как такое реализовать? Везде вижу этот «Для Каждого…» :dfbbdrfb:

Многие объекты метаданных в 1С могут иметь табличную часть. У одного объекта может быть создано неограниченное количество табличных частей.

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

Строка табличной части не является отдельным объектом. К строке можно обратиться только по индексу строки в табличной части.

Программно нельзя создать табличную часть через конструктор. Можно только получить к ней доступ через основной объект:

//создаем объект
НовыйДок = Документы.РасходТовара.СоздатьДокумент();
//через объект получаем доступ к табличной части СписокУслуг
ТабЧастьДока = НовыйДок.СписокУслуг;

Строка табличной части

Добавить новую строку табличной части можно с помощью методов Добавить и Вставить. Через точку от строки табличной части можно обращаться к реквизитам строки:

//добавление строки табличной части
СтрокаТабличнойЧасти = НовыйДок.СписокУслуг.Добавить();
СтрокаТабличнойЧасти.Услуга = СсылкаНаУслугу;
СтрокаТабличнойЧасти.СуммаУслуги = 900;

//для метода Вставить нужно указать индекс строки
СтрокаТабличнойЧасти = НовыйДок.СписокУслуг.Вставить(1);
СтрокаТабличнойЧасти.Услуга = СсылкаНаУслугу;
СтрокаТабличнойЧасти.СуммаУслуги = 800;

//у строки есть предопределенная колонка НомерСтроки
Сообщить(СтрокаТабличнойЧасти.НомерСтроки); //2
//в отличии от индексов номера строк начинаются с 1

Заполнение табличной части

Заполнить табличную часть можно по одной строке с помощью методов Добавить и Вставить, а также с помощью методов Загрузить и ЗагрузитьКолонку для массового заполнения табличной части:

//создаем таблицу значений
ТЗТаблЧасть = Новый ТаблицаЗначений;
ТЗТаблЧасть.Колонки.Добавить("Услуга");
ТЗТаблЧасть.Колонки.Добавить("СуммаУслуги");

СтрокаТЗ = ТЗТаблЧасть.Вставить(1);
СтрокаТЗ.Услуга = СсылкаНаУслугу;
СтрокаТЗ.СуммаУслуги = 800;

СтрокаТЗ = ТЗТаблЧасть.Вставить(1);
СтрокаТЗ.Услуга = СсылкаНаУслугу;
СтрокаТЗ.СуммаУслуги = 900;

//создаем документ
НовыйДок = Документы.РасходТовара.СоздатьДокумент();

//заполнение табличной части из таблицы значений
//имена колонок должны совпадать
//все прежние строки будут удалены из табличной части
НовыйДок.СписокУслуг.Загрузить(ТЗТаблЧасть);

МассивТаблЧасть = Новый Массив;
МассивТаблЧасть.Добавить(500);
МассивТаблЧасть.Добавить(600);

//заполнение одной колонки табличной части
//все значения из массива будут загружены в колонку СуммаУслуги
НовыйДок.СписокУслуг.ЗагрузитьКолонку(МассивТаблЧасть, "СуммаУслуги");

Перебор табличной части

Перебрать табличную часть можно в цикле:

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//обход табличной части через цикл Для Каждого
Для Каждого СтрокаТабличнойЧасти Из ДокОбъект.СписокУслуг Цикл
	Сообщить(СтрокаТабличнойЧасти.НомерСтроки);
КонецЦикла;	

//количество строк табличной части
КолвоСтрок = ДокОбъект.СписокУслуг.Количество();

//Перебор табличной части через цикл Для
Для ё = 0 По КолвоСтрок Цикл
	//строку можно получить через квадратные скобки
	СтрокаТабличнойЧасти = ДокОбъект.СписокУслуг[ё];
	Сообщить(СтрокаТабличнойЧасти.НомерСтроки);
	
	//или методом Получить
	СтрокаТабличнойЧасти = ДокОбъект.СписокУслуг.Получить(ё);
	Сообщить(СтрокаТабличнойЧасти.НомерСтроки);
КонецЦикла;	

//через цикл Пока можно перебрать табличную часть с конца 
ИндСтр = КолвоСтрок; 
Пока ИндСтр > 0 Цикл
	//строку можно получить через квадратные скобки
	СтрокаТабличнойЧасти = ДокОбъект.СписокУслуг[ИндСтр];
	Сообщить(СтрокаТабличнойЧасти.НомерСтроки);	
	
	ИндСтр = ИндСтр - 1;
КонецЦикла;	

Удаление строк табличной части

Удалить одну строку табличной части можно с помощью метода Удалить. Для удаления всех строк применяется метод Очистить.

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//удалить строку табличной части по индексу
//удалит вторую строку
ДокОбъект.СписокУслуг.Удалить(1);

//удалить все строки табличной части
ДокОбъект.СписокУслуг.Очистить();
//можно так
Для Каждого СтрТаблЧасть Из ДокОбъект.СписокУслуг Цикл
	ДокОбъект.СписокУслуг.Удалить(СтрТаблЧасть);	
КонецЦикла;	

//удалить строки табличной части по условию
//строки перебираем с конца
ИндСтр = ДокОбъект.СписокУслуг.Количество() - 1;
Пока ИндСтр >= 0 Цикл
	//по индексу получаем строку
	СтрокаТабличнойЧасти = ДокОбъект.СписокУслуг.Получить(ИндСтр);
	//удаляем все строки, где СуммаУслуги < 500
	Если СтрокаТабличнойЧасти.СуммаУслуги < 500 Тогда
		ДокОбъект.СписокУслуг.Удалить(СтрокаТабличнойЧасти);	
	КонецЕсли;
	
	//уменьшаем индекс
	ИндСтр = ИндСтр - 1;
КонецЦикла;	

//после удаления строк нужно записать объект
ДокОбъект.Записать();

Как выгрузить табличную часть

Табличную часть можно выгрузить в таблицу значений методом Выгрузить. Также можно выгрузить в массив все значения одной колонки методом ВыгрузитьКолонку:

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

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

//можно указать какие колонки выгружать
ТЗТаблЧасть = ДокОбъект.СписокУслуг.Выгрузить(, "Услуга");

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

//можно выгрузить в массив
МассивУслуг = ДокОбъект.СписокУслуг.ВыгрузитьКолонку("Услуга");

Методом ВыгрузитьКолонки можно создать пустую таблицу значений с такими же колонками, как у табличной части:

//все колонки
ПустаяТЗ = ДокОбъект.СписокУслуг.ВыгрузитьКолонки();

//можно указать список колонок
ПустаяТЗ = ДокОбъект.СписокУслуг.ВыгрузитьКолонки("Услуга");

Итог по табличной части

Для получения итога по числовой колонке табличной части можно воспользоваться методом Итог:

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//параметром указывается имя колонки
СуммаВсего = ДокОбъект.СписокУслуг.Итог("СуммаУслуги");

Свернуть табличную часть

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

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//сворачиваем табличную часть
ДокОбъект.СписокУслуг.Свернуть("Услуга", "СуммаУслуги");

//записываем
ДокОбъект.Записать();

Сортировка табличной части

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

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//сортировка табличной части по возрастанию сумму
ДокОбъект.СписокУслуг.Сортировать("СуммаУслуги");

//сортировка табличной части по убыванию сумму
ДокОбъект.СписокУслуг.Сортировать("СуммаУслуги Убыв");

//записываем
ДокОбъект.Записать();

Поиск в табличной части

Чтобы найти строку в табличной части можно воспользоваться методами Найти и НайтиСтроки. Метод Найти позволяет найти одну (первую попавшуюся) строку по значению. Метод НайтиСтроки позволяет найти несколько строк, подходящих под условие:

//из ссылки получаем объект
ДокОбъект = СсылкаНаДок.ПолучитьОбъект();

//найти строку с суммой равно 500
СтрокаТабличнойЧасти = ДокОбъект.СписокУслуг.Найти(500, "СуммаУслуги");
Если Не СтрокаТабличнойЧасти = Неопределено Тогда
	//нашли
КонецЕсли;

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

ОЧИСТКА ТАБЛИЧНОЙ ЧАСТИ ДОКУМЕНТА

Каждый раз при выполнении кода могут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, чтобы очищать имеющиеся строки, перед добавлением новых строк можно воспользоваться методом Очистить объекта СписокТоваров, который имеет тип ДанныйФормыКоллекция.

Объект.СписокТоваров.Очистить();

После выполнения этого метода вся табличная часть будет очищена.

ТЕКУЩАЯ СТРОКА ТАБЛИЧНОЙ ЧАСТИ

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

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

Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.

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

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

&НаКлиенте
Процедура СписокТоваровЦенаПриИзменении(Элемент)
	ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат; //если пустая таблица
	КонецЕсли;
	ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:

&НаКлиенте
Процедура УмножитьНа2(Команда)
    ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат; //если пустая таблица
    КонецЕсли;
    ТекДанные.Количество = ТекДанные.Количество * 2;
    ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
ИдентификторСлед = Идентификтор + 1;

Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
    Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
КонецЕсли;

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

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

&НаКлиенте
Процедура СписокТоваровКоличествоПриИзменении(Элемент)
    Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
    Если Идентификтор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра «Кто хочет стать миллионером?» с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Понравилась статья? Поделить с друзьями:
  • Как найти похожих песен
  • Как найти павильон саккэи в геншин
  • Как найти подходящее сто
  • Лего хоббит как найти некроманта
  • Как найти градусную сетку на карте