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

Вопрос по регистрам сведений

Автор blacat, 24 янв 2013, 01:49

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

blacat

Добрый день!
Подскажите, что я делаю не так. Нужно выбрать контактную инфу контрагента. Пробую следующий код:
//------------------------------------------------------------------------------------------------------
   Контрагент = Справочники.Контрагенты.НайтиПоКоду("БЕ0001876");

   ВыборкаОРГ = РегистрыСведений.КонтактнаяИнформация.Выбрать(Новый Структура("Объект", Контрагент));
   Пока ВыборкаОРГ.Следующий() Цикл
      Если Строка(ВыборкаОРГ.Вид) = "Юридический адрес организации" Тогда
             ЮрАдрес = ВыборкаОРГ.Представление;
      ИначеЕсли Строка(ВыборкаОРГ.Вид) = "Телефон организации" Тогда
             Телефон = ВыборкаОРГ.Представление;
      КонецЕсли;   
   КонецЦикла; 
   
  Сообщение(" ЮрАдрес " + ЮрАдрес );

//------------------------------------------------------------------------------------------------------
В итоге программа не заходит внутрь цикла. Пробовал и так и подставлять контрагента из формы - результат нулевой.
Подскажите, плиз, где грабли?


sertak

Проверьте, так ли на самом деле называются виды контактной информации: Юридический адрес организации, Телефон организации.

СветланаCC

Контрагент = Справочники.Контрагенты.НайтиПоКоду("БЕ0001876");
//вытаскиваем адрес
Запрос = Новый Запрос;
Запрос.Текст =
""ВЫБРАТЬ
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Контрагент
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Запрос.УстановитьПараметр("Тип",Перечисления.ТипыКонтактнойИнформации.Адрес);
Запрос.УстановитьПараметр("Вид",Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
// либо возможно, смотря какой адрес нужен
//Запрос.УстановитьПараметр("Вид",Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Адрес = Выборка.Представление;
КонецЦикла;

//вытаскиваем телефон
Запрос = Новый Запрос;
Запрос.Текст =
""ВЫБРАТЬ
| КонтактнаяИнформация.Представление
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Контрагент
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Запрос.УстановитьПараметр("Тип",Перечисления.ТипыКонтактнойИнформации.Телефон);
Запрос.УстановитьПараметр("Вид",Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Телефон = Выборка.Представление;
КонецЦикла;
Тазовод)

СветланаCC

Либо проще одним запросом -
Контрагент = Справочники.Контрагенты.НайтиПоКоду("БЕ0001876");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.Вид
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Контрагент";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
АдресЮр = Выборка.Представление;
ИначеЕсли Выборка.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента Тогда
АдресФакт = Выборка.Представление;
ИначеЕсли Выборка.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
Телефон = Выборка.Представление;
КонецЕсли;
КонецЦикла;

Тазовод)

mixqn

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

// ЮрАдресКонтрагента - вид контактной информации
// обычно юридический адрес - предопределенный элемент справочника, поэтому можно написать так:
ЮрАдресКонтрагента = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
// если вдруг в вашем конкретном случае юридический адрес - не предопределенный элемент, то
// его следует вынести в форму и определять значение "по умолчанию" конструкцией НайтиПоКоду

// тоже самое с телефоном
ТелефонКонтрагента = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(КонтактнаяИнформацияЮрАдрес.Представление КАК СТРОКА) КАК ЮрАдрес,
| ВЫРАЗИТЬ(КонтактнаяИнформацияТелефон.Представление КАК СТРОКА) КАК Телефон
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияЮрАдрес
| ПО Контрагенты.Ссылка = КонтактнаяИнформацияЮрАдрес.Объект
| И (КонтактнаяИнформацияЮрАдрес.Тип = &ТипАдрес)
| И (КонтактнаяИнформацияЮрАдрес.Вид = &ЮрАдресКонтрагента)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияТелефон
| ПО Контрагенты.Ссылка = КонтактнаяИнформацияТелефон.Объект
| И (КонтактнаяИнформацияТелефон.Тип = &ТипТелефон)
| И (КонтактнаяИнформацияТелефон.Вид = &ТелефонКонтрагента)
|ГДЕ
| Контрагенты.Ссылка = &Контрагент";

Запрос.УстановитьПараметр("Контрагент", Контрагент); // предполагается, что контрагент определен заранее - например, вынесен в форму
Запрос.УстановитьПараметр("ЮрАдресКонтрагента", ЮрАдресКонтрагента);
Запрос.УстановитьПараметр("ТипАдрес", Перечисления.ТипыКонтактнойИнформации.Адрес);
Запрос.УстановитьПараметр("ТелефонКонтрагента", ТелефонКонтрагента);
Запрос.УстановитьПараметр("ТипТелефон", Перечисления.ТипыКонтактнойИнформации.Телефон);

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Если Выборка.Следующий() Тогда
ЮрАдрес = СокрЛП(Выборка.ЮрАдрес);
Телефон = СокрЛП(Выборка.Телефон);
Если ЗначениеЗаполнено(ЮрАдрес) Тогда
Сообщить("Юр. адрес: " + ЮрАдрес);
КонецЕсли;
Если ЗначениеЗаполнено(Телефон) Тогда
Сообщить("Телефон: " + Телефон);
КонецЕсли;
КонецЕсли;

СветланаCC

согласна, что нужно делать запросом, но если человеку очень хочет выборкой то вот -
ВыборкаОРГ = РегистрыСведений.КонтактнаяИнформация.Выбрать(Новый Структура("Объект", Контрагент));
Пока ВыборкаОРГ.Следующий() Цикл
Если ВыборкаОРГ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
ЮрАдрес = ВыборкаОРГ.Представление;
ИначеЕсли ВыборкаОРГ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента Тогда
Телефон = ВыборкаОРГ.Представление;
КонецЕсли;   
КонецЦикла; 
Сообщить(ЮрАдрес);
Сообщить(Телефон);
Тазовод)

blacat

Добрый вечер, друзья! Спасибо, что откликнулись на мою просьбу о помощи! Ваши варианты кодов я рассмотрел и уверен, что эта информация мне обязательно еще пригодится. Моя проблема решилась, на решение меня натолкнул mixqn - я сам виноват. Вчера ночью я пытался извлечь данные из регистра сведений в базе, в которой этот регистр НЕ заполнен...:dfbsdfbsdf: Да, бывает и так. На компе стоит несколько одинаковых баз и я был просто уверен, что извлекаю данные из рабочей, а не из тестовой как оказалось в итоге. Т.ч. еще раз всем спасибо и впредь буду внимательнее.

Теги:

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

Рейтинг@Mail.ru

Поиск