8.х Помогите с запросом для печатной формы

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем AlekseiJa, 30 мар 2011.

  1. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Добрый день. Создал документ "АнкетаСлушателя", в табличную часть выбераем сотридников. В печатную форму нужно вывести стаж работы на предприятии по данным сотрудникам.
    Написал запрос. Через консоль отчетов данный запрос выводит необходимые мне данные, а в документе не хочет.
    При отладке через "Вычеслить вырожение" выдает
    "ВидСтажа Ошибка чтения значения"
    "ДатаОтсчета Ошибка чтения значения"
    "РазмерДней Ошибка чтения значения"
    "РазмерМесяцев Ошибка чтения значения"
    "Сотрудник Ошибка чтения значения".
    Подскажите где я накосячил?

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

    ZlodeyM Опытный в 1С

    Регистрация:
    6 окт 2007
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    а параметры где? Не проще ли сотрудников передавать параметром в запрос, а потом перезаполнять ТЧ?
  3. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    В том то и дело что я не знаю какие параметры указать...
  4. ZlodeyM
    Offline

    ZlodeyM Опытный в 1С

    Регистрация:
    6 окт 2007
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    как то так

    Код:
    Счетчик=ТабличнаяЧасть.Количество()-1;
    Сотр=Новый СписокЗначений;
    для сч=0 по Счетчик цикл
    Сотр.Добавить(ТабличнаяЧасть.Получить(Сч).Сотрудник);
    конеццикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |    ФизическиеЛицаСтажи.ВидСтажа,
    |    ФизическиеЛицаСтажи.ДатаОтсчета,
    |    ФизическиеЛицаСтажи.РазмерМесяцев,
    |    ФизическиеЛицаСтажи.РазмерДней
    |ИЗ
    |    Документ.АнкетаСлушателя.ТабличнаяЧасть КАК АнкетаСлушателяТабличнаяЧасть
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.Стажи КАК ФизическиеЛицаСтажи
    |        ПО АнкетаСлушателяТабличнаяЧасть.Сотрудник.Физлицо = ФизическиеЛицаСтажи.Ссылка
    где 
    АнкетаСлушателяТабличнаяЧасть.Сотрудник в (&Сотр)";
    
    Запрос.УстановитьПараметр("Сотр", Сотр);
    
    Результат = Запрос.Выполнить();
    Выборка=Результат.Выбрать();
    
    
  5. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Данной процедурой определяет сотрудников, но ВидСтажа, ДатаОтсчета, РазмерМесяцев, РазмерДней не определяет.
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Какой процедурой???
  7. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Код:
    Счетчик=ТабличнаяЧасть.Количество()-1;
    Сотр=Новый СписокЗначений;
    для сч=0 по Счетчик цикл
    Сотр.Добавить(ТабличнаяЧасть.Получить(Сч).Сотрудник);
    конеццикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |    ФизическиеЛицаСтажи.ВидСтажа,
    |    ФизическиеЛицаСтажи.ДатаОтсчета,
    |    ФизическиеЛицаСтажи.РазмерМесяцев,
    |    ФизическиеЛицаСтажи.РазмерДней
    |ИЗ
    |    Документ.АнкетаСлушателя.ТабличнаяЧасть КАК АнкетаСлушателяТабличнаяЧасть
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.Стажи КАК ФизическиеЛицаСтажи
    |        ПО АнкетаСлушателяТабличнаяЧасть.Сотрудник.Физлицо = ФизическиеЛицаСтажи.Ссылка
    где 
    АнкетаСлушателяТабличнаяЧасть.Сотрудник в (&Сотр)";
    
    Запрос.УстановитьПараметр("Сотр", Сотр);
    
    Результат = Запрос.Выполнить();
    Выборка=Результат.Выбрать();
    
  8. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    А где код, который запрос обрабатывает? И кстати, табличные части доков обычно вложенным запросом перебираются.
  9. ZlodeyM
    Offline

    ZlodeyM Опытный в 1С

    Регистрация:
    6 окт 2007
    Сообщения:
    202
    Симпатии:
    0
    Баллы:
    26
    я и не писал вывод стажа из запроса. Процедурка только выбирает для сотрудников из ТЧ стаж и все. Дальнейшую обработку писать надо. Про вложенный запрос не знал(
  10. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Код:
    ОбластьОбщийСтаж = Макет.ПолучитьОбласть("ОбщийСтаж");
    Счетчик=ТабличнаяЧасть.Количество()-1;
    Сотр=Новый СписокЗначений;
    для сч=0 по Счетчик цикл
    Сотр.Добавить(ТабличнаяЧасть.Получить(Сч).Сотрудник);
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |    ФизическиеЛицаСтажи.ВидСтажа,
    |    ФизическиеЛицаСтажи.ДатаОтсчета,
    |    ФизическиеЛицаСтажи.РазмерМесяцев,
    |    ФизическиеЛицаСтажи.РазмерДней
    |ИЗ
    |    Документ.АнкетаСлушателя.ТабличнаяЧасть КАК АнкетаСлушателяТабличнаяЧасть
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица.Стажи КАК ФизическиеЛицаСтажи
    |        ПО АнкетаСлушателяТабличнаяЧасть.Сотрудник.Физлицо = ФизическиеЛицаСтажи.Ссылка
    |Где 
    |     АнкетаСлушателяТабличнаяЧасть.Сотрудник в (&Сотр)";
    
    Запрос.УстановитьПараметр("Сотр", Сотр);
    
    Результат = Запрос.Выполнить();
    Выборка=Результат.Выбрать();
    
    Если Выборка.ДатаОтсчета <> Null тогда
    ДатаОтсчета = Выборка.ДатаОтсчета - Выборка.РазмерМесяцев * 30 * 86400 - Выборка.РазмерДней * 86400;
    Иначе ДатаОтсчета = Null;
    КонецЕсли;
    
    Если ДатаОтсчета <> Null тогда
    
    Лет = 0;
    Месяцев = 0;
    Дней = 0;
    ОбщегоНазначения.РазобратьРазностьДат(ДатаОтсчета, Лет, Месяцев, Дней);
    
    СтрокаЛет = "";
    Если Лет = 1 тогда
    СтрокаЛет = " год";
    ИначеЕсли Лет > 1 и Лет < 5 тогда
    СтрокаЛет = " года";
    ИначеЕсли Лет >= 5 и Лет < 20 тогда
    СтрокаЛет = " лет";
    ИначеЕсли Лет >= 5 и Лет <= 20 тогда
    СтрокаЛет = " лет";
    Иначе 
    Если Лет%10 = 1 тогда
    СтрокаЛет = " год";
    ИначеЕсли Лет%10 > 1 и Лет%10 < 5 тогда
    СтрокаЛет = " года";
    ИначеЕсли Лет%10 >= 5 и Лет%10 < 10 или Лет%10 = 0 тогда
    СтрокаЛет = " лет";
    Иначе
    СтрокаЛет = " лет";
    КонецЕсли;
    КонецЕсли;
    ОбластьОбщийСтаж.Параметры.СтажВТаблицу = "" + ?(Лет = 0 , "", "" + Лет + СтрокаЛет + "" + ?(Месяцев = 0, "", "" + Месяцев + " мес" +"") + Дней + " дн";
    
    КонецЕсли;
    ТабДок.Вывести(ОбластьОбщийСтаж);
    
    
    
    
    При отладке в "Вычеслить выражение" по Выборка выдает "ДатаОтсчет - Ошибка чтения значения "
  11. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Не могли бы Вы пояснить каким вложеным запросом это сделать?
  12. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    С этим разобрался, сделал по другому:

    Код:
    Функция ВыбратьСтажиРаботника1(Физлицо, ДопУсловие = Неопределено, ВидСтажа = Неопределено) Экспорт
    
    Запрос = Новый Запрос;
    ТекстЗапроса = 
    
    "ВЫБРАТЬ
    |	ФизическиеЛицаСтажи.ВидСтажа,
    |	ФизическиеЛицаСтажи.ВидСтажа.Наименование КАК Наименование,
    |	ФизическиеЛицаСтажи.ДатаОтсчета,
    |	ФизическиеЛицаСтажи.РазмерМесяцев,
    |	ФизическиеЛицаСтажи.РазмерДней
    |ИЗ
    |	Справочник.ФизическиеЛица.Стажи КАК ФизическиеЛицаСтажи
    |ГДЕ
    |	ФизическиеЛицаСтажи.Ссылка = &Физлицо
    |	И ФизическиеЛицаСтажи.ДатаОтсчета <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)";
    
    Если ДопУсловие <> Неопределено Тогда
    
    ТекстЗапроса = ТекстЗапроса + " " + ДопУсловие;
    
    Если ВидСтажа = Справочники.ВидыСтажа.НепрерывныйСтаж Тогда
    
    Запрос.УстановитьПараметр("ВидСтажа", ВидСтажа);
    ИначеЕсли ВидСтажа <> Неопределено Тогда
    Запрос.УстановитьПараметр("ВидСтажа", ВидСтажа);
    КонецЕсли; 
    
    КонецЕсли; 
    
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Физлицо", Физлицо);
    Возврат Запрос.Выполнить().Выбрать()
    
    КонецФункции // ВыбратьСтажиРаботника()
    
    ОбластьОбщийСтаж = Макет.ПолучитьОбласть("ОбщийСтаж");
    Работник = ТекСтрокаТабличнаяЧасть.Сотрудник;
    СтруктураПоискаСотрудник = Новый Структура("Сотрудник", Работник);
    ВыводитьДатуСтажа = Ложь;	
    ВыборкаПоСтажу = ВыбратьСтажиРаботника1(Работник.Физлицо);
    
    ВыведенПроизвольныйСтаж = Ложь;
    ДатаАктуальности = ТекущаяДата();
    
    Пока ВыборкаПоСтажу.Следующий()	Цикл
    
    ДатаНачалаОтсчетаСтажа = ДобавитьМесяц(ВыборкаПоСтажу.ДатаОтсчета, - ВыборкаПоСтажу.РазмерМесяцев) - ВыборкаПоСтажу.РазмерДней*86400;
    Лет		= 0;
    Месяцев	= 0;
    Дней	= 0;
    ОбщегоНазначения.РазобратьРазностьДат(ДатаАктуальности, ДатаНачалаОтсчетаСтажа, Лет, Месяцев, Дней);
    
    Если ВыборкаПоСтажу.ВидСтажа = Справочники.ВидыСтажа.НайтиПоНаименованию("Общий медицинский стаж") Тогда
    ОбластьОбщийСтаж.Параметры.Лет		=	Лет;
    СтрокаЛет = "";
    Если Лет = 1 тогда
    СтрокаЛет = " год";
    ИначеЕсли Лет > 1 и Лет < 5 тогда
    СтрокаЛет = " года";
    ИначеЕсли Лет >= 5 и Лет < 20 тогда
    СтрокаЛет = " лет";
    ИначеЕсли Лет >= 5 и Лет <= 20 тогда
    СтрокаЛет = " лет";
    Иначе 
    Если Лет%10 = 1 тогда
    СтрокаЛет = " год";
    ИначеЕсли Лет%10 > 1 и Лет%10 < 5 тогда
    СтрокаЛет = " года";
    ИначеЕсли Лет%10 >= 5 и Лет%10 < 10 или Лет%10 = 0 тогда
    СтрокаЛет = " лет";
    Иначе
    СтрокаЛет = " лет";
    КонецЕсли;
    КонецЕсли;
    ОбластьОбщийСтаж.Параметры.СтрокаЛет = СтрокаЛет;
    
    КонецЕсли; 
    
    КонецЦикла;		
    ТабДок.Вывести(ОбластьОбщийСтаж);  		
    
    
    

    Если можно объясните как сделать проще вывод данных по сотруднику из регистра сведений, на примере данной процедуры

    Код:
    ОбластьКатегория = Макет.ПолучитьОбласть("Категория");
    ОбластьКатегория.Параметры.Категория = "";
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |	АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |	ВложенныйЗапрос.КвалификацияПерсонала
    |ИЗ
    |	Документ.АнкетаСлушателя.ТабличнаяЧасть КАК АнкетаСлушателяТабличнаяЧасть
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |			КвалификацииПерсоналаСрезПоследних.Сотрудник КАК Сотрудник,
    |			КвалификацииПерсоналаСрезПоследних.КвалификацияПерсонала КАК КвалификацияПерсонала
    |		ИЗ
    |			РегистрСведений.КвалификацииПерсонала.СрезПоследних КАК КвалификацииПерсоналаСрезПоследних) КАК ВложенныйЗапрос
    |		ПО АнкетаСлушателяТабличнаяЧасть.Сотрудник = ВложенныйЗапрос.Сотрудник";
    Результат = Запрос.Выполнить();
    Выборка=Результат.Выбрать(); 
    ОбластьКатегория.Параметры.Категория = Выборка.КвалификацияПерсонала;
    ТабДок.Вывести(ОбластьКатегория);
    
    
  13. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Группировку по сотруднику в запрос не пробывали добавлять?
  14. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    В таком виде?

    Код:
    Запрос.Текст = "ВЫБРАТЬ
    |	АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |	ВложенныйЗапрос.КвалификацияПерсонала
    |ИЗ
    |	Документ.АнкетаСлушателя.ТабличнаяЧасть КАК АнкетаСлушателяТабличнаяЧасть
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |			КвалификацииПерсоналаСрезПоследних.Сотрудник КАК Сотрудник,
    |			КвалификацииПерсоналаСрезПоследних.КвалификацияПерсонала КАК КвалификацияПерсонала
    |		ИЗ
    |			РегистрСведений.КвалификацииПерсонала.СрезПоследних КАК КвалификацииПерсоналаСрезПоследних) КАК ВложенныйЗапрос
    |		ПО АнкетаСлушателяТабличнаяЧасть.Сотрудник = ВложенныйЗапрос.Сотрудник
    |
    |СГРУППИРОВАТЬ ПО
    |	АнкетаСлушателяТабличнаяЧасть.Сотрудник,
    |	ВложенныйЗапрос.КвалификацияПерсонала";
    
  15. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    ну да, хотя он может и ругаться:)
  16. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Такой вариант не подходит:
    Выборка ВыборкаИзРезультатаЗапроса
    КвалификацияПерсонала Ошибка чтения значения
    Сотрудник Ошибка чтения значения
  17. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    У меня просто нет вашей конфы, чтоб подробнее разобраться.
  18. TopicStarter Overlay
    AlekseiJa
    Offline

    AlekseiJa

    Регистрация:
    12 май 2007
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Конфа: Зарплата бюджетного учреждения.
    В ней добавлен регистр сведений в котором содержатся Измерение - сотрудник и ресурс - КвалификацияПерсонала.
    КвалификацияПерсонала - Перечисления.КвалификацияПерсонала.Высшая, Перечисления.КвалификацияПерсонала.ВтораяКатегория, Перечисления.КвалификацияПерсонала.ПерваяКатегория.
    Нужно вывести в печатную форму какая КвалификацияПерсонала у каждого сотрудника.

Поделиться этой страницей