1с 7 как сделать 2 таблицы в документе
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей документа (или справочника). Традиционно эта задача имеет несколько решений:
1. Хранение нескольких табличных частей в одной. Данный метод имеет только один плюс, "1С-совместимо". Основной недостаток – часто разные табличные части сильно отличаются форматом и составом полей;
2. Хранение дополнительной информации путем "сворачивания" данных в строку. Никаких плюсов метод не имеет. Минусы очевидны: возможное нарушение ссылочной целостности;
3. Хранение табличных частей вне информационной базы. Как и в предыдущем способе гарантировать, что восстановленная ссылка будет корректной, нельзя;
4. Наконец есть правильный способ – хранение табличных частей в служебных документах.
Этот последний способ позволяет:
* делать практически неограниченное число табличных частей,
* избавиться от задач отображения таблицы значений,
* конфигурации остаться 1С-совместимой,
* трудозатраты на создание табличной части в типовом случае составляют около 5 минут,
* ссылочная целостность отрабатывается системой.
Этот способ достаточно известен, однако в предлагаемом решении есть оригинальные моменты (по крайней мере, лично я не встречал подобных подходов).
Итак, рассмотрим технологию организации второй табличной части документа (пример в виде маленькой конфигурации приложен к статье, ссылка внизу страницы).
Первый шаг – создание служебного документа. Он не должен проводится, не должен задействовать компоненты платформы и, лучше всего, не должен принадлежать никакому журналу.
Далее, в табличной части этого документа создаем необходимые реквизиты. Даже те, которые не должны отображаться. В поле "Синоним" указываем то название, которое должно отображаться в колонке. На рисунке 1 имеется реквизит табличной части "ОбъемПриДаннойТемп", который в колонке таблицы будет отображаться как "V при tc".
В поле "Комментарий" можно указывать команды форматирования таблицы (необычная фича, да? ;-). В данном случае задается ширина колонки таблицы, 11 единиц. Сейчас у меня поддерживается несколько таких команд:
- "Ширина=ХХХ;" – установить ширину в ХХХ,
- "Скрыть;" – скрыть колонку,
- "Иконка;" – отображать иконки в колонке.
Команды отделяются друг от друга точкой с запятой, без пробелов, их имена являются регистрозависимыми. Не составляет труда добавить свои собственные команды.
Рисунок 1. Реквизит служебного документа.
После этих операций можно смело утверждать, что с форматированием отображаемой таблицы мы справились.
Добавляем в родительский документ реквизит типа "Документ", и связываем его с только что созданным служебным документом. Через этот реквизит впоследствии мы сможем работать с дополнительной табличной частью.
Рисунок 2. Связь главного и служебного документов.
В форму "главного" документа добавляем таблицу значений, при помощи которой будем отображать дополнительную табличную часть, и три кнопки – стандартные "добавить-редактировать-удалить". При желании можно определить и другие операции со строками дополнительной табличной части – копировать строку, и т.д.
Рисунок 3. Будущая табличная часть.
Теперь нужно вставить необходимый код в глобальный модуль (см. конфигурацию-пример).
Для манипуляций с табличной частью в родительский документ необходимо добавить всго лишь три строки:
В процедуру передаются три параметра – Контекст, реквизит родительского документа, в котором содержится ссылка на служебный документ, и таблица значений на форме, которая отображает табличную часть.
При открытии происходит форматирование таблицы и заполнение её данными.
При закрытии происходит попытка удаления служебного документа (при необходимости). Второй параметр такой же, как и в первой функции:
Ну и собственно сохранение табличной части. Параметры такие же как и в первой процедуре:
Готово. Ну, за исключением ввода данных в таблицу. Для этого я позаимствовал из типовой конфигурации ИТРП универсальную процедуру ввода в таблицу значений (см. пример). Можно взять какую-нибудь другую универсальную процедуру ввода данных в ТЗ, или написать свою собственную – кому как больше нравится.
Вот и все… Восьмерка лишается одного из своих основных козырей?
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей документа (или справочника). Традиционно эта задача имеет несколько решений:
1. Хранение нескольких табличных частей в одной. Данный метод имеет только один плюс, "1С-совместимо". Основной недостаток – часто разные табличные части сильно отличаются форматом и составом полей;
2. Хранение дополнительной информации путем "сворачивания" данных в строку. Никаких плюсов метод не имеет. Минусы очевидны: возможное нарушение ссылочной целостности;
3. Хранение табличных частей вне информационной базы. Как и в предыдущем способе гарантировать, что восстановленная ссылка будет корректной, нельзя;
4. Наконец есть правильный способ – хранение табличных частей в служебных документах.
Этот последний способ позволяет:
* делать практически неограниченное число табличных частей,
* избавиться от задач отображения таблицы значений,
* конфигурации остаться 1С-совместимой,
* трудозатраты на создание табличной части в типовом случае составляют около 5 минут,
* ссылочная целостность отрабатывается системой.
Этот способ достаточно известен, однако в предлагаемом решении есть оригинальные моменты (по крайней мере, лично я не встречал подобных подходов).
Итак, рассмотрим технологию организации второй табличной части документа (пример в виде маленькой конфигурации приложен к статье, ссылка внизу страницы).
Первый шаг – создание служебного документа. Он не должен проводится, не должен задействовать компоненты платформы и, лучше всего, не должен принадлежать никакому журналу.
Далее, в табличной части этого документа создаем необходимые реквизиты. Даже те, которые не должны отображаться. В поле "Синоним" указываем то название, которое должно отображаться в колонке. На рисунке 1 имеется реквизит табличной части "ОбъемПриДаннойТемп", который в колонке таблицы будет отображаться как "V при tc".
В поле "Комментарий" можно указывать команды форматирования таблицы (необычная фича, да? ;-). В данном случае задается ширина колонки таблицы, 11 единиц. Сейчас у меня поддерживается несколько таких команд:
- "Ширина=ХХХ;" – установить ширину в ХХХ,
- "Скрыть;" – скрыть колонку,
- "Иконка;" – отображать иконки в колонке.
Команды отделяются друг от друга точкой с запятой, без пробелов, их имена являются регистрозависимыми. Не составляет труда добавить свои собственные команды.
Рисунок 1. Реквизит служебного документа.
После этих операций можно смело утверждать, что с форматированием отображаемой таблицы мы справились.
Добавляем в родительский документ реквизит типа "Документ", и связываем его с только что созданным служебным документом. Через этот реквизит впоследствии мы сможем работать с дополнительной табличной частью.
Рисунок 2. Связь главного и служебного документов.
В форму "главного" документа добавляем таблицу значений, при помощи которой будем отображать дополнительную табличную часть, и три кнопки – стандартные "добавить-редактировать-удалить". При желании можно определить и другие операции со строками дополнительной табличной части – копировать строку, и т.д.
Рисунок 3. Будущая табличная часть.
Теперь нужно вставить необходимый код в глобальный модуль (см. конфигурацию-пример).
Для манипуляций с табличной частью в родительский документ необходимо добавить всго лишь три строки:
В процедуру передаются три параметра – Контекст, реквизит родительского документа, в котором содержится ссылка на служебный документ, и таблица значений на форме, которая отображает табличную часть.
При открытии происходит форматирование таблицы и заполнение её данными.
При закрытии происходит попытка удаления служебного документа (при необходимости). Второй параметр такой же, как и в первой функции:
Ну и собственно сохранение табличной части. Параметры такие же как и в первой процедуре:
Готово. Ну, за исключением ввода данных в таблицу. Для этого я позаимствовал из типовой конфигурации ИТРП универсальную процедуру ввода в таблицу значений (см. пример). Можно взять какую-нибудь другую универсальную процедуру ввода данных в ТЗ, или написать свою собственную – кому как больше нравится.
Вот и все… Восьмерка лишается одного из своих основных козырей?
Встала передо мной тут задачка одна - автоматизировать работу контролеров на рыке. Рынок поделен на торговые зоны.
Каждая зона разбита на ряды и на места. Трудность заключается в том, что в каждой зоне разное количество рядов, как и мест
в рядах. Нужно, чтобы контролер мог наглядно (схематически) видеть состояние той или иной зоны. Видеть занятые/свободные
места, для чего предназначено каждое место. Кроме того требуется сделать это все «динамически». Т.е. каждый месяц
количество рядов, мест и их назначение может меняться.
На первый взгляд задача не такая и трудная. Главное - как-то сохранить структуру зоны в 1С. Но как? Структура зоны
представляет собой не что иное, как обычную двумерную таблицу «шахматку». По вертикали места, по горизонтали ряды. Т.е.
оптимальный вариант – использование таблицы значений в 1С. Но, к сожалению, 1С не умеет хранить ТЗ в составе базы. Есть
несколько вариантов хранить ТЗ. Во-первых, во внешнем файле. Во-вторых, во внешнем dbf’е. В-третьих, создать справочник
(несколько справочников). И последний вариант – документ с табличными реквизитами.
Первый способ отметаем сразу, второй немного лучше первого, но все равно хранить что-то отдельно от базы не всегда
удачное решение, да и трудностей больше. Третий способ предлагали многие, но он мне не понравился. Представьте себе зону
100 на 100… Пусть даже справочник будет заполняться программно. Геморрой… А еще если учесть что реквизиты справочника
должны быть периодическими, то хочется плакать. Четвертый вариант – вот оно! То что нужно! Точнее, это единственный верный
вариант в данном случае.
Итак, для хранения ТЗ используем документ с реквизитом шапки – Зона и табличными реквизитами – ряд, место,
назначение. Зона – справочник «Структура торговой зоны», где указано количество рядов в зоне и максимальное количество мест
в ряду. Но как заполнять такой документ? Согласитесь, очень неудобно десять раз указать ряд, десять раз выбрать место, а
потом еще и назначение этого места. Утомительно и трудно для восприятия. Отсюда возможные ошибки. Вот тут и возникла идея -
заполнять документ, используя таблицу! Таким образом, табличные реквизиты вообще можно не выводить в документе…
После начала реализации, понял, а ведь это очень удобно использовать таблицу для ввода всевозможных данных в 1С.
Кроме того ее можно использовать не только для ввода, но и для вывода, в том числе и динамического. Да и еще кучу
применений можно придумать!Так родилась идея создания универсальной таблицы для ввода данных. На входе указываем количество
рядов и мест, на выходе получаем ТЗ…
Делаем таблицу…
В свойствах формы обработки/отчета выбираем использовать таблицу для ввода данных (Положение: любое).
Для начала нам надо сформировать таблицу…
Вот что у нас получилось (рядов 10, мест 10): рис. 1
Теперь надо сделать так, чтобы в ячейки можно было вносить какие-то данные, например из справочника. Замечу, что
ячейки таблицы в режиме ввода данных могут быть любого типа (по умолчанию у всех стоит тип «строка»). Т.е. если мы в
конфигураторе укажем заранее, что ячейка имеет тип Справочник.XXX. То при работе в эту ячейку можно вносить элементы из
указанного справочника. А саму таблицу потом выгружать в список значений методом Выгрузить(). Тут меня ждало первое
разочарование…
Поскольку заранее мы не знаем количество рядов/мест, то какие ячейки будут иметь нужный нам тип надо сделать
программно. Да и метод такой имеется УстановитьТип(). Но этот метод применим, если на этапе конфигурирования ячейке
назначен тип – «Неопределенный», а по умолчанию, как я уже писал, у всех ячеек тип «строка». Предположив, что на практике
вряд ли будет существовать зона 100 рядов на 100 мест, я, не долго думая, выделил в конфигураторе область 100 на 100 и
назначил всем ячейкам тип «Неопределенный». Сохранил отчет и … отчет стал весить 64(. ) Мегабайта….) Мда, так не пойдет… и
я придумал другой выход.
При открытии обработки формируем таблицу значений, которая по структуре идентична нашей таблице. Т.е. количество
строк будет равно количеству мест, а количество колонок – количеству рядов. Тип колонок выбираете произвольно, или
«неопределенный». Таким образом, эта ТЗ будет являться своего рода «подложкой» нашей таблицы и полностью дублировать ее. Эту ТЗ мы и передаем во внешний документ, вызвавший эту обработку.
Получаем вот такое меню: рис.2
Итоговый вид таблицы после заполнения оператором: рис.3
Демонстрационная обработка здесь -> //infostart.ru/projects/1299/
В демонстрационной обработке используются значения типа "Строка".
Рис.1
Рис. 2
Рис. 3
Бывают случаи, когда необходимо, для удобства, подставить в 1 документ несколько табличных частей, но 7мерка не позволяет этого сделать. Но если нельзя, но очень хочется, то можно!
Также позволяет добавить любое количество закладок в документ автоматически.
Бывают случаи, когда необходимо, для удобства, подставить в 1 документ несколько табличных частей, но 7мерка не позволяет этого сделать. Суть в том, что все, необходимые нам табличные части, хранятся в специальном справочнике (довольно громоздко, но эффективно и быстро).
Специальные предложения
УдалитьСтроки>();
<\БУХ\TABL_DOCS.ERT(12)>: Процедура не обнаружена (УдалитьСтроки)
НоваяСтрока>();
<\БУХ\TABL_DOCS.ERT(17)>: Процедура не обнаружена (НоваяСтрока)
ВыбратьСтроки>();
<\БУХ\TABL_DOCS.ERT(30)>: Процедура не обнаружена (ВыбратьСтроки)
Пока ПолучитьСтроку>()=1 Цикл
<\БУХ\TABL_DOCS.ERT(31)>: Функция не обнаружена (ПолучитьСтроку)
Г=0>;
<\БУХ\TABL_DOCS.ERT(40)>: Ожидается ключевое слово 'Тогда' ('Then')
>КонецЕсли;
<\БУХ\TABL_DOCS.ERT(41)>: Ожидается ключевое слово 'КонецЦикла' ('EndDo')
>КонецЦикла;
<\БУХ\TABL_DOCS.ERT(51)>: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
КонецЦикла>;
<\БУХ\TABL_DOCS.ERT(51)>: Ожидается ключевое слово 'КонецПроцедуры' ('EndProcedure')
ТЗ.Сортировать("ЗначСорт");>
<\БУХ\TABL_DOCS.ERT(52)>: Обнаружено логическое завершение исходного текста модуля
Автар я тоже экономист. Как варианты есть еще:
Первый вариант реализации через список значений. Второй вариант через таблицу значений и документ. :)
>но 7мерка не позволяет этого сделать
Вопрос решен лет сто назад. На проклабе, кажись, еще в году 2000-ом. И хранить лучше в документе с неопределенными реквизитами.
+(5) Почему именно в документе? Да потому, что там уже есть готовая табличная часть, ничего особенно и мудрить не надо.
(16) имеет/не имеет - суждение спорное, к тому же не моё; и в зависимости от поставленной задачи имеет свои как плюсы, так и минусы
Просмотры 17339
Загрузки 783
Рейтинг 30
Создание 27.03.08 10:09
Обновление 14.04.08 19:39
№ Публикации 15672
Конфигурация Конфигурации 1cv7
Операционная система Не имеет значения
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Не указано
См. также
Класс 1С++ для программного добавления изображений/текста/ШК в таблицу Промо
Необходимо добавить в сформированную таблицу изображения/текста/ШК (81 тип ШК) с прозрачным фоном? Вставить фирменный логотип? Быстро организовать оформление документов в корпоративном стиле? Данная разработка поможет в этом!
1 стартмани
03.06.2012 251895 233 zarius 116
WebЦвета для 1с77 FormEx
Обработка с фрагментами кода для программного использования набора цветов из коллекции WebЦвета 1с версии 8+ в 1с версии 77. Требуется предварительное подключение сторонней библиотеки FormEх. Будет полезно программистам 1с 77, 1с 8. Да и вообще при программировании на любом языке при потребности использовать коллекцию цветов WebЦвета.
1 стартмани
30.03.2022 859 0 igor7777 4
Выбор цвета для 1С 7.7
Простая и удобная внешняя обработка для выбора цвета без применения внешних компонент.
1 стартмани
09.06.2020 4773 2 vap_pig 5
Несколько табличных частей в 1С:7.7 - это просто
При программировании на платформе V7 достаточно часто возникает задача создать несколько табличных частей документа (или справочника). Традиционно эта задача имеет несколько решений..
1 стартмани
01.05.2018 18427 24 Gkmy 10
Процесс бар (индикатор состояния выполнения цикла) Промо
Полезная "красотулька" в вашем документе. Будет очень полезна для медленных компьютеров, где не всегда понятно, работает-ли обработка или 1с-ка тупо "зависла"
14.04.2008 29014 871 ded00786 38
Диалоги выбора периода для 1С версий 8.3 и 7.7
Представлены два диалога для выбора интервала дат по календарю в составе демонстрационных конфигураций 1С8.3 и 1С7.7
1 стартмани
24.01.2017 22224 19 romasna 7
Как создать индикатор в 1С:Предприятии 7.7
В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.
1 стартмани
27.09.2016 16213 2 HAMMER_59 6
Полноценное использование Drag&Drop в 1С 7.7
Несмотря на то, что кое-какие функции Drag&Drop были заложены авторами 1cpp, моё дополнение позволяет сделать этот функционал законченным. Дело в том, что средствами 1cpp можно было таскать файлы ТОЛЬКО в 1С, а из 1С - невозможно. Теперь Вы можете сделать работу с файлами на порядок удобнее и эффективнее.
1 стартмани
19.09.2016 18364 15 DasIsFantastich 4
Вывод и перенумерация отчета с заранее неизвестным количеством группировок. Промо
1 стартмани
21.03.2012 32008 21 unichkin 11
Пилотный проект ФСС. Заявление, реестр, опись, выгрузка в формате xml версия 1.7.2.
Типовые объекты конфигурации не изменены, поэтому подходит для любого релиза ЗиК.
1 стартмани
29.07.2016 14999 21 Cvetic 1
"Магический батон" или еще одна попытка сделать "волшебную кнопку"
Собственно, проблема, которая может возникнуть при присоединении одного табличного документа к другому в том, что строки документов изначально могут иметь один формат строк, но при этом разную ширину колонок. При присоединении одного такого документа к другому мы получим одну и туже ширину колонок табличного документа, т.е. документ будет выглядеть не так как вы ожидаете.
Рис.1. Ширина колонок изменилась и логотип сместился вправо.
При каких сценариях это происходит:
- При объединении нескольких печатных форм в один табличный документ;
- При дополнении отчета на СКД областью из своего макета.
Суть решения
Все просто - в момент присоединения одного табличного документа к другому мы создаем для него новый формат строк. По сути тоже самое, что происходит при интерактивном редактировании макета, когда вы выделяете строки и изменяете для них ширину столбца.
Рис.2. Табличный документ из двух частей. Создан новый формат строк.
Рис. 3. Вопрос в редакторе табличного документа при изменении ширины столбцов.
В качестве бонуса отчет на СКД с логотипом.
Тестировалось на платформе 8.3.13.1513
Специальные предложения
Всё равно ширина колонок будет одна и та же в обоих макетах, т.е. уедет ваш второй макет от изначального шаблона. Или я ошибаюсь? Точно, ошибаюсь, проверил :) Тогда "плюс" :)
Коллеги доброго времени суток, есть функция которая получает сформированные Печатные формы(далее ПФ) у каждого табдока есть параметр "ШиринаТаблицы" для всех сформированных ПФ разный(зависит от макета) и объединяет их в большойТАбДОк.
При попытке вывести на печать наш большойТАбДОк (при условии что для него АвтоМасштаб = Истина) получается что та ПФ которая с меньшим параметром "ШиринаТаблицы" становится нечитаемым(скрин прилагается) . Хотелось узнать можно ли как то решить эту проблему не унифицируя все макеты ПФ?
ПЫСЫ: параметр ШиринаТаблицы недоступен для записи.
Особенности использования форматированных строк описаны на ИТС
Особенности работы с форматами строк табличного документа
Но из голой теории мало что понятно - не хватает картинок. примеров на реальных макетах.
В справке 1С - предоставлен пример такой же , как и в публикации - который отрабатывает присоединяемый табл. документ, у которого один (!) формат строк на весь макет.
Если в присоединяемом табл. документе много разных блоков - с разными форматами строк, то алгоритм уже не сработает - поскольку все последующие строки табл. документа будут приводиться к формату первого блока строк.
Автор алгоритма потрудился разделить присоединяемый табл.документ на все блоки разных форматов строк - присоединил каждый по отдельности. Ему огромное спасибо за предоставленный алгоритм!
Расскажу в чем нюанс. Сначала я выводил так таб. документы:
В таком случае два макета садятся в один - с первого взгляда красиво, но в формат А4 Портрет уже не влезает - колонки изменяют ширину. По отдельности каждый макет влезает в А4.
Пришлось воспользоваться алгоритмом соединения табл. документов через СоздатьФорматСтрок() - результат положительный и представлен на скриншотах.
Читайте также: