1С:Предпоиятие 8.1 - в реестре документов при выборе даты ошибка
18.08.2009
09:34
#1
"{Отчет.РеестрДокументов.Форма.ФормаЗаполнения(769)}: Ошибка при вызове метода контекста (Выполнить): {(28, 2)}: Ожидается выражение ")"
<>>ГДЕ
Запрос.Выполнить();
Если не выбирать дату - формирует отчет. Если назначить какую-нибудь дату - ошибка
Куда я только не ставила эту скобку
бесполезно. Что я делаю не так?
Процедура ФормированиеЗапросаДобавитьДокумент(Запрос, МетаданныеДокумента, ВидДокумента, МассивСвойств, ФлагЕстьУсловия)
Если НЕ ВРЕГ(ВидДокумента) =ВРЕГ("ЗаказПокупателя") Тогда
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Док.Ссылка,
| Док.Дата,
| Док.Номер,
| """"" + МетаданныеДокумента.Представление() + """"" КАК ВидДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВидОперации", МетаданныеДокумента), "Док.ВидОперации", "NULL") + " КАК ВидОперации,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента), "Док.Организация", "NULL") + " КАК Организация,
| ";
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизитаСклад = "СкладОрдер";
Иначе
ИмяРеквизитаСклад = "Склад";
КонецЕсли;
Запрос.Текст = Запрос.Текст + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", МетаданныеДокумента), "Док.Контрагент", "NULL") + " КАК Контрагент,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизитаСклад, МетаданныеДокумента), "Док."+ИмяРеквизитаСклад, "NULL") + " КАК Склад,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("СуммаДокумента", МетаданныеДокумента), "Док.СуммаДокумента", "NULL") + " КАК СуммаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента), "Док.ВалютаДокумента", "NULL") + " КАК ВалютаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Ответственный", МетаданныеДокумента), "Док.Ответственный", "NULL") + " КАК Ответственный ,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Количество", МетаданныеДокумента), "Док.Количество", "NULL") + " КАК Количество
|";
Запрос.Текст = Запрос.Текст + " ИЗ
| Документ." + ВидДокумента + " КАК Док
|";
Иначе
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Док.Ссылка,
| Док.Дата,
| Док.Номер,
| """"" + МетаданныеДокумента.Представление() + """"" КАК ВидДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВидОперации", МетаданныеДокумента), "Док.ВидОперации", "NULL") + " КАК ВидОперации,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента), "Док.Организация", "NULL") + " КАК Организация,
| ";
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизитаСклад = "СкладОрдер";
Иначе
ИмяРеквизитаСклад = "Склад";
КонецЕсли;
Запрос.Текст = Запрос.Текст + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", МетаданныеДокумента), "Док.Контрагент", "NULL") + " КАК Контрагент,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизитаСклад, МетаданныеДокумента), "Док."+ИмяРеквизитаСклад, "NULL") + " КАК Склад,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("СуммаДокумента", МетаданныеДокумента), "Док.СуммаДокумента", "NULL") + " КАК СуммаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента), "Док.ВалютаДокумента", "NULL") + " КАК ВалютаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Ответственный", МетаданныеДокумента), "Док.Ответственный", "NULL") + " КАК Ответственный ,
|Сумма (ТабЧасть.Количество) Как Количество
|";
Запрос.Текст = Запрос.Текст + " ИЗ
| Документ." + ВидДокумента + " КАК Док
|";
Запрос.Текст = Запрос.Текст + " соединение
| Документ.ЗаказПокупателя.Товары как ТабЧасть
| По Док.Ссылка = ТабЧасть.Ссылка
| сгруппировать по
|Док.Ссылка,Док.Номер,Док.Дата, Док.СуммаДокумента,Док.Организация,Док.Контрагент
|";
КонецЕсли;
ФлагЕстьУсловия = Ложь;
Если МассивСвойств.Количество() > 0 Тогда
ДобавитьФильтрыПоСвойствам(Запрос, МассивСвойств);
КонецЕсли;
ЕстьФильтры = ДобавитьФильтрыПоДокументу(Запрос, ВидДокумента, МассивСвойств, ФлагЕстьУсловия);
Если Не ДатаНач = '00010101000000' Тогда
Запрос.Текст = Запрос.Текст + ?(ЕстьФильтры, " И ", " ГДЕ ") + "
|Док.Дата >= &ДатаНач
| ";
ЕстьФильтры = Истина;
КонецЕсли;
Если Не ДатаКон = '00010101000000' Тогда
Запрос.Текст = Запрос.Текст + ?(ЕстьФильтры, " И ", " ГДЕ ") + "
|Док.Дата <= &ДатаКон
| ";
ЕстьФильтры = Истина;
КонецЕсли;
КонецПроцедуры // ФормированиеЗапросаДобавитьДокумент()
// Проверить, нужно ли исключить документ в тексте запроса
//
// Параметры
// МетаданныеДокумента
//
// Возвращаемое значение:
// Булево – Истина - документ нужно исключить, Ложь - нет
//
Функция ИсключитьДокумент(МетаданныеДокумента)
Для Каждого СтрокаОтбораДляПеребора Из Отбор Цикл
Если НЕ СтрокаОтбораДляПеребора.Использование Тогда
Продолжить;
КонецЕсли;
Если НЕ СтрокаОтбораДляПеребора.ИмяОтбора = "ДокументОтчета"
И Не СтрокаОтбораДляПеребора.ИмяОтбора = "Проведен"
И Не СтрокаОтбораДляПеребора.ИмяОтбора = "ПометкаУдаления"
И НЕ СтрокаОтбораДляПеребора.ИмяОтбора = "Категория"
И Найти(СтрокаОтбораДляПеребора.ПредставлениеОтбора, "(свойство документов)") = 0 Тогда
Если СтрокаОтбораДляПеребора.ИмяОтбора = "Склад" Тогда
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизита = "СкладОрдер";
Иначе
ИмяРеквизита = "Склад";
КонецЕсли;
Иначе
ИмяРеквизита = СтрокаОтбораДляПеребора.ИмяОтбора;
КонецЕсли;
Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции // ИсключитьДокумент()
// Добавляет в запрос необходимые виды документов
//
// Параметры:
// Запрос - запрос в который добавляется указанный вид документа
// МассивВидовДокументов - массив содержащий виды документов (строкой) которые надо добавить в запрос
// МассивСвойств - массив свойств документов по которым надо установить фильтр
// СтрКатегорий - строка таблицы фильтров в которой указаны фильтры по категории документов
//
Функция ДобавитьДокументВЗапрос(масЗапросов, МассивВидовДокументов, МассивСвойств, СтрокаОтбора)
Перем ЕстьФильтры;
Перем ФлагЕстьУсловия;
ФлагЕстьКатегории = Не СтрокаОтбора = Неопределено;
текНомерТаблицы = 0;
текЗапрос = Неопределено;
максТаблиц = 1;
К1 = -1;
ДобавлятьОкончаниеТекстаЗапроса = Ложь;
Для Каждого ВидДокумента Из МассивВидовДокументов Цикл
//Здесь мы должны понять, не установлен ли фильтр по какому-либо реквизиту, которого нет у документа
//указанного вида. Если установлен, то мы просто не включаем документ в запрос, исключая его из отчета
МетаданныеДокумента = Метаданные.Документы[ВидДокумента];
Если ИсключитьДокумент(МетаданныеДокумента) Тогда
Продолжить;
КонецЕсли;
Если текНомерТаблицы = 0 Тогда
текЗапрос = Новый Запрос;
масЗапросов.Добавить(текЗапрос);
ФормированиеЗапросаНачало(текЗапрос);
ДобавлятьОкончаниеТекстаЗапроса = Истина;
Иначе
текЗапрос.Текст = текЗапрос.Текст + "
|ОБЪЕДИНИТЬ ВСЕ";
КонецЕсли;
текНомерТаблицы = текНомерТаблицы + 1;
ФормированиеЗапросаДобавитьДокумент(текЗапрос, МетаданныеДокумента, ВидДокумента, МассивСвойств, ФлагЕстьУсловия);
Если текНомерТаблицы = максТаблиц Тогда
текНомерТаблицы = 0;
ФормированиеЗапросаОкончание(текЗапрос, ФлагЕстьКатегории, СтрокаОтбора);
ДобавлятьОкончаниеТекстаЗапроса = Ложь;
КонецЕсли;
КонецЦикла;
Если текЗапрос = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ДобавлятьОкончаниеТекстаЗапроса Тогда
ФормированиеЗапросаОкончание(текЗапрос, ФлагЕстьКатегории, СтрокаОтбора);
КонецЕсли;
Возврат Истина;
КонецФункции // ДобавитьДокументВЗапрос()
// Обработка выбранных документов
//
// Параметры:
// Нет.
//
Процедура ВидОбработкиДокументы() Экспорт
Перем МассивСвойств;
Перем МассивВидовДокументов;
Перем Индекс;
Перем СтрФильтров;
Перем СтрКатегорий;
МассивСвойств = Новый Массив;
СтрКатегорий = Неопределено;
Для Каждого К Из Отбор Цикл
Если НЕ К.Использование Тогда
Продолжить;
КонецЕсли;
СтрФильтров = мТаблицаФильтры.Найти(К.ИмяОтбора, "ИмяПоля");
// На случай если не выбран фильтр
Если СтрФильтров = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Не СтрФильтров.Свойство = Неопределено Тогда
МассивСвойств.Добавить(К);
КонецЕсли;
Если К.ИмяОтбора = "Категория" Тогда
СтрКатегорий = К;
КонецЕсли;
// Проверим на заполненность отбора по виду документа
Если К.ИмяОтбора = "ДокументОтчета" Тогда
Если ТипЗнч(К.ЗначениеОтбора) = Тип("СписокЗначений")
И К.ЗначениеОтбора.Количество()=0 Тогда
Предупреждение("Надо обязательно указать значение отбора для отбора по виду документа!", 60);
Возврат;
Иначе
Если НЕ ЗначениеЗаполнено(К.ЗначениеОтбора) Тогда
Предупреждение("Надо обязательно указать значение отбора для отбора по виду документа!", 60);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
МассивВидовДокументов = Новый Массив;
Индекс = 0;
СтрокаОтбора = Отбор.Найти("ДокументОтчета", "ИмяОтбора");
Если СтрокаОтбора = Неопределено Тогда
Для Каждого К Из мСписокВидовДокументов Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
Иначе
Если СтрокаОтбора.Использование Тогда
Если СтрокаОтбора.ВидСравнения = ВидСравнения.НеРавно
ИЛИ СтрокаОтбора.ВидСравнения = ВидСравнения.НеВСписке Тогда
СписокИсключений = Новый СписокЗначений;
Если ТипЗнч(СтрокаОтбора.ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
СписокИсключений.Добавить(СтрокаОтбора.ЗначениеОтбора);
Иначе
Для Каждого К Из СтрокаОтбора.ЗначениеОтбора Цикл
СписокИсключений.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
Для Каждого К Из мСписокВидовДокументов Цикл
Если СписокИсключений.НайтиПоЗначению(К.Значение) = Неопределено Тогда
МассивВидовДокументов.Добавить(К.Значение);
КонецЕсли;
КонецЦикла;
Иначе
Если ТипЗнч(СтрокаОтбора.ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
МассивВидовДокументов.Добавить(СтрокаОтбора.ЗначениеОтбора);
Иначе
Для Каждого К Из СтрокаОтбора.ЗначениеОтбора Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Иначе
Для Каждого К Из мСписокВидовДокументов Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
масЗапросов = Новый Массив;
Если НЕ ДобавитьДокументВЗапрос(масЗапросов, МассивВидовДокументов, МассивСвойств, СтрКатегорий) Тогда
Предупреждение("Установлены фильтры по реквизитам, которых нет в выбранных видах документов!
|Отчет не может быть сформирован.");
возврат;
КонецЕсли;
Колво = масЗапросов.Количество();
Если Колво = 1 Тогда
// РЕЗУЛЬТАТ ПОЛУЧАЕТСЯ ОДНИМ ЗАПРОСОМ
Запрос = масЗапросов.Получить(0);
Запрос.Текст = СтрЗаменить(Запрос.Текст, Символы.ПС + "#ПоместитьВоВременнуюТаблицу#", """");
Иначе
// НУЖНО ДЕЛАТЬ НЕСКОЛЬКО ЗАПРОСОВ
масИменТаблиц = Новый Массив;
Менеджер = Новый МенеджерВременныхТаблиц;
Для Сч=1 По Колво Цикл
Запрос = масЗапросов.Получить(Сч-1);
ИмяТаблицы = "ВременнаяТаблица" + Формат(Сч, "ЧГ=0");
ТекстЗапроса = Запрос.Текст;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.ПС + "#ПоместитьВоВременнуюТаблицу#", Символы.ПС + "Поместить " + ИмяТаблицы);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.ПС + "УПОРЯДОЧИТЬ ПО Дата, Ссылка", Символы.ПС + "ИНДЕКСИРОВАТЬ ПО Дата, Ссылка");
Запрос.Текст = ТекстЗапроса;
масИменТаблиц.Добавить(ИмяТаблицы);
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.Выполнить();
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ
| ОтобранныеДокументы.*
|ИЗ (";
Сч = 0;
Для Каждого ИмяТаблицы Из масИменТаблиц Цикл
ТекстЗапроса = ТекстЗапроса + ?(Сч=0, """", "
|ОБЪЕДИНИТЬ ВСЕ") + "
|ВЫБРАТЬ " + ИмяТаблицы + ".* ИЗ " + ИмяТаблицы;
Сч = Сч + 1;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + ") КАК ОтобранныеДокументы
|УПОРЯДОЧИТЬ ПО Дата, Ссылка";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.МенеджерВременныхТаблиц = Менеджер;
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ПечатьРеестра(Выборка);
КонецПроцедуры // ВидОбработкиДокументы()
"
<>>ГДЕ
Запрос.Выполнить();
Если не выбирать дату - формирует отчет. Если назначить какую-нибудь дату - ошибка
Куда я только не ставила эту скобку
Процедура ФормированиеЗапросаДобавитьДокумент(Запрос, МетаданныеДокумента, ВидДокумента, МассивСвойств, ФлагЕстьУсловия)
Если НЕ ВРЕГ(ВидДокумента) =ВРЕГ("ЗаказПокупателя") Тогда
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Док.Ссылка,
| Док.Дата,
| Док.Номер,
| """"" + МетаданныеДокумента.Представление() + """"" КАК ВидДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВидОперации", МетаданныеДокумента), "Док.ВидОперации", "NULL") + " КАК ВидОперации,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента), "Док.Организация", "NULL") + " КАК Организация,
| ";
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизитаСклад = "СкладОрдер";
Иначе
ИмяРеквизитаСклад = "Склад";
КонецЕсли;
Запрос.Текст = Запрос.Текст + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", МетаданныеДокумента), "Док.Контрагент", "NULL") + " КАК Контрагент,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизитаСклад, МетаданныеДокумента), "Док."+ИмяРеквизитаСклад, "NULL") + " КАК Склад,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("СуммаДокумента", МетаданныеДокумента), "Док.СуммаДокумента", "NULL") + " КАК СуммаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента), "Док.ВалютаДокумента", "NULL") + " КАК ВалютаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Ответственный", МетаданныеДокумента), "Док.Ответственный", "NULL") + " КАК Ответственный ,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Количество", МетаданныеДокумента), "Док.Количество", "NULL") + " КАК Количество
|";
Запрос.Текст = Запрос.Текст + " ИЗ
| Документ." + ВидДокумента + " КАК Док
|";
Иначе
Запрос.Текст = Запрос.Текст + "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Док.Ссылка,
| Док.Дата,
| Док.Номер,
| """"" + МетаданныеДокумента.Представление() + """"" КАК ВидДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВидОперации", МетаданныеДокумента), "Док.ВидОперации", "NULL") + " КАК ВидОперации,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента), "Док.Организация", "NULL") + " КАК Организация,
| ";
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизитаСклад = "СкладОрдер";
Иначе
ИмяРеквизитаСклад = "Склад";
КонецЕсли;
Запрос.Текст = Запрос.Текст + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", МетаданныеДокумента), "Док.Контрагент", "NULL") + " КАК Контрагент,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизитаСклад, МетаданныеДокумента), "Док."+ИмяРеквизитаСклад, "NULL") + " КАК Склад,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("СуммаДокумента", МетаданныеДокумента), "Док.СуммаДокумента", "NULL") + " КАК СуммаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента), "Док.ВалютаДокумента", "NULL") + " КАК ВалютаДокумента,
| " + ?(ОбщегоНазначения.ЕстьРеквизитДокумента("Ответственный", МетаданныеДокумента), "Док.Ответственный", "NULL") + " КАК Ответственный ,
|Сумма (ТабЧасть.Количество) Как Количество
|";
Запрос.Текст = Запрос.Текст + " ИЗ
| Документ." + ВидДокумента + " КАК Док
|";
Запрос.Текст = Запрос.Текст + " соединение
| Документ.ЗаказПокупателя.Товары как ТабЧасть
| По Док.Ссылка = ТабЧасть.Ссылка
| сгруппировать по
|Док.Ссылка,Док.Номер,Док.Дата, Док.СуммаДокумента,Док.Организация,Док.Контрагент
|";
КонецЕсли;
ФлагЕстьУсловия = Ложь;
Если МассивСвойств.Количество() > 0 Тогда
ДобавитьФильтрыПоСвойствам(Запрос, МассивСвойств);
КонецЕсли;
ЕстьФильтры = ДобавитьФильтрыПоДокументу(Запрос, ВидДокумента, МассивСвойств, ФлагЕстьУсловия);
Если Не ДатаНач = '00010101000000' Тогда
Запрос.Текст = Запрос.Текст + ?(ЕстьФильтры, " И ", " ГДЕ ") + "
|Док.Дата >= &ДатаНач
| ";
ЕстьФильтры = Истина;
КонецЕсли;
Если Не ДатаКон = '00010101000000' Тогда
Запрос.Текст = Запрос.Текст + ?(ЕстьФильтры, " И ", " ГДЕ ") + "
|Док.Дата <= &ДатаКон
| ";
ЕстьФильтры = Истина;
КонецЕсли;
КонецПроцедуры // ФормированиеЗапросаДобавитьДокумент()
// Проверить, нужно ли исключить документ в тексте запроса
//
// Параметры
// МетаданныеДокумента
//
// Возвращаемое значение:
// Булево – Истина - документ нужно исключить, Ложь - нет
//
Функция ИсключитьДокумент(МетаданныеДокумента)
Для Каждого СтрокаОтбораДляПеребора Из Отбор Цикл
Если НЕ СтрокаОтбораДляПеребора.Использование Тогда
Продолжить;
КонецЕсли;
Если НЕ СтрокаОтбораДляПеребора.ИмяОтбора = "ДокументОтчета"
И Не СтрокаОтбораДляПеребора.ИмяОтбора = "Проведен"
И Не СтрокаОтбораДляПеребора.ИмяОтбора = "ПометкаУдаления"
И НЕ СтрокаОтбораДляПеребора.ИмяОтбора = "Категория"
И Найти(СтрокаОтбораДляПеребора.ПредставлениеОтбора, "(свойство документов)") = 0 Тогда
Если СтрокаОтбораДляПеребора.ИмяОтбора = "Склад" Тогда
Если ОбщегоНазначения.ЕстьРеквизитДокумента("СкладОрдер", МетаданныеДокумента) Тогда
ИмяРеквизита = "СкладОрдер";
Иначе
ИмяРеквизита = "Склад";
КонецЕсли;
Иначе
ИмяРеквизита = СтрокаОтбораДляПеребора.ИмяОтбора;
КонецЕсли;
Если НЕ ОбщегоНазначения.ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции // ИсключитьДокумент()
// Добавляет в запрос необходимые виды документов
//
// Параметры:
// Запрос - запрос в который добавляется указанный вид документа
// МассивВидовДокументов - массив содержащий виды документов (строкой) которые надо добавить в запрос
// МассивСвойств - массив свойств документов по которым надо установить фильтр
// СтрКатегорий - строка таблицы фильтров в которой указаны фильтры по категории документов
//
Функция ДобавитьДокументВЗапрос(масЗапросов, МассивВидовДокументов, МассивСвойств, СтрокаОтбора)
Перем ЕстьФильтры;
Перем ФлагЕстьУсловия;
ФлагЕстьКатегории = Не СтрокаОтбора = Неопределено;
текНомерТаблицы = 0;
текЗапрос = Неопределено;
максТаблиц = 1;
К1 = -1;
ДобавлятьОкончаниеТекстаЗапроса = Ложь;
Для Каждого ВидДокумента Из МассивВидовДокументов Цикл
//Здесь мы должны понять, не установлен ли фильтр по какому-либо реквизиту, которого нет у документа
//указанного вида. Если установлен, то мы просто не включаем документ в запрос, исключая его из отчета
МетаданныеДокумента = Метаданные.Документы[ВидДокумента];
Если ИсключитьДокумент(МетаданныеДокумента) Тогда
Продолжить;
КонецЕсли;
Если текНомерТаблицы = 0 Тогда
текЗапрос = Новый Запрос;
масЗапросов.Добавить(текЗапрос);
ФормированиеЗапросаНачало(текЗапрос);
ДобавлятьОкончаниеТекстаЗапроса = Истина;
Иначе
текЗапрос.Текст = текЗапрос.Текст + "
|ОБЪЕДИНИТЬ ВСЕ";
КонецЕсли;
текНомерТаблицы = текНомерТаблицы + 1;
ФормированиеЗапросаДобавитьДокумент(текЗапрос, МетаданныеДокумента, ВидДокумента, МассивСвойств, ФлагЕстьУсловия);
Если текНомерТаблицы = максТаблиц Тогда
текНомерТаблицы = 0;
ФормированиеЗапросаОкончание(текЗапрос, ФлагЕстьКатегории, СтрокаОтбора);
ДобавлятьОкончаниеТекстаЗапроса = Ложь;
КонецЕсли;
КонецЦикла;
Если текЗапрос = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ДобавлятьОкончаниеТекстаЗапроса Тогда
ФормированиеЗапросаОкончание(текЗапрос, ФлагЕстьКатегории, СтрокаОтбора);
КонецЕсли;
Возврат Истина;
КонецФункции // ДобавитьДокументВЗапрос()
// Обработка выбранных документов
//
// Параметры:
// Нет.
//
Процедура ВидОбработкиДокументы() Экспорт
Перем МассивСвойств;
Перем МассивВидовДокументов;
Перем Индекс;
Перем СтрФильтров;
Перем СтрКатегорий;
МассивСвойств = Новый Массив;
СтрКатегорий = Неопределено;
Для Каждого К Из Отбор Цикл
Если НЕ К.Использование Тогда
Продолжить;
КонецЕсли;
СтрФильтров = мТаблицаФильтры.Найти(К.ИмяОтбора, "ИмяПоля");
// На случай если не выбран фильтр
Если СтрФильтров = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Не СтрФильтров.Свойство = Неопределено Тогда
МассивСвойств.Добавить(К);
КонецЕсли;
Если К.ИмяОтбора = "Категория" Тогда
СтрКатегорий = К;
КонецЕсли;
// Проверим на заполненность отбора по виду документа
Если К.ИмяОтбора = "ДокументОтчета" Тогда
Если ТипЗнч(К.ЗначениеОтбора) = Тип("СписокЗначений")
И К.ЗначениеОтбора.Количество()=0 Тогда
Предупреждение("Надо обязательно указать значение отбора для отбора по виду документа!", 60);
Возврат;
Иначе
Если НЕ ЗначениеЗаполнено(К.ЗначениеОтбора) Тогда
Предупреждение("Надо обязательно указать значение отбора для отбора по виду документа!", 60);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
МассивВидовДокументов = Новый Массив;
Индекс = 0;
СтрокаОтбора = Отбор.Найти("ДокументОтчета", "ИмяОтбора");
Если СтрокаОтбора = Неопределено Тогда
Для Каждого К Из мСписокВидовДокументов Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
Иначе
Если СтрокаОтбора.Использование Тогда
Если СтрокаОтбора.ВидСравнения = ВидСравнения.НеРавно
ИЛИ СтрокаОтбора.ВидСравнения = ВидСравнения.НеВСписке Тогда
СписокИсключений = Новый СписокЗначений;
Если ТипЗнч(СтрокаОтбора.ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
СписокИсключений.Добавить(СтрокаОтбора.ЗначениеОтбора);
Иначе
Для Каждого К Из СтрокаОтбора.ЗначениеОтбора Цикл
СписокИсключений.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
Для Каждого К Из мСписокВидовДокументов Цикл
Если СписокИсключений.НайтиПоЗначению(К.Значение) = Неопределено Тогда
МассивВидовДокументов.Добавить(К.Значение);
КонецЕсли;
КонецЦикла;
Иначе
Если ТипЗнч(СтрокаОтбора.ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
МассивВидовДокументов.Добавить(СтрокаОтбора.ЗначениеОтбора);
Иначе
Для Каждого К Из СтрокаОтбора.ЗначениеОтбора Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Иначе
Для Каждого К Из мСписокВидовДокументов Цикл
МассивВидовДокументов.Добавить(К.Значение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
масЗапросов = Новый Массив;
Если НЕ ДобавитьДокументВЗапрос(масЗапросов, МассивВидовДокументов, МассивСвойств, СтрКатегорий) Тогда
Предупреждение("Установлены фильтры по реквизитам, которых нет в выбранных видах документов!
|Отчет не может быть сформирован.");
возврат;
КонецЕсли;
Колво = масЗапросов.Количество();
Если Колво = 1 Тогда
// РЕЗУЛЬТАТ ПОЛУЧАЕТСЯ ОДНИМ ЗАПРОСОМ
Запрос = масЗапросов.Получить(0);
Запрос.Текст = СтрЗаменить(Запрос.Текст, Символы.ПС + "#ПоместитьВоВременнуюТаблицу#", """");
Иначе
// НУЖНО ДЕЛАТЬ НЕСКОЛЬКО ЗАПРОСОВ
масИменТаблиц = Новый Массив;
Менеджер = Новый МенеджерВременныхТаблиц;
Для Сч=1 По Колво Цикл
Запрос = масЗапросов.Получить(Сч-1);
ИмяТаблицы = "ВременнаяТаблица" + Формат(Сч, "ЧГ=0");
ТекстЗапроса = Запрос.Текст;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.ПС + "#ПоместитьВоВременнуюТаблицу#", Символы.ПС + "Поместить " + ИмяТаблицы);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Символы.ПС + "УПОРЯДОЧИТЬ ПО Дата, Ссылка", Символы.ПС + "ИНДЕКСИРОВАТЬ ПО Дата, Ссылка");
Запрос.Текст = ТекстЗапроса;
масИменТаблиц.Добавить(ИмяТаблицы);
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.Выполнить();
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ
| ОтобранныеДокументы.*
|ИЗ (";
Сч = 0;
Для Каждого ИмяТаблицы Из масИменТаблиц Цикл
ТекстЗапроса = ТекстЗапроса + ?(Сч=0, """", "
|ОБЪЕДИНИТЬ ВСЕ") + "
|ВЫБРАТЬ " + ИмяТаблицы + ".* ИЗ " + ИмяТаблицы;
Сч = Сч + 1;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + ") КАК ОтобранныеДокументы
|УПОРЯДОЧИТЬ ПО Дата, Ссылка";
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Запрос.МенеджерВременныхТаблиц = Менеджер;
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
ПечатьРеестра(Выборка);
КонецПроцедуры // ВидОбработкиДокументы()
"
20.08.2009
08:17
#3
1С:Предприятие 8.1 (8.1.14.69)
Конфигурация "Управление торговлей", редакция 10.3 (10.3.8.9)
Конфигурация "Управление торговлей", редакция 10.3 (10.3.8.9)
20.08.2009
08:54
#4
"ЕстьФильтры = ДобавитьФильтрыПоДокументу(Запрос, ВидДокумента, МассивСвойств, ФлагЕстьУсловия);
Что за функция? Что она возвращает в вашем случае?
Подозреваю, что при проверке на дату ставится первое условие сословом И, а не ГДЕ."
Что за функция? Что она возвращает в вашем случае?
Подозреваю, что при проверке на дату ставится первое условие сословом И, а не ГДЕ."
20.08.2009
09:43
#5
1. Постарайтесь не обновлять конфигурации с обновлений, которые еще не вышли на ИТС.
2. Если нововведения или исправления ошибок жизненно необходимы вашей программе, то перед обновлением постарайтесь выждать некоторое количество дней, чтобы народ "отловил" большинство ошибок обновления и обязательно ознакомьтесь со всеми зафиксированными ошибками (в вышеуказанной конфигурации они просто "убийственны").
3. Делайте тестовое обновление на копии базы с максимальной проверкой функционала, который в основном используется в вашем управленческом учете.
2. Если нововведения или исправления ошибок жизненно необходимы вашей программе, то перед обновлением постарайтесь выждать некоторое количество дней, чтобы народ "отловил" большинство ошибок обновления и обязательно ознакомьтесь со всеми зафиксированными ошибками (в вышеуказанной конфигурации они просто "убийственны").
3. Делайте тестовое обновление на копии базы с максимальной проверкой функционала, который в основном используется в вашем управленческом учете.
20.08.2009
10:17
#6
У меня, кстати, ошибка не воспроизвелась... Укажите с какими настройками запускаете.
21.08.2009
10:52
#8
1. Обновляем с сайта users.v8.1c.ru
2. Нововведения действительно жизненнонеобходимы нашей программе.
А вот где можно увидеть "отловленные" ошибки обновления?
(в вышеуказанной конфигурации они просто "убийственны")- обновим на следующее обновление
3. Ну сдесь все как вы говорите: делаем тестовое обновление на копии базы с максимальной проверкой функционала
2. Нововведения действительно жизненнонеобходимы нашей программе.
А вот где можно увидеть "отловленные" ошибки обновления?
(в вышеуказанной конфигурации они просто "убийственны")- обновим на следующее обновление
3. Ну сдесь все как вы говорите: делаем тестовое обновление на копии базы с максимальной проверкой функционала
21.08.2009
13:12
#9
1. Если не секрет, то какие именно из четырех новшеств так уж вам необходимы? 
2. Список зарегистрированных ошибок расположен на той же странице, с которой скачиваете дистрибутив обновления (внизу).
3. Имелись ввиду настройки отчета "Реестр документов". Я пробовал выводить список всех документов за месяц, пробовал выводить с ограничением по виду "Заказ покупателя" и во всех случаях ошибка не возникала.
2. Список зарегистрированных ошибок расположен на той же странице, с которой скачиваете дистрибутив обновления (внизу).
3. Имелись ввиду настройки отчета "Реестр документов". Я пробовал выводить список всех документов за месяц, пробовал выводить с ограничением по виду "Заказ покупателя" и во всех случаях ошибка не возникала.
Предопределенные элементы Расходов будущих периодов. Работа нескольких организаций.не устраивает работа 1С v.7.7 по RDP
Читают тему
(гостей: 1)