В рамках данной статьи мы напишем обработку заполнения табличной части в 1С 8.3 для типовой конфигурации 1С:ERP 2.1. Предположим, что целью поставленной задачи стоит установка ручной скидки в размере 5% для всех номенклатурных позиций данного документа. Пример из статьи можно скачать по или другой аналогичной обработки по .
Данная инструкция предназначена для управляемых форм (8.2 и 8.3). Для обычных форм (8.1, 8.2) можно воспользоваться .
Создайте и сохраните на ваш компьютер новую обработку. Сначала необходимо произвести некоторые регистрационные действия.
Откройте модуль объекта и пропишите код, приведенный ниже (его также можно взять из данной выше обработки). В целом, структура не будет меняться в зависимости от ситуации. Редактируются только некоторые параметры настроек, а так же при необходимости имена переменных.
В рамках данной статьи мы не будем подробно останавливаться на регистрации внешних обработок и печатных форм в 1С. Вся эта информация есть в других наших статьях.
Заполнение табличной части документа
Создадим новую форму обработки.
Теперь нам необходимо добавить на созданной форме новую команду. Предполагается, что она будет автоматически менять данные в табличной части как одного, так и нескольких документов (их формы списка) одновременно, записывая их впоследствии.
В рамках нашего примера будет произведена обработка уже существующей табличной части «Товары». Для каждой строки будет установлена ручная скидка в размере 5%. Так же, мы рассчитаем саму сумму данной скидки, равную сумме товаров в строке, умноженных на 0,05.
&НаСервере Процедура ВыполнитьКоманду(Команда, ОбъектыНазначения) Для каждого ЗаказКлиента из ОбъектыНазначения Цикл ЗаказКлиентаОбъект = ЗаказКлиента. ПолучитьОбъект() ; Для каждого СтрокаТЗ из ЗаказКлиентаОбъект. Товары Цикл СтрокаТЗ. ПроцентРучнойСкидки = 5 ; СтрокаТЗ. СуммаРучнойСкидки = СтрокаТЗ. Сумма * 0 . 05 ; КонецЦикла ; ЗаказКлиентаОбъект. Записать() ; КонецЦикла ; КонецПроцедурыРегистрация внешней обработки
Запустите 1С в режиме «Предприятие» и откройте справочник «Дополнительные отчеты и обработки». Найдем его через меню «Все функции».
Создайте новый элемент в открывшемся справочнике и по одноименной кнопке загрузите из файла свою обработку. Разместим ее одновременно и на форме списка и на форме самой карточки документа.
Теперь в форме списка документов «Заказ клиента» появится кнопку «Заполнение…», которая позволит произвести изменить ручные скидки товаров сразу у нескольких документов.
Так же данная кнопка будет доступна и в карточке самого документа.
Для того, чтобы произвести какие то действия со строками табличной части необязательно менять конфигурацию. В платформе 1С 8.2 есть механизм, который позволяет выполнить работу с табличной частью при помощи внешней обработки. Для этого обработку нужно оформить соответствующим образом и поместить в справочник внешних обработок. После чего в нужном документе появится кнопка, которая будет выполнять действие прописанное в модуле нашей обработки.
Для начала создадим в конфигураторе внешнюю обработку при помощи меню Файл/Новый. В появившемся окне выберем «Внешняя обработка».
Сама процедура должна выглядеть следующим образом:
Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПоле) Экспорт;
Для каждого СтрокаТабличнойЧасти из Объект[ИмяТабличнойЧасти] Цикл
СтрокаТабличнойЧасти.Результат = Окр(СтрокаТабличнойЧасти.Результат);
КонецЦикла;
КонецПроцедуры
В данном примере нужно было округлить результаты расчета зарплаты в документе «Начисление зарплаты» в ЗУП 2.5. Вы же прописывайте необходимые вам действия с табличной частью документа. Процедура обязательно должна называться «Инициализировать», содержать три параметра и ключевое слово «Экспорт».
После того как прописали то что должна делать обработка, сохраняем её и переходим в режим 1С Предприятия, где регистрируем обработку в справочнике внешних обработок.
Обязательно нужно выбрать реквизит вид — «Заполнение табличных частей». В таблицу добавляем строку и заполняем все нужные поля. Представление объекта — это документ, в котором необходимо вызвать нашу обработку. Табличная часть — наименование табличной части, т.к. их может быть несколько в документе. И представление кнопки — это то как будет выглядеть кнопка в меню «Заполнить» над табличной частью.
После выполнения всех действий записываем элемент и переходим в нужный документ. Видим что над табличной частью появилась новая кнопка. Пользуемся и радуемся.)
Надеюсь, эта статья помогла вам создать механизм для заполнения или обработки табличной части. Если нет, вы всегда можете и я напишу для вас любую обработку.)
Также вы можете скачать для примера обработку, которая получилась в ходе написания этой статьи, для этого нажмите на ссылку ниже.
Табличные части существуют у многих объектов в 1С:
- Справочники
- Документы
- Отчеты и обработки
- Планы счетов
- Планы видов характеристик
- Планы видов расчета
- Бизнес-процессы и задачи
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить(Строка. РеквизитТабличнойЧасти) ;
КонецЦикла ;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита .
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле . Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения .
Для получения перечня выделенных строк используется следующий код:
Для того чтобы обойти выделенные строки используется цикл Для каждого :
ВыделенныеСтроки= ЭлементыФормы. ИмяТабличногоПоля. ВыделенныеСтроки;
Для каждого Строка из ВыделенныеСтроки Цикл
//содержимое цикла
КонецЦикла ;
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
ЭлементыФормы. ИмяТабличногоПоля. ВыделенныйСтроки. Очистить() ;
Чтобы программно выделить все строки табличного поля:
Для
каждого ТекущаяСтрока Из
ТабличнаяЧасть Цикл
ЭлементыФормы.
ИмяТабличногоПоля.
ВыделенныеСтроки.
Добавить(ТекущаяСтрока)
;
КонецЦикла
;
Как очистить табличную часть
ТабличнаяЧасть. Очистить() ;
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
ЭлементыФормы. ИмяТабличногоПоля. ТекущиеДанные;
Для управляемых форм:
Элементы. ИмяТабличногоПоля. ТекущиеДанные;
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
НоваяСтрока=
ТабличнаяЧасть.
Добавить()
;
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока=
ТабличнаяЧасть.
Вставить(Индекс)
//Индекс - номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока. Реквизит1 = "Значение" ;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования .
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле .
- НоваяСтрока — булево. Содержит значение Истина , если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина , если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета , в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
//Если пользователь редактирует существующую строку, то ничего не делаем
Если
НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли
;
//Если же строка новая, устанавливаем счет учета
ТекСтрока =
Элемент.
ТекущиеДанные;
//Получили текущую строку табличной части
ТекСтрока.
СчетУчета =
ПланыСчетов.
Хозрасчетый.
НужныйСчетУчета;
КонецПроцедуры