1с обращение к процедуре как к функции

Обновлено: 03.07.2024

&НаКлиенте
Процедура ЗаполнитьПодразделения (НомерПриложения)
ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Очистить ();
СтрПоОрганизации = ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Добавить ();
СтрПоОрганизации. НаимЮЛ = "По организации";
СтрПоОрганизации. ИтогоПоПоставкам = ПересчетИтогов6и7(НомерФормы);
//
Для Каждого СтрПодразделения Из Отчет [СтрШаблон ("ТЧПодразделения%1", НомерПриложения)] Цикл
СтрПодразделенияНаФорме = ЭтотОбъект [СтрШаблон ("Подразделения%1", НомерПриложения)]. Добавить ();
ЗаполнитьЗначенияСвойств (СтрПодразделенияНаФорме, СтрПодразделения);
КонецЦикла;
КонецПроцедуры

Ошибка в "СтрПоОрганизации. ИтогоПоПоставкам = ПересчетИтогов6и7(НомерФормы); "

Вот сама процедура:
&НаКлиенте
Процедура ПересчетИтогов6и7(НомерФормы)

ТабличнаяЧасть = ?(НомерФормы = "6", Отчет. ТЧ6_Поставки, Отчет. ТЧ7_Закупки);
ТабличнаяЧастьЭлементы = ?(НомерФормы = "6", Элементы. ТЧ6_Поставки, Элементы. ТЧ7_Закупки);

Для Каждого стрТЧ1 Из ТабличнаяЧасть Цикл
Если ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧ1.ПолучитьИдентификатор ()) = Неопределено Тогда
Продолжить;
КонецЕсли;
Сумма = Сумма + ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧ1.ПолучитьИдентификатор ()).П000000000021;
КонецЦикла;

Если НомерФормы = "6" Тогда
Элементы. ТЧ6_ПоставкиП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
ИначеЕсли НомерФормы = "7" Тогда
Элементы. ТЧ7_ЗакупкиП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
КонецЕсли;

ТабличнаяЧасть = ?(НомерФормы = "6", Отчет. ТЧ6_Возвраты, Отчет. ТЧ7_Возвраты);
ТабличнаяЧастьЭлементы = ?(НомерФормы = "6", Элементы. ТЧ6_Возвраты, Элементы. ТЧ7_Возвраты);

Для Каждого стрТЧВозвраты Из ТабличнаяЧасть Цикл
Если ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧВозвраты. ПолучитьИдентификатор ()) = Неопределено Тогда
Продолжить;
КонецЕсли;
Сумма = Сумма + ТабличнаяЧастьЭлементы. ДанныеСтроки (стрТЧВозвраты. ПолучитьИдентификатор ()).П000000000021;
КонецЦикла;

Если НомерФормы = "6" Тогда
Элементы. ТЧ6_ВозвратыП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
ИначеЕсли НомерФормы = "7" Тогда
Элементы. ТЧ7_ВозвратыП000000000021.ТекстПодвала = Формат (Сумма, "ЧЦ=15; ЧДЦ=5");
КонецЕсли;

Вам надо определиться:
1. у вас ПересчетИтогов6и7() - это функция, тогда первая процедура без изменений, а вот функция все-таки функция

Функция ПересчетИтогов6и7(НомерФормы)
.
Возврат ЧтоХотитеВернуть;
КонецФункции

2. у вас ПересчетИтогов6и7() - это процедура, тогда вторая процедура без изменений, а вот обращаться к ней надо как к процедуре

Процедура ЗаполнитьПодразделения (НомерПриложения)
.
ПересчетИтогов6и7(НомерФормы);
.
КонецПроцедуры

Т. е. если из процедуры хотите получить какое-то значение, то это функция:
ИмяПеременной = ИмяФункции ();
и в самой функции должно быть "Функция" и строка Возврат.
Если вам надо просто пойти в другую процедуру, там пошуршать и вернуться обратно, то никаких равно при ее вызове:
кодкодкод
ВыполнитьПроцедуру ();
кодкодкод

Ключевое слово Процедура начинает секцию исходного текста, выполнение которого можно инициировать из любой точки программного модуля, просто указав Имя_процедуры со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле обычного приложения, модуле управляемого приложения или общем программном модуле в теле описания процедуры использовано ключевое слово Экспорт , то это означает, что данная процедура является доступной из всех других программных модулей конфигурации.

При выполнении оператора Возврат процедура заканчивается и возвращает управление в точку вызова. Если в тексте процедуры не встретился оператор Возврат , то после выполнения последнего исполняемого оператора происходит выполнение неявного оператора Возврат . Конец программной секции процедуры определяется по оператору КонецПроцедуры .

Переменные, объявленные в теле процедуры в разделе Объявления локальных переменных , являются локальными переменными данной процедуры, поэтому доступны только в этой процедуре (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).

Имя_проц Назначает имя процедуры.
Знач Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, то есть изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра.
Парам1 , . ПарамN Необязательный список формальных параметров, разделяемых запятыми. Значения формальных параметров должны соответствовать значениям передаваемых при вызове процедуры фактических параметров. В этом списке определяются имена каждого из параметров так, как они используются в тексте процедуры. Список формальных параметров может быть пуст.
= ДефЗнач Необязательная установка значения параметра по умолчанию. Параметры с установленными значениями по умолчанию можно располагать в любом месте списка формальных параметров.
Экспорт Необязательное ключевое слово, которое указывает на то, что данная процедура является доступной из других программных модулей.
// Объявления локальных переменных Объявляются локальные переменные, на которые можно ссылаться только в рамках этой процедуры.
// Операторы Исполняемые операторы процедуры.
Возврат Необязательное ключевое слово, которое завершает выполнение процедуры и осуществляет возврат в точку программы, из которой было обращение к процедуре. Использование данного оператора в процедуре не обязательно.
КонецПроцедуры Обязательное ключевое слово, обозначающее конец исходного текста процедуры, завершение выполнения процедуры. Возврат в точку, из которой было обращение к процедуре.

Функция

Ключевое слово Функция начинает секцию исходного текста функции, выполнение которой можно инициировать из любой точки программного модуля, просто указав Имя_функции со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле обычного, управляемого приложения, внешнего соединения, сеанса или общем программном модуле в теле описания функции использовано ключевое слово Экспорт , то это означает, что данная функция является доступной из всех других программных модулей конфигурации.

Функции отличаются от процедур только тем, что возвращают Возвращаемое значение . Конец программной секции функции определяется по оператору КонецФункции .

Вызов любой функции в тексте программного модуля можно записывать как вызов процедуры, то есть в языке допускается не принимать от функции возвращаемое значение .

Переменные, объявленные в теле функции в разделе Объявления локальных переменных , являются локальными переменными данной функции, поэтому доступны только в этой функции (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).

(62)
ТабличныйДокумент (SpreadsheetDocument)
Вывод (Output)
Использование:

Чтение и запись.
Описание:

Тип: ИспользованиеВывода.
Ограничение вывода на печать, сохранения, работы с буфером обмена.

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

ИспользованиеВывода (UseOutput)
Значения

Авто (Auto) (при авто используется право вывода пользователя).
Запретить (Disable)
Разрешить (Enable)

Содержит варианты использования права доступа Вывод.

ТекстовыйДокумент, свойство Вывод
ТабличныйДокумент, свойство Вывод
ПолеHTMLДокумента, свойство Вывод
ТабличноеПоле, свойство Вывод
ГеографическаяСхема, свойство Вывод
ГрафическаяСхема, свойство Вывод

У вас получитькаталог функция а вызывается как процедура

(12)
Это получение каталога в модуле формы

(14) Даже если я засуну код сразу перед вывести область без функции, так же ошибка выйдет

Если вы про этот кусок, то там ДокументРезультат, а какой у него тип мы не знаем, но я подозреваю что не табличный документ

(17) ТабличныйДокумент тоже.
Вообще не понимаю почему так происходит

(19) Закоментируйте функцию получитькатолог, а вот этот кусок раскомменте, только вместо ДокументРезультат.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF); напишите врТабличныйДокумент.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);

(19) потому-что отладчик всегда работает как получение результата.
Т.е. в отладчике этот код будет вызван как функция. Что соответственно приводит к ошибке. Нельзя в отладчике это проверять. (21) Ну это тоже правильно, но я так понимаю что у человека же совсем не работает (24) Она работает, сохраняет, но не всегда
Раз я запущу допустим, он сохранит 30 платежёк, второй раз в другую папку пытаюсь сохранить, просто вываливает "Не удалось сохранить т.д т.п" и даже печатку не выводит показать. (24) Может ли это быть как то связано с сервером? То есть при сохранении на сервер отказ идёт?
Потому что у меня при открытии внешней обработки более 2ух раз вываливается "Ошибка файловой операции и путь" (26) ну тут может быть что угодно вплоть до отсутствия места на диске и прав на папку, надо смотреть в момент ошибки (27) Он попытку перемещения файла делает и отваливается. Не может из 1С её вытащить (24) ошибка связана именно с вычислением выражения в отладчике.
Может что и не работает, но с другой ошибкой.

ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Вариант синтаксиса: В файл

Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:

Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:

Запись табличного документа в файл.

(31) При перемещении возможно указываете локальный путь, а не на сервере, поэтому и ругается Если файловая база - проверьте у пользователя доступность ко всем каталогам на чтение и запись, если серверная - у пользователя 1cv8User доступ на чтение и запись к каталогам. (34)Хорошо, а как тогда объяснить то что он сохраняет файлы через раз?

(35) Посмотрите чему равны ВремФайл, ИмяФайла при нормальном функционировании и при ошибке

(36) Отваливается на "ПереместитьФайл" и улетает в общий модуль с описанием ошибок

ВремФайл = ПолучитьИмяВременногоФайла("pdf");
ИмяФайла = ЭтотОбъект.КаталогВыгрузки + "\" + ТНаим + ".pdf";
врТабличныйДокумент.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);

По синтаксису должно быть

или я что-то в беседе пропустил и про это проговорили ?

Глобальный контекст.ПереместитьФайл (Global context.MoveFile)
Глобальный контекст (Global context)
ПереместитьФайл (MoveFile)
Синтаксис:

ПереместитьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>)
Параметры:

Тип: Строка.
Полное имя файла-источника (полное исходное имя файла).
<ИмяФайлаПриемника> (обязательный)

Тип: Строка.
Полное имя файла-приемника (полное новое имя файла).
Описание:

Выполняет перемещение (переименование) указанного файла.

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:

Эта статья продолжает цикл статей «Первые шаги в разработке на 1С». В ней будут рассмотрены следующие вопросы:

  • Что такое процедуры и функции и когда их нужно использовать?
  • В чем отличие процедуры от функции?
  • Что такое параметр процедуры (функции) и как его передать?
  • В каком случае передавать параметр по ссылке, а в каком по значению?
  • Как быстро посмотреть список процедур текущего модуля?

Применимость

Материал полностью актуален для платформы «1С:Предприятие 8» редакций 8.2. и 8.3.

Процедуры и функции

В отдельные процедуры и функции можно выносить общие алгоритмы. Одинаковый программный код из разных модулей (какой-то общий алгоритм) разумно выносить в процедуру или функцию какого-нибудь модуля и обращаться к ней.

При этом мы избавляемся от дублирования кода, заменив его вызовом процедуры (функции). Если возникает потребность внести изменения в алгоритм, то эти изменения будет достаточно внести в одном месте.

Кроме того, процедуры и функции повышают читаемость программного кода. Гораздо проще просмотреть, что выполняет данный код, особенно, если вызовы процедур имеют осмысленные названия.

В итоге облегчается сопровождение прикладного решения.

Следует отметить, что начинающие разработчики иногда для названия процедуры или функции пытаются использовать зарезервированное слово Выполнить.

Зарезервированные слова использовать для этих целей нельзя, и, естественно, в этом случае система будет сообщать об ошибке.

Функция, в отличии от процедуры, может иметь возвращаемое значение. В теле функции для того, чтобы вернуть значение, нужно использовать оператор Возврат и указать то значение, которое будет возвращаться.

Процедура, в отличии от функции, не может иметь возвращаемое значение. Она просто вызывается и выполняет какие-то действия.

Если функция не будет иметь ключевого слова Возврат, то она вернет несуществующее значение, т.е. значение типа данных Неопределено. Вместе с тем, ключевое слово Возврат можно использовать и в процедуре, но в этом случае возвращаемое значение не указывается, а само ключевое слово будет означать: прекратить выполнение процедуры.

Процедура или функция начинает описываться со слова Процедура (Функция). Далее следует Имя процедуры (функции). После имени обязательно указываются круглые скобки. Внутри скобок могут находиться описываемые параметры.

Данные параметры нужно будет передавать при вызове (при обращении к процедуре). После круглых скобок может стоять слово Экспорт (экспортная функция).

Потом следует тело процедуры (функции), т.е. последовательность из любого количества операторов.

В теле могут находиться вызовы других процедур и функций данного модуля или других модулей, которые доступны из текущего программного модуля. Обязательным является наличие заключительного слова КонецПроцедуры (КонецФункции).

После описания процедуры или функции точку с запятой ставить не нужно. При этом Платформа не считает ошибкой, если точка с запятой стоит после последней процедуры (функции) в модуле.

Описание процедур и функций

Параметры, переданные в процедуру (функцию) при ее вызове, могут быть использованы при формировании возвращаемого результата функцией или при выборе используемого алгоритма в процедуре.

При описании процедуры или функции мы можем указать, что для какого-либо параметра по умолчанию должно использоваться некоторое значение. Для этого справа от параметра через знак равенства указывается требуемое значение.

В том случае, если при вызове процедуры (функции) значение параметра будет не задано, то оно примет значение, используемое по умолчанию.

Таким образом, параметры, для которых указано значение по умолчанию, являются необязательными для указания при вызове. В описании процедуры(функции) вначале следуют обязательные параметры, а потом необязательные.

Кроме этого, существует передача параметров по ссылке и по значению. Внутри процедуры (функции) параметр может анализироваться, а также может изменяться. Все данные хранятся в оперативной памяти компьютера.

При передаче по ссылке система сообщает, что нужно обратиться к переменной, которая хранится в данной области памяти. В том случае, если значение параметра изменяется, оно меняется именно в указанной области памяти.

Т.е. при вызове процедуры (функции) мы передавали параметр с одним значением, а после отработки вызываемой процедуры (функции) значение параметра изменилось.

В случае передачи по значению указывается, что параметр нужно передавать по значению.

В этом случае вызывается новая область памяти, отличная от предыдущей, и меняется именно она. Исходное значение параметра не меняется.

По умолчанию все параметры передаются по ссылке. Чтобы передать параметр по значению, в описании процедуры перед параметром нужно поставить ключевое слово Знач.

Если в теле процедуры-обработчика установить данному параметру значение Истина, то процедура не отработает.

Порядок следования процедур и функций в модуле 1С:Предприятие 8 значения не имеет. Из любой процедуры (функции) модуля можно вызывать любую другую процедуру или функцию данного модуля.

Чтобы обратиться к списку процедур текущего модуля в панели конфигуратора можно нажать на кнопку в виде лупы с надписью «PROC» или использовать горячие клавиши (Ctrl+Alt+P).

Откроется диалоговое окно, в котором описаны функции F(x) и процедуры P( ). К ним возможно обращаться.

Список может быть отсортирован в алфавитном порядке (для этого устанавливается галочка «Сортировка»).

При снятой галочке процедуры и функции в списке размещены в соответствии с их следованием в модуле.

Список процедур в панели конфигуратора

Кроме процедур и функций в списке для разных модулей будут доступны разные стандартные обработчики. При выборе обработчика двойным кликом мыши в модуле создается шаблон соответствующей процедуры (обработчика события).

Если в диалоговом окне «Процедуры и функции» выбрать процедуру и нажать на кнопку Перейти, то мы окажемся в начале выбранной процедуры (функции).

Справа от кнопки с надписью «PROC» располагается поле. В этом поле указано имя текущей процедуры (функции).

Первичное знакомство с процедурами и функциями будем считать завершенным. Однако отметим, что платформа содержит множество стандартных процедур и функций, логику которых вам не нужно писать самостоятельно. Достаточно только в случае необходимости вызвать их в нужном месте вашего программного кода. Изучением этих стандартных функций мы и займемся в нашей следующей статье :)


PDF-версия статьи

Статья в PDF-формате

Читайте также: