//ZDN 28.07.20 Функция для получения объекта(-ов) базы по заданному запросу //ZDN 07.06.23 Добавляем возможность в качестве шаблона использовать уже существующий запрос //Примеры: // Запрос("ВЫБРАТЬ Первые 1 Регистратор // |ИЗ РегистрНакопления.ОплатаСчетовИЗаказов // |ГДЕ СчетНаОплату=&Заказ // | И СуммаАванса>0 // |УПОРЯДОЧИТЬ ПО Период", Новый Структура("Заказ", Строка.Заказ)); // // Запрос("Выбрать * из РегистрНакопления.ЗапасыНаСкладах.ОстаткиИОбороты(, &д, Регистратор) // |ГДЕ СтруктурнаяЕдиница=&с и Номенклатура=&н и Регистратор<>&р", // Новый Структура("д, с, н, р", // Объект.Дата, Объект.СтруктурнаяЕдиницаЗапасов, Строка.Номенклатура, Объект.Ссылка), 2); // // Запрос("Выбрать Сумма(ЕдиницаИзмерения.Вес*Количество) ИЗ Документ.ПеремещениеТоваров.Товары // |ГДЕ Ссылка = &Перемещение", Строка, 1); Функция Запрос(Запрос_ТекстЗапроса, Параметры1=Неопределено, ТипРезультата=0, Поле="", Параметры2=Неопределено, Параметры3=Неопределено) Экспорт //ZDN 07.06.23 Добавляем возможность в качестве шаблона использовать уже существующий запрос Если ТипЗнч(Запрос_ТекстЗапроса) = Тип("Запрос") Тогда //ZDN 07.06.23 Для существующего Запроса нужно заполнение с проверкой (чтобы не обнулить существующие параметры) Запрос = Новый Запрос(Запрос_ТекстЗапроса.Текст); //ZDN 21.11.23 Так же перенесём МенеджерВременныхТаблиц Запрос.МенеджерВременныхТаблиц = Запрос_ТекстЗапроса.МенеджерВременныхТаблиц; //ZDN 07.06.23 Используем заполнение через функцию Копия() //Для Каждого Параметр Из Запрос_ТекстЗапроса.Параметры Цикл Запрос.Параметры.Вставить(Параметр.Ключ, Параметр.Значение) КонецЦикла; //Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Если НЕ Запрос.Параметры.Свойство(Параметр.Имя) Тогда Запрос.Параметры.Вставить(Параметр.Имя) КонецЕсли КонецЦикла; Копия(Запрос_ТекстЗапроса.Параметры, 2, Запрос.Параметры); Копия(Запрос.НайтиПараметры(), 3, Запрос.Параметры); ИначеЕсли ТипЗнч(Запрос_ТекстЗапроса) = Тип("Строка") Тогда ТекстЗапроса = Запрос_ТекстЗапроса; //ZDN 22.03.23 Очистим текст запроса от символов перевода строки (если вызов из конфигуратора) Если Найти(ТекстЗапроса, "¶") Тогда Пока Найти(ТекстЗапроса, "¶" + Символы.Таб + Символы.Таб) Цикл ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶" + Символы.Таб + Символы.Таб, "¶" + Символы.Таб) КонецЦикла; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶" + Символы.Таб, Символы.ПС); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "¶", Символы.ПС); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "|", ""); КонецЕсли; Запрос = Новый Запрос(ТекстЗапроса); Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Запрос.Параметры.Вставить(Параметр.Имя) КонецЦикла; Иначе //ZDN 07.06.23 Возвращаем текст ошибки, если ТекстЗапроса указан неверно Возврат "Ошибка: ТекстЗапроса не указан |Вместо него можно указать уже существующий Запрос" КонецЕсли; //ZDN 07.06.23 Переносим заполнение параметров выше, так как для существующего Запроса нужно заполнение с проверкой (чтобы не обнулить существующие параметры) //ZDN 12.10.20 Теперь в качестве источника параметров можно передавать любой объект (не только структуру) //Если Параметры<>Неопределено Тогда // Для Каждого Параметр Из Параметры Цикл Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение) КонецЦикла; //КонецЕсли; //Для Каждого Параметр Из Запрос.НайтиПараметры() Цикл Запрос.Параметры.Вставить(Параметр.Имя) КонецЦикла; //ZDN 28.07.21 Для исключительных случаев добавляем ещё два источника параметров (приоритет с конца) //Если Параметры3<>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры3) КонецЕсли; //Если Параметры2<>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры2) КонецЕсли; //Если Параметры <>Неопределено Тогда ЗаполнитьЗначенияСвойств(Запрос.Параметры, Параметры ) КонецЕсли; //ZDN 04.05.22 Добавляем возможность обращаться к самому параметру через &П1, &П2, &П3 Если Параметры3<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры3) КонецЕсли; Если Параметры2<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры2) КонецЕсли; Если Параметры1<>Неопределено Тогда ЗаполнитьСвойства(Запрос.Параметры, Параметры1) КонецЕсли; ЗаполнитьЗначенияСвойств(Запрос.Параметры, Новый Структура("П1, П2, П3", Параметры1, Параметры2, Параметры3)); Результат=Запрос.Выполнить(); //---------------------------------------------------------------- Если ТипРезультата=-1 Тогда //-1 = Запрос.Выполнить() ИначеЕсли ТипРезультата=-2 Тогда //-2 = Запрос.Выполнить().Выбрать() Результат=Результат.Выбрать(); ИначеЕсли ТипРезультата=0 Тогда // 0 = Первая строка результата или указанное поле из неё Результат=Результат.Выбрать(); Результат=?(Результат.Следующий(), ?(Поле<>"", Результат[Поле], Результат), Неопределено); ИначеЕсли ТипРезультата=1 Тогда // 1 = Первое или указанное поле из первой строки результата Результат=Результат.Выбрать(); Результат=?(Результат.Следующий(), ?(Поле<>"", Результат[Поле], Результат.Получить(0)), Неопределено); ИначеЕсли ТипРезультата=2 Тогда // 2 = Таблица значений Результат=Результат.Выгрузить(); ИначеЕсли ТипРезультата=3 Тогда // 3 = Массив значений (по умолчанию выгружается первая колонка) Результат=Результат.Выгрузить(); Если Поле="" Тогда Поле=Результат.Колонки[0].Имя КонецЕсли; Результат=?(Результат.Колонки.Найти(Поле)=Неопределено, Новый Массив, Результат.ВыгрузитьКолонку(Поле)); ИначеЕсли ТипРезультата=4 Тогда // 4 = Список значений (по умолчанию выгружается первая колонка) Результат=Результат.Выгрузить(); //ZDN 07.06.23 Дорабатываем получение представления списка //Если Поле="" Тогда Поле=Результат.Колонки[0].Имя КонецЕсли; // ////ZDN 21.09.21 Добавляем определение представления //Если Результат.Колонки.Количество()>1 Тогда // Представление = ?(Результат.Колонки.Найти(Поле + "Представление")=Неопределено, Неопределено, Результат.ВыгрузитьКолонку(Поле + "Представление")); //КонецЕсли; // //Результат=?(Результат.Колонки.Найти(Поле)=Неопределено, Новый Массив, Результат.ВыгрузитьКолонку(Поле)); //СписокЗначений=Новый СписокЗначений; //СписокЗначений.ЗагрузитьЗначения(Результат); // ////ZDN 21.09.21 Заполняем представления //Если Представление <> Неопределено Тогда // ДляКаждого(СписокЗначений,, "Элемент.Представление = П1[П]; П = П + 1", 0, Представление); //КонецЕсли; СписокЗначений = Новый СписокЗначений; ПрисвоитьЕслиРавно(Поле, "", Результат.Колонки[0].Имя); Представление = ЕслиОпределено(Результат.Колонки.Найти(Поле + "Представление"), "Имя",, ?(Результат.Колонки.Количество()>1, Результат.Колонки[1].Имя, "")); Если Представление = "" Тогда СписокЗначений.ЗагрузитьЗначения(Результат.ВыгрузитьКолонку(Поле)) Иначе Для Каждого Строка ИЗ Результат Цикл СписокЗначений.Добавить(Строка[Поле], Строка[Представление]) КонецЦикла; КонецЕсли; Результат=СписокЗначений; Иначе //ZDN 07.06.23 При указании другого значения типа результата - возвращаем строку описания типов //Результат = Неопределено // * = Неопределено Результат = "Ошибка: не верно указан ТипРезультата | |-1 = Запрос.Выполнить() |-2 = Запрос.Выполнить().Выбрать() | 0 = Первая строка результата или указанное ""Поле"" из неё | 1 = Первое или указанное ""Поле"" из первой строки результата | 2 = Таблица значений | 3 = Массив значений (первая либо указанная в ""Поле"" колонка) | 4 = Список значений (первая либо указанная в ""Поле"" колонка с представлением в Поле+""Представление"" либо второй колонке)"; КонецЕсли; Возврат Результат КонецФункции //ZDN 07.10.19 Функция для присваивания в случае равенства значений //Варианты использования: // ПрисвоитьЕслиРавно(Валюта, "UAH", "") //Если Валюта="UAH" Тогда Валюта="" КонецЕсли // ПрисвоитьЕслиРавно(Валюта, "EUR", Операция, "валютная") //Если Валюта="EUR" Тогда Операция="валютная" КонецЕсли Функция ПрисвоитьЕслиРавно(ИсходныйОбъект, ОбъектСравнения, Параметр1, Параметр2=NULL, Модифицированность=Ложь) Экспорт Если ИсходныйОбъект=ОбъектСравнения Тогда Если Параметр2=NULL Тогда ИсходныйОбъект=Параметр1 Иначе Параметр1=Параметр2 КонецЕсли; Модифицирован = Истина Иначе Модифицирован = Ложь КонецЕсли; Если Модифицирован Тогда Модифицированность = Истина КонецЕсли; Возврат Модифицирован КонецФункции //ZDN 07.06.23 Скопировать структуру либо коллекцию //ZDN 01.09.19 Скопировать структуру //Примеры: // Параметры = Копия(Запрос.Параметры) // Копия параметров запроса через сериализатор // Параметры = Копия(Запрос.Параметры, 1) // Копия параметров запроса через преобразование в строку // Копия(Параметры, 2, Запрос.Параметры) // Заполнение параметров запроса из структуры (присвоение параметров недоступно) Функция Копия(Объект, Метод = 0, Результат = NULL) Экспорт Если Метод = 0 Тогда Результат = СериализаторXDTO.ПрочитатьXDTO(СериализаторXDTO.ЗаписатьXDTO(Объект)) ИначеЕсли Метод = 1 Тогда Результат = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Объект)) ИначеЕсли Метод = 2 Тогда Если Результат = NULL Тогда Результат = Новый Структура КонецЕсли; Если ТипЗнч(Объект) = Тип("Структура") Тогда Для Каждого Элемент ИЗ Объект Цикл Результат.Вставить(Элемент.Ключ, ?(ТипЗнч(Элемент.Значение)=Тип("Структура"), Копия(Элемент.Значение, Метод), Элемент.Значение)) КонецЦикла КонецЕсли ИначеЕсли Метод = 3 Тогда Если Результат = NULL Тогда Результат = Новый Структура КонецЕсли; Для Каждого Элемент ИЗ Объект Цикл Для Каждого Элемент ИЗ Объект Цикл ПолеОбъекта = ?(ТипЗнч(Объект) = Тип("Структура"), "Ключ", "Имя"); Если НЕ Результат.Свойство(Элемент[ПолеОбъекта]) Тогда Если ПолеОбъекта = "Ключ" Тогда Результат.Вставить(Элемент[ПолеОбъекта], ?(ТипЗнч(Элемент.Значение) = Тип("Структура"), Копия(Элемент.Значение, Метод), Элемент.Значение)) Иначе Результат.Вставить(Элемент[ПолеОбъекта]) КонецЕсли КонецЕсли КонецЦикла //ПолеОбъекта = ?(Элемент.Свойство("Ключ"), "Ключ", "Имя"); //ПолеЭлемента = ?(Элемент.Свойство("Ключ"), "Ключ", "Имя"); //Если НЕ Результат.Свойство(ПолеЭлемента) Тогда // Если Элемент.Свойство("Значение") Тогда // Результат.Вставить(Элемент[ПолеЭлемента], ?(ТипЗнч(Элемент.Значение) = Тип("Структура"), Копия(Элемент.Значение, Метод), Элемент.Значение) // Иначе // Результат.Вставить(Элемент[ПолеЭлемента]) // КонецЕсли //КонецЕсли КонецЦикла Иначе Возврат Неопределено КонецЕсли; Возврат Результат КонецФункции //ZDN 13.07.20 Функция для получения поля объекта либо произвольного значения, если сам объект определен //Примеры: // ЗаказПокупателя = ЕслиОпределено(Заказ, "ЗаказПокупателя") // Следующие две команды идентичны: // ЗаказПокупателя = ПолучитьНаСервере("?(П1.Заказ<>Неопределено, П1.Заказ.ЗаказПокупателя, 0)", ДокументПоступления); // ЗаказПокупателя = ПолучитьНаСервере("ЕслиОпределено(П1.Заказ, ""ЗаказПокупателя"")", ДокументПоступления); Функция ЕслиОпределено(Объект, ПолеОбъекта=NULL, ЕслиОпределено=NULL, ЕслиНеОпределено=Неопределено) Экспорт Результат = ЕслиНеОпределено; Если Объект<>Неопределено Тогда Если ПолеОбъекта=NULL Тогда Результат = ?(ЕслиОпределено=NULL, Объект, ЕслиОпределено); Иначе Результат = Вычислить("Объект." + ПолеОбъекта); КонецЕсли; КонецЕсли; Возврат Результат КонецФункции