Программы на языке программирования платформы «1С:Предприятие» довольно многословны. В них часто повторяются одни и те же шаблоны. Например, постоянно приходится видеть повторение конструкций вида:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИмяПараметра1", ЗначениеПараметра1);
...
Запрос.УстановитьПараметр("ИмяПараметраN", ЗначениеПараметраN);
Запрос.Текст = "ВЫБРАТЬ ... ";
Или конструкций вида:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(ИмяКолонки1);
...
ТЗ.Колонки.Добавить(ИмяКолонкиN);
Для ускорения ввода конструкций языка по шаблонам есть соответствующие средства. Однако существует и другой путь справиться со ставшей уже привычной избыточностью кода. Этот путь – использование функций.
Для получения готового к выполнению запроса можно использовать функцию:
Функция НовыйЗапрос(Текст, Параметры = 0) Экспорт
Результат = Новый Запрос(Текст);
Для Каждого Параметр Из Результат.НайтиПараметры() Цикл Результат.Параметры.Вставить(Параметр.Имя)
КонецЦикла;
Если Параметры <> 0 Тогда ЗаполнитьЗначенияСвойств(Результат.Параметры, Параметры)
КонецЕсли;
Возврат Результат
КонецФункции
Здесь параметрами является текст запроса и структура или объект, реквизиты которого содержат значения параметров запроса. В модуле объекта удобнее использовать в качестве параметра значение «ЭтотОбъект». А параметры запроса именовать также как реквизиты этого объекта.
Примеры использования функции:
Для получения количества всех элементов справочника можно использовать код:
ВсегоВНоменклатуре = НовыйЗапрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура").Выполнить().Выгрузить().Количество();
Для получения таблицы значений из табличной части "Товары" документа "РеализацияТоваровИУслуг" можно использовать код:
Товары_ = НовыйЗапрос("ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг.Товары ГДЕ Ссылка = &Ссылка", ЭтотОбъект).Выполнить().Выгрузить();
Также, например, в обработке заполнения табличной части для удаления строк с нулевой суммой в модуле объекта обработки достаточно будет записать такую короткую процедуру:
Процедура Инициализировать (Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
Объект.Товары.Загрузить(
НовыйЗапрос("ВЫБРАТЬ * ИЗ Документ.РеализацияТоваровУслуг.Товары ГДЕ Ссылка = &Ссылка И Сумма > 0"
, Объект).Выполнить().Выгрузить())
КонецПроцедуры
Конечно, это только небольшая часть возможных примеров. После того, как использование этой функции входит в привычку, к обычному варианту через повторение "УстановитьЗначениеПараметра" возвращаться уже не хочется. В редких случаях, когда объекта-параметра с походящим набором свойств подобрать не удается, в качестве параметра можно использовать Новый Структура("ИмяПараметра1, ... ", ЗначениеПараметра1, ... ). Все равно за счет возможности записать после функции через точку метод "Выполнить" код получается короче.
Для получения таблицы значений, имена колонок которой перечислены в строке через запятую, можно использовать функцию:
Функция НоваяТаблицаЗначений(ИменаКолонокЧерезЗапятую) Экспорт
Результат = Новый ТаблицаЗначений;
Для Каждого Элемент Из Новый Структура(ИменаКолонокЧерезЗапятую) Цикл Результат.Колонки.Добавить(Элемент.Ключ)
КонецЦикла;
Возврат Результат
КонецФункции
Пример использования функции:
ВзаимоРасчетыФИФО = НоваяТаблицаЗначений("ДокументОтгрузки, ДокументОплаты, Сумма");