Владимир Камышников январь
2003.
www.tazoth.ru
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей
документа (или справочника). Традиционно эта задача имеет несколько решений:
- Хранение нескольких табличных частей в одной. Данный метод имеет только один плюс, "1С-совместимо".
Основной недостаток часто разные табличные части сильно отличаются форматом и составом
полей;
- Хранение дополнительной информации путем "сворачивания" данных в строку. Никаких плюсов метод
не имеет. Минусы очевидны: возможное нарушение ссылочной целостности;
- Хранение табличных частей вне информационной базы. Как и в предыдущем способе гарантировать, что
восстановленная ссылка будет корректной, нельзя;
- Наконец есть правильный способ хранение табличных частей в служебных документах.
Этот последний способ позволяет:
- делать практически неограниченное число табличных частей;
- избавиться от задач отображения таблицы значений;
- конфигурации остаться 1С-совместимой;
- трудозатраты на создание табличной части в типовом случае составляют около 5 (!) минут;
- ссылочная целостность отрабатывается системой;
Этот способ достаточно известен, однако в предлагаемом решении есть оригинальные моменты
(по крайней мере, лично я не встречал подобных подходов).
Итак, рассмотрим технологию организации второй табличной части документа (пример в виде маленькой
конфигурации приложен к статье, ссылка внизу страницы).
Первый шаг создание служебного документа. Он не должен проводится, не должен задействовать
компоненты платформы и, лучше всего, не должен принадлежать никакому журналу.
Далее, в табличной части этого документа создаем необходимые реквизиты. Даже те, которые не
должны отображаться. В поле "Синоним" указываем то название, которое должно отображаться в колонке.
На рисунке 1 имеется реквизит табличной части "ОбъемПриДаннойТемп", который в колонке таблицы будет
отображаться как "V при tc".
В поле "Комментарий" можно указывать команды форматирования таблицы (необычная фича, да? ;-).
В данном случае задается ширина колонки таблицы, 11 единиц. Сейчас у меня поддерживается несколько
таких команд:
- "Ширина=ХХХ;" установить ширину в ХХХ;
- "Скрыть;" скрыть колонку;
- "Иконка;" отображать иконки в колонке;
Команды отделяются друг от друга точкой с запятой, без пробелов, их имена являются регистрозависимыми.
Не составляет труда добавить свои собственные команды.
 |
Рисунок 1. Реквизит служебного документа.
| |
После этих операций можно смело утверждать, что с форматированием отображаемой таблицы мы справились.
Добавляем в родительский документ реквизит типа "Документ", и связываем его с только что созданным
служебным документом. Через этот реквизит впоследствии мы сможем работать с дополнительной табличной
частью.
 |
Рисунок 2. Связь главного и служебного документов.
| |
В форму "главного" документа добавляем таблицу значений, при помощи которой будем отображать
дополнительную табличную часть, и три кнопки стандартные "добавить-редактировать-удалить".
При желании можно определить и другие операции со строками дополнительной табличной части
копировать строку, и т.д.
 |
Рисунок 3. Будущая табличная часть.
| |
Теперь нужно вставить необходимый код в глобальный модуль (см. конфигурацию-пример).
Для манипуляций с табличной частью в родительский документ необходимо добавить всго лишь три (!) строки:
Процедура ПриОткрытии()
глХранилищеОткрыть(Контекст,ХранилищеПотери,ТаблицаПотерь);
КонецПроцедуры
|
В процедуру передаются три параметра Контекст, реквизит родительского документа, в
котором содержится ссылка на служебный документ, и таблица значений на форме, которая отображает
табличную часть.
При открытии происходит форматирование таблицы и заполнение её данными.
При закрытии происходит попытка удаления служебного документа (при необходимости). Второй параметр
такой же, как и в первой функции:
Процедура ПриЗакрытии()
глХранилищеУдалить(Контекст,ХранилищеПотери);
КонецПроцедуры
|
Ну и собственно сохранение табличной части. Параметры такие же как и в первой процедуре:
Процедура ПриЗаписи()
глХранилищеСохранить(Контекст,ХранилищеПотери,ТаблицаПотерь);
КонецПроцедуры
|
Готово. Ну, за исключением ввода данных в таблицу. Для этого я позаимствовал из типовой
конфигурации ИТРП универсальную процедуру ввода в таблицу значений (см. пример). Можно
взять какую-нибудь другую универсальную процедуру ввода данных в ТЗ, или написать свою
собственную кому как больше нравится.
Вот и все
Восьмерка лишается одного из своих основных козырей? ;-)
Оригинал статьи расположен на сайте www.tazoth.ru
|