Документобъект 1с что это
Довольно часто встречаются задачи, когда нужно организовать программное заполнение формы какого-то объекта. Скажем, у нас есть форма документа, на форме есть реквизиты, и нам нужно сделать команду, которая заполнит эти реквизиты. Данные для заполнения предполагается получать запросом.
Если конфигурация типовая, то, наверное, самый простой способ решения такой задачи – создать внешнюю обработку вида "Заполнение объекта".
Заполнение формы объекта с помощью внешней обработки
Строка с соответствующим параметром в модуле обработки:
Подключив обработку и указав, для какого документа она назначена, мы получим в форме документа команду. Тип команды задаётся при создании внешней обработки, и от него зависит, где и как будет выполняться обработчик команды. Для наших целей может подойти один из следующих типов команд:
- ВызовСерверногоМетода – обработчик команды располагается в модуле обработки;
- ВызовКлиентскогоМетода – обработчик команды располагается в модуле формы обработки;
- ЗаполнениеФормы – обработчик команды располагается в модуле обработки и позволяет работать с данными формы. Также позволяет вызвать серверную процедуру из модуля формы объекта. При этом можно заполнить форму не записывая объект.
Возможность заполнить форму не записывая объект – это то, что нужно. Ведь пользователь скорее всего ожидает, что по нажатию кнопки форма заполнится, а записываться будет позднее, после проверки результата заполнения. Поэтому выбираем тип команды – ЗаполнениеФормы.
В конечном итоге код в модуле обработки будет выглядеть примерно так:
В общем счёте задача решена. Однако, у такого способа есть небольшой недостаток – команда на форме размещается в определённом месте, а не там, где мы хотим её разместить. К примеру, на форме уже есть группа команд, включающая в себя команды заполнения, и мы хотели бы видеть новую команду в этой группе, но при подключении обработки команда на форме будет расположена отдельно от группы.
В связи с этим можно реализовать другой способ: добавить команду непосредственно в форму объекта – либо в основной конфигурации, либо в расширении – а обработчик команды организовать в модуле формы.
Заполнение формы объекта посредством обработчика команды в модуле формы
Итак, размещаем команду на форме объекта в том месте, которое нам нравится. В модуле формы добавляем клиентскую процедуру обработчика команды, из которой будем вызывать серверную процедуру. Серверную процедуру тоже создадим, она нам понадобится потому, что по условию задачи данные для заполнения получаются запросом.
Над серверной процедурой нужно подумать. В ней у нас будет объект формы с типом "ДанныеФормыСтуктура". Что-либо менять или заполнять в этом объекте не получится, возникнет ошибка "Объект недоступен для изменения".
Можно получить объект документа Объект . Ссылка . ПолучитьОбъект () , и заполнить его данными. Но тогда, чтобы увидеть данные в открытой форме, объект придётся записать, а это не очень хорошо.
Будет лучше, если данные добавятся без записи, и мы можем это сделать с помощью метода РеквизитФормыВЗначение . Этот метод преобразует реквизит формы в объект прикладного типа, и вот этот объект прикладного типа мы можем заполнить, а затем, уже заполненный, преобразовать обратно с помощью метода ЗначениеВРеквизитФормы . Выглядеть это будет примерно так:
Если основной реквизит формы имеет тип значения ДокументОбъект., то для данной формы действует расширение формы документа. Посредством него решаются вопросы специфичной функциональности формы документа. Расширение помогает обрабатывать различные команды пользователя, выполнять предварительные проверки и другие сервисные действия. Кроме того, действие расширения формы документа распространяется и на механизмы записи и проведения документа. При этом неважно, была вызвана запись документа интерактивными действиями пользователя в форме документа или средствами языка Записать(). Рассмотрим ряд примеров работы этих механизмов.
Установка даты документа при открытии формы
Если дата документа изначально не установлена, то при открытии формы нового документа происходит установка дате документа значения текущей даты сеанса.
Причем время документа будет установлено в зависимости от следующих настроек. Если свойство АвтоВремя расширения формы документа имеет значение НеИспользовать то время документа будет установлено по значению текущей даты сеанса. В остальных случаях дате документа присваивается время начала дня (00:00:00).
Установка даты нового документа при записи нового документа в форме
При записи документа в режиме оперативного проведения значение даты документа устанавливается согласно выданной оперативной отметке времени. Тут настройки свойств расширения формы не играют роли.
Но если время документа "нулевое" (0:00:00), то при неоперативном проведении документа оно будет изменено согласно настройкам свойства АвтоВремя. Исключение - когда АвтоВремя имеет значение НеИспользовать тогда время документа не меняется.
Запрет интерактивной записи проведенного документа без проведения (перепроведения)
Запрет интерактивной записи проведенного документа без проведения (перепроведения) используется, чтобы не создавалась, например, такая ситуация: сначала документ реализации был заполнен и проведен, при проведении сформированы движения по регистру с указанием количества, соответствующего количеству в документе. После этого пользователь исправил данные документа и сохранил без проведения.
В результате таких манипуляций в документе будут записаны новые данные, а в движениях по регистру останутся данные от прошлого проведения документа, то есть они никак не будут соответствовать текущим данным документа.
Предотвращение подобных ситуаций достигается за счет установки свойства расширения формы документа ПриЗаписиПерепроводить значение Истина. Тогда отказ в обработке проведения приведет к откату транзации - документ не будет и перезаписан.
Установка режима проведения
Если интерактивное проведение разрешено, сам выбор варианта проведения должен быть обусловлен логикой применения механизма установки режима проведения из формы. То есть в некоторых ситуациях система должна выбирать режим жестко, в некоторых право выбора режима можно предоставить пользователю. Для этого разработчик обладает рядом возможностей, предоставляемых системой посредством разграничения прав и расширениями формы документа.
При записи документа из формы расширение формы документа выполняет установку режима проведения документа.
Для реализации данного функционала система использует вариант (Автоматически, Оперативный, Неоперативный, Запрашивать) указанный в качестве значения свойства ИспользоватьРежимПроведения расширения формы документа.
Вариант "Автоматически"
Вариант Автоматически устанавливается посредством выбора значения Автоматически у свойства ИспользоватьРежимПроведения расширения формы документа. Платформа стандартно устанавливает это значение для новой формы.
При испльзовании данного варианта, в зависимости от ситуации и настроек, происходит первичный подбор режима проведения из вариантов Оперативный или Неоперативный.
Для проводимого документа происходит проверка положения даты документа относительно текущей даты сеанса.
Если дата документа (без учета времени) равна текущей дате сеанса, то система автоматически выбирает вариант проведения Оперативный.
Если дата документа (без учета времени) больше текущей даты сеанса, пользователю выдается предупреждение: "Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Если дата документа (без учета времени) меньше текущей даты сеанса, выбирается вариант проведения Неоперативный. При этом если у пользователя нет права на неоперативное проведение, выдается предупреждение: "Недостаточно прав для неоперативного проведения", и проведение документа отменяется.
Вариант "Оперативный"
Вариант Оперативный устанавливается посредством выбора значения Оперативный у свойства ИспользоватьРежимПроведения расширения формы документа.
В данном варианте, если дата документа (без учета времени) меньше текущей даты сеанса, выдается предупреждение: "Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Если дата документа (без учета времени) равна текущей дате сеанса, производится запись документа с оперативным проведением.
Если дата документа (без учета времени) больше текущей даты сеанса, выдается предупреждение: "Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Вариант "Неоперативный"
Вариант Неоперативный устанавливается посредством выбора значения Неоперативный у свойства ИспользоватьРежимПроведения расширения формы документа.
При использовании данного варианта проведение документа из формы всегда производится в неоперативном режиме, независимо от положения даты документа по отношению к текущей дате сеанса.
При этом, если у пользователя нет права на неоперативное проведение, выдается предупреждение: "Недостаточно прав для неоперативного проведения", и проведение документа отменяется.
Вариант "Запрашивать"
Вариант Запрашивать устанавливается посредством выбора значения Запрашивать у свойства ИспользоватьРежимПроведения расширения формы документа.
Данный вариант реализован в системе для того, чтобы помочь пользователю принять решение о выборе режима проведения для каждой конкретной ситуации.
В данном варианте пользователь перед началом проведения должен будет выбрать режим проведения документа в специальном системном окне.
Поведение системы при этом варианте определяется прежде всего положением даты документа (без времени) по отношению к текущей дате сеанса.
При равенстве этих дат далее проверяется, имеет ли пользователь право проводить документ неоперативно. Если пользователь такого права не имеет, система проводит данный документ в оперативном режиме. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора режима проведения система проводит документ соответственно в оперативном или неоперативном режиме.
Если дата документа (без учета времени) меньше текущей даты сеанса, поведение системы определяется опять же наличием права на неоперативное проведение у пользователя. Если пользователь таким правом не обладает, выдается предупреждение: "Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, выдается предупреждение: "Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Если дата документа (без учета времени) больше текущей даты сеанса, система не позволяет проводить документ оперативно. Поэтому если права неоперативного проведения нет, сразу выдается предупреждение: "Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!", и проведение документа отменяется.
Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, будет выдано предупреждение: "Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!", и проведение документа отменится.
Прочие функции
Кроме выбора режима проведения и установки даты документа, расширение формы документа реализует также следующий функционал:
Ниже перечислены виды программных объектов "Документы", их краткое описание, свойства и методы.
ДокументыМенеджер - это менеджер прикладных объектов данного типа. Объекты данного вида обеспечивают доступ к менеджерам конкретного прикладного объекта (т.е. дает доступ к любому виду документов).
- СправочникиМенеджер
- ДокументыМенеджер
- КонстантыМенеджер
- РегистрыНакопленияМенеджер
- ОтчетыМенеджер
- ОбработкиМенеджер
Обычно доступ к таким объектам производится через свойства глобального контекста, например, Документы.Счет , Справочники.Сотрудники , РегистрыСведений.КурсыВалют и т.д.
Свойства соответствуют именам прикладных объектов и являются объектами типа "Менеджер прикладного объекта".
Эти объекты являются коллекциями значений и позволяют перебрать свои элементы с помощью цикла "Для Каждого".
ДокументМенеджер - это менеджер прикладного объекта; объект обеспечивает доступ к операциям над прикладным объектом как множеством элементов. Через методы этого объекта можно:
- осуществлять поиск,
- получать выборку,
- создавать новые записи,
- обращаться к формам и макетам прикладного объекта.
Является "центральным" в объектной модели 1С (из него можно получить остальные объекты, например, ссылки, выборки, объекты для изменения, наборы записей и т.д.).
- СправочникМенеджер
- ДокументМенеджер
- КонстантаМенеджер
- РегистрНакопленияМенеджер
- ОтчетМенеджер
- ОбработкаМенеджер
Объект ДокументМенеджер предназначен для управления документом:
- программное создание новых документов (метод СоздатьДокумент ());
- поиск существующих документов (методы НайтиПоНомеру (), НайтиПоРеквизиту ());
- получение выборок (методы Выбрать (), ПолучитьДанныеВыбора ());
- получение ссылок (методы ПолучитьСсылку (), ПустаяСсылка ());
- получение макетов (метод ПолучитьМакет ());
- получение форм (методы ПолучитьФорму (), ПолучитьФормуВыбора (), ПолучитьФормуНовогоДокумента (), ПолучитьФормуСписка ()).
ДокументСсылка - этот объект однозначно идентифицирует документ как объект базы данных и позволяет обращаться к нему в режиме "только чтение". Используется для указания ссылки на документ из реквизитов других объектов и переменных. Через свойства и методы этого объекта можно прочитать реквизиты элемента, обратиться к его табличным частям.
- СправочникСсылка
- ДокументСсылка
- ПланСчетовСсылка
- ПланВидовРасчетаСсылка
Ссылки хранятся в реквизитах, ссылающихся на элементы данного прикладного объекта, например, в реквизите "Сотрудник" документа "ПриемНаРаботу" хранится ссылка на конкретный элемент справочника "Сотрудники".
Типичные свойства объектов вида "Ссылка":
Например, для изменения объекта базы данных (элемента справочника, документа) нужно получить другой объект с помощью метода ПолучитьОбъект ().
ДокументВыборка - объект предоставляет возможность обхода (перебора) объектов базы данных (выполняет динамический перебор документов).
Например, можно перебрать перебрать документы, входящие в конкретный журнал.
ВАЖНО ! Данный объект не является коллекцией значений и, следовательно, нельзя использовать цикл "Для Каждого" для перебора элементов.
- СправочникВыборка;
- ДокументВыборка;
- ЖурналДокументовВыборка;
- РегистрНакопленияВыборка;
Свойства аналогичны свойствам объекта типа "Ссылка".
ДокументОбъект - предоставляет доступ к объекту базы данных с возможностью записи изменений. Используется для чтения, добавления, изменения, удаления документов.
- СправочникОбъект
- ДокументОбъект
- ПланСчетовОбъект
- ОтчетОбъект
- ОбработкаОбъект
Для отчетов и обработок через этот объект обычно осуществляется формирование отчета или выполнение обработки.
Для регистров подобного объекта не существует, а изменение данных всегда производится через набор записей (см. ниже).
Если в модуле прикладного объекта (не путать с модулем формы) есть экспортируемые переменные модуля или процедуры/функции, то они дополняют набор свойств и методов именно этого программного объекта.
ВАЖНО! У всех событий этого объекта назначены предопределенные процедуры-обработчики. Имена процедур соответствуют именам событий. Процедуры должны располагаться в модуле документа.
Методы ДокументОбъект:
блокировка и разблокировка | Заблокирован(), Заблокировать(), Разблокировать() |
модификация | Записать(), Заполнить(), Модифицировать(), Скопировать(), Удалить(), УстановитьВремя(), УстановитьНовыйНомер(), УстановитьПометкуУдаления(), УстановитьСсылкуНового() |
чтение | Метаданные(), Модифицированность(), МоментВремени(), Прочитать(), ЭтоНовый(), ПроверитьЗаполнение() |
получение ссылок | ПолучитьСсылкуНового() |
получение форм | ПолучитьФорму() |
получение макетов | ПолучитьМакет() |
ДокументСписок - объект предназначен для управления списком элементов в табличном поле (т.е. для решения интерфейсных задач ). Позволяет управлять колонками, отбором и сортировкой в списке.
Этот объект нельзя создать программно , он создается системой автоматически при размещении на форме табличного поля. Однако, программно можно создать табличное поле в экранной форме и тогда будет создан объект данного типа.
С документами в пользовательском режиме можно работать не только интерактивно – так, как мы это делали до сих пор, но и программно. Рассмотрим объекты 1С:Предприятие, которые используются для программной работы с документами.
ДокументыМенеджер – этот объект доступен через свойство глобального контекста Документы. Он позволяет управлять документами, давая доступ к объекту ДокументМенеджер для конкретного документа
ДокументМенеджер – позволяет управлять документом, в частности, создавать новые документы, производить поиск документов, помечать документы на удаление, получать выборки.
ДокументСсылка – идентификатор документа. Используется обычно в реквизитах других объектов для указания ссылки на определенный документ.
ДокументОбъект – позволяет работать с отдельным документом – читать и редактировать его данные.
ДокументВыборка – предназначен для работы с выборкой документов, произведенной по определенным условиям.
ДокументСписок – позволяет управлять списком документов, расположенных в табличном поле .
Для доступа к метаданным документа можно воспользоваться свойством Документы свойства глобального контекста Метаданные.
Создадим новую обработку, назовем ее РаботаСДокументами. Включим в подсистему Администрирование.
Добавим в обработку команду с именем ВывестиСписокВидовДокументов, зададим обработчик для этой команды, выведем ее на форму обработки.
Сейчас мы воспользуемся свойством глобального контекста Метаданные для того, чтобы вывести пользователю список синонимов существующих в конфигурации документов. Для подобных действий нам понадобится серверная процедура, которую мы вызовем из клиентской процедуры обработчика ранее созданной команды. Выполнить запланированное можно с помощью следующего кода:
Результат выполнения показан на рис. 7.11.
С помощью коллекции Метаданные (тип ОбъектМетаданныхКонфигурация) мы можем получить доступ к структуре конфигурации, в частности, к коллекции Документы (тип КоллекцияОбъектовМетаданных), состоящей из объектов типа ОбъектМетаданных: Документ. Обратившись к документу, как к объекту метаданных, мы можем узнать имя, синоним и другие метаданные .
Теперь рассмотрим следующую задачу. Нужно программно создать новый документ заданного вида, заполнить его некоторыми данными, сохранить в базе данных, приняв решение о том, проводить его или не проводить на основе анализа флага ПроводитьДокумент, который имеется на форме обработки, после чего открыть его форму для проверки пользователем.
Здесь нам понадобится начинать "поиски" нужного объекта от объекта ДокументыМенеджер. С его помощью мы можем получить объект ДокументМенеджер для нужного вида документов, и уже с помощью этого объекта мы сможем создать новый документ.
Добавим в нашу обработку новую команду – СоздатьДокументПоступлениеМатериалов. Так же добавим новый реквизит – ПроводитьДокумент, поместим его на форму, рис. 7.12.
Мы зададим все данные, в том числе – и тип документа для создания – в коде.
Решить поставленную задачу можно с помощью следующего кода:
Проведение документа , либо его запись , либо – отмена проведения – производятся с помощью метода документа Записать(). Этот метод принимает параметр , который и отвечает за то, что будет произведено при записи документа. В начале клиентской процедуры СоздатьДокументПоступлениеМатериалов мы анализируем флаг ПроводитьДокумент, предварительно установив переменную РежимЗаписи в значение РежимЗаписиДокумента.Запись. Если флаг установлен – то есть мы хотим не только записать, но и провести документ, значение переменной меняется на РежимЗаписиДокумента.Проведение.
При вызове функции СоздатьДокумент(), мы планируем воспользоваться возвращенной ей ссылкой на созданный документ для открытия его формы с помощью метода ОткрытьЗначение().
Функция СоздатьДокумент принимает один параметр – РежимЗаписи, который мы используем после создания документа для задания режима его записи.
В переменной Документ, после работы метода СоздатьДокумент(), мы имеем объект типа ДокументОбъект, новый чистый документ, с которым можем работать. Мы заполняем дату с помощью функции ТекущаяДата(). Заполняя реквизиты мы пользуемся различными методами поиска данных в справочнике. Метод НайтиПоКоду() позволяет найти элемент справочника по заданному коду, НайтиПоРеквизиту() ищет по значению заданного реквизита. Оба эти метода возвращают нам ссылку на элемент справочника.
В реквизит Комментарий мы записываем строку.
Следующим этапом работы с документом становится заполнение его табличной части. Мы выполняем заполнение построчно, добавляя в табличную часть строку – она представлена в коде переменной НоваяСтрокаТЧ с типом Строка табличной части. Когда строка добавлена, мы обращаемся к ее реквизитам, заполняя их данными.
После того, как документ сформирован, мы записываем его (или – и записываем и проводим – в зависимости от значения параметра РежимЗаписи) и возвращаем ссылку на него в точку вызова функции СоздатьДокумент.
Вот, как выглядит документ, созданный программно с помощью нашего кода, рис. 7.13.
Решим теперь следующую задачу. Нужно пометить на удаление все документы типа ПоступлениемМатериалов, которые созданы автоматически – их реквизит Комментарий содержит текст "Документ создан автоматически".
Добавим в форму обработки новую команду, назовем ее ПометитьНаУдаление. Поставленную задачу можно реализовать с помощью следующего кода:
Здесь мы, в серверной процедуре ПометитьДокументыНаУдаление(), получаем с помощью запроса список ссылок на документы, реквизит Комментарий которых равен нужному нам значению. После этого в цикле обхода выборки запроса переходим от ссылки на объект к объекту (тип ДокументОбъект) и устанавливаем у объектов пометки удаления.
Нашей следующей задачей будет вывод пользователю списка документов за заданный пользователем период. Добавим в форму обработки команду ВыводСпискаДокументовЗаПериод и два реквизита – ДатаНачала и ДатаОкончания – тип Дата, состав даты – Дата и время. Дата документа содержит сведения о дате и времени создания документа, поэтому для выбора периода, в который должны попасть искомые документы, нам понадобятся значения даты с датой и временем.
Решение задачи может выглядеть так:
Здесь мы пользуемся методом Выбрать с параметрами, устанавливающими дату начала и дату окончания для выборки документов. Полученную выборку перебираем в цикле и сообщаем пользователю о найденных документах, рис. 7.15.
Выводы
В данной лекции мы научились работать с консолью запросов, которую можно использовать для конструирования сложных запросов, создали процедуру проведения расходного документа, научились работать с объектом конфигурации Журнал документов , а так же – рассмотрели методы программной работы с документами.
Возьмем ДокументОбъект и ДокументСсылка. Будем, например, смотреть на флаг ОтражатьВБухгалтерскомУчете. Событие - ПередЗаписью.
Я завел две переменные ОбъектОтражатьВБухгалтерскомУчете и СсылкаОтражатьВБухгалтерскомУчете. И вычислил их значения, остановившись на точке останова в обработчике события.
Нарисовал себе табличку:
1. Документ уже проведен. В нем взведен флаг отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Истина.
СсылкаОтражатьВБухгалтерскомУчете - Истина.
2. Документ был проведен, в нем БЫЛ взведены флаг отразить в БУ. Сняли флаг БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Истина.
3. Документ был проведен, в нем не был взведен флаг отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.
4. Новый документ. Накинута галка отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Истина.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.
5. Новый документ. Нет галки отразить в БУ.
ОбъектОтражатьВБухгалтерскомУчете - Ложь.
СсылкаОтражатьВБухгалтерскомУчете - Ложь.
Вот сижу и смотрю на эту табличку. И не могу понять 2 и 4-й случаи. Был бы очень признателен за комментарий.
Вообще, хочу понять - новый документ заводится, или редактируется старый. И что-то из этих выкладок ничего не приходит на ум.
Очень интересное исследование, знать бы только смысл.
"Итак дети, все прочитали произведение великого пейсателя и готовы ответить мне, что же хотел сказать автор."
ЭтоНовый()
Возвращаемое значение:
Тип: Булево.
Истина - изменяется еще ни разу не записанный документ; Ложь - документ уже записан.
Описание:
Определяет, записан ли документ в базу данных.
Сервер, толстый клиент, внешнее соединение.
А мое исследование - оно совсем не имеет смысла?
Но почему-то же поведение таково.
(0) Чувак, реально не понимаешь что такое ссылка на объект и сам объект.
Что такое объектные блокировки? Ой, о чем это я.
Смотри, есть квартира (объект) и адрес в каталоге, который модно по телефону продиктовать (ссылка), есть разница?
То есть обращаясь к обьекту при вычислении ты каждый раз заставляешь считывать актуальное значение из базы
А ссылка на то она и ссылка тире в ней же нигде не уакзпно что должно соответствовать состоянию объекта в базе
Поэтому ссылку следует использовать для ССЫЛКИ на объект
А объект для получения актуальных зачений реквизитов объекта
(0) Молодец. Не обращай внимание на жесткую критику. Системный подход к изучению 1С. Пытливый ум даст свои плоды. Так держать!.
(9) Обращаясь к Объекту, ты считываешь поля объекта, такие, какие они там есть, такие, какие ты мог в него раньше присвоить.
Обращаясь к ссылке, ты всегда получишь то, что в базе, даже если реквизиты ссылки кешированы (обращался чуть раньше, менее 20 секунд назад) - 1С все равно запросит в базе поле _version и сравнит его со значением в кеше.
(8) Ладно, пусть квартира.
Второй случай:
Ссылка в каталоге: в квартире есть душ.
Объект: в квартире ванна. Т.е. после публикации объявления успели переделалать.
Это более-менее понятно.
Четвертый случай (новый объект):
Объект: в квартире душ. Вот он - можно потрогать.
Ссылка в каталоге: . Почему должна ложь-то стоять?
В четвертом случае по ссылке ложь.
(20) не помню, в Си уже были объекты?
докОбъект - это классический экземпляр класса. докСсылка -грубо говоря идентификатор в БД.
ПолучитьОбъект() -конструктор по идентификатору, при котором в переменные считываются данные с базы. Потом идет работа с уже считанными значениями. С докСсылка все не так "привычно". Фактически при обращении докСсылка.реквизит каждый раз идет считывание с БД.
Спасибо всем. Разобрался. У меня в четвертом случае некорректно было все.
У нового ссылка пустая. А от пустой ссылки я получил значение свойства. Ну, и получил ложь.
(18) прошу сделать поправку на мою неснеговитость-клюшечност и пояснить азы
Объект тире это копия записи базы в оперативной памяти слэш кеше вопрос
Потому как для меня-клюшечника объект это актуальный экземпляр записи.
(24) причем гуру говорят что при обращении к реквизиту ссылки тащатся все реквизиты, что некошерно. v8: обращение к реквизиту vs запрос
(0) Ссылка.Реквизит - обращение к ЗАПИСАННЫМ данных из ИБ
Объект.Реквизит - обращение к текущим данным и не факт записанны
Даже в семерке неявно существуют объекты и ссылки. СоздатьОбъект("Справочник.XXX") - гибрид объекта с менеджером. А вот .ТекущийЭлемент() - ссылка в чистом виде.
(32) Считывается весь объект из памяти, что естественно может повлиять на производительность. Работайте с запросами
(35) Выразился не правильно.
Считывается весь объект в память из базы данных, что естественно Может повлиять на производительность, если получать данные всего объекта не требует алгоритм. Работайте с запросами.
(0) у вас не Ссылка или Объект конфликт - а проведен/не проведен.
Пока док не был проведен - объект давал картину "я снял /поставил флаг", а ссылка - давала данные БД, которые еще не изменились.
После проведения - объект записался в БД, по ссылке снова стали актуальные данные.
(32)>>что при обращении к реквизиту ссылки тащатся все реквизиты,
- да, все ссылочные.
(20) ссылки 1С к ссылкам остальных языков отношения не имеют - там ссылка на область памяти (сам объект), тут - ссылка это уникальный индекс, по которому 1С ищет у себя что-то в таблицах.
(18) вот вроде все правильно написал, но из-за незнания ООП - путаешь объекты и Объекты.
С большой буквы - это, конечно же, в 1С ))
(21) если "объект" обновил свое альтер-эго в базе, то ссылка и объект возвратят одно и то же.
Если нет - то ссылка возвратит то, что в БД, а обращение к объекту (это "объект" 1С, не забываем! он вообще ничего общего не имеет с объектами ООП!) даст некое содержимое некоего кэша в 1С, куда она временно спихнула содержимое блока памяти (отвечающего за отображение на экране - если угодно, "скриншот" экрана в виде "объектов") и держит свой "объект".
- дважды неправильно. Считывается весь объект и ссылочные "продолжения" его реквизитов.
Отсюда и ранее распространенная ошибка SQL "превышено 256 таблиц".
Когда такое неявное "разъименование" тащило за собой чуть не всю базу.
И плюс один раз неправильно - в запросах 1С тоже такое возможно: неявное разъменование и дополнительные "явно не указанные" соединения "ссылочных" таблиц между собой.
(37)>>теперь пойди книгу почитай или к (8) на курсы
- они там сами не знают, как у них эта вся "система ниппель" работает ))
+ 42
SQL-ю указывают ссылку на другие таблицы ("дай мне весь объект вместе со значением реквизита "СправочникСсылка"!"), он и возвращает все ссылочные таблицы. А уже 1С отбирает из этого то, что "нужно" для 1С-запроса (значения полей, интерпретацию ссылок и т.д.), и отбрасывает "лишнее".
(22)>>Нет. Объект может:
1) Устареть.
- как "объет" может "устареть", не модифицируясь при этом в своих остальных "реинкарнациях"? Разве что только испортится в БД ))
(24)>>не помню, в Си уже были объекты?
- напоминаю: в С++ появились объекты. Но еще не ООП.
>>докОбъект - это классический экземпляр класса. докСсылка -грубо говоря идентификатор в БД.
- нет.
докОбъект "в Си" - это не класс, а сам объект. С "ручками"-методами, и "ножками"-свойствами.
А класс - это описание поведения объекта. Его "ручек" и "ножек". А еще и событий.
докСсылка "в Си" - это ссылка (почти указатель, но менее "опасный") на область памяти, где содержится в данный момент считанный из БД нужный объект.
Т.е. ссылка в Си сродни ярлыку на папку (объект), которая физически находится на диске по такому-то указателю. Это "безопасное" звено между вызовом из интерфейса и физическим содержимым памяти.
К 1С все выше перечисленное не имеет ровным счетом никакого отношения.
(0)Про то, что у нового объекта у .Ссылка все поля пустые и все булево = ложь говорили уже?
А у Объекта могло и при создании сделать Истина
(24)>>ПолучитьОбъект() -конструктор по идентификатору, при котором в переменные считываются данные с базы.
- вы путаете получение объекта (из базы), и работу с этим объектом.
При обращении/изменении к реквизиту/та (до записи в БД) уже полученого объекта - никакого "нового" считывания объекта из БД нет, поэтому и получается расхождение между "объектом", и тем, что по ссылке в БД.
>>Фактически при обращении докСсылка.реквизит каждый раз идет считывание с БД.
- да, Ссылке и неоткуда больше брать данные - только считывать их снова и снова из БД (она же в 1С прсото "ссылка", и больше ничего не умеет, как только указать на данные в ТАБЛИЦЕ БД, чтобы их оттуда могли забрать).
(50)>>Про то, что у нового объекта у .Ссылка все поля пустые
- ссылка на формируется на оснвое скрипта-"класса в 1С". Если разработчик заложит в платформе какое-то поле "Истина" - то ссылка тоже будет с полем Истина сразу.
>>А у Объекта могло и при создании сделать Истина
- потому что "объект" - уже не детерменирован "классом-скриптом", жесткая, как у ссылки, связь с "классом" разрушена-оторвана, т.е. сам объект уже может успеть поменяться после того, как 1С его сгенерировала из своих "скриптов-классов".
+ . как 1С его сгенерировала из своих "скриптов-классов", и запустила в "свободное" плавание по таблицам БД ))
(51)
Че это я путаю?
ПолучитьОбъект() - обычный конструктор. При котором как раз данные и считываются по ссылке.
Никто не мешает получить два объекта по одной ссылке :)
(54)>>Че это я путаю?
- путаете понятия объекта в ООП (Си), и "объекта" в 1С.
"ПолучитьОбъект()" - это в 1С не "конструктор", а "отделение "самостоятельного" объекта, если новый/получение существующего по ссылке".
(54)>>Никто не мешает получить два объекта по одной ссылке :)
- в 1С это невозможно ))
Ссылка - это не "класс", а "выхлоп" скрипта-класса. И не ссылка формирует объект 1С, а этот скрипт-класс, а ссылка идет как "бесплатное приложение", однозначно уникально идентифицирующее объект внутри отдельно взятой БД ))
(56)
Невозможно два Объекта по одной Ссылке получить?
Т.е. два экземпляра класса по одному идентификатору в базе? (это если нормальным языком).
Да легко.
Ссылка не формирует Объект, я этого не писал. Конструктор формирует новый экземпляр класса(Объект), получая в качестве параметра идентификатор в базе(Ссылку).
(58)>>Невозможно два Объекта по одной Ссылке получить?
- невозможно
>>Т.е. два экземпляра класса по одному идентификатору в базе? (это если нормальным языком).
- конструктор в 1С - это команда, которая и запускает скрипт-класс. На выходе - не "экзепляр класса", а "объект 1С", т.е. "собранный" из кусочков "объект 1С". assembling руками "робота"-скрипта.
>>получая в качестве параметра идентификатор в базе(Ссылку).
- ссылка не параметр, а скорей свойство. Параметр можно менять в широких пределах, чтобы получить разные реакции "объекта", а ссылку - только сгенерировать на точно такую же ссылку, т.е. ни для объекта, ни, тем более, для программиста - ничего в этом случае не меняется ))
(59)>>Когда начинают объектную модель 1с натягивать на ООП
- гораздо чаще путают их между собой. А 1С делает вид, что ничего не происходит, называя каждый раз заново собираемый платформой монолитный кусок (объекты Документ и Справочник - не потомки "одного класса", как может показаться, а совершенно разные по происхождению) - "объектом" ))
(62)>>"выхлоп", "скрипт класса", "отделение объекта" - вот это нормальный язык :)
- у 1С нет своей терминологии, а где есть - она крайне нечеткая.
Поэтому это наиболее близкие, в моем понимании, термины, описывающие взаимодействие сущностей внутри 1С.
Но это взаимодействие - точно не ООП ))
Поэтому и термины ООП к 1С не должны применяться, либо - с гигансткими оговорками, о чем, собственно (об этих оговорках), и вся текущая тема.
Что такое "ссылка" - это некоторый специальный объект в системе, в котором хранится информация о том, как найти объект в базе данных и какой объект найти.
Если мы у ссылки запрашиваем какие-то данные объекта, то система считывает данные из базы или из кеша и отдаёт их нам, но реально в самой ссылке они не хранятся.
"Объект" же - это объект в системе, где хранятся данные объекта из базы данных. То есть уже внутри самого объекта будут хранится все данные, считанные из базы, также допускается изменение этих данных с возможностью последующего сохранения в базу.
Несколько разных объектов, полученных из одной ссылки, могут содержать совершенно разные данные.
Кроме того, у объекта есть модуль, где можно определить некоторые процедуры и функции, выполняемые при некоторых системных событиях или вызываемые в коде для самого объекта (если они описаны с модификатором "Экспорт").
Что касается ООП в 1С, то есть только иллюзия ООП, так как есть общие свойства у всех объектов, а также у объектов одного типа (документы, справочники, регистры).
Но реально никакого наследования нет, каждый объект описывается самостоятельно.
Программист в конфигураторе может создать объект только определённого типа и никак иначе.
- нет.
То ли у программистов 1С такой уровень, то ли лень было делать - но кажущиеся однтипными "объекты" - имеют, на самом деле, совершенно разные свойства и методы работу. Зачастую даже одинаково называющиеся (свойства или методы), но работающие по-разному (и это совершенно не замотивированно каким-либо "назначением" объекта и чем-то подобным).
(69) По крайней мере это было бы логично. Сначала создать базовый класс СсылочныйТип со свойством "Ссылка" и методами Записать(), Удалить(). Далее производные классы частично переопределяют эти методы и свойства, и добавляют свои.
(68)>>так как есть общие свойства у всех объектов
- это далеко не так. Даже скажу прямо - это вообще не так. Подтверждение тому - весь гигантский зоопарк методов и свойств работы с разными объектами в 1С.
(70) Так если есть команда "ПолучитьОбъект", то мы можем получать объект из ссылки.
Также есть команда "Ссылка", позволяющая получить из объекта ссылку.
То есть ничего удивительного в том, что из одного объекта (Ссылка) можно получить другой объект (Объект) - нет.
(73)>>Так если есть команда "ПолучитьОбъект", то мы можем получать объект из ссылки
- было бы неразумно считать, что завуалированная команда "создать объект" имеет непосредственное отношение к значению того слова-команды, которая в 1С призвана создавать объект ))
(71) Просто программистам 1С ООП не совсем знакомо.
Одинаковые методы могут вызывать однотипные низкоуровневые функции (например, для записи табличной части), но изначально это будут разные функции.
Собственно, в случае ООП это также будут разные функции, просто для них будет создаваться таблица виртуальных функции, чтобы разные функции одного объекта находились по одному смещению.
Так как в языке 1С все функции вызываются по наименованию, то делать виртуальные таблицы функции никто не стал - там будут таблицы соответствия между наименованием и адресом функции.
(71)>>Сначала создать базовый класс СсылочныйТип со свойством "Ссылка" и методами Записать(), Удалить(). Далее производные классы частично переопределяют эти методы и свойства, и добавляют свои.
- это вообще не так, хотя бы потому, что ваш с Torquader подразумеваемый "класс Ссылка" вообще не имеет каких-либо свойств и методов, тем более описанных вами ))
(74) Нет, а что вам не нравится, есть в системе объект, называемый "ссылка" у него есть метод "ПолучитьОбъект", который возвращает объект другого типа (для системы в целом нет никакой связи между объектами "ссылка" и "объект").
Вообще-то, в 1С нет просто объекта "Ссылка", есть объекты "ДокументСсылка", "ДокументВидаСсылка" и т.п.
Читайте также: