Как обратиться к табличной части документа 1с
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить ( Строка . РеквизитТабличнойЧасти ) ;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.
Для получения перечня выделенных строк используется следующий код:
Для того чтобы обойти выделенные строки используется цикл Для каждого:
ВыделенныеСтроки = ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки ;
Для каждого Строка из ВыделенныеСтроки Цикл
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
Чтобы программно выделить все строки табличного поля:
Как очистить табличную часть
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
Для управляемых форм:
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока = ТабличнаяЧасть . Вставить ( Индекс )
//Индекс – номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока . Реквизит 1 = “Значение” ;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле.
- НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования ( Элемент , НоваяСтрока , Копирование )
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат ;
КонецЕсли ;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент . ТекущиеДанные ; //Получили текущую строку табличной части
ТекСтрока . СчетУчета = ПланыСчетов . Хозрасчетый . НужныйСчетУчета ;
КонецПроцедуры
Работа с табличной частью объектов в 1С : 7 комментариев
Приветствую!
Только начал изучать 1С.
Кое что уже знаю, но мало и опыта практически ноль.
Создал свою конфигурацию, пока только для тестов.
В данной конфигурации есть документ, назовем его «Заявка».
В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
Вопрос.
Как мне это сделать?
Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
Но как это оформить, пока не могу понять…
Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать.
Спасибо!
Буду пробовать.
А может это подойдет?
Табличная часть (Tabular section)
Итог (Total)
Синтаксис:
Тип: Число; Строка.
Индекс либо имя колонки, по которой подсчитывается итог.
Возвращаемое значение:
Тип: Число; Неопределено.
Суммирует значения всех строк в указанной колонке.
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Сервер, толстый клиент, внешнее соединение.
Пример:
Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.
Добрый день!
Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?
Не совсем понял, о чем конкретно вопрос.
Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Документы
Описание:
Документ – одно из основных понятий системы 1С:Предприятие. При помощи документов организуется ввод в систему информации о совершаемых хозяйственных операциях, а также ее просмотр и корректировка.
В большинстве своем документы, которые создаются в процессе настройки конфигурации задачи, являются электронными аналогами стандартных бумажных документов, являющихся основаниями для тех или иных учетных действий или расчетов. Тем не менее, использование этого типа данных может выходить далеко за рамки простой фиксации изменений, внесенных в учетные регистры.
Структура каждого конкретного вида документа определяется при его создании в конфигураторе. У любого вида документа существуют реквизиты, которые создаются автоматически – это “Дата” и “Номер”. Номер создается, если при конфигурировании длина номера указана больше 0. Другие реквизиты документа определяются в конфигураторе отдельно для каждого создаваемого вида документа.
Документы в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Сайт о программировании в 1с версии 7.7 и 8.x
25 августа 2011 г.
Обратиться к текущей строке табличной части документа или справочника
Задача: Есть документ, например, прием на работу. Ссылка на справочник Сотрудников – в табличной части. С точки зрения пользователя – можно принять на работу несколько человек одним документом.
Вопрос: Как обратиться к текущей строке документа и получить реквизиты (например для печати контракта)?
В версии 7.7 всё просто. Даже ничего не нужно придумываться. Как только мы активируем строку документа – программно уже можно получить значение реквизитов из текущей строки.
А вот в 8.1 сложнее: Табличных частей может быть много, форм документа тоже несколько.
В 8.1 – нужно понимать что Табличная часть документа отображается только через Табличное поле , поэтому обращение к текущей строке будет так:
Часто требуется показать в форме списка документа итог по реквизитам табличных частей, таких как Сумма, Итого и т.п. Для этого можно завести специальные реквизиты, которые заполнять в процедуре ПередЗаписью в модуле документа. Но эту же задачу можно выполнить запросом - не выгоняя пользователей и не перепроводя все старые документы.
В качестве тестового примера возьмем конфигурацию с одним документом (ссылка на скачивание - см. ниже).
В документе ПриходнаяНакладная есть реквизиты шапки Реквизит1, Реквизит2, Реквизит3, Табличные части Тч1 и Тч2, в каждой из которых есть реквизиты Сумма и Количество.
Автоматически система генерирует запрос такого вида:
Мы изменим этот запрос так, чтобы он обращался к данным табличных частей документа:
Запрос обращается к табличным частям, которые в этом примере названы как Тч1 и Тч2.
Части запроса, которые выполняют это обращение, на картинке ниже обведены в рамку:
Чтобы изменить запрос формы списка, нужно сделать следующее:
То есть, в открытой в конфигураторе форме списка документов дважды щелкаем на реквизит «Список», открываем его свойства и там выставляем, как показано на картинке выше, флажок «ПроизвольныйЗапрос» и щелкаем на ссылку «Настройка списка».
Чтобы форма списка с измененным запросом «вела себя» как обычная форма списка документов, надо выставить реквизит «Основная таблица», для оптимизации на больших базах можно поставить галочку «Динамическое считывание данных».
Вложенный запрос можно вписать вручную по аналогии с показанным примером, либо сформировать в конструкторе запросов.
Связи вложенного запроса с основной таблицей документа:
Показанная на рисунке выше настройка связей - это то же самое, что и конструкция «ЛЕВОЕ СОЕДИНЕНИЕ … ПО» в самом тексте запроса:
Настройка псевдонимов полей производится либо на закладке Объединения/Псевдонимы
либо в тексте запроса в выражении КАК:
Размещение реквизитов на форме списка
Полученные реквизиты нужно перетащить на форму, чтобы получилось вот это:
Тестовый пример конфигурации
- Последние изменения: 12.08.2014 20:26
- — romix
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Плаваю ещё в 1С программировании.
Как в модуле формы документа обратиться к реквизиту табличной части этого документа?
Обращение к реквизиту
Всем привет, помогите начинающему нубу в 1с У меня в документах есть страховой акт, в реквизитах.
Обращение к реквизиту формы
Добрый день всем! Что имеем: 1. Реквизит на форме "Контрагент" 2. Происходит обращение к.
Обращение к реквизиту справочника программно
Здарова. Ситуация: создал справочник, в нём реквизиты. В справочнике ФормаЭлемента создал команду.
Обращение к реквизиту шапки документа
Всем доброго времени! Такой вопрос - как можно поменять реквизит шапки документа. Нигде не.
GreenkO, прошу прощения, но у меня снова ступор. Сбросила конфигурацию(не знаю верно ли выгрузила. ). Проблема с документом НачисленияЗарплат. В модуле объекта я сделала автоподстановку оклада по фамилии. То есть, при выборе фамилии поле СтавкаЗаМесяц должно заполнится само. А оно мало того, что не заполняется, так ещё отладчик показал, что даже не заходит в функцию ПриИзменении. Тестовая База 1.rar
Тамика, у меня проблемы при загрузке конфигурации из файлов. На Configuration.xml выдает несоответствие XDTO.
Можете выгрузить конфигурацию одним файлом(Конфигурация - Сохранить конфигурацию в файл)? Или базу(Администрирование - Выгрузить информационную базу).
Тамика, а можете перед выгрузкой установить режим совместимости? У вас платформа 8.3.7, у меня 8.3.6, не открывает. После выгрузки можно будет все вернуть.
Решение
Тамика, события элементов формы описываются &НаКлиенте(так было и по умолчанию, вы видимо изменили). Обращение к данным регистра сведений происходит &НаСервере, т.е. вам надо было вызвать функцию на сервере для получения ставки.
По работе с регистром сведений - есть такая функция ПолучитьПоследнее(. ) - она сразу дает вам последнюю запись по регистру по заданному отбору.
Пользуйтесь синтакс-помощником, там так же описано, где можно вызывать определенные методы и получать свойства.
Здесь ДополнительныеРеквизиты - табличная часть в справочнике.
Печать табличной части справочника
Добрый день! Помогите пожалуйста! Конфигурация УТ 11.2. Печатная форма документа. В модуле.
Обратиться к табличной части документа. УТ 11.1
Мне необходимо построить отчет по РН Выручка и себестоимостьПродаж. Из измерения ЗаказКлиента.
С табличной части справочника в табличную часть документа
Добрый день! 1)Есть справочник "Продукция" там в стандартном реквизите название продукции. 2).
Подстановка из табличной части справочника в поле формы
Ребят, такой вопрос. Как реализовать подстановку из табличной части справочника определенной.
Тамика, а Свойство - реквизит ТЧ? И уж точно там тип не Строка, а что-то типа ПланВидовХарактеристикСсылка.
GreenkA, да, это реквизит ТЧ.
Попробовала Ваш вариант -
Справочник.ВнутренниеДокументы.Форма.ФормаЭлемента.Форма(671 ,24)>: Переменная не определена (ДополнительныеРеквизиты)
То есть, не видит почему-то табличную часть.
Решение
Тамика, так это управляемая форма элемента справочника.. Обходите циклом ТЧ через Объект: Объект.ДополнительныеРеквизиты
GreenkA, есть! Спасибо!
Скажите, пожалуйста. Может глупый вопрос, но в чём разница, когда я в модуле формы, между обращениями
Объект.Что-то И ЭтотОбъект.Что-то?
Добавлено через 3 минуты
GreenkA, и ещё вопрос.
Код работает, но для того, чтобы реквизит на форме заполнялся, нужно ещё обратится к нему на форме? Или он должен сам заполнится, если такое свойство найдено и реквизиту назначено значение?
Скажите, пожалуйста. Может глупый вопрос, но в чём разница, когда я в модуле формы, между обращениями
Объект.Что-то И ЭтотОбъект.Что-то?
Объект - это реквизит формы (обычно так именуется основной реквизит формы). Здесь Вы работаете с данными формы.
ЭтотОбъект - это сама форма (ее свойства, элементы, методы).
Добавлено через 2 минуты
Код работает, но для того, чтобы реквизит на форме заполнялся, нужно ещё обратится к нему на форме? Или он должен сам заполнится, если такое свойство найдено и реквизиту назначено значение?
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить ( Строка . РеквизитТабличнойЧасти ) ;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.
Для получения перечня выделенных строк используется следующий код:
Для того чтобы обойти выделенные строки используется цикл Для каждого:
ВыделенныеСтроки = ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки ;
Для каждого Строка из ВыделенныеСтроки Цикл
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
Чтобы программно выделить все строки табличного поля:
Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы . ИмяТабличногоПоля . ВыделенныеСтроки . Добавить ( ТекущаяСтрока ) ;
КонецЦикла ;
Как очистить табличную часть
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
Для управляемых форм:
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока = ТабличнаяЧасть . Вставить ( Индекс )
//Индекс - номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока . Реквизит 1 = "Значение" ;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле.
- НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования ( Элемент , НоваяСтрока , Копирование )
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат ;
КонецЕсли ;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент . ТекущиеДанные ; //Получили текущую строку табличной части
ТекСтрока . СчетУчета = ПланыСчетов . Хозрасчетый . НужныйСчетУчета ;
КонецПроцедуры
Работа с табличной частью объектов в 1С : 13 комментариев
Приветствую!
Только начал изучать 1С.
Кое что уже знаю, но мало и опыта практически ноль.
Создал свою конфигурацию, пока только для тестов.
В данной конфигурации есть документ, назовем его «Заявка».
В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
Вопрос.
Как мне это сделать?
Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
Но как это оформить, пока не могу понять…
Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать.
Спасибо!
Буду пробовать.
А может это подойдет?
Табличная часть (Tabular section)
Итог (Total)
Синтаксис:
Тип: Число; Строка.
Индекс либо имя колонки, по которой подсчитывается итог.
Возвращаемое значение:
Тип: Число; Неопределено.
Суммирует значения всех строк в указанной колонке.
Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
Сервер, толстый клиент, внешнее соединение.
Пример:
Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.
Добрый день!
Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?
Не совсем понял, о чем конкретно вопрос.
Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.
Здравствуйте!
Опишу вкратце ситуацию:
Из документа вызывается команда печати штрихкодов и в обработку печати передается, как я понимаю, весь контекст документа и печатаются этикетки для всех строк документа. Возможно ли в обработке печати получить информацию только о выделенных строках из этого контекста ? Прилагаю код модуля команды ПечатьЭтикеток.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
//Создаём новую коллекцию печатных форм
КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(«ПечатьЭтикеток»);
//Добавляем в коллекцию сформированный табличный документ
КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДокумент;
//Устанавливаем параметры печати (при необходимости)
КоллекцияПечатныхФорм[0].Экземпляров = 1;
КоллекцияПечатныхФорм[0].СинонимМакета = «ПечатьЭтикеток»; //Так будет выглядеть имя файла при сохранении в файл из формы «Печать документов»
//Вывод через стандартную процедуру БСП
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, Неопределено, Неопределено);КонецПроцедуры
ТабДокумент.АвтоМасштаб = истина ;
ТабДокумент.ОтображатьСетку = Ложь;
ТабДокумент.ТолькоПросмотр = Истина;
ТабДокумент.ОтображатьЗаголовки = Ложь;
Макет = ДокСсылка.ПолучитьОбъект().ПолучитьМакет(«Этикетка»);
Для каждого Стр Из ДокСсылка.Картриджи Цикл
//Если Лев(Стр.СерийныйНомер,2) «30» Тогда
// Продолжить;
//КонецЕсли;
ОбластьМакета = Макет.ПолучитьОбласть(«ШПК»);
ЧтоТо = Стр.СерийныйНомер;
ПервыйМодуль.ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,ЧтоТо) ;
Информацию о выделенных строках вы можете получить только в модуле формы документа, причем, если мне не изменяет память, это должна быть клиентская процедура. По ссылке на документ выделенные строки получить нельзя.
Значит я на клиенте должен сформировать таблицу выделенных строк и уже ее передавать в обработку печати ?
Да, логика такая. Только учтите, что таблица значений не передается с клиента на сервер.
Выделенный строки табличного поля на форме — это массив строк. Надо попробовать, передастся ли он. Если да, хорошо. Если нет — надо думать, как его передать.
Доброго времени суток!
Создаю обработку на обычных формах, в которой имеется несколько Табличных частей. Они в свою очередь находят отображение в Форме обработки. И если данные первых 3, меня после закрытия Формы, не интересуют, то данные последней хотелось-бы использовать в дальнейшем, пока открыта обработка. В настоящее время при закрытии Формы Табличные части очищаются. В дальнейшем, в новом сеансе работы с обработкой эти данные не нужны. Насколько я понимаю Функции сохранения Данных Табличной части обработки не существует. Табличную часть в обработке решил использовать из-за возможности сохранить структуру Данных. Как мне сохранить эти данные для использования в других окнах?
Может у Вас есть видео по данному вопросу?
Читайте также: