1с 7 как сделать 2 таблицы в документе
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей документа (или справочника). Традиционно эта задача имеет несколько решений:
1. Хранение нескольких табличных частей в одной. Данный метод имеет только один плюс, "1С-совместимо". Основной недостаток – часто разные табличные части сильно отличаются форматом и составом полей;
2. Хранение дополнительной информации путем "сворачивания" данных в строку. Никаких плюсов метод не имеет. Минусы очевидны: возможное нарушение ссылочной целостности;
3. Хранение табличных частей вне информационной базы. Как и в предыдущем способе гарантировать, что восстановленная ссылка будет корректной, нельзя;
4. Наконец есть правильный способ – хранение табличных частей в служебных документах.
Этот последний способ позволяет:
* делать практически неограниченное число табличных частей,
* избавиться от задач отображения таблицы значений,
* конфигурации остаться 1С-совместимой,
* трудозатраты на создание табличной части в типовом случае составляют около 5 минут,
* ссылочная целостность отрабатывается системой.
Этот способ достаточно известен, однако в предлагаемом решении есть оригинальные моменты (по крайней мере, лично я не встречал подобных подходов).
Итак, рассмотрим технологию организации второй табличной части документа (пример в виде маленькой конфигурации приложен к статье, ссылка внизу страницы).
Первый шаг – создание служебного документа. Он не должен проводится, не должен задействовать компоненты платформы и, лучше всего, не должен принадлежать никакому журналу.
Далее, в табличной части этого документа создаем необходимые реквизиты. Даже те, которые не должны отображаться. В поле "Синоним" указываем то название, которое должно отображаться в колонке. На рисунке 1 имеется реквизит табличной части "ОбъемПриДаннойТемп", который в колонке таблицы будет отображаться как "V при tc".
В поле "Комментарий" можно указывать команды форматирования таблицы (необычная фича, да? ;-). В данном случае задается ширина колонки таблицы, 11 единиц. Сейчас у меня поддерживается несколько таких команд:
- "Ширина=ХХХ;" – установить ширину в ХХХ,
- "Скрыть;" – скрыть колонку,
- "Иконка;" – отображать иконки в колонке.
Команды отделяются друг от друга точкой с запятой, без пробелов, их имена являются регистрозависимыми. Не составляет труда добавить свои собственные команды.
Рисунок 1. Реквизит служебного документа.
После этих операций можно смело утверждать, что с форматированием отображаемой таблицы мы справились.
Добавляем в родительский документ реквизит типа "Документ", и связываем его с только что созданным служебным документом. Через этот реквизит впоследствии мы сможем работать с дополнительной табличной частью.
Рисунок 2. Связь главного и служебного документов.
В форму "главного" документа добавляем таблицу значений, при помощи которой будем отображать дополнительную табличную часть, и три кнопки – стандартные "добавить-редактировать-удалить". При желании можно определить и другие операции со строками дополнительной табличной части – копировать строку, и т.д.
Рисунок 3. Будущая табличная часть.
Теперь нужно вставить необходимый код в глобальный модуль (см. конфигурацию-пример).
Для манипуляций с табличной частью в родительский документ необходимо добавить всго лишь три строки:
В процедуру передаются три параметра – Контекст, реквизит родительского документа, в котором содержится ссылка на служебный документ, и таблица значений на форме, которая отображает табличную часть.
При открытии происходит форматирование таблицы и заполнение её данными.
При закрытии происходит попытка удаления служебного документа (при необходимости). Второй параметр такой же, как и в первой функции:
Ну и собственно сохранение табличной части. Параметры такие же как и в первой процедуре:
Готово. Ну, за исключением ввода данных в таблицу. Для этого я позаимствовал из типовой конфигурации ИТРП универсальную процедуру ввода в таблицу значений (см. пример). Можно взять какую-нибудь другую универсальную процедуру ввода данных в ТЗ, или написать свою собственную – кому как больше нравится.
Класс 1С++ для программного добавления изображений/текста/ШК в таблицу Промо
Необходимо добавить в сформированную таблицу изображения/текста/ШК (81 тип ШК) с прозрачным фоном? Вставить фирменный логотип? Быстро организовать оформление документов в корпоративном стиле? Данная разработка поможет в этом!
1 стартмани
03.06.2012 246237 230 zarius 113
Мышонок в лабиринте бегает за сыром (игрушка)
Краткая игра про мышонка на языке 1С.
1 стартмани
24.05.2021 1674 1 user1479164 8
Выбор цвета для 1С 7.7
Простая и удобная внешняя обработка для выбора цвета без применения внешних компонент.
1 стартмани
09.06.2020 3821 2 vap_pig 5
Несколько табличных частей в 1С:7.7 - это просто
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей документа (или справочника). Традиционно эта задача имеет несколько решений..
1 стартмани
01.05.2018 16842 23 Gkmy 10
Сравнение и объединение диалогов форм МД файла Промо
1 стартмани
09.09.2008 29013 1287 WiseSnake 27
Диалоги выбора периода для 1С версий 8.3 и 7.7
Представлены два диалога для выбора интервала дат по календарю в составе демонстрационных конфигураций 1С8.3 и 1С7.7
1 стартмани
24.01.2017 20774 18 romasna 7
Как создать индикатор в 1С:Предприятии 7.7
В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.
1 стартмани
27.09.2016 15223 2 HAMMER_59 6
Полноценное использование Drag&Drop в 1С 7.7
Несмотря на то, что кое-какие функции Drag&Drop были заложены авторами 1cpp, моё дополнение позволяет сделать этот функционал законченным. Дело в том, что средствами 1cpp можно было таскать файлы ТОЛЬКО в 1С, а из 1С - невозможно. Теперь Вы можете сделать работу с файлами на порядок удобнее и эффективнее.
1 стартмани
19.09.2016 17034 15 DasIsFantastich 4
Вывод и перенумерация отчета с заранее неизвестным количеством группировок. Промо
1 стартмани
21.03.2012 30598 21 unichkin 11
Пилотный проект ФСС. Заявление, реестр, опись, выгрузка в формате xml версия 1.7.2.
Типовые объекты конфигурации не изменены, поэтому подходит для любого релиза ЗиК.
1 стартмани
29.07.2016 14147 21 Cvetic 1
"Магический батон" или еще одна попытка сделать "волшебную кнопку"
Подскажите, пожалуйста, каким образом можно организовать "вторую" табличную часть в документе в 1С Торговле 7.7. Мне нужно в ней хранить две колонки (2 реквизита), которые не имеют никакого отношения к первой таб. части.
Таблица значений. Хранить данные можно многими способами, можно в отдельном файле, например ДБФ, можно делать реквизит шапки типа строка неогран длины и сохранять тулда ЗначениеВСтроку(тз).
Делается второй документ и его табличная часть отображается в первом.
Скорее всего остановлюсь на последнем варианте. Спасибо большое за ссылку на описание как это сделать.
(0) Какие типы данных будешь хранить в колонках второй таб. части?
(7): для хранения ТЗ (используемой в качестве второй табличной части документа), содержащей данные только(!) НЕагрегатных типов, лучше использовать реквизит типа "строка неограниченной длины", в которую при сохранении документа записывать внутреннее представление (получаемое функцией "ЗначениеВСтрокуВнутр") такой ТЗ - а при открытии документа восстанавливать из внутреннего представления (при помощи функции "ЗначениеИзСтрокиВнутр") и использовать нужным образом. повторить по слогам: только(!) данные НЕагрегатных(. ) типов.
Во-второй табличной части предполагается набор пар значений.
А эти значения в каждом документе свои - или, быть может, проще их сохранить в каком-то элементе справочника, а потом вставлять в документ ?
(9) Тогда ещё полезно объяснять, что такое "агрегатный тип данных" - не факт, что автор знает, что это такое.
зачем плодить сущности. все прекрасно делается с физически одной табличной частью.
в самой табличной части документа можно хранить дохрена табличных частей и не выделываться с внешними файлами и сторонними документами
Мне не очень удобно с одной табличной частью - вы сейчас говорите про скрывать (показывать) колонки?. У меня в одной таб. части очень много строк, во второй - мало. Очень много трудозатрат - на выполнение этого метода.
(15) ну если несколько строк кода это большие трудозатраты, тогда конечно.
Я второй документ обычно делал. Непроводной и с фиксированной датой типа 01.01.1980, чтобы в журнале не болтался.
(15) ну, если ЗагрузитьТабличнуюЧасть и ВыгрузитьТабличнуюЧасть + пара строк кода это неподъемная ноша, тогда пложи объекты метаданных под кадую такую "ношу".
(17) спер из камина?
"1с 7.7<br>Есть документ в табличной части указаны цены.<br>как из внешней обработки установить Цена=Цена*коэфф и записать док?<br><br>Такой код:<br>Док1.ВыбратьСтроки();<br> Пока Док1.ПолучитьСтроку()=1 цикл<br> Ц1=Док1.ПолучитьАтрибут("Цена"); <br> Ц2=Ц1*Коэфф;<br> Док1.УстановитьАтрибут("Цена",Ц2);<br>КонецЦикла;<br><br>Не работает. Вернее работает но цена в документе не меняется(<br>"
в обработке есть ТЗ соответствующая ТЧ дока ?
можно расшифровать ТЗ и ТЧ?)
ТЗ - Таблица Значения в обработке<br>ТЧ - Табличная Часть документа
нет наверное. а как они выглядят?<br><br>там выше весь код. Док1 выбирается из реквизита диалога. и все.
показывай внешнюю обработку
"//*******************************************<br>//Док1 это поле ввода<br><br>Процедура Сформировать()<br> <br> Если ПустоеЗначение(Док1)=1 Тогда<br> Предупреждение("Документ не задан");<br> Возврат;<br> КонецЕсли;<br> <br> Если Док1.Проведен()=1 Тогда<br> Предупреждение("Документ проведен. Данная операция возможна только на непроведенном документе.");<br> Возврат;<br> КонецЕсли; <br> <br> Док1.ВыбратьСтроки();<br> Пока Док1.ПолучитьСтроку()=1 цикл<br> Ц1=Док1.ПолучитьАтрибут("Цена"); <br> Ц2=Ц1*Коэфф;<br> Док1.УстановитьАтрибут("Цена",Ц2);<br> КонецЦикла;<br><br>КонецПроцедуры<br><br><br>Коэфф=2<br>"
1. ужас, ничего не понял<br>2. почему проведенный нельзя изменять?<br>3. что такое Коэфф
1. а что не понятно ?<br>2. что бы случайно в проведенном доке не поменять цены.<br>3. коэфф это коэффициент на который надо изменить цену в документе по всем строкам.<br><br>ну короче в табличной части дока были <br>яблоки по 10 р<br>груши по 20 р<br>надо умножить на коэфф=2<br>получим<br>яблоки 20р<br>груши 40 р
"Процедура Сформировать()<br> <br> Если ПустоеЗначение(Док1)=1 Тогда<br> Предупреждение("Документ не задан");<br> Возврат;<br> КонецЕсли;<br> <br> Если Док1.Проведен()=1 Тогда<br> Предупреждение("Документ проведен. Данная операция возможна только на непроведенном документе.");<br> Возврат;<br> КонецЕсли;<br> <br> Док2 = СоздатьОбъект("Документ."+Док1.Вид());<br> Док2.НайтиДокумент(Док1.ТекущийДокумент());<br> <br> Док2.ВыбратьСтроки();<br>Пока Док2.ПолучитьСтроку()=1 цикл<br> Ц1=Док2.ПолучитьАтрибут("Цена");<br> Ц2=Ц1*Коэфф;<br> Док2.УстановитьАтрибут("Цена",Ц2);<br>КонецЦикла;<br> Док2.Записать();<br><br>//аплодисменты ! =)<br><br>КонецПроцедуры"
Читайте также: