Свойство и метод в чем разница 1с
Перейти к содержимому

Свойство и метод в чем разница 1с

  • автор:

Свойства против методов

На первый взгляд, такой вопрос как выбор свойства или метода кажется простым. Но это до тех пор, пока вы не столкнётесь с непониманием в своей команде. Хотя есть устоявшиеся практики, их формулировки достаточно расплывчаты. В такого рода вопросах есть некоторая степень свободы, которая затрудняет наш выбор, а кажущаяся простота даёт плодородную почву для споров.

Бэкграунд Java-программистов

Язык программирования — это основной инструмент программиста. Наличие или отсутствие каких-либо конструкций формирует определённый стиль кодирования. Вот, например, в Java нет свойств, есть только поля и методы.

Возьмём для примера следующий класс:

Мы имеем класс, описывающий точку на плоскости. Что с ним не так? Во-первых, так как это открытые поля, то они доступны для редактирования извне. Во-вторых, мы открываем детали реализации, что храним точку в декартовых координатах.

Поэтому, обычно, так не пишут, а инкапсулируют поля за геттерами и сеттерами:

Стандартная практика на Java, в IDE даже есть специальные генераторы для этого.
Мы убрали прямой доступ к полям с помощью методов get и set.

Хотя они выглядят как функции, в сущности, являются геттерами и сеттерами.

Сахар в Котлине

В Котлине у нас есть свойства и мы можем не писать простыню из методов get и set:

Выглядит лаконично, не так ли? Обращение к свойству тоже удобно: x вместо getX() .

При необходимости мы можем переопределить геттер или сеттер:

В Котлине мы всегда имеем дело со свойствами, поля скрыты за сеттерами и геттерами. То есть мы имеем все преимущества методов, но при этом можем обращаться как с полями.

Нам подвезли сахар, но старые привычки остались. Я часто замечаю, что программисты на Java продолжают писать методы get и set в классах на Котлине, когда это уже необязательно. Название самих методов говорит о том, что их можно сконвертировать в свойства. Но всегда ли нужно предпочесть свойство методу? Если у нас есть функция без параметров, то выбор не всегда очевиден.

Общепринятые соглашения

Официальная документация говорит нам, что функции без параметров могут быть взаимозаменяемы read-only свойствами.

Ниже дан алгоритм, по которому можно определить, когда предпочесть свойство методу:

  • если свойство не бросает исключение (exception)
  • дёшево для вычисления (или можно закешировать при первом запуске)
  • возвращает одно и то же значение при каждом вызове, если состояние объекта не изменилось

Я ожидал увидеть более развёрнутое руководство. Для первого пункта я бы добавил про любой сайд-эффект, который может происходить при вызове функции. С последним пунктом тоже не всё так просто.

Например, если у нас есть класс User:

Нужно ли полное имя делать свойством или всё же методом?

В данном случае создаётся всегда новый объект String, хотя это деталь реализации. Но значения всегда будут равны при сравнении через equals. На крайний случай можно закешировать fullName, пожертвовав памятью.

Но вот пункт про вычислимость вызывает больше всего вопросов.

Сложно или легко вычислимые свойства

Кажется, это довольно расплывчатое требование. Что значит сложно вычислимое? Если подразумеваются тяжёлые вычисления, такие как запрос в сеть или к БД, то мы должны будем вынести вызов в отдельный поток. В этом случае асинхронный вызов будет выглядеть по-другому: метод с коллбэком, реактивный поток или корутина. Но речь, скорее всего, не об этом.

Рассмотрим следующий пример:

У нас есть класс модели документа, у которого есть свойство activePageIndex, которое возвращает текущий индекс страницы. Мы не знаем внутренней реализации, но предполагаем, что это свойство и согласно принятому соглашению, мы можем не беспокоиться о производительности и спокойно использовать его в цикле:

Допустим, чтобы получить текущую страницу, нужно пробежаться по всему документу, то есть сделать некоторые вычисления. В этом случае оптимально сохранить текущую страницу в переменную, прежде чем использовать её в цикле:

Но чтобы это понять, нужно заглянуть в реализацию. Когда программист видит свойство, то он делает некоторые допущения в использовании, полагая, что автор класса позаботился о принятом соглашении. В этом случае автор допустил небрежность, чем ввёл в заблуждение. По хорошему, нужно сделать метод вместо свойства для получения активной страницы и назвать её как-то по-другому, например, findActivePageIndex.

Интерфейс важнее реализации

С одной стороны, приведённый выше пример показывает, насколько важно думать об интерфейсе, как он будет использоваться на клиентской стороне. С другой стороны, реализация накладывает ограничение на интерфейс. Если сложные вычисления, то нужно использовать функцию вместо свойства. Здесь мы вступаем в некоторое противоречие, что первичнее, реализация или интерфейс? Мы заранее не можем сказать об эффективности и есть соблазн впасть в крайность — всегда делать методы в интерфейсе. Особенно после Java непривычно видеть свойства в интерфейсе. При этом, метод, начинающийся со слова get или set никого не смущает.

При проектировании интерфейса, по-моему, мы должны в первую очередь думать о клиентском коде. Если мы будем ставить реализацию впереди интерфейса, то мы получим плохой API класса. Цена такой ошибки может быть рефакторинг всех вызовов в проекте. Разработчики библиотек хорошо это понимают, когда изменение API ломает сторонний код или меняет поведение класса, на которое клиент не рассчитывал.

Частая ситуация, что интерфейс создают при помощи рефакторинга в IDE, извлекая из существующего класса. Похоже, что это порочная практика. В результате такого рефакторинга на выходе мы получаем кашу из методов, зачастую несвязанных между собой.

Интерфейс — это так же важно, как и подбор подходящего имени для переменной или функции. Это контракт между автором и пользователем интерфейса. Реализаций может быть множество, включая самые неоптимальные. Это уже детали. При реализации свойств мы должны позаботиться, чтобы оно соответствовало принятому соглашению о лёгкой вычислимости.

Фундаментальные отличия

Хорошо, предположим, мы принимаем, что интерфейс первичен по отношению к реализации. Но из каких соображений исходить при его проектировании. В каком случае выбрать свойство, а когда нужен метод?

У свойств и методов есть более глубокие различия. Когда мы проектируем класс, то его можно разделить на две условные части:

  • Состояние. Можно рассматривать как данные, которые описывают характеристики или черты объекта. В этом случае больше подходят свойства.
  • Поведение. То есть то, что можно сделать с объектом. За это отвечают методы.
    Они обычно изменяют состояние.

Это довольно простое правило, которое поможет при выборе свойства или метода.

Вместо заключения

Разберём первоначальный пример, только сделаем его интерфейсом:

Так что с ним не так?

Во-первых, два отдельных сеттера для координат x и y. Когда мы определяем точку в пространстве, то мы задаём их в паре, то есть атомарно. Меняя их независимо, мы создаём возможность для ошибок.

Добавим метод для задания координат и сделаем координаты x и y только для чтения:

Во-вторых, интерфейс недостаточно гибкий. Иногда удобно работать с полярными координатами, но в интерфейсе только прямоугольные. Таким образом, мы неявно раскрываем реализацию.

Как мы видим, хороший интерфейс спроектировать не так просто. Хотя можно было бы ограничиться data-классом:

Свойство и метод в чем разница 1с

Работа с прикладными объектами средствами встроенного языка

Работа с любым прикладным объектом (объектом конфигурации) похожа на работу с другими объектами, потому что есть общий принцип. Понимая этот принцип, можно быстро освоить все прикладные объекты, будь то справочники, планы счетов, документы, регистры или любой другой прикладной объект.

Данный раздел носит скорее теоретический характер, но для успешной разработки в 1С:Предприятии 8 абсолютно необходимо понимать эту классификацию объектов. В следующей таблице перечислены виды программных объектов с конкретными примерами, их краткое описание, типичные свойства и методы (т.е. встречающиеся у разных объектов):

Вид объекта Описание Типичные
свойства и методы
Менеджер прикладных объектов данного типа

Объекты данного вида обеспечивают доступ к менеджерам конкретного прикладного объекта.

Обычно доступ к таким объектам производится через свойства глобального контекста, например, Справочники.Сотрудники, Документы.Счет, РегистрыСведений.КурсыВалют и т.д.

Эти объекты являются коллекциями значений и позволяют перебрать свои элементы с помощью цикла «Для Каждого».

Свойства соответствуют именам прикладных объектов и являются объектами типа «Менеджер прикладного объекта»

Данный объект является «центральным» в объектной модели, из которого можно получить остальные объекты, например, ссылки, выборки, объекты для изменения, наборы записей и т.д. (см. ниже параграф «Взаимосвязь объектов»).

Объект этого вида обеспечивает доступ к операциям над прикладным объектом как множеством элементов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новые записи, обращаться к формам и макетам прикладного объекта.

Данный объект однозначно идентифицирует объект базы данных (например, элемент справочника, документ) и позволяет обращаться к нему в режиме «только чтение». Через свойства и методы этого объекта можно прочитать реквизиты элемента, обратиться к его табличным частям.

Ссылки хранятся в реквизитах, ссылающихся на элементы данного прикладного объекта, например, в реквизите «Сотрудник» документа «ПриемНаРаботу» хранится ссылка на конкретный элемент справочника «Сотрудники».

Заметьте, что у записей регистров нет ссылок.

Для изменения объекта базы данных (элемента справочника, документа) нужно получить другой объект с помощью метода ПолучитьОбъект() .

Этот объект предоставляет возможность обхода (перебора) объектов базы данных. Например, можно перебрать элементы справочника или перебрать документы, входящие в конкретный журнал.

Обратите внимание, что данный объект не является коллекцией значений и, следовательно, нельзя использовать цикл » Для Каждого » для перебора элементов.

Свойства аналогичны свойствам объекта типа «Ссылка».

Предоставляет доступ к элементу с возможностью записи изменений в базу данных. Этот объект содержит методы, влияющие на элемент в базе данных, например, методы Записать и Удалить.

Для отчетов и обработок через этот объект обычно осуществляется формирование отчета или выполнение обработки.

Если в модуле прикладного объекта (не путать с модулем формы) есть экспортируемые переменные модуля или процедуры/функции, то они дополняют набор свойств и методов именно этого программного объекта.

Для регистров подобного объекта не существует, а изменение данных всегда производится через набор записей (см. ниже).

Свойства аналогичны свойствам объекта типа «Ссылка».

Этот программный объект предназначен для управления списком элементов в табличном поле. Позволяет управлять колонками, отбором и сортировкой в списке.

Этот объект нельзя создать программно, он создается системой автоматически при размещении на форме табличного поля. Конечно, программно можно создать табличное поле в экранной форме и тогда будет создан объект данного типа.

Набор записей позволяет оперировать сразу несколькими записями прикладного объекта (обычно регистра). Набор записей можно целиком прочитать из базы данных, добавить в него записи или изменить их, а зетем записать в базу данных (в одной транзакции).

У документов есть свойство-коллекция «Движения», которое предоставляет доступ к наборам записей по каждому регистру, отмеченному на закладке «Движения». Через это свойство обычно производится формирование движений документа при его проведении.

Обеспечивает доступ к одной записи из набора, для того чтобы установить ее измерения, ресурсы и т.д. Этот объект возвращается методами других объектов, например, методом Добавить у объекта типа РегистрНакопленияНаборЗаписей.

Объект типа «Запись» не является постоянным идентификатором конкретной записи регистра, наподобие объекта «Ссылка» для справочников и документов. У записей регистра сведений вообще нет неизменяемого во времени идентификатора и каждая запись регистра однозначно определяется значениями своих измерений (включая системные, например, Период, Регистратор, НомерСтроки)

Этот объект нужен для идентификации записи регистра в табличном поле, например, набора записей документа-регистратора или списка всех записей регистра. Он используется для позиционирования в списке записей на конкретной записи регистра.

Свойства для регистра сведений:

Специфические объекты

Ниже перечислены некоторые важные объекты, которые не укладываются в приведенную выше классификацию:

Менеджер записи регистра сведений

Применяется для операций над одной записью регистра сведений. Этот объект существует только у независимого регистра сведений, т.е. не подчиненного регистратору.

Следует иметь в виду, что даже если редактирование записей производится с использованием менеджера записи, то на нижнем уровне все равно применяется набор записей регистра, т.е. при сохранении/удалении записей срабатывают события модуля набора записей регистра.


Аналогичен объектам типа НаборЗаписей в том смысле, что позволяет прочитать из базы данных или записать в базу данных значения нескольких констант в одной транзакции. Его набор свойств и методов нетипичен по сравнению с наборами записей, поэтому он вынесен в специфические объекты.

Менеджер внешних обработок подобен менеджерам других прикладных объектов. Его метод Создать(<имя файла>) позволяет создать объект типа «ВнешняяОбработка». Этот объект, в свою очередь, подобен объектам ОтчетОбъект и ОбработкаОбъект и предоставляет доступ к реквизитам и табличным частям внешней обработки для передачи параметров формирования отчета или выполнения обработки.

Если в модуле внешней обработки (не путать с модулем формы) есть экспортируемые переменные модуля или процедуры/функции, то они дополняют набор свойств и методов объекта «ВнешняяОбработка».

Взаимосвязь объектов

Ниже показана взаимосвязь программных объектов, характерная для объектов, имеющих ссылки (на примере справочников):

Вид объекта Соответствующий
прикладной объект
Описание
Регистры сведений Планы счетов Применяется для работы со списком видов субконто, прикрепленных к данному счету.
Регистры бухгалтерии Свойство Субконто объекта РегистрБухгалтерииЗапись является объектом именно этого типа. Данный объект является коллекцией значений и позволяет управлять значениями субконто для конкретной записи регистра бухгалтерии.
Внешние обработки
ЗАМЕЧАНИЕ. На схеме показаны не все возможные объекты и взаимосвязи. Например, метод Скопировать() существует не только у объекта СправочникСсылка , но и у самого объекта СправочникОбъект . Кроме того, у объекта СправочникМенеджер есть методы НайтиПоНаименованию() и НайтиПоРеквизиту() , которые действуют аналогично методу НайтиПоКоду и возвращают ссылку на найденный элемент или пустую ссылку, если элемент не найден. Также на схемах не показаны специфические объекты и объекты типа «Список».

А теперь немного другая взаимосвязь, характерная для регистров (на примере регистров накопления):

Как видите, левые части этих схем очень похожи, а правые части различаются. Не думайте, что объект «Ключ записи» аналогичен объектам «Ссылка», а объекты «НаборЗаписей» и «Запись» аналогичны объекту «Объект», хотя некоторое сходство прослеживается.

Методы, свойства

Ну например нужно получить "текущую строку",это значит что обращаться нужно к элементам, а не реквизитам формы. Дальше я смотрю на тип элемента, допустим таблица формы — в СП смотришь свойства этого типа. Ну и находишь текущие данные

Я всегда от алгоритма плясал, заранее не закладывался на то, что "умеет" тот или иной объект.
Ну то есть, придумал, что мне нужно, например, какое-то хранилище настроек и из него в цикле элементы дергать. Ок, написал "настройки = новый Массив", тут же по "Массиву" — в синтакс-помощник и смотреть, что он умеет. Так, массив не подходит — надо что-то более развернутое — тут же рядом таблица значений есть, можно на ее умения посмотреть.

Иногда, конечно, оказывалось, что то, что я задумал вообще никак не решить (например, содержимое динамического списка обещают только в самой последней платформе). Но так еще интереснее — если в лоб не решается, как правило, всегда можно обходной путь придумать

Так, массив не подходит — надо что-то более развернутое — тут же рядом таблица значений есть

Свойства и методы объекта отчета

Свойства и методы объекта отчета можно посмотреть в синнктакс – помощник конфигуратора:

Объект отчета используется для доступа к реквизитам и табличным частям, формам и макетам отчета. Он создается с помощью следующей конструкции:

ОтчетОбъект содержит реквизиты отчета и табличные части оичета . Доступ к значению осуществляется по имени, как оно задано в Конфигураторе, например

Отметим, реквизиты могут использоваться для чтения и записи. Однако, табличная часть доступно только на чтение.

Для редактирования настроек отчета используется свойство КомпоновщикНастроек.

Свойство СхемаКомпоновкиДанных дает доступ к схеме компоновки, на основании которой будет выполняться отчет

Для выполнения компоновки данных используется метод СкомпоноватьРезультат

Параметр <ТабличныйДокумент> , в который будет выводиться результат является обязательным параметром . Однако, переменная <ДанныеРасшифровки>, в которую будет записана информация расшифровки необязательна. Расшифровка заполняться не будет если не указана переменная

Одна из особенностей метода СкомпоноватьРезультат заключается в том, что при выполнении метода генерируется событие ПриКомпоновкеРезультата. Обработчик данного события доступен в модуле объекта отчета

Параметры обработчика ПриКомпоновкиРезультата:

  • <ТабличныйДокумент> – Документ, в который выводится результат и переданный из метода СкомпоноввтьРезультат
  • <ДанныеРасшифровки> – Переменная, в которую необходимо поместить данные расшифровки. Если данный параметр имеет значение Null, то данные расшифровки создавать не нужно.
  • <СтандартнаяОбработка> – В данный параметр передается признак выполнения стандартной (системной) обработки события. Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет. Значение по умолчанию: Истина.
Примеры использования обработчика ПриКомпоновкеРезультата

Пример№1 Передача Внешних Наборов Данных в СКД .

Для перерадчи внешних наборов данных в СКД используется метод Инициализировать процессора копмоновки :

Пример №2 Передача параметров данных

Для передачи параметры данных используется метод УстановитьЗаначениеПараметра . В следующем примере , нужно передать в СКД документ – основание выбранного документа- регистратора в установленных параметрах. Следовательно, сначала находим регистратор, а затем передаем основание:

Манипулирование объектами базы данных 1С

В модели разработки прикладных решений 1С:Предприятия для ряда сущностей предметной области используется объектный подход манипулирования данными.

Эти сущности описываются в конфигурации объектами метаданных:

    ; ;
  • ПланВидовХарактеристик;
  • ПланСчетов;
  • ПланВидовРасчета.

С точки зрения модели данных 1С:Предприятия, в базе данных для этих сущностей хранятся объекты.

Рассмотрим состав типов, используемых для манипулирования этими сущностями в конфигурации на примере справочника ( для других перечисленных объектов метаданных имеется аналогичный состав типов ).

Справочник хранится в таблице. Запись (строка) таблицы определяет объект базы данных – элемент справочника. Но объект базы данных включает не только запись в основной таблице справочника, но и все записи всех табличных частей справочника, относящиеся к данному объекту. Таким образом, объект базы данных включает в себя:

  1. запись основной таблицы;
  2. записи табличных частей.

Объект базы данных 1С

Объектные таблицы — это справочники, документы, планы видов характеристик и т.д. (все, что имеет ссылку) — характеризуются тем, что каждая запись имеет внутренний уникальный идентификатор (GUID), которая генерируется автоматически при записи объекта в базу. Поэтому, например, если создать элемент справочника, удалить его, а потом создать элемент с точно такими же значениями всех абсолютно реквизитов, ссылка все равно будет другая, так как с точки зрения системы это уже другой объект (несмотря на то, что для пользователя визуально все тоже самое, те же значения всех реквизитов).

Необъектные таблицы — предназначены для хранения сущностей, не имеющих объектной природы (например, табличные части справочников, регистры сведений). Уникальность их записей определяется набором измерений и никакого дополнительного уникального идентификатора не существует. Поэтому, если вы удалите запись, а потом добавите точно такую же, с точки зрения логики программы это будет одно и тоже.

Тип СправочникиМенеджер

Тип СправочникиМенеджер предназначен в основном для доступа к менеджерам конкретных справочников. Кроме того, он имеет метод ТипВсеСсылки (), который позволяет получить значение ОписаниеТипов , содержащее типы ссылок всех справочников конфигурации. Например, с помощью данного значения (используя метод СодержитТип ()) можно проверить, является ли тип некоторого значениям типом ссылки какого-либо справочника.

Тип СправочникМенеджер

Тип СправочникМенеджер предоставляет доступ к общим действиям, относящимся к конкретному справочнику . С помощью его методов выполняются действия, относящиеся к справочнику, а не к его конкретным объектам, например:

  • создать новый объект справочника;
  • найти объект справочника по коду, и т.д.

Данный менеджер является своего рода «точкой входа» в конкретный справочник в объектной модели встроенного языка.

Объекты типа СправочникиМенеджер и СправочникМенеджер имеются в системе в единственном экземпляре.

Тип СправочникСсылка

Объект базы данных 1С

Справочник хранится в таблице. В таблице справочника присутствует поле Ссылка, которое хранит значения, однозначно идентифицирующие объекты (элементы справочника) в базе данных 1С:Предприятия. Если в какой-либо другой таблице (табличной части) нужно сослаться на некоторый объект базы данных, то в поле этой таблицы будет храниться именно значение ссылки.

Значение типа СправочникСсылка – хранит ссылку, идентифицирующую объект в базе данных 1С.

Фактически значение СправочникСсылка хранит только внутренний идентификатор, хранящийся в поле Ссылка таблицы справочника. Это значение:

  • хранится в полях других таблиц базы данных,
  • выбирается в поле ввода,
  • указывается в параметрах запроса при поиске по ссылке и т.д.

Важно, что значение типа СправочникСсылка можно сравнивать с другим значением типа СправочникСсылка и они буду всегда равны, если это ссылка на один и тот же объект в базе данных (независимо от способа получения и от того откуда получено значение).

Тип СправочникОбъект

Значение типа СправочникОбъект используется (в основном):

  • для создания нового объекта,
  • изменения существующего объекта,
  • удаления объекта,
  • для отображения и редактирования всех данных элемента справочника в форме элемента,
  • при редактировании строки списка справочника ( при отображении строк списка СправочникОбъект не используется ).

Для одного и того же элемента справочника можно получить несколько объектов типа СправочникОбъект:

  • При сравнении этих значений они будут равны, только если это один и тот же объект встроенного языка.
  • Два объекта встроенного языка, полученные для одного элемента справочника, не будут равны, даже если в них считан один и тот же объект базы данных и совпадают все данные объекта.

СправочникОбъект оптимизирует запись изменений в базу данных, например:

  1. если не менялись реквизиты самого объекта, то будет записываться только минимальная информация об изменении;
  2. если не менялись строки табличной части, то табличная часть записываться не будет;
  3. если менялись только отдельные строки или добавлялись строки, то будут записываться только измененные и добавленные строки;
  4. если строки удалялись или изменялся порядок строк, то будут записываться все строки табличной части.

Т.о. для манипулирования справочником во встроенном языке существуют два основных типа СправочникСсылка.ХХХХ и СправочникОбъект.ХХХХ , где ХХХХ — имя справочника в метаданных.

Важно, что имеются отдельные типы для каждого справочника, они появляются в системе при создании справочника в метаданных. Таким образом, типы ссылок двух разных справочников не будут совпадать между собой.

Отличие типов СправочникСсылка и СправочникОбъект:
  • значение типа СправочникСсылка хранит ссылку, идентифицирующую объект в базе данных;
  • значение типа СправочникОбъект позволяет считывать и записывать данные объекта.

И СправочникСсылка, и СправочникОбъект предоставляют доступ через свойства к данным объекта — значениям полей таблицы. Однако это происходит совершенно по-разному, так как назначение и использование этих типов принципиально отличается:

  • Значение СправочникОбъект хранит свойства непосредственно в объекте встроенного языка. Они заполняются при считывании существующего объекта значениями из базы данных, а для нового объекта инициализируются значениями по умолчанию.
  • Значение СправочникСсылка при обращении к свойствам осуществляет считывание информации из базы данных. Однако чтобы считывание происходило не при каждом обращении – данные объектов кэшируются системой.

Если обращаться через ссылки к свойствам одного и того же объекта базы данных, то считывание данных будет происходить только при первом обращении, а так же после того как система выгрузит этот объект из кэша.

Данные объекта удерживаются в кэше около 20 минут , но после интервала в 20 секунд при очередном обращении будет выполняться проверка того, что объект в базе данных не менялся, и, при необходимости, выполняется обновление данных в кэше. Если объект записывается в данной сессии, то он сразу обновляется в кэше. Также имеются ограничения на количество объектов хранимых в кэше. Следует заметить, что в рамках транзакции система использует отдельный кэш, поэтому обращение к данным объекта через ссылки в транзакциях гарантированно выдает актуальные данные.

Для объектов обеспечивается оптимистическая блокировка : объект не может быть записан, если он был изменен в базе данных после считывания.

Этот механизм обеспечивает логическую целостность изменения объектов. Каждый, кто меняет объект, может быть уверен, что его изменения не «затрут» изменений сделанных другими пользователями (сессиями) или другими объектами в этой же сессии. Такая блокировка не препятствует изменению объекта другими сессиями или этой сессией. Однако если с момента считывания объекта и до попытки его записи объект был изменен в базе данных, то запись не будет выполнена.

Механизм пессимистической блокировки запрещает изменения другими сессиями или этой сессией, до снятия блокировки этим объектом встроенного языка. Данный механизм необходимо включать в явном виде методом Заблокировать (). В основном он предназначен для блокировки объектов, редактируемых в форме. Расширение формы элемента справочника автоматически включает блокировку, чтобы пользователь был уверен что, начав редактировать объект, он сможет его записать.

Тип СправочникВыборка

Тип СправочникВыборка предназначен для динамического обхода элементов справочника. Механизм выборок для объектных таблиц не имеет существенных отличий от выборок других таблиц. Можно заметить, что считанные в выборке элементы могут быть получены в качестве значений типа СправочникОбъект. При этом они не будут повторно считываться из базы данных.

ВАЖНО! Выборка всегда считывает данные объектов целиком (все поля и все табличные части).

Тип СправочникСписок

Тип СправочникСписок предназначен для динамического просмотра данных справочника в элементе управления ТабличноеПоле . У него может быть настроен состав считываемых полей (колонок), отбор и сортировка. Список осуществляет считывание данных порциями в процессе навигации пользователем в табличном поле.

Кроме указанных типов значений справочник определяет несколько расширений элементов управления и форм, предназначенных для интерактивного ввода и просмотра данных справочника. Расширения не являются типами данных, а добавляют специфические свойства, методы и события к соответствующим объектам. Кроме того, расширения определяют некоторое специфическое поведение форм и элементов управления при конфигурировании и работе пользователя с системой.

Рисунок отсюда , там же можно почитать подробнее.

Взаимосвязь объектов 1С

На схеме показаны не все возможные объекты и взаимосвязи. Например, метод Скопировать () существует не только у объекта СправочникСсылка, но и у самого объекта СправочникОбъект. Кроме того, у объекта СправочникМенеджер есть методы НайтиПоНаименованию () и НайтиПоРеквизиту (), которые действуют аналогично методу НайтиПоКоду и возвращают ссылку на найденный элемент или пустую ссылку, если элемент не найден. Также на схемах не показаны специфические объекты и объекты типа «Список».

Взаимосвязь регистров в 1С

Свойства и методы прикладных объектов

Менеджер прикладных объектов данного типа

  • СправочникиМенеджер
  • ДокументыМенеджер
  • КонстантыМенеджер
  • РегистрыНакопленияМенеджер
  • ОтчетыМенеджер
  • ОбработкиМенеджер

Объекты данного вида обеспечивают доступ к менеджерам конкретного прикладного объекта.

Обычно доступ к таким объектам производится через свойства глобального контекста, например, Справочники.Сотрудники, Документы.Счет, РегистрыСведений.КурсыВалют и т.д.

Эти объекты являются коллекциями значений и позволяют перебрать свои элементы с помощью цикла «Для Каждого».

Менеджер прикладного объекта

  • СправочникМенеджер
  • ДокументМенеджер
  • КонстантаМенеджер
  • РегистрНакопленияМенеджер
  • ОтчетМенеджер
  • ОбработкаМенеджер

Данный объект является «центральным» в объектной модели, из которого можно получить остальные объекты, например, ссылки, выборки, объекты для изменения, наборы записей и т.д. (см. ниже параграф «Взаимосвязь объектов»).

Объект этого вида обеспечивает доступ к операциям над прикладным объектом как множеством элементов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новые записи, обращаться к формам и макетам прикладного объекта.

Типичные свойства (для справочников и планов):

  • <предопределенный элемент>
  • Выбрать()
  • НайтиПоКоду()
  • НайтиПоРеквизиту()
  • ПустаяСсылка()
  • СоздатьЭлемент()
  • СоздатьНаборЗаписей()
  • ПолучитьМакет()
  • ПолучитьФорму()
  • СправочникСсылка
  • ДокументСсылка
  • ПланСчетовСсылка
  • ПланВидовРасчетаСсылка

Данный объект однозначно идентифицирует объект базы данных (например, элемент справочника, документ) и позволяет обращаться к нему в режиме «только чтение». Через свойства и методы этого объекта можно прочитать реквизиты элемента, обратиться к его табличным частям.

Ссылки хранятся в реквизитах, ссылающихся на элементы данного прикладного объекта, например, в реквизите «Сотрудник» документа «ПриемНаРаботу» хранится ссылка на конкретный элемент справочника «Сотрудники».

Заметьте, что у записей регистров нет ссылок.

Для изменения объекта базы данных (элемента справочника, документа) нужно получить другой объект с помощью метода ПолучитьОбъект().

  • <реквизит>
  • <табличная часть>
  • ПометкаУдаления
  • Дата
  • Предопределенный
  • Ссылка
  • Пустая()
  • ПолучитьОбъект()
  • ПолучитьФорму()
  • Метаданные()
  • Скопировать()
  • СправочникВыборка
  • ДокументВыборка
  • ЖурналДокументовВыборка
  • РегистрНакопленияВыборка

Этот объект предоставляет возможность обхода (перебора) объектов базы данных. Например, можно перебрать элементы справочника или перебрать документы, входящие в конкретный журнал.

Обратите внимание, что данный объект не является коллекцией значений и, следовательно, нельзя использовать цикл «Для Каждого» для перебора элементов.

Свойства аналогичны свойствам объекта типа «Ссылка».

  • Следующий()
  • ПолучитьОбъект()
  • СправочникОбъект
  • ДокументОбъект
  • ПланСчетовОбъект
  • ОтчетОбъект
  • ОбработкаОбъект

Предоставляет доступ к элементу с возможностью записи изменений в базу данных. Этот объект содержит методы, влияющие на элемент в базе данных, например, методы Записать и Удалить.

Для отчетов и обработок через этот объект обычно осуществляется формирование отчета или выполнение обработки.

Если в модуле прикладного объекта (не путать с модулем формы) есть экспортируемые переменные модуля или процедуры/функции, то они дополняют набор свойств и методов именно этого программного объекта.

Для регистров подобного объекта не существует, а изменение данных всегда производится через набор записей (см. ниже).

Свойства аналогичны свойствам объекта типа «Ссылка».

  • Записать()
  • Удалить()
  • Заблокировать()
  • Разблокировать()
  • Заблокирован()
  • Скопировать()
  • ПолучитьФорму()
  • ПолучитьМакет()
  • Метаданные()
  • СправочникСписок
  • ДокументСписок
  • ЖурналДокументовСписок
  • ПланСчетовСписок
  • РегистрНакопленияСписок
  • КритерийОтбораСписок

Этот программный объект предназначен для управления списком элементов в табличном поле. Позволяет управлять колонками, отбором и сортировкой в списке.

Этот объект нельзя создать программно, он создается системой автоматически при размещении на форме табличного поля. Конечно, программно можно создать табличное поле в экранной форме и тогда будет создан объект данного типа.

  • Колонки
  • Отбор
  • Порядок
  • Обновить()

Набор записей

  • РегистрСведенийНаборЗаписей
  • РегистрНакопленияНаборЗаписей
  • РегистрБухгалтерииНаборЗаписей
  • РегистрРасчетаНаборЗаписей
  • ПоследовательностьНаборЗаписей

Набор записей позволяет оперировать сразу несколькими записями прикладного объекта (обычно регистра). Набор записей можно целиком прочитать из базы данных, добавить в него записи или изменить их, а зетем записать в базу данных (в одной транзакции).

У документов есть свойство-коллекция «Движения», которое предоставляет доступ к наборам записей по каждому регистру, отмеченному на закладке «Движения». Через это свойство обычно производится формирование движений документа при его проведении.

  • Отбор
  • ЭтотОбъект
  • Добавить()
  • Удалить()
  • Очистить()
  • Записать()
  • Прочитать()
  • Количество()
  • Выгрузить()
  • Загрузить()
  • РегистрСведенийЗапись
  • РегистрНакопленияЗапись
  • РегистрБухгалтерииЗапись
  • РегистрРасчетаЗапись

Обеспечивает доступ к одной записи из набора, для того чтобы установить ее измерения, ресурсы и т.д. Этот объект возвращается методами других объектов, например, методом Добавить у объекта типа РегистрНакопленияНаборЗаписей.

Объект типа «Запись» не является постоянным идентификатором конкретной записи регистра, наподобие объекта «Ссылка» для справочников и документов. У записей регистра сведений вообще нет неизменяемого во времени идентификатора и каждая запись регистра однозначно определяется значениями своих измерений (включая системные, например, Период, Регистратор, НомерСтроки)

Методы, свойства

Ну например нужно получить "текущую строку",это значит что обращаться нужно к элементам, а не реквизитам формы. Дальше я смотрю на тип элемента, допустим таблица формы — в СП смотришь свойства этого типа. Ну и находишь текущие данные

Я всегда от алгоритма плясал, заранее не закладывался на то, что "умеет" тот или иной объект.
Ну то есть, придумал, что мне нужно, например, какое-то хранилище настроек и из него в цикле элементы дергать. Ок, написал "настройки = новый Массив", тут же по "Массиву" — в синтакс-помощник и смотреть, что он умеет. Так, массив не подходит — надо что-то более развернутое — тут же рядом таблица значений есть, можно на ее умения посмотреть.

Иногда, конечно, оказывалось, что то, что я задумал вообще никак не решить (например, содержимое динамического списка обещают только в самой последней платформе). Но так еще интереснее — если в лоб не решается, как правило, всегда можно обходной путь придумать

Так, массив не подходит — надо что-то более развернутое — тут же рядом таблица значений есть

Это где они рядом? в твоем понимании?

(50) смотри, элементарное решение, до которого ты не допёр:

В = А; // Запоминаем первоначальное значение А
А = Б; // Присваиваем переменной А значение Б
Б = В; // Присваиваем переменной Б первоначальное значение А

Разница между свойством и методом

Пока меня не было, вопрос отредактировали. Почему Task.Result — свойство, а не метод? Что следовало бы поставить и почему? У него есть только геттер и оно не кешируется (наверно).

С точки зрения рантайма разницы, конечно, нет. Свойство есть не более чем пара из двух функций — геттера и сеттера, причём эти функции, формально говоря, вовсе не обязаны читать/устанавливать какое-либо поле объекта.

Разница есть в семантике. Когда мы говорим об объекте, мы подразумеваем абстракцию чего-нибудь из окружающего мира. Это звучит довольно тривиально, но из этого следуют нетривиальные выводы.

У объекта есть данные, которыми он обладает, и поведение. То, что является данными, моделируется свойствами. То, что является поведением, моделируется методами. При этом совершенно не важно, представлены ли данные объекта полем, несколькими полями, или вообще вычисляются на лету — это подробности имплементации, которые никому «снаружи» не интересны. Это является одной из причин того, почему «наружу» нужно выставлять свойства, а не поля.

Допустим, у вас есть собака. У неё есть цвет шерсти, кличка, и она умеет выполнять команды. Теперь давайте рассмотрим разницу.

Кличка — это есть свойство собаки: это нечто, что есть объект (строка), присущий самой собаке. Её можно установить (например, новый хозяин собаки может поменять кличку), и прочитать. Соответственно, её нужно моделировать свойством:

Цвет шерсти собаки — тоже её свойство. Но его невозможно «установить» снаружи (отвлечёмся от возможности перекрасить собаку: цвет краски и цвет шерсти — не одно и то же). Поэтому его нужно моделировать свойством, которое доступно только на чтение:

(или для вышедшего пару дней назад C# 6 можно просто

поскольку значение можно установить в конструкторе).

Теперь, выполнение команды. Это не свойство самой по себе собаки, это ей поведение. Таким образом, правильно будет моделировать выполнение команды так:

Заметьте, что формальные признаки («я только получаю значение поля!») нерелевантны. Например, если у вас команда, которую в данный момент выполняет собака, записывается во внутреннее поле, и вы хотите иметь возможность узнать, какую же команду собака выполняет в данный момент, то неправильно будет оформлять команду так:

потому, что команда — это не неотъемлемое свойство самой собаки, а лишь её поведение. Правильно будет, например, так:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *