Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 05:06

Работа с документами и справочниками

Автор shurik91, 06 авг 2017, 22:50

0 Пользователей и 1 гость просматривают эту тему.

shurik91

После начала работы отладчика Выборка1 содержит значение реквизита "Наименование"(этот реквизит стандартный), а в этом реквизите прописывается ФИО. Зачем тогда ".ссылка" писать, не понимаю((

oleg-x

Цитата: shurik91 от 07 авг 2017, 13:51
После начала работы отладчика Выборка1 содержит значение реквизита "Наименование"(этот реквизит стандартный), а в этом реквизите прописывается ФИО. Зачем тогда ".ссылка" писать, не понимаю((
Если Сотрудник = Выборка1.ссылка Тогда  // Сотрудник - это реквизит справочника Сотрудники...
Сотрудник это реквизит, который имеет ссылочный тип на справочник, наименование это строка. Разные типы не сравнивают. Если указать просто "Сотрудник = Выборка1", значение конечно возможно подставит, но вот вопрос. что подставит программа, если у тебя будет два одинаковых ФИО.
При том у вас в базе может быть сотрудники с одинаковым ФИО, но это разные люди, с разными должностями.

Советую так не писать код, оставляя на откуп программы. Потом будете смотреть и удивляться, почему так программа сделала, а не иначе.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

shurik91

Спасибо большое,Oleg-x.  т.е. надо писать "Выборка1.ссылка"? вместо ссылка ничего не надо указывать, я вас правильно понял?

oleg-x

Цитата: shurik91 от 07 авг 2017, 14:25
Спасибо большое,Oleg-x.  т.е. надо писать "Выборка1.ссылка"? вместо ссылка ничего не надо указывать, я вас правильно понял?
Совершенно верно.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

shurik91

Спасибо!
Добавлено: 07 авг 2017, 21:41


Цитата: oleg-x от 07 авг 2017, 12:25


Процедура ПриИзмененииСотрудник()
Если ЗначениеЗаполнено(Сотрудник) Тогда
Должность = Сотрудник.Должность;
КонецЕсли;
КонецПроцедуры //так делаем, если берем значение из документа/справочник, ссылку на который есть в объекте.

Добавлено: 07 авг 2017, 21:42


Цитата: shurik91 от 07 авг 2017, 14:52

Добавлено: 07 авг 2017, 21:41


Цитата: oleg-x от 07 авг 2017, 12:25


Процедура ПриИзмененииСотрудник()
Если ЗначениеЗаполнено(Сотрудник) Тогда
Должность = Сотрудник.Должность;
КонецЕсли;
КонецПроцедуры //так делаем, если берем значение из документа/справочник, ссылку на который есть в объекте.

Спасибо еще раз этот код проврял работает.
Добавлено: 07 авг 2017, 21:45


Цитата: oleg-x от 07 авг 2017, 14:03
Цитата: shurik91 от 07 авг 2017, 13:51
После начала работы отладчика Выборка1 содержит значение реквизита "Наименование"(этот реквизит стандартный), а в этом реквизите прописывается ФИО. Зачем тогда ".ссылка" писать, не понимаю((
Если Сотрудник = Выборка1.ссылка Тогда  // Сотрудник - это реквизит справочника Сотрудники...
Сотрудник это реквизит, который имеет ссылочный тип на справочник, наименование это строка. Разные типы не сравнивают. Если указать просто "Сотрудник = Выборка1", значение конечно возможно подставит, но вот вопрос. что подставит программа, если у тебя будет два одинаковых ФИО.
При том у вас в базе может быть сотрудники с одинаковым ФИО, но это разные люди, с разными должностями.

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


И код, где Выборка1.ссылка тоже работает. Причина почему не попадал в цикл - т.к. Сотрудник имел тип Справочник Ссылка, а Выборка1 - Справочник Выборка, после того, как дописал ".ссылка" он стал типа справочник ссылка.

Norfolk

ТС, Вам с такими познаниями лучше для начала прочитать книжку Радченко...

AIFrame

Цитата: shurik91 от 07 авг 2017, 13:51
После начала работы отладчика Выборка1 содержит значение реквизита "Наименование"(этот реквизит стандартный), а в этом реквизите прописывается ФИО. Зачем тогда ".ссылка" писать, не понимаю((
Наименование - это тип "строка".
Если бы Выборка1 действительно была "наименованием", как бы тогда класс строки мог содержать в себе остальные реквизиты ссылки? "Наименование".Должность? "Наименование".Комментарий? "Наименование".Код?
Вы с SQL\MySQL и прочими субд знакомы? Или таблицу EXCEL можете себе представить хотя бы?
Вот есть таблица, в которой 55 колонок и 270000 строк.
Вы поиском (Запросом) находите некую строку или несколько строк (Отборы). При этом вы указываете, какие колонки вам нужны.
Результат поиска записываете в Выборка1.
Методом Выборка1.Следующий() вы получаете одну строку с колонками из запроса. Назовем ее СтрокаВыборки.
Что будет, если вы сделаете присвоение вида "Вася = СтрокаВыборки". Чем станет Вася? Правильно - всей этой строкой.

Метод Справочник.Сотрудники.Выбрать() - это и есть запрос. Однострочная его версия.
"ВЫБРАТЬ _.* ИЗ Справочник.Сотрудники КАК _"
_.* - все реквизиты этого справочника, включая стандартные.
И среди стандартных реквизитов любого элемента конфигурации типа Объект (Справочник, документ) есть реквизит "Ссылка". Ссылка на этот элемент. Со всеми его реквизитами. Выборка тоже содержит в себе все эти реквизиты, но только потому что мы их так выбрали. Выборка.Наименование и Выборка.Ссылка.Наименование - равнозначны.

И по поводу объекта. Сразу на будущее.
Представь себе, что у тебя есть строка таблицы. Ты можешь в ней менять данные как хочешь. Строка таблицы - это Объект.
А теперь представь, что у тебя есть скриншот этой строки таблицы. Скриншот - это Ссылка. Ты можешь рисовать поверх скриншота сколько угодно. Это не изменит самой строки в таблице. Хочешь поменять - находишь эту строку в таблице (ссылаясь на скриншот) и с ней работаешь. Эта процедура и есть Ссылка.ПолучитьОбъект()
Грубо говоря, Ссылка - это текущее состояние(и только состояние) Объекта.

shurik91

Цитата: Norfolk от 08 авг 2017, 04:48
ТС, Вам с такими познаниями лучше для начала прочитать книжку Радченко...
Спасибо за совет, я только начинаю изучать 1С. А Радченко какую книжку?
Добавлено: 08 авг 2017, 14:05


Цитата: AIFrame от 08 авг 2017, 06:07
Цитата: shurik91 от 07 авг 2017, 13:51
После начала работы отладчика Выборка1 содержит значение реквизита "Наименование"(этот реквизит стандартный), а в этом реквизите прописывается ФИО. Зачем тогда ".ссылка" писать, не понимаю((
Наименование - это тип "строка".
Если бы Выборка1 действительно была "наименованием", как бы тогда класс строки мог содержать в себе остальные реквизиты ссылки? "Наименование".Должность? "Наименование".Комментарий? "Наименование".Код?
Вы с SQL\MySQL и прочими субд знакомы? Или таблицу EXCEL можете себе представить хотя бы?
Вот есть таблица, в которой 55 колонок и 270000 строк.
Вы поиском (Запросом) находите некую строку или несколько строк (Отборы). При этом вы указываете, какие колонки вам нужны.
Результат поиска записываете в Выборка1.
Методом Выборка1.Следующий() вы получаете одну строку с колонками из запроса. Назовем ее СтрокаВыборки.
Что будет, если вы сделаете присвоение вида "Вася = СтрокаВыборки". Чем станет Вася? Правильно - всей этой строкой.

Метод Справочник.Сотрудники.Выбрать() - это и есть запрос. Однострочная его версия.
"ВЫБРАТЬ _.* ИЗ Справочник.Сотрудники КАК _"
_.* - все реквизиты этого справочника, включая стандартные.
И среди стандартных реквизитов любого элемента конфигурации типа Объект (Справочник, документ) есть реквизит "Ссылка". Ссылка на этот элемент. Со всеми его реквизитами. Выборка тоже содержит в себе все эти реквизиты, но только потому что мы их так выбрали. Выборка.Наименование и Выборка.Ссылка.Наименование - равнозначны.

И по поводу объекта. Сразу на будущее.
Представь себе, что у тебя есть строка таблицы. Ты можешь в ней менять данные как хочешь. Строка таблицы - это Объект.
А теперь представь, что у тебя есть скриншот этой строки таблицы. Скриншот - это Ссылка. Ты можешь рисовать поверх скриншота сколько угодно. Это не изменит самой строки в таблице. Хочешь поменять - находишь эту строку в таблице (ссылаясь на скриншот) и с ней работаешь. Эта процедура и есть Ссылка.ПолучитьОбъект()
Грубо говоря, Ссылка - это текущее состояние(и только состояние) Объекта.

С MySQL знаком. И спасибо за доходчивое разъяснение.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск