Чем отличается реквизит формы от реквизита объекта 1с
Формы используются для удобного отображения данных базы пользователю. С формами можно работать как пользователь интерактивно, так и программист управляя поведением и внешним видом формы с помощью кода.
Типы форм
Формы делятся на два типа: обычные и управляемые, обычные формы это формы которые были в линейке 8 с самого начала и по текущий момент. Смысл этих форм заключается в том что форма в прямом смысле рисуется разработчиком, он указывает на то место (вплоть до пикселя)где будут располагаться элементы формы. Обычные формы работают только в толстом клиенте, в то время когда управляемые формы работают и в толстом и в тонком клиенте. Управляемые формы доступны в версии 1С начиная с 8.2 и выше и только когда конфигурация настроена как "Управляемое приложение". В тонком клиенте возможно использование только управляемых форм. Управляемую форму нельзя нарисовать мышкой. Элементы в ней не рисуются, а декларируются или объявляются, что накладывает некоторые ограничения. Вы можете указать что реквизиты будут группироваться горизонтально а не вертикально к примеру, но нельзя указать системе: "вон то поле ввода на 2пикселя выше пусть будет". В управляемых формах код делится строго на клиентский и серверный. В обычных формах можно встретить некоторые серверные ограничения только в режиме клиент-сервер и только для функций которые не расположены в модулях форм.
Программное открытие формы
Программно открыть форму можно с помощью метода "Открыть форму". Этот метод доступен в различных контекстах(форма может существовать и быть открыта только на клиенте) и отличается при использовании обычного и управляемого приложения(в толстом клиенте нельзя передать параметру в форму) но в целом имеет следующие основные параметры: ОткрытьФорму(, , , )
Имя формы: имя открываемой формы, так как для объекта метаданных могут быть не определены никакие формы, возможно указать просто тип формы который надо открыть, например "ФормаСписка" или "ФормаЭлемента".
Параметры - параметры передаваемые в форму, с их помощью можно управлять отборами, устанавливать строку в нужном месте, или просто передавать в форму нужные параметры.
Владелец – используется для организации подбора, обработкой результата выбора если форма открыта для подбора, будет заниматься форма или элемент указанные в этом параметре, так же есть возможность закрывать форму, если закрыта форма-владелец.
Уникальность – этот определенный ключ отвечающий за уникальность формы, если этот параметр указан, то при открытии формы будет произведен поиск формы открытой с этим ключом и если такая будет найдена, то будет активирована уже открытая форма.
Принадлежность форм
Формы могут общими(принадлежать к общим формам) или принадлежать определенному виду объектов, например справочнику номенклатура. Если формы принадлежат какому то виду объекта то они могут быть специального типа: например форма списка, эту форму можно использовать для того, что бы просмотреть список документов или форма документа, эту форму можно использовать для редактирования документа. Здесь мы говорим, «можно использовать» так как когда мы щелкаем по документу в списке или когда мы открываем список документов, будет открываться та форма, которая назначена основной. Если основная форма не назначена, при открытии форма будет сгенерирована, вне зависимости от того есть ли в списке форм, форма нужного вида. По сути форма это просто набор полей и кнопок, Форма выбора , форма списка и форма элемента могут отличаться друг от друга только основным реквизитом, который и служит идентификатором для платформы. Основными реквизитами у форм документа и у элемента справочника являются СправочникОбъект и ДокументОбъект . Для форм выбора и форм списка обычного приложения это СправочникСписок.ВидСправочника и ДокументСписок.ВидДокумента . У управляемого приложения у форм выбора и форм списка основной реквизит ДинамическийСписок . Форма выбора отличается от формы списка установленным свойством Режим выбора у основного реквизита. Если форма принадлежит справочнику\документу то для них доступны следующие типы:
Разница между элементами формы, и реквизитами объекта.
Для корректной работы с элементами формы, следует для себя четко разделить где нужно пользоваться элементами формы, а где реквизитами объекта. К примеру, Элементы.Организация Отвечает за поведение реквизита на форме, начиная от видимости, заканчивая цветом заголовка. В то время как Объект.Организация Предоставляет доступ непосредственно к данным.
Обращение к данным формы из модуля объекта.
Обратиться к реквизиту формы(не путайте с реквизитом документа\справочника) из модуля документа или справочника невозможно, потому, что модуль не может знать какая форма сейчас открыта(а их ведь может много) да и не факт, что при выполнении процедуры или функции модуля формы, какая то форма будет вообще открыта. Реквизиты формы существуют, только до тех пор, пока форма открыта.
"Толстые" объекты на управляемой форме.
Так как на тонком клиенте недостуны, данные базы данных, серверные объекты(например таблица значений) то на форме их как таковые разместить нельзя в то время, когда они как типы для реквизитов доступны. Здесь дело в том что, при добавлении на форму, добавляется не табличное поле, и не сам список элементов справочника номенклатура к примеру, а коллекция например типа ДанныеФормыКоллекция или ДанныеФормыСтруктура с урезанным функционалом, суть которой заключается в том, чтобы отображать данные таблицы значений которая является реквизитом формы или документа. Список методов, доступных для этих типов, позволяет вести комфортную работу, с данными тех объектов которые они отображают.
Преобразование Реквизит – Данные формы и обратно.
Несмотря на то, что типы ДанныеФормыКоллекция , имеют достаточно широкий функционал, иногда возникает необходимость на сервере получить, "оригинал" - тот объект который отображает форма. Особенно это актуально для реквизитов формы, ведь данные реквизитов объекта, можно получить из самого объекта. Для таких случаев существует метод РеквизитФормыВЗначение() , например:
Второй параметр необязательный.(и не совсем понятно зачем он нужен). Возможно и обратное преобразование, бывает необходимо когда полученный извне или сгенерированный объект "засунуть" в уже существующий реквизит формы, соответствующего типа для этого существует
Перезаполнение реквизитов формы в случае изменения объекта.
Бывают случаи когда объект изменяется не из формы а с помощью какой то процедуры, которая находится в модуле объекта или в любом другом месте. Если действие было инициализировано с помощью кнопки на форме, то после, например таких действий:
Вы не увидите изменений на форме, все дело в том, что форма не делает лишних вызовов к серверу без необходимости и как следствие не в курсе, что с объектом, что-то происходило. В этом случае надо перечитать данные объекта, следующим образом:
Понятие "тип реквизита" отличается от понятия "тип значения"
Конкретное значение не может быть составного типа. Одно конкретное значение может быть только одного типа данных.
Реквизит может быть как одного типа, так и составного типа. В последнем случае его тип описывается объектом "ОписаниеТипов", т.е. список возможных типов, значения которых могут храниться в этой колонке. Например, СправочникСсылка.М1, СправочникСсылка.М2, Строка, Число, ДокументСсылка.Д1.
В каждой строке (элементе, записи) содержится какое-то свое значение, но каждое из них - одного типа. Например, "СправочникСсылка.М1". Если же в ячейке колонки, имеющей составной тип, даже не выбран (не назначен) тип значения, то оно содержит значение "Неопределено" (это значение и одновременно тип). Если же тип выбран (кнопкой Т или установлен программно), то ячейка содержит пустое значение этого типа, например, пустую ссылку на элемент справочника (см. v8: Пустые ссылки), пустую строку "" или 0.
Чтобы реквизиту составного типа установить конкретный тип, достаточно присвоить ему пустое значение этого типа.
Вопрос:
Какие существуют особенности работы с составными типами данных.
Ответ
Этот вопрос имеет два стороны:
1) Сторона элемента формы.
Для элемента формы мы можем установить только ограничение на типы которые можно выбрать.
Т.е. с помощью кода:
Мы ограничиваем возможный типы только одним "СправочникСсылка.Контрагенты".
НО это не действует на значение которое хранится в источнике данных.
Поэтому если реквизит который связан с "ПолеВвода1" имеет "составной" тип, например Любая ссылка,
он будет неопределенного типа даже после "ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);"
2) Сторона источника данных.
Здесь ограничение на тип накладывается либо в конфигураторе, либо в момент создания этого элемента из языка.
Но если у реквизита установлен "составной" тип значение реквизита будет неопределенно до тех пор, пока ему не будет присвоено значение конкретного типа.
Присвоить конкретное значение можно либо из языка, либо выбрав это значение в форме.
Из выше описанного можно сделать вывод:
Если у реквизита установлен "Составной" тип данных, то даже при ограничении возможных типов у элемента формы до одного возможного, у пользователя будет запрошен тип который нужно будет присвоить реквизиту.
Если мы хотим оградить пользователя от лишних движений, т.е. выбора единственно возможного типа, нам нужно предварительно установить тип реквизита.
Сделать это можно следующим образом:
Добавление от ezh (особенности при работе с элементами в табличном поле):
1.
Вместо этого:
Приветствую знатоков 1С.
Оговорюсь сразу - только начал изучать и ещё в самом начале. Буду очень благодарен за содержательные советы.
Суть проблемы: есть справочник, содержащий название блюда, массу мяса и массу масла. Нужно при вводе через форму объекта документа выбрать из справочника название блюда (это я сделал - через ссылочный тип) а вот два оставшихся поля должны автоматически заполниться соответствующими значениями граммовки из той же записи справочника.
Можно хотя бы пример кода который бы выбирал данные из других полей данных записи справочника, на которую (запись) указывает выбор пользователя из ссылочного списка.
Как сделать, чтобы в одном поле формы списка отражались данные двух реквизитов справочника
Привет! Подскажите пожалуйста как сделать, чтобы в одном поле формы списка отражались данные двух.
Заполнение реквизитов строки ТЧ документа заченями реквизитов выбранного элемента
Здравствуйте. Запнулся вроде бы на простой задаче - забыл как делается. Суть задачи: есть в.
Поиск соответствия реквизитов справочника
Доброго дня, у меня такая проблема разрабатываю примитивную (информационную систему аэропорта).
Если нужно заполнить реквизиты документа, тогда создаётся событие поля блюда ПриИзменении на клиенте и на сервере, и заполняется примерно так:
Но это дублирование информации, и не считается хорошим тоном. Объясняю.
В документе хранят исходную информацию и результирующую информацию.
Промежуточную информацию, которую можно получить из имеющихся объектов, нужно хранить только если она меняется со временем, но тогда она должна находиться не в справочнике, а в периодическом регистре сведений.
Это нужно для того, чтобы, с одной стороны, при перепроведении документа без изменения документа содержимое регистров не менялось, но, с другой, можно было бы пересчитать результирующую информацию без открывания интерфейса документа. Например, в Вашем случае, при исправлении ошибки в ТТК.
Здравствуйте. Спасибо большое за ответ. Видимо не набрал ещё нужного уровня знаний, чтобы понять ответ. Я как раз только дошёл до того, что любое приложение на "1С" это взаимодействие клиента, сервера и БД.
Эти методы, что вы написали в примере - они стандартные?
Вот что мне нужно. Есть соответствуйющий справочник - "МенюПервогоКорпуса" - там разумеется два стандартных реквизита, код и наименование (в нём хранится название блюд) и два реквизита созданных: МассаМяса, МассаМасла (В них соответственно граммовка).
Чтобы максимально на это корректно ответить, нужна дополнительно информация.
1. Куда Вы это делаете:
- Для себя;
- По заданию, для обучения;
- Для реальной конфигурации;
2. Форма объекта чего? Документ, Обработка, другой справочник?
3. Что должен делать этот объект?
4. Версия платформы, Режим запуска конфигурации: Управляемое или обычное приложение.
Привет.
1. Делаю это для жены для её работы очень пригодится. И конечно для того чтобы получить опыт.
2. Это форма документа, которая будет давать возможность выбрать блюда завтрака, обеда и заодно заполнить соответствующие поля граммовки из заполненного справочника. Через эту же форму добавлю поле и соответствующий атрибут в документе для кол-ва поевших в завтрак и обед.
3. Версия учебная 8.3. Про режим запуска пока затрудняюсь ответить. И клиентская, серверная часть и БД все на локальном диске. Если вопрос был об этом.
1.Какие-нибудь наработки есть уже? Интересно посмотреть. Действительно интересно.
Даже если всё неправильно, это даст другую полезную информацию
2.Мясо с маслом - это хорошо, но ведь могут быть другие ингредиенты?
3.Учитывать ли % потерь при готовке?
1) ДА - я могу выгрузить конфигурацию, что сделал - но там пока мало совсем. Плюс я пока пишу это для одного корпуса школы, а их два. В каждом корпусе есть своё меню - названия одинаковые, а вот граммовка разная.
2) ДА - других ингридиентов много, но все они считаются довольно быстро. Основная проблема у жены - она тратит на это час-полтора на подсчёт именно мяса и масла. Эти два ингредиента входят во всякие блюда, граммовка которых как раз должна браться из соответствующих справочников. А иногда, когда блюда нестандартной граммовки, нужно будет расчитать массу по пропорции, но это уже потом. Мне бы сначала обычные вещи огорить. Явпринципе дошёл до главы "Прикладные типы" - и там потихоньку начинает проясняться пути как работать с БД. Но помощь не будет лишней.
3) Нет потери при готовке не учитываются. Это грубо говоря, как в Access - есть запись в таблице - в ней поля записи: "НАзвание блюда", "Вес мяса", "Вес масла" - для каждого блюда в каждом корпусе соответствие однозначное. И вроде программа с точки зрения программирования не сложная - на Си++ я бы её уже написал, но я изучать начал "1С" и пока "сражаюсь" с банальным вводом-выводом.
Да, мало, но общую тенденцию можно увидеть.
Значит комментарии:
- Если есть масло и мясо, значит надо сразу предполагать, что будет неизвестное количество других ингредиентов. Поэтому нельзя для них выделять отдельные поля, а надо запихать их в табличную часть.
- Если граммовка различается для разных корпусов, и можно предположить, что она будет различаться по времени (например, директор может сказать, что первому корпусу с ноября по апрель больше класть крупы, потом вернуть обратно), то логично её организовать в виде документа. Назовём его ТТК (Технико-технологическая карта), и искать на момент расчёта последнюю, но не позднее этого момента, чтобы можно было заранее предусматривать изменения на будущее.
- ТТК составляется обязательно с указанием выхода готового продукта в граммах. Некоторые продукты во время готовки сильно теряют в весе (вода), а некоторые вообще потом изымаются (кости для бульона).
- Сразу нужно предусмотреть, что в состав блюда могут входить уже составные элементы (Заготовки), тогда при расчете они тоже должны разбираться, причём с учётом выхода блюда, выхода заготовки и количества заготовки в блюде. Выходит, рекурсия.
Теперь по наваяному:
Справочники.
- Корпус. Ну, тут понятно.
- Номенклатура. В нём и блюда, и заготовки, и ингредиенты. Справочник иерархический, так что одно от третьего отделить можно. Есть реквизит ЭтоБлюдо. Ставится вручную, или при проведении евоного ТТК с указанием количества порций в выходе. В документ Меню попадают только блюда с этим признаком.
Документы.
- ТТК.
Дата. С какого момента начинает действовать. И до момента следующей ТТК. ТТК можно задавать заранее, передним числом.
Корпус. Можно не указывать. Тогда действует на все корпуса.
Номенклатура. Какое собсно блюдо или заготовку делаем.
Выход. Обязательно. Масса готового блюда из всех указанных ингредиентов.
Порций. Только для блюд. Не для заготовок. На сколько порций делится указанный выход.
- Меню.
По реквизитам понятно. Считает общую граммовку на указанное количество порций всех указанных блюд. Результат не хранит, т.к. к следующему расчету граммовки могут измениться.
Всё проверил. Граммовки рассчитал вручную, вроде совпадает.
Порядок действий: Заводим ингредиенты, заготовки, блюда. Заводим ТТК для заготовок и блюд с учётом даты документа. Заводим меню по аналогии. Жмём кнопку Рассчитать. Поминаем меня незлым тихим словом.
Предупреждаю. Оптимизацию кода и запросов не делал. Есть смертные грехи вроде запроса в цикле. На взаимовложенность заготовок не проверяю (если заготовка А вложена в заготовку Б, а та в заготовку А, то зациклится). Но работает, и уже надоело возиться.
Спасибо огромное ))
Не отвечал долговато, потому как для меня пока сложно всё это воспринимать. Вы конечно сделали сверх меры.
Но как я уже сказал - для меня цель сделать самому и разобраться - сама программа уже дело второе.
Я по своему самоучителю только-только дошёл до темы "события". НЕмного там упоминается как вообще обращаться к СУБД.
Повторюсь - вы проделали огромную работу, не могли бы вы сказать в общих чертах какое событие происходит в приложении, когда мы вызываем форму документа. Как и где его отследить. Т.е. мне нужно:
1) Получить из справочника значение грамм мяса и масла именно того блюда, который выбрал пользователь.
2) Установить это значение в поле формы документа. Т.е. просто сделать вывод значения в соответствующее поле, после выбора соседнего(основного поля).
Вот - всего лишь что я хотел понять. Просто пока я до этого дойду в книге - много времени пройдёт. Мне даже не нужен конкретный код - просто скажите - то происходит событие такое-то. Его надо отлавливать таким-то методом, такого-то объекта. Спасибо большое за ваш труд )
Некоторые вещи, которые кажутся очевидными для опытных специалистов, для обучающихся могут быть непонятны. В ходе обучения на курсе 1С:Программист – Быстрый старт в Профессию! у слушателя возник вопрос, который мы решили опубликовать – ведь с подобным вопросом могут столкнуться начинающие программисты.
Вопрос
При создании формы есть объекты формы (реквизиты) и элементы формы. Разве это не одно и то же? Тогда какая между ними разница?
Ответ тренера
Нет, это не одно и то же.
Реквизиты формы предназначены для хранения данных, с которыми работает форма. Элементы формы предназначены для отображения и редактирования реквизитов формы, а также для отображения и выполнения команд.
Набор реквизитов формы описывает состав данных, которые отображаются, редактируются и хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы, связанные с реквизитами формы.
Это пример разобранного вопроса из Мастер-группы курса
1С:Программист – Быстрый старт в Профессию! .
Комментарии / обсуждение (2):
Добрый день!
1. Можно ли реквизиты и элементы формы создавать программно, и в чем разница в методах, если да?
2. Может ли один реквизит иметь более одного элемента формы. Если да, является ли это ошибкой?
1. Реквизиты и элементы формы можно создавать программно. Например для поля ввода обычно сначала создают реквизит формы, а потом элемент формы, само поле ввода, который связывают с вновь созданным реквизитом. Не совсем понятен вопрос про разницу. Элементы формы и реквизиты формы это разные сущности, которые могут быть связаны между собой, например поле ввода, а могут быть не связаны, например декорация. Более подробно о формах можно узнать из курса Профессиональная разработка интерфейсов и форм в 1С:Предприятие 8.3
2. Несколько различных элементов формы могут быть связаны с одним и тем же реквизитом формы. Это не будет ошибкой. Такая связь может использоваться для больших и сложных форм чтобы уменьшить количество переходов. Так же такая связь используется когда одна форма отвечает за похожие действия и требуется скрывать одни или другую страницу в зависимости от параметров переданных при открытии формы.
Подскажите, пожалуйста, никак не могу разобраться. Хочу в отчете сделать табличное поле (в нем одна колонка, колонка типа справочник) так, чтобы данные, которые там вводил пользователь (для формирования отчета) сохранялись при следующем открытии отчета.
Т.е. пользователь открывает отчет, видит табличное поле, добавляет нужные ему данные из справочника (заполняет колонку) и формирует отчет. Закрывает отчет.
Потом снова открывает отчет и видит те данные в табличном поле, которые он вводил до этого.
Вот эти значения нужно указать в свойствах формы (Сохранять = Итсина, Сохраняемые значения = отметить нужные)
А в самом отчете
Сохранить настройку - сохранять автоматически - использовать при открытии
С кнопочками на ком.панели - "сохранить значения", "восстановить значение" - получилось.
А я пробовала в процедуре при открытии и при закрытии - СохранитьЗначение("ТПоле", ТабПоле); ТабПоле = ВосстановитьЗначение("ТПоле");
При заполнении табполя - значение исчезало.. (
Нужно внимательно проверить, какое значение вы сохраняете
хотела сохранять ТабПоле - это реквизит формы, в которую я и заношу значения.
Скорее всего не табполе, а его значение нужно восстанавливать
т.е. построчно запоминать по всей таблице?
Проверьте, что у вас возвращает ВосстановитьЗначение("ТПоле");
ТабПоле это таблица значений?
А можете еще подсказать. Я создала другой отчет по типу этого же, т.е. есть табличное поле (реквизит формы), значения, в котором я хочу сохранять при открытии. Сделала все аналогично. Значения сохраняются (если открыть/закрыть отчет). НО! Если закрыть и открыть 1С Предприятие, то при открытии отчета табличное поле пусто и кнопочка "Восстановить значение" - неактивна. Что это может быть, подскажите, пожалуйста?
Если работа системы завершена корректно, значит значение настройки сохранится, если же нет - тогда данные в кэш не записываются и при открытии не восстанавливаются, поэтому кнопка и не активна
вроде разобралась почему, но все равно не все понятно. Если сохранить значения, а потом зайти в 1С предприятие через F5 из конфигуратора, то настройки не сохраняются. А если открыть Предприятие не через конфигуратор (не через отладчик), то я вижу сохраненные значения. Это конечно непонятно..
ага, все разобралась. Если сохранить настройки и ВЫЙТИ из программы, а потом даже из конфигуратора можно заходить и видеть сохраненные значения.
Все верно, кэш пишется при штатном завершении работы системы.
А как вы запускаете программу - это не имеет значение
Читайте также: