§ 6.2. Таблица из табличной части: товары в поступлении
Проверьте на деле. Откройте поступление № 12, добавьте четвёртую строку — например, ещё одну пачку бумаги, — и закройте документ, не записывая. Откройте снова: строк три, как было. Строки табличной части — часть той же записи, что и шапка, и живут по тому же правилу, что артикул в карточке товара: форма работает с их копией, а в базу они уходят только при записи — и уходят все разом, вместе с документом.
1. Табличная часть живёт внутри записи
Табличная часть — не отдельный объект, а часть документа: строки товаров принадлежат поступлению так же, как его номер и дата. В форме это видно по основному реквизиту.
Объект (ДокументОбъект.ПоступлениеТоваров)
├── Номер, Дата, Контрагент, Склад
└── Товары ← табличная часть
├── Товар
├── Количество
├── Цена
└── Сумма
Это та же картина, что мы видели, разворачивая «Объект» в главе о данных. Таблица на форме показывает то, что лежит внутри «Объекта», и путь у неё — «Объект.Товары».
Строки табличной части — такие же данные записи, как номер и дата. Таблица на форме — способ их показать.
2. Как таблица попадает в форму
Путь тот же, что у поля: перетащить из реквизитов в элементы. Разница в том, что тащат не одно значение, а табличную часть целиком.
| что перетащили | что появилось в элементах |
|---|---|
| Объект.Артикул | поле |
| Объект.Товары | таблица с колонками |
Колонки редактор предложит сам — по реквизитам табличной части. Как и с полями, это правило, а не обязанность: колонку можно убрать, и реквизит строки от этого не исчезнет, его просто перестанут показывать.
У каждой строки табличной части есть ещё и стандартный реквизит — «НомерСтроки». Его платформа ведёт сама, и в таблице он обычно виден первой колонкой.
Таблица на месте. Теперь посмотрим, что происходит со строками, пока форма открыта.
3. Жизнь строк в открытой форме
Строки проходят тот же путь, что и все данные формы, и граница между записью и формой проходит там же.
| что делает пользователь | что происходит |
|---|---|
| открыл документ | строки вместе с шапкой пришли копией в данные формы |
| добавил, удалил, поменял строку | изменилась копия, в базе прежнее |
| нажал «Записать» | вся табличная часть записана вместе с документом |
| закрыл без записи | копия исчезла вместе со всеми правками строк |
Запись — действие над документом, а не над строкой: отдельной «записи строки» у платформы нет. Табличная часть уходит в базу так же, как документ, — одним куском.
4. Сумма документа и сумма строки
Опыт ниже нужен не ради арифметики: он показывает границу — что делает объект при записи, а что остаётся на форме до неё.
| что | когда пересчитывается |
|---|---|
| сумма документа | при записи — модуль объекта складывает суммы строк |
| сумма строки | сама не пересчитывается |
Сумму документа складывает из строк код в модуле объекта при записи — так собрана конфигурация «Канцтовары»; сам код за границей книги. Складывает он колонку «Сумма», какой бы формой ни записывали документ. А вот сумма строки при изменении количества сама не поменяется: для этого нужен обработчик формы, а в наших формах их нет. Отсюда ловушка. Поменяли количество, записали — и итог документа сложился из прежних сумм строк, а с новыми количествами он уже не сходится. Правило объекта верно считает то, что ему дали; дать ему верные суммы строк — дело формы.
5. Строки и проведение
Строки табличной части — исходные данные для проведения: код проведения в модуле объекта обходит строки и по каждой делает движение — остаток товара на складе растёт на её количество.
строка поступления → движение регистра
Товар: ручка Товар: ручка
Количество: 400 Склад: Основной
Количество: +400
Отсюда практическое следствие для чтения: таблица товаров в документе — не «просто список», а исходные данные для учёта. Строка, добавленная в форме, до записи и проведения ни на какие остатки не влияет.
6. Как узнать табличную часть в чужой форме
Главные признаки читаются по путям.
| признак | что значит |
|---|---|
| путь таблицы начинается с «Объект.» | строки — часть записи |
| пути колонок — «Объект.Товары.Количество» | колонки — реквизиты строки |
| реквизит строки есть, а колонки нет | его не показывают, но он хранится |
| путь таблицы без «Объект.» | это не табличная часть, а данные формы |
Последняя строка — та же история, что с полями: не все реквизиты табличной части обязаны быть на экране. Найти скрытые помогает сравнение колонок с составом табличной части внутри «Объекта».
7. В Конфигураторе и в Предприятии
Соберём таблицу товаров заново — чтобы увидеть, как она появляется.
-
Откройте форму поступления, которую собрали на закладках, и удалите из страницы «Товары» таблицу. Реквизиты не трогайте.
-
Разверните в реквизитах «Объект» и перетащите табличную часть «Товары» на страницу «Товары». Посмотрите, какие колонки появились.
-
Обновите конфигурацию базы данных и откройте поступление № 12. Добавьте строку и закройте без записи: строк по-прежнему три.
-
Откройте снова, поменяйте количество в первой строке и посмотрите на сумму строки: она прежняя. Закройте без записи.
-
Проверьте, что таблица снова на месте, и оставьте форму.
Главное в одном абзаце
Табличная часть — не отдельный объект, а часть записи: строки товаров принадлежат поступлению так же, как номер и дата, и в форме лежат внутри основного реквизита, по пути «Объект.Товары». В форму таблицу выводят тем же жестом, что и поле, — перетаскиванием, и колонки редактор предлагает сам, по реквизитам строки; у каждой строки есть ещё стандартный номер. Строки живут по общему правилу данных формы: пришли копией, правятся в копии, уходят в базу только при записи — и уходят целиком, вместе с документом. Сумму документа в «Канцтоварах» при записи складывает из сумм строк код объекта, а сумма строки сама не меняется — обработчиков в наших формах нет, и поэтому итог может разойтись с количествами. Строки — исходные данные для проведения, и до записи и проведения ни на какие остатки они не влияют. В чужой форме табличную часть узнают по путям: таблица — «Объект.Товары», колонки — «Объект.Товары.Количество».
Колонки редактор создал сам, по реквизитам строки. Но каждая колонка — поле со своим путём, видом и свойствами. Что в этом пути означает каждая часть и что можно сделать с колонкой, не трогая данных?
Контрольные вопросы
- Где в данных формы лежит табличная часть документа?
- Каким жестом выводят табличную часть в форму и что при этом появляется?
- Что происходит со строками, пока форма открыта, и когда они попадают в базу?
- Можно ли записать в базу только одну изменённую строку? Почему?
- Кто считает сумму документа и сумму строки и почему после изменения количества итог может оказаться неверным?
- Как строки поступления связаны с остатками на складе?
- По каким признакам узнать табличную часть в чужой форме?
Упражнения
По образцу. Проделайте опыт с добавлением строки на документе «РеализацияТоваров»: добавьте строку, закройте без записи, откройте снова.
Своё: предскажите итог. В поступлении меняют количество в двух строках и записывают документ. Что будет с суммами строк и с суммой документа?
Ловушка: «строку добавил — значит, товар уже на складе». Кладовщик добавил строку в поступление, не записав документ, и удивляется, почему в отчёте об остатках её нет. Что вы объясните?
Обратный ход. В табличной части документа есть реквизит «Скидка», а колонки с таким заголовком в таблице нет. Где он и хранится ли его значение?
На чтение. В чужой форме две таблицы: у одной путь «Объект.Услуги», у другой — «ПодборУслуг», без «Объект.». Чем различаются их строки и что будет с каждой при закрытии без записи?
Ответы — в конце части.