Кривой запрос (хотя не факт =). 1С: Предприятие 8.1.
20.12.2010
17:31
#1
"Всем привет.
Я новичок. Вот нужно подправить чужую прогу, написанную для 1С:Предприятие 8.1.
Встала проблема получения адреса прописки сотрудников из таблицы "Сотрудники". Код следующий:
"ДЛЯ Cчетчик = 0 по Ведомость.Зарплата.Количество()-1 ЦИКЛ
ДанныеСтр = Ведомость.Зарплата.Получить(Cчетчик);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Физл",ДанныеСтр.Физлицо);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица);
Запрос.Текст="ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Тип,
| КонтактнаяИнформация.Вид,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Поле1,
| КонтактнаяИнформация.Поле2,
| КонтактнаяИнформация.Поле3,
| КонтактнаяИнформация.Поле4,
| КонтактнаяИнформация.Поле5,
| КонтактнаяИнформация.Поле6,
| КонтактнаяИнформация.Поле7,
| КонтактнаяИнформация.Поле8,
| КонтактнаяИнформация.Поле9,
| КонтактнаяИнформация.Поле10
|
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Физл
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
РезЗапросаАд=Запрос.Выполнить().Выгрузить();
Если РезЗапросаАд.Количество()>0 тогда
// Адрес=Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица;
Индекс = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле1));
Регион = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле2));
Район = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле3));
Город = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле4));
НаселённыйПункт = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле5));
Улица = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле6));
Дом = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле7));
Корпус = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле8));
Квартира = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле9));
// Поле10=СокрЛП(строка(РезЗапросаАд.Получить(0).Поле10));
Адрес = Индекс + "," + Регион + "," + Район + "," + Город + "," + НаселённыйПункт + "," + Улица + "," + Дом + "," + Корпус + "," + Квартира;
Иначе
Сигнал();
Сообщить("Для сотрудника " + ВРег(ДанныеСтр.Физлицо) + " не заполнены поля проживания!");
КонецЕсли;
КонецЦикла;"
Данный код выдаёт, что далеко не у всех сотурдников в моей таблице "Сотрудники" есть адрес.
Хотя они есть у всех. Я специально проверял тех, адрес которых этим кодом не находится, и видел у них заполненный "Адрес по прописке физ. лица". К слову сказать, у меня на 1С:Предприятие 8.1 стоит демо база.
А у тех, чей адрес этот код находил, адрес брался тоже именно из "Адрес по прописке физ. лица".
Подскажите, в чём здесь ошибка."
Я новичок. Вот нужно подправить чужую прогу, написанную для 1С:Предприятие 8.1.
Встала проблема получения адреса прописки сотрудников из таблицы "Сотрудники". Код следующий:
"ДЛЯ Cчетчик = 0 по Ведомость.Зарплата.Количество()-1 ЦИКЛ
ДанныеСтр = Ведомость.Зарплата.Получить(Cчетчик);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Физл",ДанныеСтр.Физлицо);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица);
Запрос.Текст="ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Тип,
| КонтактнаяИнформация.Вид,
| КонтактнаяИнформация.Объект,
| КонтактнаяИнформация.Поле1,
| КонтактнаяИнформация.Поле2,
| КонтактнаяИнформация.Поле3,
| КонтактнаяИнформация.Поле4,
| КонтактнаяИнформация.Поле5,
| КонтактнаяИнформация.Поле6,
| КонтактнаяИнформация.Поле7,
| КонтактнаяИнформация.Поле8,
| КонтактнаяИнформация.Поле9,
| КонтактнаяИнформация.Поле10
|
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Физл
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид";
РезЗапросаАд=Запрос.Выполнить().Выгрузить();
Если РезЗапросаАд.Количество()>0 тогда
// Адрес=Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица;
Индекс = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле1));
Регион = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле2));
Район = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле3));
Город = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле4));
НаселённыйПункт = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле5));
Улица = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле6));
Дом = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле7));
Корпус = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле8));
Квартира = СокрЛП(Строка(РезЗапросаАд.Получить(0).Поле9));
// Поле10=СокрЛП(строка(РезЗапросаАд.Получить(0).Поле10));
Адрес = Индекс + "," + Регион + "," + Район + "," + Город + "," + НаселённыйПункт + "," + Улица + "," + Дом + "," + Корпус + "," + Квартира;
Иначе
Сигнал();
Сообщить("Для сотрудника " + ВРег(ДанныеСтр.Физлицо) + " не заполнены поля проживания!");
КонецЕсли;
КонецЦикла;"
Данный код выдаёт, что далеко не у всех сотурдников в моей таблице "Сотрудники" есть адрес.
Хотя они есть у всех. Я специально проверял тех, адрес которых этим кодом не находится, и видел у них заполненный "Адрес по прописке физ. лица". К слову сказать, у меня на 1С:Предприятие 8.1 стоит демо база.
А у тех, чей адрес этот код находил, адрес брался тоже именно из "Адрес по прописке физ. лица".
Подскажите, в чём здесь ошибка."
21.12.2010
11:30
#3
"Я выгружаю зарплатную ведомость в обычный текстовый файл.
Просто каждого сотрудника с суммой и со всеми его данными через определённый разделитель записываю в файл в отдельную строку.
Я беру его ФИО, паспортные данные, дату рождения, ИНН и т.д.
С этими данными проблем нет, у каждого сотрудника они достаются (кстати, они также в этом цикле берутся такими же запросами, я их просто вырезал, чтобы место сэкономить).
Кроме этих полей мне нужно у каждого сотрудника достать адрес по прописке (индекс, регион, район, город, насел. пункт, улица, дом, корпус, квартира). И вот поле адрес то достаётся у одних сотрудников, то не достаётся у других.
Т.е. условие после этого запроса:
"Если РезЗапросаАд.Количество()>0 тогда"
то выполняется для одних, то не выполняется для других (соответственно, если не выполняется, переходит в "иначе" и выдаёт сообщение "Для сотрудника ... не заполнены поля проживания!").
Хотя я проверяю адреса и у первых, и у вторых и вижу у обоих заполненное поле "Адрес по прописке физ. лица".
Вот, например, кусок кода для получения паспортных данных по каждому сотруднику:
"ДЛЯ Cчетчик = 0 по Ведомость.Зарплата.Количество()-1 ЦИКЛ
ДанныеСтр = Ведомость.Зарплата.Получить(Cчетчик);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Физл",ДанныеСтр.Физлицо);
Запрос.Текст = "ВЫБРАТЬ
| ПаспортныеДанныеФизЛиц.ФизЛицо,
| ПаспортныеДанныеФизЛиц.ДокументСерия,
| ПаспортныеДанныеФизЛиц.ДокументНомер,
| ПаспортныеДанныеФизЛиц.ДокументКемВыдан,
| ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи
|ИЗ
| РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
|ГДЕ
| ПаспортныеДанныеФизЛиц.ФизЛицо =&Физл";
РезЗапросаП = Запрос.Выполнить().Выгрузить();
Если РезЗапросаП.Количество()>0 тогда
СерияПаспорта = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументСерия));
НомерПаспорта = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументНомер));
КемВыдан = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументКемВыдан));
ДатаВыдачи = РезЗапросаП.Получить(0).ДокументДатаВыдачи;
Иначе
Сигнал();
Сообщить("Для сотрудника "+ВРег(ДанныеСтр.Физлицо)+" не указаны Паспортные данные!");
КонецЕсли;
КонецЦикла;"
Вот этот код вполне себе нормально работает, паспортные данные по всем сотрудникам выдаёт. Все другие запросы на получение д.р., ИНН и т.д. таким же образом работают и успешно.
А с адресом почему-то проблема.
Ну я же адрес у них проверяю. Захожу в "Сотрудники", выбираю сотрудника, по которому этот запрос не нашёл адрес, нажимаю "Личные данные сотрудника" и вижу заполненное поле "Адрес по прописке физ. лица".
Может, есть какой-то другой способ достать адрес по прописке у всех сотрудников?"
Просто каждого сотрудника с суммой и со всеми его данными через определённый разделитель записываю в файл в отдельную строку.
Я беру его ФИО, паспортные данные, дату рождения, ИНН и т.д.
С этими данными проблем нет, у каждого сотрудника они достаются (кстати, они также в этом цикле берутся такими же запросами, я их просто вырезал, чтобы место сэкономить).
Кроме этих полей мне нужно у каждого сотрудника достать адрес по прописке (индекс, регион, район, город, насел. пункт, улица, дом, корпус, квартира). И вот поле адрес то достаётся у одних сотрудников, то не достаётся у других.
Т.е. условие после этого запроса:
"Если РезЗапросаАд.Количество()>0 тогда"
то выполняется для одних, то не выполняется для других (соответственно, если не выполняется, переходит в "иначе" и выдаёт сообщение "Для сотрудника ... не заполнены поля проживания!").
Хотя я проверяю адреса и у первых, и у вторых и вижу у обоих заполненное поле "Адрес по прописке физ. лица".
Вот, например, кусок кода для получения паспортных данных по каждому сотруднику:
"ДЛЯ Cчетчик = 0 по Ведомость.Зарплата.Количество()-1 ЦИКЛ
ДанныеСтр = Ведомость.Зарплата.Получить(Cчетчик);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Физл",ДанныеСтр.Физлицо);
Запрос.Текст = "ВЫБРАТЬ
| ПаспортныеДанныеФизЛиц.ФизЛицо,
| ПаспортныеДанныеФизЛиц.ДокументСерия,
| ПаспортныеДанныеФизЛиц.ДокументНомер,
| ПаспортныеДанныеФизЛиц.ДокументКемВыдан,
| ПаспортныеДанныеФизЛиц.ДокументДатаВыдачи
|ИЗ
| РегистрСведений.ПаспортныеДанныеФизЛиц КАК ПаспортныеДанныеФизЛиц
|ГДЕ
| ПаспортныеДанныеФизЛиц.ФизЛицо =&Физл";
РезЗапросаП = Запрос.Выполнить().Выгрузить();
Если РезЗапросаП.Количество()>0 тогда
СерияПаспорта = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументСерия));
НомерПаспорта = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументНомер));
КемВыдан = СокрЛП(Строка(РезЗапросаП.Получить(0).ДокументКемВыдан));
ДатаВыдачи = РезЗапросаП.Получить(0).ДокументДатаВыдачи;
Иначе
Сигнал();
Сообщить("Для сотрудника "+ВРег(ДанныеСтр.Физлицо)+" не указаны Паспортные данные!");
КонецЕсли;
КонецЦикла;"
Вот этот код вполне себе нормально работает, паспортные данные по всем сотрудникам выдаёт. Все другие запросы на получение д.р., ИНН и т.д. таким же образом работают и успешно.
А с адресом почему-то проблема.
Ну я же адрес у них проверяю. Захожу в "Сотрудники", выбираю сотрудника, по которому этот запрос не нашёл адрес, нажимаю "Личные данные сотрудника" и вижу заполненное поле "Адрес по прописке физ. лица".
Может, есть какой-то другой способ достать адрес по прописке у всех сотрудников?"
22.12.2010
12:22
#5
Совет: возьмите сотрудника, по которому у вас не срабатывает и выполните запрос в КонсолиЗапросов.
Результат должен быть пусто, если это так - уберите условия
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид
И посмотрите, что написано в Тип и Вид.
Может там не ФактАдресФизЛица, а скажем ЮрАдресФизЛица.
В общем я думаю, что проблема в условиях, а не имея базы подсказать сложно. В принципе зарос рабочий, а если так и данных нет - смотрите условия.
Результат должен быть пусто, если это так - уберите условия
| И КонтактнаяИнформация.Тип = &Тип
| И КонтактнаяИнформация.Вид = &Вид
И посмотрите, что написано в Тип и Вид.
Может там не ФактАдресФизЛица, а скажем ЮрАдресФизЛица.
В общем я думаю, что проблема в условиях, а не имея базы подсказать сложно. В принципе зарос рабочий, а если так и данных нет - смотрите условия.
Выразить целую часть от деления. 1С 8.1.14.72помогите как настроить накопительные дисконтные карты в трех магазинах
Читают тему
(гостей: 1)