Что такое табличная часть
Перейти к содержимому

Что такое табличная часть

  • автор:

Табличная часть

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

Например, справочник Сотрудники может иметь табличную часть Состав семьи. Состав этой информации одинаков: ФИО, степень родства. Но количество членов семьи у разных сотрудников может быть разным.

Полезные ссылки:

  • Учимся программировать — Статьи по работе с табличной частью объектов,
  • ИТС — Рекомендации по выбору между подчиненным справочником и табличной частью

Табличная часть объектов 1С 8.3

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

Табличная часть документа в 1С 8.3

Наиболее часто перечисление какой-то однотипной информации реализуется в документах. Например, у нас может быть приход различного товара на склады, или продажа разного товара контрагентам. Создать табличную часть документа можно двумя способами. Первый, в конструкторе документа: на закладке данные, во втором окне для табличных частей, где и нужно добавлять новую табличную часть при помощи кнопки «Добавить табличную часть».

Добавление табличной части документа 1С

Добавление табличной части документа 1С

Второй способ: непосредственно в окне редактирования метаданных. Для этого нужно мышкой выделить ветвь дерева документа, вызвать контекстное меню и выполнить единственную команду «Добавить»

Добавление табличной части документа 1СДобавление табличной части документа 1С

Табличная часть справочника 1С 8.3

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

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

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

Добавление колонки табличной части 1С

Добавление колонки табличной части 1С

Второй способ, посредством окна метаданных (нужно выделить мышкой табличную часть).

Добавление колонки табличной части 1С

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

Тип реквизита табличной части 1С

Количество колонок вы можете создавать практически неограниченное количество, в зависимости от вашей прикладной задачи.

Реквизиты табличной части 1С

Табличная часть 1С 8.3 на управляемой форме

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

Табличная часть в конструкторе формы документа

Если же вы уже создали форму документа, а потом в конфигураторе сделали табличную часть (или забыли добавить табличную часть в конструкторе), то вам нужно в форме перетащить мышкой табличную часть из дерева объекта в дерево элементов.

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

При переносе на вопрос «Добавить колонки», отвечаем «Да» (иначе придется добавлять колонки вручную, о чем мы поговорим ниже).

Добавление всех колонок табличной части на форму

После этого табличная часть со всеми колонками будет добавлена на форму.

Табличная часть на управляемой форме

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

Перенос колонок табличной части на форму

У ветки табличной части в дереве Объекты управляемой формы имеются также элементы, которые не соответствуют текущим реквизитам. Как привило, это итог по суммовым полям табличной части. Эти поля можно разместить на форме.

Итог по суммовым полям табличной части

Итог по суммовым полям табличной части

Также эти поля можно использовать в подвале таблицы на форме.

Для этого в палитре свойств таблицы формы необходимо установить признак Подвал.

Включили использование подвала в таблице формы

После этого в палитре свойств нужного поля табличной части, в свойстве ПутьКДаннымПодвала указать нужное суммовое поле табличной части.

Заполненное свойство путькданнымподвала

После этих настроек, в подвале нужной колонки будет сумма значений это колонки.

Заполненный подвал колонки

Остальные статьи по теме конфигурирования в 1С:

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Документация разработчика

«Табличная часть» — это по вложенный объект в другой объект (тип объекта: positions). Обычно табличный части используются в «Справочниках» и «Документах.

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

У одного объекта может быть несколько табличных частей. Например, в документе «Ремонт» существуют табличный части «Запчасти» и «Выполненные работы».

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

Имя табличной частить должно быть уникальным для выбранного Объекта.

После добавления новой «Табличной части» автоматически добавятся поля: “id”, “visible” и “owner”.

Связь между «Табличной частью» и «Объектом» осуществляется по полю-указателю “owner” (в поле хранится ID основного объекта). Удалять эти поля нельзя.

Пример добавления табличной части

Рассмотрим добавление табличной части на примере справочника “Автопарк” (references.autos). Данный справочник добавлен в базовую конфигурацию в качестве примера для разработчика и не выведен в основной меню. Ссылка на объект: http://my_crm_ru/autos/

Перейдем в справочник “Автопарк” (references.autos). Добавим табличную часть “Техническое обслуживание” (services):

Затем в «Табличную часть» необходимо добавить “Форму редактирования”.

Новая форма должна быть вложена в «Форму редактирования” родительского объекта (в нашем случае autos/edit). Название формы должно быть уникальным в рамках текущего Объекта.

После добавления появится новая форма у «Табличной части».

Для того, чтобы в “Форме редактирования” автомобиля (references.autos) появилась таблица, ее необходимо прописать в «PHP-сценарии» и в «Шаблоне» родительской «Формы редактирования».

Данная табличная часть будет динамической. Изменения в ней будет отображаться на странице без перезагрузки страницы. За вывод динамической табличной части отвечает метод printDataDTable().

Добавим следующий код в «PHP-сценарий» в метод onPlay() основной “Формы редактирования” автомобиля:

$this->printDataDTable($this->structure->services, "services", [ "date", "number", "km", "comment", "total" => function($obj) < return Text::money($obj->total); > ],[ "path" => "/autos/" . $this->structure->id . "/services", "modalTitle" => Language::getVariable($this->form, 'Services'), "modalSize" => "tiny", "modalMulti" => 0, "modalName" => "services", "selectAll" => 1, "calcFields" => ["total"], "moreActions" => [ [ "onclick" => "functionName(); return false;", "name" => Language::getVariable($this->form, 'ButtonName'), "icon" => ['before' => 'fa fa-plus'], "access" => ACCESS_EDIT, ]);

Где:

  • $this->structure->services — ссылка на структуру, которую необходимо вывести
  • services — название табличной части (должен совпадать с названием табличной части в шаблоне)
  • 3-й параметр — массив полей для вывода в таблицу. Можно использовать комбинированные значения. В переменной obj находится ссылка на запись табличной части (references.autos.services)
  • 4-й параметр — массив настроек для табличной части
  • path — путь (ссылка) для открытия формы добавления в табличную часть
  • modalTitle — заголовок модального окна
  • modalSize — размер модального окна (small, tiny, fullscreen, large)
  • modalMulti — если “true”, то после добавления записи модальное окно не закроется
  • modalCustomReady — если “true”, то при добавлении новой записи в «Табличную часть» в модальной форме кнопка «Сохранить» не активна по умолчанию. Флаг используется при добавлении «Номенклатуры» в документы «Счета», «Коммерческие предложения», «Договоры». Т.е. когда без выбора «Номенклатуры» пользователю нельзя добавить значение в «Табличную часть». Кнопка «Сохранить» активируется через JS-сценарий «Модальной формы» согласно логике бизнес-процессов.
  • modalName — системное имя модального окна
  • selectAll — возможность выбрать 1 и более (все) записи с помощью чек-боксов. По умолчанию = «1» . Если стоит «0» (ноль), то запрет.
  • add — возможностью добавлять записи в таб. часть. По умолчанию = «1» . Если стоит «0» (ноль), то запрет.
  • delete — возможностью удалять записи из таб. часть. По умолчанию = «1». Если стоит «0» (ноль), то запрет.
  • edit — возможностью редактировать записи в таб. часть. По умолчанию = «1». Если стоит «0» (ноль), то запрет.
  • calcFields — массив калькулируемых полей.
  • blockName — указывается блок, в котором лежит табличная часть. По умолчанию = ‘BASE’, пример смотреть в Сделке. Опция доступна с версии 24.04.
  • moreActions — добавление кнопок в кнопку «Еще» табличной части.

В “Шаблон” необходимо добавить таблицу, отвечающую за вывод динамической табличной части:

[[CONTAINER | header: $data.services.name | name: services | template: table]] [[dTable | name: services | id: servicesTable | key: num]] [[column | table: services | name: num | header: # | type: num]] [[column | table: services | name: date | tags: nowrap center]] [[column | table: services | name: number | align: center]] [[column | table: services | name: km]] [[column | table: services | name: comment]] [[column | table: services | name: total]] [[edit | table: services]] [[delete | table: services]] [[table_end]] [[CONTAINER_END]]

Для контейнера необходимо указать параметр “template: table”, чтобы добавилась кнопка добавления нового элемента в табличную часть.

Обращаем внимание, что «плюсик» в контейнере становится активным (можно добавлять элементы в табличную часть) только тогда, когда родительский Объект уже создан и имеет уникальную ссылку вида: http://my_crm_ru/autos/[id].

В блоке dTable параметр «name» (название табличной части) должен быть обязательно равен 2-му параметру из метода printDataDTable().

Параметр «id» у dTable должен быть уникальным для страницы. Обычно его называют: название табличной части и постфикс «Table». Например: servicesTable.

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

Затем необходимо отредактировать “Форму редактирования” нашей новой табличной части.

В сценарии PHP поменять наследование на ModalEdit:

class Edit extends \Kernel\Actions\Forms\ModalEdit

В «PHP-сценарий» в метод onSave() добавим следующий код, чтобы была связь между табличной частью и родительским Объектом (references.autos):

protected function onSave() < $this->structure->owner = $this->parents[0][0]; >

При наследовании от ModalEdit необходимо реализовать метод responseChange() с вызовом результирующего метода response().

В него передается массив, ключ которого равен названию таблицы в dTable в шаблоне основной «Формы редактирования».

Для динамического редактирования также необходимо всегда передать ключи id и act.

В массиве также передаются поля, которые отображены в форме редактирования табличной части, и при нажатии на кнопку «Сохранить» они динамически передаются в новую строку в таблице (без перезагрузки страницы).

protected function responseChange() < $this->response([ "services" => [ "id" => $this->structure->id, "act" => $this->formType, "date" => $this->structure->date->toFormat('d.m.Y'), "number" => $this->structure->number, "km" => $this->structure->km, "comment" => $this->structure->comment, "total" => Text::money($this->structure->total) ] ]); >

Добавим в «Шаблон» формы редактирования табличной части новый контейнер с полями и подключить форму js:

 [[CONTAINER | h: hide | name: data]] [[field | name: date]] [[field | name: number]] [[field | name: km]] [[field | name: comment]] [[field | name: total]] [[CONTAINER_END]] [[js | name: autos/services/edit]] 

На закладке «Интерфейс (JS-код)» формы редактирования таб. части реализуем следующие условия:

  • При добавлении записи в табличной части должно быть заполнено хотя бы одно значение (как правило это поле “Количество”, либо “Номенклатура”.) Если поле не заполнено, то необходимо заблокировать кнопку “Сохранить”.
  • При изменении обязательного для заполнения поля сделать проверку: заполнено ли поле после изменения и в зависимости от этого снять/добавить блокировку кнопки
  • После загрузки всплывающего окна убрать иконку загрузки (loader).
  • Если параметр ModalMutli в методе printDataDTable установлен true, то необходимо реализовать также перезагрузку формы (reset).
// функция разблокировки function enabled(id_number) < if(id_number == 0 || !id_number)< modal.find(".actions .btn.ok").addClass("disabled"); >else < modal.find(".actions .btn.ok").removeClass("disabled"); >> // убираем иконку загрузки страницы var modal; top.jsApplication.findTop("body").on("readyModal", function(e, selectorModal, modalName) < if(selectorModal == "#EditModal_0")< modal = jsApplication.getModal(selectorModal); modal.find(".actions .btn.cancel").removeClass("disabled"); modal.find(".content").removeClass("loading"); >>); $(function () < // после сохранения записи очищаем все поля на форме $("form.ui.form").on("reset",function()< modal.find(".actions .btn.cancel").removeClass("disabled"); modal.find(".content").removeClass("loading"); >); // при изменении поля number Блокируем либо разблокируем кнопку “Сохранить” $("#f_number").on("keyup",function()< var number = $("#f_number").val(); enabled(number); >); >);

Итоговый результат добавления добавления табличной части:

Пользователя нажимает на «плюсик».

Открывается модальная «Форма редактирования» табличной части «Техническое обслуживание» с полями.

Пользователь заполняет поля на форме и нажимаем «Сохранить».

После чего форма модальная закрывается и на экране отображается новая (отредактированная) строка в «Табличной части» родительского Объекта. Строка всегда подкрашивается желтым цветом.

Пример работы формы добавления товара в «Счет»

Рассмотрим пример «Табличной части» с одновременным выбором «Номенклатуры» на примере модуля “Счет” (documents.orders).

В табличной части «products» создаются 2 поля для номенклатуры:

  • product — ссылка на объект references.product (Справочник «Номенклатура»)
  • name — название номенклатуры (строка). В него вставляется текстовое наименование «Номенклатуры» из модуля “Номенклатура” (поле «name»). Данное поле можно скорректировать в момент добавления «Номенклатуры» в «Счет».

В шаблоне «Формы редактирования» табличной части «products» указывается скрытым поле «product».

Добавляем фрейм на форму выбора «Номенклатуры».

 

Важно! В этом случаем мы добавляем «Формы выбора» номенклатуры из объекта «Номенклатуры», а не из табличной части «Номенклатура» документа «Счет».

Обратите внимание на путь формы выбора из фрейма :

/products/select/?noTree=1&pType=$pType$&store=$store$&noLoader=1$appendFilterParents

В «Форму редактирования» табличной части «product» в метод onPlay() добавляем метод для передачи переменных на форму. Необходимо передать «Склад» и «Тип цены» (если они есть в Объекте), чтобы «Форма выбора» Номенклатура показала нам остатки товара на определенном «Складе» и выбранный «Тип цен» (например, оптовые).

$this->page->set([ "BASE.pType" => $this->parents[0]->price_type->id, "BASE.store" => $this->parents[0]->storehouse->id ]);
  • $this->parents[0] — ссылка на родительский элемент (document.orders)

В результате при добавления «Номенклатуры» в «Счет» откроется следующая форма.

При выборе «Номенклатуры» в списке добавим следующую логику:

  • Наименование = Название номенклатуры
  • Количество = 1
  • Цена = Цена из номенклатуры
  • Сумма = Цена * Количество

Для этого внесем правки в «Форму редактирования» табличной части «Products» на закладке «Интерфейс (JS-код)»:

// блокировка / разблокировка кнопки "Сохранить" function enabled(number) < if(number == 0 || !number || parseFloat(minNumber) >number) < modal.find(".actions .btn.ok").addClass("disabled"); >else < modal.find(".actions .btn.ok").removeClass("disabled"); >> // подсчет сумм function result(a, b) < return (b != 0) ? (a / b).toFixed(2) : 0; >// блокировка / разблокировка полей function enabledFields(isEnabled) < if(isEnabled == undefined) isEnabled = false; /* если режим редактирования */ productId = jsApplication.getString($("#f_product").val()); number = jsApplication.getNumber($("#f_number").val()); if(productId.length >0 && number > 0) < isEnabled = true; >if(isEnabled) < $("input, select, textarea").removeAttr("disabled").closest(".field").removeClass("disabled").find(".dropdown").removeClass("disabled"); >else < $("input, select, textarea").attr("disabled", "disabled").closest(".field").addClass("disabled").find(".dropdown").addClass("disabled"); >> var modal; // после загрузки модального окна выключаем иконку загрузки (loader) и снимаем disabled с кнопки "Закрыть" top.jsApplication.findTop("body").on("readyModal", function(e, selectorModal, modalName) < if(selectorModal == "#EditModal_0")< modal = jsApplication.getModal(selectorModal); enabledFields(); modal.find(".actions .btn.cancel").removeClass("disabled"); modal.find(".content").removeClass("loading"); >>); $(function () < // после отправки формы очищаем поля $("form.ui.form").on("reset",function()< enabledFields(); modal.find(".actions .btn.cancel").removeClass("disabled"); modal.find(".content").removeClass("loading"); >); // при нажатии на товар из фрейма вставляем данные в шаблон jsApplication.OnEventTableInFrame("iframe#products", "products", "onSelect", function(e, extra)< $("#f_product").val(extra.id); $("#f_name").val($(extra.tr).children("td:eq(2)").text()); $("#f_price_nds, #f_total").val(parseFloat($(extra.tr).children("td:eq(3)").text().replace("'", ''))); $("#f_number").val(1); enabledFields(true); enabled(extra.id); >); // при изменении полей number или price_nds пересчитываем total (сумма) $("#f_number, #f_price_nds").on("keyup",function()< var number = $("#f_number").val(), price_nds = $("#f_price_nds").val(); $("#f_total").val(result(number * price_nds, 1)); enabled(number); >); // при изменении поля total пересчитываем price_nds (цена) $("#f_total").on("keyup",function()< var number = $("#f_number").val(), total = $("#f_total").val(); $("#f_price_nds").val(result(total, number)); enabled(number); >); >);

Оглавление

  • Введение
  • Концепция системы
  • Конфигурирование
  • Знакомство с конфигуратором
  • Объекты конфигурации
  • Структура объекта
    • Поля объекта
    • Табличная часть объекта
    • Форма редактирования
    • Форма списка
    • Форма выбора
    • Техническая форма
    • Печатная форма
    • Работа с экземпляром объекта
    • Работа с выборкой объектов
    • Объект Structure
    • Класс Database
    • Поля
    • Таблицы
    • Контейнеры
    • Ряд (row)
    • Блоки (block)
    • Закладки
    • Кнопки
    • Языковые константы
    • Комментарии
    • Чек-лист
    • Панель History
    • Создание приходной накладной
    • Создание отгрузочной накладной
    • Создание перемещения товара
    • Интеграция API (XML)
    • Webhooks
    • Плагины
    • Импорт из CSV

    Что такое табличная часть

    Кадровое перемещение, прием на работу в УПП — ТЧ работники организаций и ТЧ плановые начисления примерно то.

    Извечное правило — подчиненные записи должны храниться в отдельной таблице.
    «Пакуя», одно в другое, всегда будет проблема в последующем извлечении данных.
    В 8-ке есть возможность сделать несколько таб.частей, но логическая связь между ними будет полностью на твоей «совести» и умении. «Паковать» в ревизит таблицы другую таблицу вообще лажа.

    Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *