1с передать в запрос структуру как параметр
Структуры и таблицы значений в качестве параметров процедур и функций
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Для процедур и функций (далее по тексту: функций) с параметрами типа Структура, ТаблицаЗначений, а также ДеревоЗначений (далее по тексту рекомендации для таблицы значений также относятся к дереву значений) рекомендуется придерживаться следующего подхода к разработке.
1.1 Помимо функции, которая собственно реализует прикладную функциональность (далее по тексту: вызываемая функция), необходимо определить функцию-конструктор параметров возвращающую:
• структуру-заготовку со свойствами,
• или пустую таблицу значений (дерево значений) с типизированными колонками,
которую вызывающий код должен проинициализировать конкретными значениями и передать в вызываемую функцию.
Пример вызывающего кода:
// Получаем новую структуру параметров.
ПараметрыЗаполненияЦен = ЦенообразованиеКлиентСервер.ПараметрыЗаполненияЦеныВСтрокеТЧ();
// Заполняем параметры.
ПараметрыЗаполненияЦен.Дата = Объект.Дата;
ПараметрыЗаполненияЦен.Валюта = Объект.Валюта;
// Передаем структуру параметров в прикладную функцию.
ЦенообразованиеСервер.ЗаполнитьЦеныВСтрокеТЧ(ТекущаяСтрока, ПараметрыЗаполненияЦен);
Пример функции-конструктора параметров в модуле ЦенообразованиеКлиентСервер :
// Функция-конструктор параметров процедуры ЦенообразованиеСервер.ЗаполнитьЦеныВСтрокеТЧ
// Возвращаемое значение:
// Cтруктура:
// * Дата – Дата
// * Валюта — СправочникСсылка.Валюты — ссылка пересчитываемой валюты
// * ПересчитыватьСумму — Булево
//
Функция ПараметрыЗаполненияЦеныВСтрокеТЧ() Экспорт
ПараметрыЗаполненияЦен = Новый Структура;
ПараметрыЗаполненияЦен.Вставить(«Дата»);
ПараметрыЗаполненияЦен.Вставить(«Валюта»);
ПараметрыЗаполненияЦен.Вставить(«ПересчитыватьСумму», Истина);
Возврат ПараметрыЗаполненияЦен;
1.2. Имена свойств структуры соответствуют параметрам вызываемой функции. При этом параметры со значениями по умолчанию должны быть явно проинициализированы в этой структуре.
1.3. Для создания параметра с типом ТаблицаЗначений допускается не создавать отдельную функцию-конструктор, если таблица значений является результатом каких-либо расчетов в прикладном коде. Например, есть функция, которая делает запрос к информационной базе и передает результат в другую функцию в виде таблицы значений.
1.4. При разработке программного интерфейса библиотек все функции, возвращающие значения в виде структур и таблиц значений, в том числе и функции-конструкторы, обязательно должны иметь описание типа возвращаемого значения. При этом необходимо описывать свойства структур и колонки таблиц значений, начиная с новой строки и предваряя символом *.
// Возвращаемое значение:
// ТаблицаЗначений:
// * Серия — СправочникСсылка.СерииНоменклатуры — если серия указана и она может
// использоваться с новым значением номенклатуры на указанном складе,
// то возвращается переданное значение; если нет — пустая ссылка
// * СтатусУказанияСерий — Число — если серии указываются в ТЧ «Товары», то
// возвращается рассчитанный статус, если для переданной
// номенклатуры/склада серии не используется — возвращается 0
// иначе возвращается переданный статус.
1.5. В описании структур и таблиц значений могут быть вложенные описания, при этом перед именами вложенных свойств число звездочек увеличивается: для первого уровня вложенности 2 звездочки, для второго 3 и т.д.
// Параметры:
// СведенияОбОбновлении — Структура:
// * КодАдресногоОбъекта — Структура:
// ** КодРегиона — Число — код региона (длина — 2).
// ** КодНаселенногоПункта — Число — код населенного пункта (длина — 3).
// ** КодУлицы — Число — код улицы (длина — 4).
// * Наименование — Строка
// * ОбновлениеДоступно — Булево
2. В вызывающем коде не следует инициализировать структуру параметров или добавлять в нее какие-либо другие свойства, а также изменять состав и тип колонок таблицы значений. Во избежание неоднозначности и скрытых ошибок все допустимые параметры вызываемой функции должны быть определены явно в функции-конструкторе параметров.
См. также
- Использование объектов типа Структура
- Описание процедур и функций
1с передать в запрос структуру как параметр
У справочника есть табл. часть «условия», и есть соответствие данных.
Нужно найти элемент справочника у которого реквизит «значение» равен значению в соответствии. Т.е. например в табл. «условия» есть строка :
«реквизит» — «Сумма», «условие» — «=», «значение» — «5000».
А соответствие содержит ключи «количество», «сумма», «валсумма».
Можно ли запросом победить?
Мне думалось таким образом:
«ВЫБРАТЬ
| Настройка.Ссылка,
| Настройка.ПометкаУдаления,
| Настройка.ЗагружатьДокумент,
| Настройка.Условия.(
| Ссылка,
| НомерСтроки,
| Реквизит,
| Условие,
| Значение
| )
|ИЗ
| Справочник.Настройка КАК Настройка
|ГДЕ
| (Настройка.Условия.Значение = &Соответствие[Настройка.Условия.Реквизит])»
;
но у соответствия в запросе не хочет получать значение.
пока такой возможности у платформы нет
ясно, спасибо. буду перебором справочника
В качестве параметра можно передать ТЗ,массив,список. Потом используйте В(&Параметр. Я регулярно так делаю, почему нельзя если это удобно?!
бессмысленно соответствие передавать в параметры
Ну может перебрать параметры запроса:
Для Каждого Парам из Запрос.Параметры Цикл
Если НЕ Зн = Неопределено Тогда
Вот только как то еще нужно обработать само условие (=, «в группе» и проч.)
РезультатЗапросаВСтруктуру (БСП)

Результат запроса структуру. Возвращает данные первой записи результата запроса в виде структуры.
// Возвращает данные первой записи результата запроса в виде структуры. // // Параметры: // РезультатЗапроса - РезультатЗапроса - Результат запроса, содержащий данные для обработки. // // Возвращаемое значение: // Структура - структура с результатом. // Функция РезультатЗапросаВСтруктуру(Знач РезультатЗапроса) Экспорт Результат = Новый Структура; Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл Результат.Вставить(Колонка.Имя); КонецЦикла; Если РезультатЗапроса.Пустой() Тогда Возврат Результат; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); ЗаполнитьЗначенияСвойств(Результат, Выборка); Возврат Результат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
// Возвращает данные первой записи результата запроса в виде структуры. // // Параметры: // РезультатЗапроса - РезультатЗапроса - Результат запроса, содержащий данные для обработки. // // Возвращаемое значение: // Структура - структура с результатом. // Функция РезультатЗапросаВСтруктуру(Знач РезультатЗапроса) Экспорт Результат = Новый Структура; Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл Результат.Вставить(Колонка.Имя); КонецЦикла; Если РезультатЗапроса.Пустой() Тогда Возврат Результат; КонецЕсли; Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); ЗаполнитьЗначенияСвойств(Результат, Выборка); Возврат Результат; КонецФункции /////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2019, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode ///////////////////////////////////////////////////////////////////////////////////////////////////////
Параметры процедур и функций
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При объявлении формальных параметров процедур и функций (далее по тексту: функций) необходимо придерживаться общих правил образования имен переменных. В частности, имена параметров следует образовывать от терминов предметной области таким образом, чтобы из имени параметра было понятно его назначение.
2. Не следует использовать вместо параметров функций другие средства конфигурирования (переменные модулей, реквизиты формы и т.п.)
3. Параметры в функции должны идти в логической последовательности. Рекомендуется располагать параметры по принципу от общего к частному.
Например, неправильно:
Процедура ПересчитатьСуммуДокумента(ИмяПоляСумма, ДокументОбъект, СуммаВключаетНДС = Истина) Процедура ПоменятьЦветПоляФормы(Цвет, ИмяПоля, Форма)
правильно сначала расположить основные параметры ДокументОбъект и Форма :
Процедура ПересчитатьСуммуДокумента(ДокументОбъект, ИмяПоляСумма, СуммаВключаетНДС = Истина) Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)
4. Необязательные параметры (параметры со значениями по умолчанию) должны располагаться после обязательных параметров (без значений по умолчанию).
Например:
Функция КурсВалютыНаДату(Валюта, Дата = Неопределено) Экспорт
5. Не рекомендуется объявлять в функциях много параметров (нужно ориентироваться на количество не более семи параметров), при этом не должно быть много параметров со значениями по умолчанию (нужно ориентироваться на количество не более трех таких параметров). В противном случае, читаемость вызывающего кода сильно снижается. Например, можно легко ошибиться в количестве запятых при передаче необязательных параметров.
При необходимости передавать в функцию большое число параметров рекомендуется:
- группировать однотипные параметры в один или несколько составных параметров типа Структура . Например, в структуры могут быть объединены параметры, описывающие состав и значения полей некоторого объекта ( ДанныеЗаполнения , ПараметрыПроведения, ДанныеФайла и т.п.);
- либо полностью пересмотреть логику работы функции, например, разделив ее на несколько разных, более простых функций.
// Добавляет новое поле на форму, инициализирует его значениями по умолчанию. Функция ДобавитьПолеФормы(ИмяПоля, Заголовок = Неопределено, ОбработчикПриИзменении = "", ОбработчикНачалоВыбора = "", ШиринаПоля, ЦветФона = Неопределено, ЦветФонаЗаголовка = Неопределено, Родитель = Неопределено, КартинкаШапки = Неопределено, ПутьКДанным = Неопределено, ТолькоПросмотрПоля = Ложь, СвязиПараметровВыбора = Неопределено) … КонецФункции // вызывающий код НовоеПоле = ДобавитьПолеФормы("СтараяЦена", НСтр("ru='Цена'"). 12, ЦветФона, ЦветЗаголовка, НоваяГруппа. Истина); НовоеПоле.ЦветТекста = WebЦвета.Серый;
Правильно пересмотреть логику работы функций, оставив в ней только один ключевой параметр ИмяПоля :
// Добавляет новое поле на форму, инициализирует его значениями по умолчанию. Функция НовоеПолеФормы(ИмяПоля) … КонецФункции // вызывающий код НовоеПоле = НовоеПолеФормы("СтараяЦена"); НовоеПоле.Заголовок = НСтр("ru='Цена'"); НовоеПоле.ЦветФона = ЦветФона; НовоеПоле.ЦветТекста = WebЦвета.Серый; НовоеПоле…. = … …
Другой пример. Неправильно:
// Создает элемент справочника "Номенклатура" Процедура СоздатьЭлементНоменклатуры(Наименование, ТоварУслуга, ЕдиницаИзмерения, ВесНетто, ПроверятьУникальность = Истина) … КонецПроцедуры
Правильно сгруппировать параметры, описывающие значения реквизитов номенклатуры, в структуру ЗначенияРеквизитов :
// Создает элемент справочника "Номенклатура" Процедура СоздатьЭлементНоменклатуры(ЗначенияРеквизитов, ПроверятьУникальность = Истина) … КонецПроцедуры
6. При вызове функций необходимо избегать громоздких конструкций, которые приводят к снижению читаемости кода, увеличивают вероятность ошибок и затрудняют отладку.
В частности:
6.1. Не рекомендуется при передаче параметров в одну функцию применять вложенные вызовы других функций.
Неправильно:
СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, Новый Картинка(ПолучитьИзВременногоХранилища(ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла)));
Правильно разбивать такие вызовы на отдельные операторы с помощью вспомогательных локальных переменных:
АдресФайлаИзображения = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ПрисоединенныйФайл.Ссылка).СсылкаНаДвоичныеДанныеФайла; ДанныеИзображения = Новый Картинка(ПолучитьИзВременногоХранилища(АдресФайлаИзображения)); СтруктураВложений.Вставить(ПрисоединенныйФайл.Наименование, ДанныеИзображения);
В то же время, если код с вложенными вызовами получается компактным (не требует переноса выражений) и легко читаемым, то вложенные вызовы допустимы.
Например:
Предупреждение(НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'")); ПеречитатьСуммуПоКурсу(Сумма, КурсВалютыНаДату(Валюта));
6.2. Также не рекомендуется при вызове функций использовать вложенный конструктор структуры: Новый Структура(. ) . Вложенное объявление структуры допустимо только в тех случаях, когда количество ее свойств небольшое (нужно ориентироваться на количество свойств не более трех).
ЗаполнитьЦены(Объект.Товары, , Новый Структура("Дата, Валюта, Соглашение, ПоляЗаполнения", Объект.Дата, Объект.Валюта, Объект.Соглашение, "Цена, СтавкаНДС, ВидЦены, СрокПоставки"), Новый Структура("ПересчитатьСумму, ПересчитатьСуммуСНДС, ПересчитатьСуммуНДС, ПересчитатьСуммуРучнойСкидки, ОчиститьАвтоматическуюСкидку, ОчиститьСуммуВзаиморасчетов", "КоличествоУпаковок", СтруктураПересчетаСуммы, СтруктураПересчетаСуммы, "КоличествоУпаковок", Неопределено, Неопределено));
ПараметрыЗаполнения = Новый Структура; ПараметрыЗаполнения.Вставить("Дата", Объект.Дата); ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта); ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение); ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "Цена, СтавкаНДС, ВидЦены, СрокПоставки"); ДействияСИзмененнымиСтроками = Новый Структура; ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСумму","КоличествоУпаковок"); ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуСНДС", ПараметрыПересчетыСуммы); ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуНДС", ПараметрыПересчетыСуммы); ДействияСИзмененнымиСтроками.Вставить("ПересчитатьСуммуРучнойСкидки","КоличествоУпаковок"); ДействияСИзмененнымиСтроками.Вставить("ОчиститьАвтоматическуюСкидку"); ДействияСИзмененнымиСтроками.Вставить("ОчиститьСуммуВзаиморасчетов "); ЗаполнитьЦены(Объект.Товары, ПараметрыЗаполнения, ДействияСИзмененнымиСтроками);
7. При вызове функций не следует пропускать обязательные параметры. В противном случае, в параметр будет передано значение Неопределено , на которое функция может быть не рассчитана. Если же значение Неопределено является допустимым, то нужно или его передавать в функцию явно, или сделать этот параметр необязательным со значением по умолчанию Неопределено .
Например, для вызова процедуры
Процедура ПоменятьЦветПоляФормы(Форма, ИмяПоля, Цвет)
ПоменятьЦветПоляФормы(,"РезультатПроверки", ЦветаСтиля.ПоясняющийОшибкуТекст); // пропущен первый параметр Форма ПоменятьЦветПоляФормы(,,); // пропущены все обязательные параметры
ПоменятьЦветПоляФормы(ЭтотОбъект, "РезультатПроверки", Цвет); // указаны все обязательные параметры
См. также
- Передача параметров по ссылке и по значению при вызове процедур и функций (статья на ИТС)
- Особенности использования структур в качестве параметров процедур и функций
- Использование объектов типа Структура