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