helpf.pro
Регистрация

v8: Адресный классификатор

Ermak
09.04.2012 16:18Прочитано: 11596
Добрый день!
Подскажите вариант работы справочника и Адресного классификатора, может кто делал!
Я создал справочник Сотрудники и Регистр сведений Адресный классификатор закачал в него Кладр. В справочнике есть раздел адрес, где нужно выбрать индекс, район, регион, город, населен пункт, улицу. Вот нужно чтобы при выборе регион попадали в Адресный классификатор в регион, при выборе района Адресный классификатор выдал те районы которые попадают в выбранный регион и т.д
Yandex
Возможно, вас также заинтересует
Реклама на портале
Vladislav
09.04.2012 16:20Ответ № 1
Скопируй те все с справочника Организации или Контрагенты.
Я делал так, только дело это кропотливое.
Ermak
09.04.2012 16:37Ответ № 2
Я сегодня целый день это делал ни чего не получилось, уже мозг болит
Ermak
09.04.2012 16:37Ответ № 3
Может просто есть какой нибудь способ по лучше
Vladislav
09.04.2012 17:38Ответ № 4
А Вы не зацикливайтесь на адресе, а копируйте целиком ввод контактной информации.
Ermak
09.04.2012 20:21Ответ № 5
База пишется с нуля и Ваш способ не получается. Есть пример условия, чтобы при выборе регион попадали в Адресный классификатор в регион, при выборе района Адресный классификатор выдал те районы которые попадают в выбранный регион и т.д?
Изменено 09.04.12 20:21:33
DJ_Serega
11.04.2012 11:41Ответ № 6
(5) Ermak, если Адресный классификатор добавить измерение с регионом и районом то можно через запрос создать список значений. Потом его (СЗ) при выборе установить.
Ermak
12.04.2012 10:09Ответ № 7
а можно пример запроса показать
Ermak
12.04.2012 13:01Ответ № 8
Можно пример как написать условие:
Есть справочник Город в реквизитами Код, Наименование и справочник Улицы с реквизитами Код, Наименование, Город.
Как написать условия, когда выбираешь в справочнике Город любой город в справочнике Улицы отображались те улицы которые относятся к этому городу?
Ermak
16.04.2012 11:30Ответ № 9
подскажите кто нибудь! *11
Mokey
16.04.2012 12:02Ответ № 10
Так если это два справочника, то проще сделать ГОРОД владельцем УЛИЦ и выбирать по владельцу
Mokey
16.04.2012 12:06Ответ № 11
а если одноуровневый регистр сведений, то запросом так:
"Выбрать Классификатор.Адрес
|Из РегистрСведений.Классификатор КАК Классификатор
|ГДЕ Классификатор.Регион = &ВыбранныйРегион"

На форме есть поле выбора (или списка) с адресами, который заполняется следующими данными:
ПолеВыбора.Список.ЗагрузитьЗначения(Запрос.Выбрать().Выгрузить().ВыгрузитьКолонку("Адрес"))

как-то так
Изменено 16.04.12 12:07:02
Ermak
16.04.2012 12:54Ответ № 12
(10) Mokey, Как написать в коде тогда?
Mokey
16.04.2012 13:55Ответ № 13
(12) Ermak, Я же написал, просто я не знаю Ваших условий, а в общем надо копать в эту сторону
Mokey
16.04.2012 14:03Ответ № 14
Элементу формы, допустим, поле ввода с именем Регион, в которой Вы выбираете регион, задайте процедуру ПриИзменении().
Допустим, на форме есть элемент формы ПолеВыбора, допустим, Адрес, который дожен заполняться списком адресов при изменении региона. Тогда процедура РегионПриИзменении(Элемент) будет выглядеть таким образом:
Код 1C v 8.х
 
Процедура РегионПриИзменении(Элемент)
Запрос = Новый Запрос("Выбрать Классификатор.Адрес
|Из РегистрСведений.Классификатор КАК Классификатор
|ГДЕ Классификатор.Регион = &ВыбранныйРегион
|Упорядочить По Классификатор.Адрес");
Запрос.Параметры.Вставить("ВыбранныйРегион", Элемент.Значение);
ЭлементыФормы.Адрес.СписокВыбора.ЗагрузитьЗначения(Запрос.Выбрать().Выгрузить().ВыгрузитьКолонку("Адрес"));
КонецПроцедуры
Ermak
17.04.2012 09:45Ответ № 15
(13) Mokey, Я сделал два справочника:
-) Город (Реквизиты: код, наименование)
-) Улицы (Реквизиты: код, наименование, город)

Вот что получилось, но не работает

Код 1C v 8.2 УП
 Процедура РайонПриИзменении(Элемент)

СпрГ=Справочники.Города.НайтиПоНаименованию(ЭлементыФормы.Наименование.Значение);
СпрУ = Справочники.Улицы.НайтиПоРеквизиту("Город", ЭлементыФормы.Город.Значение);
Если СпрГ.Наименование = СпрУ.Город Тогда
ЭлементыФормы.Улицы.СписокВыбора.ЗагрузитьЗначения("Город")
КонецЕсли;
КонецПроцедуры

Изменено 17.04.12 11:16:11
Mokey
17.04.2012 12:36Ответ № 16
(15) Ermak, а что конкретно не работает? из кода непонятно, зачем в улицы города грузить, да и откуда - тоже непонятно. В 10 посте написано было мной, что проще делать связь по владельцу.
В список выбора загружается массив значений.
НайтиПоРеквизиту() - ищет первый попавшийся элемент в справочнике, поэтому надо выборку по реквизиту организовать, но лучше запросами, как в 14 посте, только вместо регистра сведений подсовывайте свой справочник с улицами или городами.

ПыСы. А район тогда что в Вашей структуре данных?
Изменено 17.04.12 12:37:36
Ermak
17.04.2012 12:41Ответ № 17
покажите по 10 посту на примере как пишется!
Mokey
17.04.2012 12:42Ответ № 18
Мне видится такая структура:

Справочник.Районы
Справочник.Города (подчинён районам)
Справочник.Улицы (подчинён городам).
В таком варианте отпадает необходимость хранить дополнительные реквизиты.
Если делать выборками по владельцу, то в этом случае СписокВыбора на форме придётся заполнять перебором соответствующей выборки.
Изменено 17.04.12 12:47:40
Mokey
17.04.2012 12:45Ответ № 19
Код 1C v 8.х
 
Процедура РайонПриИзменении(Элемент)

СпрГ=Справочники.Города.Выбрать(, Элемент.Значение);
Пока СпрГ.Следующий() Цикл
ЭлементыФормы.Города.СписокВыбора.Добавить(СпрГ.Ссылка);
КонецЦикла;
КонецПроцедуры


Аналогично делается выборка улиц при изменении (выборе) города из выпадающего списка.
Изменено 17.04.12 12:46:42
Ermak
17.04.2012 16:13Ответ № 20
че та не получается. Когда я выбираю район потом выбираю населенный пункт (Район и населенный пункт это справочники )

Код 1C v 8.х
 Процедура РайонПриИзменении(Элемент)

СпрН=Справочники.НасПункт.Выбрать(, Элемент.Значение);
Пока СпрН.Следующий() Цикл
ЭлементыФормы.НасПункт.СписокВыбора.Добавить(СпрН.Ссылка);
КонецЦикла;
КонецПроцедуры


Я не понимаю что вы имеет ввиду выборка по владельцу?! *08
У меня в справочнике населенный пункт создан реквизит Район, т.е добавляю населенный пунк и указываю к какому району он относиться, родителя я не использую
Mokey
17.04.2012 16:19Ответ № 21
(20) Ermak, У справочника есть свойство "Владелец".
В строке
Код 1C v 8.х
 СпрН=Справочники.НасПункт.Выбрать(, Элемент.Значение)   

Элемент.Значение - это и есть Владелец справочника НасПункт. Он определяется в конфигураторе. Если же у Вас есть реквизит Район, то следует пользоваться этой же функцией, но третьим её параметром, который является структурой, например:
Код 1C v 8.х
 
СпрН=Справочники.НасПункт.Выбрать(, , Новый Структура("Район",Элемент.Значение))

В этом случае вы выбираете все элементы с искомым реквизитом Район (он должен быть проиндексирован!).
Ermak
17.04.2012 16:38Ответ № 22
Спасибо за разъяснения владельца, я к населенному пункту поставил владельца справочник.район

Но выдает ошибку

{Справочник.Абоненты.Форма.ФормаЭлемента.Форма(16)}: Ошибка при вызове метода контекста (Выбрать)
СпрН=Справочники.НасПункт.Выбрать(, , Новый Структура("Район" ,Элемент.Значение));
по причине:
Недопустимое значение параметра (параметр номер '3')


Код 1C v 8.х
 Процедура РайонПриИзменении(Элемент)

СпрН=Справочники.НасПункт.Выбрать(, , Новый Структура("Район" ,Элемент.Значение));
Пока СпрН.Следующий() Цикл
ЭлементыФормы.НасПункт.СписокВыбора.Добавить(СпрН.Ссылка);
КонецЦикла;
КонецПроцедуры
Mokey
17.04.2012 16:49Ответ № 23
(22) Ermak, если сделали владельцем, то почему не первым вариантом пользуетесь?
если вторым - то читайте внимательно приписку внизу примера!
Ermak
17.04.2012 17:01Ответ № 24
Все равно почему то не отбирает

Код 1C v 8.х
 Процедура РайонПриИзменении(Элемент)

СпрН=Справочники.НасПункт.Выбрать(, Элемент.Значение);
Пока СпрН.Следующий() Цикл
ЭлементыФормы.НасПункт.СписокВыбора.Добавить(СпрН.Ссылка);
КонецЦикла;
КонецПроцедуры]
Mokey
17.04.2012 17:05Ответ № 25
(24) Ermak ну теперь всё по-порядку. Реквизит "Район" в справочнике НасПункт какой тип имеет?
Mokey
17.04.2012 17:06Ответ № 26
Да и мало в конфигураторе присвоить владельца, надо ещё все элементы в подчинённом справочнике подчинить этому родителю, либо заново загрузить классификатор с учётом этих особенностей справочников.
Mokey
17.04.2012 17:08Ответ № 27
Будем развивать второй вариант. У меня уже спортивный интерес. Поставьте в свойтвах реквизита "Район" справочника НасПункт в конфигураторе "Индексировать" или "Индексировать с допупорядочиванием". После этого должен заработать вариант 2.
Ermak
17.04.2012 17:11Ответ № 28
Район имеет тип СправочникСсылка.Районы
Но это не родитель а созданный реквизит
Ermak
17.04.2012 17:12Ответ № 29
Т.е мне лучше подчинить к родителю а не к созданному реквизиту район?
Ermak
17.04.2012 17:14Ответ № 30
И я еще увидел что у меня поле владельца не было добавлено в форму
Mokey
17.04.2012 17:15Ответ № 31
Давайте остановимся на втором варианте, т.е. на реквизите, надеюсь, он у Вас заполнен данными, поставили свойство "индексировать"? Если да, то должен работать следующий код:
Код 1C v 8.х
 
Процедура РайонПриИзменении(Элемент)
СпрН=Справочники.НасПункт.Выбрать(, , Новый Структура("Район" ,Элемент.Значение));
Пока СпрН.Следующий() Цикл
ЭлементыФормы.НасПункт.СписокВыбора.Добавить(СпрН.Ссылка);
КонецЦикла;
КонецПроцедуры
Mokey
17.04.2012 17:17Ответ № 32
(30) Ermak, поле владелец на форме не нужно, на форме дожно быть поле, в котором Вы выбираете Район, далее возникает процедура РайонПриИзменении(), которая заполняет ПолеВыбора на форме населёнными пунктами выбранного района. Всё довольно просто.
Ermak
17.04.2012 17:27Ответ № 33
Индексировать поставил в реквизите Район в справочнике нас.пунк, но все равно не работает. Убрал в свойствах справочника владелец, так как мы решили по второму варианту.
Mokey
17.04.2012 17:28Ответ № 34
и что не работает?
Ermak
17.04.2012 17:29Ответ № 35
выбрал район, потом выбираю нас. пункт и выдают все населенные пункты
Ermak
17.04.2012 17:29Ответ № 36
а должен выдавать те нас.пункты которые относятся только к данному району
Mokey
17.04.2012 17:30Ответ № 37
а что за поле для выбора нас.пунктов на форме?
Ermak
17.04.2012 17:32Ответ № 38
Существует форма, где есть два реквизита поле ввода, один реквизит район тип у него справочник район, второй реквизит нас. пункт с типом справочник населенный пункт
Mokey
17.04.2012 17:34Ответ № 39
мне кажется, что-то неправильно прописано.
итак, мы имеем:
Справочник.Район, на форме поле ввода с типом значения "Справочники.Район";
Справочник.НасПункт с индексированным реквизитом "Район" с типом значения "СправочникСсылка.Район", на форме имеем поле выбора с типом значения элементов списка "СправочникСсылка.НасПункт". С полем ввода района свазана процедура ПриИзменении(), которая описана чуть выше нашего общения. Вот в таком варианте железно должно всё работать!
Изменено 17.04.12 17:36:31
Mokey
17.04.2012 17:35Ответ № 40
(38) Ermak, вот по второму реквизиту у меня большие вопросы есть. Вы же в никуда выбираете элементы!!! Но и в Вашем случае есть выход! Хотите? Или сначала попробуете с полем выбора?
Mokey
17.04.2012 17:39Ответ № 41
В вашем случае вариант с владельцем просто идеальным был бы, потому что поле ввода можно прямо в конфигураторе связать по владельцу, тогда выбираться будут только подчинённые элементы, но это отступление))).
Mokey
17.04.2012 17:44Ответ № 42
(38) Ermak, Намекну.
в таком варианте элементов формы надо юзать метод НачалоВыбора() со следующим отказом от стандартной обработки и ручного открытия формы выбора с отбором по реквизиту "Район". Тоже ничего сложного.
Ermak
17.04.2012 18:33Ответ № 43
Есть документ Сотрудник в нем есть реквизиты Район (тип Справочники.Район) и реквизит НасПункт (тип Справочники.НасПункт)
При заполнении документа выбираем район, при выборе нас. пункта должны открыться только те которые относятся с выбранyому району.

Справочник район имеет реквизиты код и наименование

Справочник наспункт имеет реквизиты код, наименование и район (тип Справочники.Район)
Владельца у справочника наспункт я убрал.
Mokey
18.04.2012 10:39Ответ № 44
(43) Ermak, хорошо, чтобы Вам не менять элементы формы, юзаем метод НачалоВыбора() элемента (реквизита) НасПункт формы документа:
Код 1C v 8.х
 
Процедура НасПунктНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = Справочники.НасПункт.ПолучитьФормуВыбора("ФормаВыбора", Элемент);
ФормаВыбора.НасПунктСписок.Отбор.Район.Значение = ЭлементыФормы.Район.Значение;
ФормаВыбора.НасПунктСписок.Отбор.Район.Использование = Истина;
ФормаВыбора.ЗакрыватьПриВыборе = Истина;
ФормаВыбора.ЗакрыватьПриЗакрытииВладельца = Истина;
ФормаВыбора.Открыть();
КонецПроцедуры


как-то так, реквизиты формы подставляйте так, как они у Вас в конфигураторе обозначены.
Изменено 18.04.12 10:41:17
Ermak
18.04.2012 10:59Ответ № 45
что то не то

Поле объекта не обнаружено (НасПунктСписок)
Изменено 18.04.12 11:26:05
Mokey
18.04.2012 14:52Ответ № 46
(45) Ermak, читайте внимательно то, что я приписываю после примера!!!! Я же не вижу Вашей базы, в конце концов!
Ermak
18.04.2012 15:03Ответ № 47
форма выбора у меня так и называется в справочнике НасПункт ФормаВыбора, что то не так
Mokey
18.04.2012 15:06Ответ № 48
(47) Ermak, странный Вы человек. А поле списка на этой форме как называется? Давно программируете?
Ermak
18.04.2012 15:07Ответ № 49
что за НасПунктСписок ?
Ermak
18.04.2012 15:08Ответ № 50
(48) Mokey, Я перепутал )
Mokey
18.04.2012 15:09Ответ № 51
(49) Ermak, вот как объяснить-то... открываете в конфигураторе вашу форму выбора и смотрите, как называется поле списка на этой форме. Вот это название подставляете ВМЕСТО "НасПунктСписок".
Mokey
18.04.2012 15:12Ответ № 52
Обычно оно называется просто "СправочникСписок"
Ermak
18.04.2012 15:26Ответ № 53
да у меня так и называется Данные - СправочникСписок но в списке нет
Ermak
18.04.2012 15:32Ответ № 54
Есть только функция ВыбратьИзСписка
Ermak
18.04.2012 15:37Ответ № 55
че та меня запарила уже *03
еще ошибка

Ошибка при вызове метода контекста (ПолучитьФормуВыбора)
ФормаВыбора = Справочники.НасПункт.ПолучитьФормуВыбора("ФормаВыбора", Элемент);
Ermak
18.04.2012 15:51Ответ № 56
Может быть из за того не получается Ваш способ потому что у меня конфигурация пишется с нуля
Mokey
18.04.2012 15:59Ответ № 57
(55) Ermak, хм... а раньше не было этой ошибки? и какая разница, с нуля Вы пишете или с единицы. Приведите всесь код, что ли, который пишете. И как элементы обозваны на формах. Я ещё вчера 4-мя способами решил Вашу задачу. На любой вкус, что называтся. Сейчас предлагаю Вам способ с наименьшими трудозатратами с Вашей стороны, только четыре строчки вписать в код, и всё ДОЛЖНО работать, но мы упёрлись в названия форм и реквизитов этих форм. Посмотрите в конфигураторе, пропишите всё правильно в процедуру.
Ermak
18.04.2012 16:01Ответ № 58
Вот что получилось

Код 1C v 8.х
 Процедура НасПунктНачалоВыбора(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

ФормаВыбора = Справочники.НасПункт.ПолучитьФормуСписка();

ФормаВыбора.Отбор.Район.Использование = Истина;

ФормаВыбора.ЗакрыватьПриВыборе = Истина;

ФормаВыбора.ЗакрыватьПриЗакрытииВладельца = Истина;

ФормаВыбора.Открыть();

КонецПроцедуры


Теперь справочник НасПункт открывается только он почему то пустой, хотя информация заполнена
Mokey
18.04.2012 16:04Ответ № 59
Код 1C v 8.х
 
Процедура НасПунктНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = Справочники.НасПункт.ПолучитьФормуВыбора("ФормаВыбора", Элемент);
ФормаВыбора.НасПунктСписок.Отбор.Район.Значение = ЭлементыФормы.Район.Значение;
ФормаВыбора.НасПунктСписок.Отбор.Район.Использование = Истина;
ФормаВыбора.ЗакрыватьПриВыборе = Истина;
ФормаВыбора.ЗакрыватьПриЗакрытииВладельца = Истина;
ФормаВыбора.Открыть();
КонецПроцедуры


Итак, по-порядку:
1) НасПункт - так я назвал справочник (у Вас, вроде, так же называется);
2) ФормаВыбора - так называется форма выбора этого справочника, можно и не указывать, тогда подтянется стандартная форма, указанная в свойсвах справочника;
3) НасПунктСписок - я так назвал реквизит формы выбора справочника, обычно он называется просто СправочникСписок;
Mokey
18.04.2012 16:05Ответ № 60
(58) Ermak, потому что Вы пропустили одну строку, но уже есть результат! Можно выпить за это!
Изменено 18.04.12 16:06:36
Mokey
18.04.2012 16:06Ответ № 61
вставьте значение отбора и О ЧУДО! Это работает! )))
Ermak
18.04.2012 16:11Ответ № 62
Mokey, Спасибо большое за Ваше упорство мне объянить *06
Все получилось, только я сделал не много не так

Вот код:

Код 1C v 8.х
 Процедура НасПунктНачалоВыбора(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = Справочники.НасПункт.ПолучитьФормуСписка();
ФормаВыбора.Отбор.Район.Значение = ЭлементыФормы.Район.Значение;
ФормаВыбора.Отбор.Район.Использование = Истина;
ФормаВыбора.ЗакрыватьПриВыборе = Истина;
ФормаВыбора.ЗакрыватьПриЗакрытииВладельца = Истина;
ФормаВыбора.Открыть();

КонецПроцедуры




Я еще слабый прогер на 1С
Изменено 18.04.12 16:12:04
Mokey
18.04.2012 16:21Ответ № 63
(62) Ermak, я же объяснял, что получить можно любую форму, списка или выбора, разница лишь в том, что на форме списка нет кнопки "Выбрать" в левом верхнем углу, и ещё форму выбора обычно делают только для просмотра, т.е. открыл - выбрал - форма закрылась. А так без разницы. Главное, что всё получилось. Поздравляю Вас. Теперь соедините воедино всё, о чё мы с вами говорили, проанализируйте, если хотите стать сильным прогером на 1С. Попробуйте другие варианты, например, с владельцем, в этом случае вообще код писать не надо ))
Ermak
18.04.2012 16:42Ответ № 64
А вы могли бы подсказать материалы для учения !
Если Вам не трудно расскажите как пример с владельцем без кода сделать?
Ermak
18.04.2012 16:46Ответ № 65
И еще проблема вылезла, почему я когда выбираю НасПункт он потом не отображается в ячейки?
Mokey
18.04.2012 17:02Ответ № 66
(64) Ermak, с владельцем просто, но надо будет перезаполнить справочник НасПункт.
(65) Ermak, поправьте так:
Код 1C v 8.х
 
....
ФормаВыбора = Справочники.НасПункт.ПолучитьФормуВыбора();
....
Элемент.Значение = ФормаВыбора.ОткрытьМодально();
Ermak
18.04.2012 17:04Ответ № 67
Спасибо получилось!
А как перезаполнить?
Mokey
18.04.2012 17:05Ответ № 68
или, чтобы избежать ошибок:
Код 1C v 8.х
 
....
ВыбранноеЗначение = ФормаВыбора.ОткрытьМодально();
Если НЕ ВыбранноеЗначение = Неопределено Тогда
Элемент.Значение = ВыбранноеЗначение;
КонецЕсли;
Mokey
18.04.2012 17:06Ответ № 69
(67) Ermak, в смысле - перезаполнить? другими данными? просто перевыберите район, наспункты сами должны перезаполниться
Ermak
18.04.2012 17:54Ответ № 70
Все сделал !
Ermak
18.04.2012 17:55Ответ № 71
Вопрос закрыт!
Подсказка: Для редактирования своего ответа щелкните по значку (справа)
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.