schnibbl
Гость
|
|
« : 14-03-2005 10:48 » |
|
Пора уже рубрики открывать обучающие азам Вот теперь несколько вопросов по запросам. Ваяем простенький запрос: ПериодическийРеквизит = СоздатьОбъект("Периодический"); Табличка=СоздатьОбъект("Таблица"); Табличка.ИсходнаяТаблица("Таблоид"); запросик=СоздатьОбъект("Запрос"); ТекстЗапроса= " |ТекущийОС=справочник.ОсновныеСредства.ТекущийЭлемент; |ТекущийПлощадь=справочник.ОсновныеСредства.Площадь; |Условие ((ТекущийПлощадь>10) и (ТекущийПлощадь<200)); |Группировка ТекущийОС упорядочить по ТекущийОС.Наименование; | |" ; Если запросик.Выполнить(ТекстЗапроса) = 0 тогда Предупреждение("Запрос содержит ошибки."); иначе Пока Запросик.Группировка("ТекущийОС")=1 Цикл счетчик=счетчик+1; ПериодическийРеквизит.ИспользоватьОбъект("Площадь", запросик.ТекущийОС); Табличка.ВывестиСекцию("ВыводОС"); //Секция содержит несколько переменных - равносильно нижеследующему: //Сообщить(Запросик.ТекущийОС+" "+ Запросик.ТекущийПлощадь + " " + Запросик.ТекущийОС.Площадь); КонецЦикла; Табличка.Показать("Элементы ОС"); Сообщить("Всего элементов: "+счетчик,"!!"); конецЕсли;
Сразу следует сказать, что реквизит Площадь у справочника Основные средства - переодический. Первы вопрос - "почему": как мы видим условия вывода по площади, почему в выходной таблице присутствуют элементы площадь которых равна "0" ? все они имена групп, но при этом выводятся названия не всех групп которые есть в справочнике Второй вопрос - "почему": если меняем условие запроса на следующее: |Условие ((ТекущийОС.код>10) и (ТекущийОС.код<12)); выводит элемент (и опять имя группы с нулевыми реквизитами) теперь если |Условие (ТекущийОС.код=11); то наша 1С ничего ненаходит Третий вопрос - "как": Строчка в цикле пробегающемся по элементам запроса: ПериодическийРеквизит.ИспользоватьОбъект("Площадь", запросик.ТекущийОС); не работает - пишет "Площадь не является константой или периодическим реквизитом", на обращение Запросик.ТекущийОС.Площадь говорит что неизвестный объект. Как грамотно работать с периодическими реквизитами в условиях Запроса Четвертый вопрос - "почему": Почему неработает такая переменная в запросе группа=справочник.ОсновныеСредства.ПолноеНаименование. и/или же неработает такое обращение запросик.ТекущийОС.ПолноеНаименование ? как тогда узнавать иерархию в справочнике найденых элементов
|
|
« Последнее редактирование: 14-03-2005 10:56 от schnibbl »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #1 : 14-03-2005 16:38 » |
|
Первы вопрос - "почему"... Нужно: Группировка ТекущийОС упорядочить по ТекущийОС.Наименование без групп; Второй вопрос - "почему"... Возможно, Тип кода - строковый, тогда 11<>"11". Попробуй привести код к числу Третий вопрос - "как"... Возможно - ругается именно на группах? Добавить проверку: Если запросик.ТекущийОС.ЭтоГруппа()=0 Тогда ... КонецЕсли; Четвертый вопрос - "почему"... А если так: запросик.ТекущийОС.ПолноеНаименование () ?
|
|
|
Записан
|
|
|
|
Reskator
Гость
|
|
« Ответ #2 : 14-03-2005 22:21 » |
|
(Пояснения к 1 вопросу) Думаю следует пояснить, что у тебя должны выводиться только те группы, в которых есть элементы, удовлетворяющие условию запроса. А уважаемый Kivals абсолютно прав. (Пояснения к 4 вопросу) Думаю, что такой финт ушами не пройдет. А иерархию можно узнавать атрибутами "Родитель".
|
|
|
Записан
|
|
|
|
schnibbl
Гость
|
|
« Ответ #3 : 15-03-2005 06:56 » |
|
по поводу первого, действительно выводятся названия групп в которых найдены элементы. по поводу второго не очень понятно (код действительно строковый), веть 1С вроде как бы сама переделывает тип переменной если он не подходит, и почему тогда строку переведя в число она понимает что она больше 10 и меньше 12 но не понимает что она равна 11 вам это не кажется странным по поводу четвертого, вродебы в запросе вообще у стандартных функций по работе не должно быть скобок - ругается тогда (например текущийЭлемент без скобок пишется ? хотя в нормальном коде скобки необходимы). в общем щас попробую.. по поводу третьего вопроса обработка вылетает в процессе выполнения запроса, значит проверку надо делать в самом запросе. Следующий вопрос не могли бы вы скинуть ссылочку на какое нить очень подробное пособие по тому как запросы писать в описании встроенного языка че то я не въехал с первого раза, как-то пишу всё на интуитивном уровне, а хотелось бы правил побольше почитать...
|
|
|
Записан
|
|
|
|
Reskator
Гость
|
|
« Ответ #4 : 15-03-2005 07:53 » |
|
А на 1С вообще пишется больше по инуиции. Я по запросам сам искал какую-нибудь ссылочку, все мимо.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #5 : 15-03-2005 08:58 » |
|
Со ссылочкой туго Я разбирался сам, используя встроенный Помошник создания запросов и стандартную документацию 1С. По поводу строковых типов - не кажется, т.к. в случае "<", ">" 1С приводит строку в число, а в случае "=" - число к строке. Неравенство получается потому, что строки "11", " 11", "11 " не равны. Т.е. если у тея в конфигураторе длина кода больше 2 (например: 4), то тебе надо сравнивать не Код="11", а Код=" 11" Третий вопрос: не понял, как кострукцию типа ПериодическийРеквизит.ИспользоватьОбъект("Площадь", запросик.ТекущийОС) ты используешь в запросе? ReskatorСпасибо за пояснение про группы! Почему-то упустил его, хотя и собирался написать
|
|
« Последнее редактирование: 15-03-2005 09:00 от Kivals »
|
Записан
|
|
|
|
schnibbl
Гость
|
|
« Ответ #6 : 15-03-2005 12:24 » |
|
Конструкцию я использую не в самом запросе а в том что это запрос вернул, в моем понимании когда говорят "используеш в запросе" реч идет о том что пишется в "ТекстЗапроса =...." и вот если в ТекстЗАпроса поставить ТекущийОС=....ТекущийЭлемент() именно со скобками, то по непонятной причине 1С скажет что это ошибка. и говоря "в процессе выполнения запроса" я имел ввиду что ошибка возникает в момент запросик.Выполнить(ТекстЗапроса) а то что там дальше копаешся после того как эта штука "1" вернула, то это уж если руки есть и запрос правильно написан, что нужно то и получиш, а если как в моем случае то результаты оставляют желать лудшего
|
|
|
Записан
|
|
|
|
schnibbl
Гость
|
|
« Ответ #7 : 15-03-2005 12:30 » |
|
второй раз слышу про иерархию, узнаваемую с помощью метода "Родитель" приведите пожалуйста пример очень коротенький, который бы вытаскивал элемент справочника и данным методом передавал некой переменной значение всех групп в которые он входит (имеет ввиду аналог ПолноеНаименование ). если не сложно.
|
|
« Последнее редактирование: 15-03-2005 12:32 от schnibbl »
|
Записан
|
|
|
|
schnibbl
Гость
|
|
« Ответ #8 : 16-03-2005 08:30 » |
|
вопросик вот какой у всех так: после выполнения запроса если мы выводим на экран переменную запроса, то всё что ыводитсья после неё уходит в небытиё. Сос=СоздатьОбъект("Справочник.Основныесредства"); в обычной программе при Сообщить(Сос +" | " + "Сос.Наименование") выведет все (вместо СОС выведет сос.Наименование) если же вывести переменную запроса таким макаром " |ТекущийДоговор=справочник.Договоры.ТекущийЭлемент;" Сообщить(запросик.ТекущийДоговор +" | "+СтрДлина(запросик.ТекущийДоговор.Наименование)); выведет только саму запросик.ТекущийДоговор.Наименование а символ "|" и значение длинны съест.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #9 : 16-03-2005 09:40 » |
|
1. Так я тебе и писал, как это использовать в последующем цикле выборки результатов запроса: Если запросик.Выполнить(ТекстЗапроса) = 0 тогда Предупреждение("Запрос содержит ошибки."); иначе Пока Запросик.Группировка("ТекущийОС")=1 Цикл счетчик=счетчик+1; Если запросик.ТекущийОС.ЭтоГруппа()=0 Тогда ПериодическийРеквизит.ИспользоватьОбъект("Площадь", запросик.ТекущийОС); Табличка.ВывестиСекцию("ВыводОС"); КонецЕсли; КонецЦикла; Табличка.Показать("Элементы ОС"); Сообщить("Всего элементов: "+счетчик,"!!"); конецЕсли; 2. Например у тебя есть элемент справочника ВыбСправочник (для простоты - реквизит на форме) Пишем рекурсивную процедуру заполнения СпискаЗначений всеми группами-родителями: Процедура ДобавитьРодителя(Эл, Сп) Если Эл.Уровень()=0 Тогда Возврат; КонецЕсли; Сп.ВставитьЗначение(1, Эл.Родитель); // Для случая ближайший родитель - вверху списка //Сп.ДобавитьЗначение(Эл.Родитель); // Для случая главный родитель - вверху списка ДобавитьРодителя(Эл.Родитель, Сп); КонецПроцедуры Использование: Сп=СоздатьОбъект("СписокЗначений"); ДобавитьРодителя(ВыбСправочник, Сп); Для И1=1 По Сп.РазмерСписка() Цикл Сообщить(Сп.ПолучитьЗначение(И1)); КонецЦикла; 3. Приводи все переменные к типу Строка или используй форматирование вывода (см. с справке функции Формат() и Шаблон() ) Пример 1 (к строке): Сообщить(Строка(запросик.ТекущийДоговор)+" | "+СтрДлина(запросик.ТекущийДоговор.Наименование)); Пример 2 (Шаблон): Сообщить(Шаблон("[запросик.ТекущийДоговор]|[СтрДлина(запросик.ТекущийДоговор.Наименование)]"));
|
|
|
Записан
|
|
|
|
easily
Участник
Offline
|
|
« Ответ #10 : 04-08-2006 07:47 » |
|
Пробовала сделать как описано выше... видимо что-то упустила.. Проблема таже, как получить периодический реквизит справочника через запрос? В периодическом реквизите всего 2-а значение "ТрудовойДоговор" и "ТрудовыеОтношения". Пожалуйста ПОМОГИТЕ
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #11 : 04-08-2006 08:12 » |
|
в запросе есть строка Период с НачДата по КонДата; Периодический реквизит справочника берется на КонДата
|
|
|
Записан
|
|
|
|
easily
Участник
Offline
|
|
« Ответ #12 : 04-08-2006 08:26 » |
|
Процедура Сформировать() Перем Запрос, ТекстЗапроса; Справ = СоздатьОбъект("Справочник.Сотрудники"); ПериодическийРеквизит = СоздатьОбъект("Периодический");
//Создание объекта типа Запрос Запросик = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по КонДата; |ХарактерРаботы = Справочник.Сотрудники.ХарактерРаботы; |Группировка ХарактерРаботы; |Условие(ХарактерРаботы = Перечисление.ХарактерРаботы.ТрудовойДоговор); |"//}}ЗАПРОС ; Если запросик.Выполнить(ТекстЗапроса) = 0 тогда Предупреждение("Запрос содержит ошибки."); иначе пр = Запросик.ХарактерРаботы; Сообщить(пр); КонецЕсли;
КонецПроцедуры
|
|
|
Записан
|
|
|
|
easily
Участник
Offline
|
|
« Ответ #13 : 04-08-2006 08:27 » |
|
он выдает пустую строчку
|
|
|
Записан
|
|
|
|
easily
Участник
Offline
|
|
« Ответ #14 : 04-08-2006 08:37 » |
|
,ой забыла, он не только периодический но и перечисление
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #15 : 04-08-2006 08:37 » |
|
Попробуй так: ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с НачДата по КонДата; |ТекущийЭлемент = Справочник.Сотрудники.ТекущийЭлемент; |ХарактерРаботы = Справочник.Сотрудники.ХарактерРаботы; |Группировка ТекущийЭлемент; |Условие(ХарактерРаботы = Перечисление.ХарактерРаботы.ТрудовойДоговор); |"//}}ЗАПРОС ;
|
|
|
Записан
|
|
|
|
easily
Участник
Offline
|
|
« Ответ #16 : 04-08-2006 08:53 » |
|
Спасибо все получилось
|
|
|
Записан
|
|
|
|
vSurfer
Гость
|
|
« Ответ #17 : 21-04-2009 11:21 » |
|
Добрый день! Есть проблема с обработкой группировок в запросе 1С Предприятие 7.70.027. Конфигурация "Бухгалтерски"
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #18 : 21-04-2009 11:24 » |
|
vSurfer А можно не скромный вопрос. В чем все таки заключается проблема "с обработкой группировок в запросе". Или народ должен сам догадываться?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
vSurfer
Гость
|
|
« Ответ #19 : 21-04-2009 11:31 » |
|
Добрый день! Есть проблема с обработкой группировок в запросе 1С Предприятие 7.70.027. Конфигурация "Бухгалтерский учет" для Украины 7.70.254. Формат БД *.dbf Процедура АнализЧлВзносов() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(АнализЧлВзносов) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы Все; |ОбрабатыватьОперации все; |Обрабатывать Все; |СчетДт = Операция.Дебет.Счет; |СчетКт = Операция.Кредит.Счет; |НаименованиеКонтрКт = Операция.Кредит.Контрагенты.Наименование; |ВидКонтрагентаКт = Операция.Кредит.Контрагенты.ВидКонтрагента; |СубконтоКтКонтр = Операция.Субконто.Контрагенты.Наименование; |СубконтоКтВидКонтр = Операция.Субконто.Контрагенты.ВидКонтрагента; |ДатаОперации = Операция.ДатаОперации; |СуммаПроводки = Операция.Сумма; |Группировка СчетКт; |Группировка ВидКонтрагентаКт; |Группировка НаименованиеКонтрКт; |Группировка Месяц все ВошедшиеВЗапрос; |Группировка СуммаПроводки все ВошедшиеВЗапрос; |Условие(СчетКт = 481); |Условие(ВидКонтрагентаКт = ВыбВидыКонтрагентов); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("АнализЧлВзносов"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 1, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл //сразу не выполняется условие!!! // Заполнение полей СчетКт Таб.ВывестиСекцию("СчетКт"); Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей ВидКонтрагентаКт Таб.ВывестиСекцию("ВидКонтрагентаКт"); Пока Запрос.Группировка(3) = 1 Цикл // Заполнение полей НаименованиеКонтрКт Таб.ВывестиСекцию("НаименованиеКонтрКт"); Пока Запрос.Группировка(4) = 1 Цикл // Заполнение полей Месяц Таб.ВывестиСекцию("Месяц"); Пока Запрос.Группировка(5) = 1 Цикл // Заполнение полей СуммаПроводки Таб.ВывестиСекцию("СуммаПроводки"); КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; в цикле "Пока Запрос.Группировка(1) = 1 Цикл" сразу же "ложь" и выход из цикла. Хотя очень много проводок с кредитным счетом 481. Может, не правильно ставлю условие?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #20 : 21-04-2009 19:24 » |
|
Условие(СчетКт = 481); нужно или Условие(СчетКт.Код = ""481""); или Условие(СчетКт = СчетПоКоду(""481""));
Второй вариант предпочтительней
|
|
|
Записан
|
|
|
|
vSurfer
Гость
|
|
« Ответ #21 : 22-04-2009 06:16 » |
|
К сожалению ни первый ни второй вариант результата не дали. Может, в обработке группировки чего не так?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #22 : 22-04-2009 09:36 » |
|
Прежде чем пенять на группировку - убери все условия и попробуй сформировать
|
|
|
Записан
|
|
|
|
vSurfer
Гость
|
|
« Ответ #23 : 22-04-2009 17:00 » |
|
Убрал и тоже самое
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #24 : 24-04-2009 05:53 » |
|
Еще раз измененный текст запроса сюда
|
|
|
Записан
|
|
|
|
vSurfer
Гость
|
|
« Ответ #25 : 24-04-2009 07:25 » |
|
Процедура АнализЧлВзносов() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(АнализЧлВзносов) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы Все; |ОбрабатыватьОперации все; |Обрабатывать Все; |СчетДт = Операция.Дебет.Счет; |СчетКт = Операция.Кредит.Счет; |НаименованиеКонтрКт = Операция.Кредит.Контрагенты.Наименование; |ВидКонтрагентаКт = Операция.Кредит.Контрагенты.ВидКонтрагента; |СубконтоКтКонтр = Операция.Субконто.Контрагенты.Наименование; |СубконтоКтВидКонтр = Операция.Субконто.Контрагенты.ВидКонтрагента; |ДатаОперации = Операция.ДатаОперации; |СуммаПроводки = Операция.Сумма; |Группировка СчетКт; |Группировка ВидКонтрагентаКт; |Группировка НаименованиеКонтрКт; |Группировка Месяц все ВошедшиеВЗапрос; |Группировка СуммаПроводки все ВошедшиеВЗапрос; |Условие(СчетКт = СчетПоКоду(""481"")); // |Условие(СчетКт.Код = ""481""); |Условие(ВидКонтрагентаКт = ВыбВидыКонтрагентов); |"//}}ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("АнализЧлВзносов"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 1, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей СчетКт Таб.ВывестиСекцию("СчетКт"); Пока Запрос.Группировка(2) = 1 Цикл // Заполнение полей ВидКонтрагентаКт Таб.ВывестиСекцию("ВидКонтрагентаКт"); Пока Запрос.Группировка(3) = 1 Цикл // Заполнение полей НаименованиеКонтрКт Таб.ВывестиСекцию("НаименованиеКонтрКт"); Пока Запрос.Группировка(4) = 1 Цикл // Заполнение полей Месяц Таб.ВывестиСекцию("Месяц"); Пока Запрос.Группировка(5) = 1 Цикл // Заполнение полей СуммаПроводки Таб.ВывестиСекцию("СуммаПроводки"); КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла; КонецЦикла;
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #26 : 27-04-2009 15:18 » |
|
Вот правильный запрос (жирным выделил что я изменил): ТекстЗапроса = "//{{ЗАПРОС(АнализЧлВзносов) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы Все; |ОбрабатыватьОперации все; |Обрабатывать Все; |СчетДт = Операция.Дебет.Счет; |СчетКт = Операция.Кредит.Счет; |НаименованиеКонтрКт = Операция.Кредит.Контрагенты.Наименование; |ВидКонтрагентаКт = Операция.Кредит.Контрагенты.ВидКонтрагента; |СубконтоКтКонтр = Операция.Субконто.Контрагенты.Наименование; |СубконтоКтВидКонтр = Операция.Субконто.Контрагенты.ВидКонтрагента; |ДатаОперации = Операция.ДатаОперации; |_СуммаПроводки = Операция.Сумма; |Группировка СчетКт; |Группировка ВидКонтрагентаКт; |Группировка НаименованиеКонтрКт; |Группировка Месяц все ВошедшиеВЗапрос; |Функция СуммаПроводки = КО(_СуммаПроводки); |Условие(СчетКт = СчетПоКоду(""481"")); // |Условие(СчетКт.Код = ""481""); |Условие(ВидКонтрагентаКт = ВыбВидыКонтрагентов); |"//}}ЗАПРОС ;
т.е. атрибут СуммаПроводки нужно вычилять как функцию КО(), а не группировать по нему. В принципе в запросе пара лишних группировок: ВидКонтрагентаКт (==СубконтоКтВидКонтр) и НаименованиеКонтрКт - эти значения можно получить в цикле группировки по СубконтоКтКонтр через Запрос.СубконтоКтКонтр.Наименование (Запрос.СубконтоКтКонтр.ВидКонтрагента)
|
|
|
Записан
|
|
|
|
vSurfer
Гость
|
|
« Ответ #27 : 28-04-2009 18:37 » |
|
Спасибо большое! Уже намного лучше! Понял я одно, что ничего не понимаю. Можете ли подсказать, есть ли доходчивая литература по программированию 1С? (родные книги от конфигурации туго что-то доходит) С чего лучше начинать?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #28 : 28-04-2009 20:51 » |
|
Изучая "семерку" я пользовался родными книжками и стандартными конфигурациями: просто брал и смотрел в тексте программы как сделано то, что мне нужно. Ну и после этого экспериментировал и задавал вопросы на форумах (на первых этапах даже глупые ) Изучая "восьмерку" в прошлом году (и сейчас) пользуюсь поиском по гуглу - находится приличное количество данных.
|
|
|
Записан
|
|
|
|
|