Табличная часть
Предназначена для хранения информации, структура которой одинакова для всех элементов прикладного объекта, но количество такой информации может быть различным.
Например, справочник Сотрудники может иметь табличную часть Состав семьи. Состав этой информации одинаков: ФИО, степень родства. Но количество членов семьи у разных сотрудников может быть разным.
Полезные ссылки:
- Учимся программировать — Статьи по работе с табличной частью объектов,
- ИТС — Рекомендации по выбору между подчиненным справочником и табличной частью
Табличная часть объектов 1С 8.3
В этой статье мы научимся конфигурировать табличные части объектов метаданных в 1С 8.3 (справочники, документы и т.д.). Для чего вообще нужны табличные части? Очень часто бывает, что объект метаданных должен хранить некий список однотипной информации, размер которой изначально может быть не известен. Например, у справочника «Контрагенты» это может быть список ответственных лиц контрагента, а у документа «Приход товара» это список товаров, который поступили в организацию. Для того, чтобы осуществить учет однотипной информации и необходимы табличный части.
Табличная часть документа в 1С 8.3
Наиболее часто перечисление какой-то однотипной информации реализуется в документах. Например, у нас может быть приход различного товара на склады, или продажа разного товара контрагентам. Создать табличную часть документа можно двумя способами. Первый, в конструкторе документа: на закладке данные, во втором окне для табличных частей, где и нужно добавлять новую табличную часть при помощи кнопки «Добавить табличную часть».
Второй способ: непосредственно в окне редактирования метаданных. Для этого нужно мышкой выделить ветвь дерева документа, вызвать контекстное меню и выполнить единственную команду «Добавить»
Табличная часть справочника 1С 8.3
У справочников 1С также могут существовать табличные части, механизм создания которых, аналогичен механизму создания табличных частей документов (используя конструктор справочника и через окно дерева метаданных).
Колонки табличной части 1С
Само по себе создание табличной части не имеет смысла, поскольку информация должна храниться в разрезе колонок. Создать колонку можно двумя способами (как в случае справочников, так и в случае документов). Первый способ, используя конструктор документа.
Второй способ, посредством окна метаданных (нужно выделить мышкой табличную часть).
После добавления, откроется палитра свойств, где можно выбрать нужный тип реквизита табличной части 1С (по умолчанию реквизиту присваивается тип строка).
Количество колонок вы можете создавать практически неограниченное количество, в зависимости от вашей прикладной задачи.
Табличная часть 1С 8.3 на управляемой форме
Рассмотрим, как добавлять табличную часть на управляемую форму 1С. Если вы создаете новую форму, то у конструктора формы нужного объекта Вам необходимо поставить флажки у ветке дерева реквизитов объекта, которое соответствует нужной табличной части.
Если же вы уже создали форму документа, а потом в конфигураторе сделали табличную часть (или забыли добавить табличную часть в конструкторе), то вам нужно в форме перетащить мышкой табличную часть из дерева объекта в дерево элементов.
При переносе на вопрос «Добавить колонки», отвечаем «Да» (иначе придется добавлять колонки вручную, о чем мы поговорим ниже).
После этого табличная часть со всеми колонками будет добавлена на форму.
Если мы откажемся от автоматического добавления колонок, то мы можем перенести нужные колонки вручную. Для этого необходимо раскрыть ветку нужной табличной части и перетащить мышкой необходимые колонки.
У ветки табличной части в дереве Объекты управляемой формы имеются также элементы, которые не соответствуют текущим реквизитам. Как привило, это итог по суммовым полям табличной части. Эти поля можно разместить на форме.
Также эти поля можно использовать в подвале таблицы на форме.
Для этого в палитре свойств таблицы формы необходимо установить признак Подвал.
После этого в палитре свойств нужного поля табличной части, в свойстве ПутьКДаннымПодвала указать нужное суммовое поле табличной части.
После этих настроек, в подвале нужной колонки будет сумма значений это колонки.
Остальные статьи по теме конфигурирования в 1С:
Более подробно и основательно конфигурирование в 1С дается в моей книге:
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 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"] ]);
Где:
- $this->structure->services — ссылка на структуру, которую необходимо вывести
- services — название табличной части (должен совпадать с названием табличной части в шаблоне)
- 3-й параметр — массив полей для вывода в таблицу. Можно использовать комбинированные значения. В переменной obj находится ссылка на запись табличной части (references.autos.services)
- 4-й параметр — массив настроек для табличной части
- path — путь (ссылка) для открытия формы добавления в табличную часть
- modalTitle — заголовок модального окна
- modalSize — размер модального окна (small, tiny, fullscreen, large)
- modalMulti — если “true”, то после добавления записи модальное окно не закроется
- modalName — системное имя модального окна
- selectAll — возможность выбрать 1 и более (все) записи с помощью чек-боксов. По умолчанию = «1» . Если стоит «0» (ноль), то запрет.
- add — возможностью добавлять записи в таб. часть. По умолчанию = «1» . Если стоит «0» (ноль), то запрет.
- delete — возможностью удалять записи из таб. часть. По умолчанию = «1». Если стоит «0» (ноль), то запрет.
- edit — возможностью редактировать записи в таб. часть. По умолчанию = «1». Если стоит «0» (ноль), то запрет.
- calcFields — массив калькулируемых полей
В “Шаблон” необходимо добавить таблицу, отвечающую за вывод динамической табличной части:
[[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
Статья Настройка табличной части документа «Начисление зарплаты и взносов» в программах 1С: ЗУП и 1С: ЗГУ
Мы не раз писали о том, как важно, чтобы рабочее место было комфортным, а рабочее место бухгалтера — это программы 1С. Так вот программы последних версий предлагают нам широкие возможности по настройке интерфейса, журналов и самих документов. Но часто нам просто не хватает времени, чтобы разобраться в этих настройках, посмотреть, а что будет, если зайти и поменять что-то.
Сегодня мы с вами рассмотрим один из основных документов программ 1С: Зарплата и управление персоналом и 1С: Зарплата и кадры государственного учреждения. Это документ «Начисление зарплаты и взносов», с которым мы ежемесячно работаем, анализируем, проверяем. Так вот, чтобы все эти моменты легко осуществлялись мы, конечно, изучаем документ с подробностями расчета:
Все мы пользуемся кнопкой «Показать подробности расчета», расположенной рядом с кнопкой «Расчетный листок». Ведь именно в таком формате видно, как получился результат по тому или иному начислению. Но при такой настройке, думаю, многие испытывают неудобства, ведь все данные не помещаются в обзор табличной части, приходится постоянно прокручивать роликом вправо, чтобы увидеть все показатели, либо период.
Так вот программа позволяет легко настраивать табличные части документа под потребности пользователя. Если вы столкнулись с подобной ситуацией, то попробуйте такую настройку: по кнопке «Еще» в правом верхнем углу выберите «Изменить форму»:
В левой колонке выбираем элемент формы «Показатели», потом в правой — вертикальную группировку. Что это даст? Все показатели для расчета начислений, которые были растянуты по табличной части, компактно сгруппируются построчно.
Также можно сгруппировать и период, для этого раскрываем «Даты Начисления» и выделяем «Начисления период» в левой области, а в правой напротив группировки выбираем из списка позицию «Вертикальная»:
После всех манипуляций нажимаем «Ок» и смотрим как преобразилась табличная часть документа:
Все стало компактнее, все данные вошли по ширине и теперь не нужно прокручивать роликом. Но если вдруг у Вас что-то не получилось или данная настройка оказалась все-таки не удобной, Вы всегда можете вернуться к стандартным настройкам. Для этого также нужно по кнопке «Еще» запустить «Изменить форму», а в открывшемся окне снова обратиться к кнопке «Еще» и установить стандартные настройки:
Поэтому не бойтесь экспериментировать, пробуйте, настраивайте программу для себя. Ничего сложного, как Вы смогли убедиться, в этом нет, тем более вернуться к стандартному варианту можно в два клика.