Чем метод отличается от функции 1с

Обновлено: 07.07.2024

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

Решено было сделать анализ - сравнение на возможность применения уже готовых функций в этих конфигурациях.

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

Отмечу сразу, это не функции БСП и отношения к библиотеке стандартных подсистем никакого не имеют.

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

Функция 1.

СведенияОЮрФизЛице(ЮрФизЛицо, ДатаПериода, ДляФизЛицаТолькоИнициалы = Истина, Знач БанковскийСчет = Неопределено)

Ничего не нужно сочинять - данная функция вернет вам структуру с информацией об организации или контрагенте на заданных период времени. Параметр ЮрФизЛицо - это может быть Организация либо Контрагент.

Возвращает структуру следующего содержания:

Данная функция в Управлении Торговли 11.4 находится в модуле ФормированиеПечатныхФорм.

В Бухгалтерии 3.0 находится в модуле БухгалтерскийУчетПереопределяемый и она немного отличается входящими параметрами от функции торговли СведенияОЮрФизЛице(ЮрФизЛицо, ДатаПериода, ДляФизЛицаТолькоИнициалы = Истина, Знач БанковскийСчет = Неопределено), но возвращает то же самое.

Полезная функция, запомните ее.

Следующая, одна из полезнейших готовых функций

Функция 2.

ОписаниеОрганизации(СписокСведений, Список = "", СПрефиксом = Истина)

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

В качестве основного параметра СписокСведений - это результат - структура предыдущей функции СведенияОЮрФизЛице.

Данная функция в Управлении Торговли 11.4 находится в модуле ФормированиеПечатныхФорм.

Возвращаемый результат такой:

В Бухгалтерии 3.0 находится в модуле ОбщегоНазначенияБПВызовСервера - по возвращаемой строке немного отличается от функции УТ.

Так же применяешь функцию, не придумывая что-то свое.

Функция 3.

ПолучитьАдресИзКонтактнойИнформации(Объект, ТипАдреса = "", Дата = Неопределено) Экспорт

Получаем сразу адрес объекта, ТипАдреса может быть "Юридический", "Регистрации", "Фактический" на дату (у меня указана ТекущаяДата())

Для получения адреса из контактной информации в Бухгалетрии 3.0, я использую ранее упомянутую функцию ОписаниеОрганизации.

Функция 4.

ПолучитьТелефонИзКонтактнойИнформации(Объект) Экспорт

Получаем напрямую телефон с помощью функции Управления Торговлей 11.4

В глубинах бухгалтерии нарыты такие интересные функции для работы с телефонами:

В обработке ОбщиеОбъектРеглОтчетности. Функция приводит формату 89012345678. Это неэкспортная функция, придется копировать в свой код.

так же есть "полуискусственная" функция, которая требует адаптации в вашем коде.

Здесь ЗаписиКонтактнойИнформации - это некая табличная часть, в которой содержится вся контактная информация.

Функция 5.

ФорматСумм(Сумма, Валюта, ЧН = "", ЧРГ = "") Экспорт

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

В бухгалтерии данная функция находится в модуле ОбщегоНазначенияБПВызовСервера

обращаться к ней нужно так: ОбщегоНазначенияБПВызовСервера.ФорматСумм(Сумма, Валюта, "0", ".");

Функция 6.

Функция СуммаРубКоп(Сумма, Валюта, ВалютаРегламентированногоУчета) Экспорт

Данная функция разбивает число "на входе" на валюты рег.учета.

Функция 7.

Функция КоличествоПрописью(Количество) Экспорт

Думаю, что данную функцию или что-то похожее придумывали все. Готовая функция работает вот так.:

Обращение в бухгалтерии:

Функция 8.

СформироватьСуммуПрописью(Сумма, Валюта) Экспорт

Обращение к этой готовой функции из бухгалтерии

Функция выглядит вот и состоит из двух функций - вышеупомянуюто ФорматСумм и встроенной в платформу ЧислоПрописью

Функция 9.

ДанныеФизЛица(Организация, ФизЛицо, ДатаСреза, ФИОКратко = Истина) Экспорт

Находится в общем модуле ОбщегоНазначенияБПВызовСервера. Полезная готовая функция бухгалтерии, выводящая данные физического лица на период времени в виде структуры:

Выглядит она так - просто экспортирует функцию УчетЗарплаты.ДанныеФизическихЛиц(Организация, ФизЛицо, ДатаСреза, ФИОКратко)

Функция 10.

ПолучитьФамилиюИмяОтчество(Фамилия = " ", Имя = " ", Отчество = " ", ФИОКратко = Истина) Экспорт

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

Данная функция возвращает фамилия, имя, отчество одной строкой. По-умолчанию - кратко.

Процедура 1 и Процедура 2.

Так же хочу упомянуть о двух готовых процедурах в УТ - это Процедура ВывестиЛоготипВТабличныйДокумент(Макет, ОбластьМакета, ИмяОбласти, Организация) Экспорт и Процедура ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, Организация, ПараметрыПечати = Неопределено) Экспорт.

Логика работы этих процедур практически одинакова - берется готовый макет, область и по передаваемой организации вставляется картинка:

Сразу можно обращаться к готовым процедурам в УТ:

ФормированиеПечатныхФорм.ВывестиФаксимилеВТабличныйДокумент(Макет, ОбластьМакета, Организация, )

Итак, на примере этих 10-ти готовых функций и 2-х процедур, опять предлагаю вам не придумывать ничего, а брать готовое - пользоваться наработками. Так же напомню, что данные функции не имеют отношения к БСП.

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

Неоднократно видел использование термина "метод" для обозначения функций-членов классов в противоположность термину "функция" для обозначения "свободных" функций нечленов. С другой стороны, в текстах о Си++, часто всё называют "функцией" и члены и нечлены.

Собственно, какова разница между терминами "метод" и "функция", почему в Си++ члены не называют "методами"?


6,824 2 2 золотых знака 21 21 серебряный знак 43 43 бронзовых знака почему в Си++ члены не называют "методами"? - так и хочется пошутить про потому что они ч. но не буду Метод - это функция, которая член класса. И это вся разница вроде) @andreymal можно как ответ делать. терминология-faq с эпичным ответом) @АлексейШиманский я не уверен, что так во всех языках, и предпочту воздержаться от ответа. Эпичный ответ с примерами и исключениями (если таковые существуют) от кого-нибудь уверенного будет более полезным) @andreymal А процедура - член класса тогда как называется?

И чего так много слов то? Все просто:

Метод всегда является функцией, а функция не всегда является методом.

80.3k 7 7 золотых знаков 66 66 серебряных знаков 146 146 бронзовых знаков Это как "Большой палец - всегда палец, но палец не всегда большой?" (c) ТБВ

Вот определение метода:

Метод в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-то классу или объекту. Методы классифицируются по применимости к объектам: статические и простые или нестатические; по возможности использования: public , private , protected .

Вот определение функции:

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

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

3,325 2 2 золотых знака 17 17 серебряных знаков 40 40 бронзовых знаков

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

Так как программирование пришло с математики, то начальные корни нужно искать там. А там были функции и процедуры. Функция на основании своих аргументов генерирует какой-то результат. sin , cos - яркие примеры. Функция без аргументов - вырожденный вариант и обычно это константа. В математике обычно функции являются чистыми - то есть, у них нет побочных эффектов. То есть, вызов функции с одними и теми же аргументами дает один и тот же результат.

Параллельно существуют процедуры. Процедура - это последовательность действий, приводящая к определенному результату (да, обычная программа - это также может быть процедура, хотя. ). В паскале и фортране принято, что процедура не возвращает результат. Но я считаю, что это исключительно соглашение, потому что иначе нужно было бы делать как в C/C++ и вводить пустой тип (void).

почему в Си++ члены не называют "методами"?

Во многих языках 60-70 годов не было ООП в том понимании, которое известно сейчас. С++ изначально был просто "фронтом" (то есть надстройкой) над обычным Си. Был долгий период, когда это уже был не Си, но и ещё и не C++. Компилятора C++ не было, а был транслятор в Си. Видимо, поэтому там закрепилось функция класса/переменная класса. Сейчас Страуструп предлагает N4174, и если его примут, то грань между обычными функциями и функциями класса размоется ещё больше.

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

Собственно, какова разница между терминами "метод" и "функция"

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

многие автора книг по с++ называют функции класса методами. Как быть?

Тут все сложно. Например, Эккель так делает видимо потому, что он ещё и много книг о Java написал. Также не стоит забывать, что многие книги мы читаем в переводе, а они "исправляют", потому что переводчику так понятнее.

так можно ли называть функции класса с++ методами?

Это точно так же, как использовать мат/обсценную лексику в высшем обществе. Или пытаться объясниться с гопниками языком Тургенева и стихами Пушкина/Блока.

Со временем почему-то перестают устраивать вещи, написанные лишь для того, чтобы они работали. Хочется красоты, стиля.
В тоже время хочется простых и понятных правил для поддержки этой красоты и этого стиля.
Данный вопрос относится к категории "Размышления над стилем".

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

Исходя из этих соображений и возникает желание определить чёткие критерии того, в каком случае стоит использовать Процедуры, а в каком случае Функции.

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

Подход 1. Исходя из определения Процедуры и Функции
Тут всё просто, читаешь документацию и, помня, что процедура отличается от функции только возвращаемым значением, решаешь - если возврат значения не нужен, то Процедура, если нужен, то Функция. Тем не менее, процедура может изменять значения параметров, переданных по Ссылке.

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

Подход 1.1 Функция возвращает один параметр через возврат, остальные через переменные, переданные по ссылке. На выходе процедуры мы включаем некую обработку ошибок, зависящую от возвращаемого значения.

Подход 1.2 Функция не может возвращать значения через свои параметры и должна это делать только через значение возврата. Если необходимо вернуть более одного значения, то эти значения необходимо упаковать в массив, список значений, прочее.
Если в ходе работы появилась ошибка, то будет возвращено значение Неопределено.

Подход 2. Процедуры - они как МАКРОСЫ
При этом подходе Процедура используется всего лишь для того, чтобы объединить несколько вызовов однотипных действий.
В этом подходе использование Процедуры носит локальный характер - просто для того, чтобы сократить код.

Подход 3. Всё на свете - Функции, но без идиотизма
1. Всегда используются функции, процедуры не используются.
2. Функция возвращает либо "", либо строковое описание ошибки, все изменения данных идут по ссылке через выходные параметры
3. Для исключения идиотизма в применении правила 2, для функций, возвращающих гарантировано одно значение, без ошибок внутри функции, используется передача значения через возврат функции. Например, ЭтоКорректнаяДата(вхДата)

В функциональном программировании есть такое понятие как функции первого класса (функции которые можно присваивать переменным, передавать в качестве аргументов и возвращать из функции). В 1С это также можно применять, используя небольшую вспомогательную функцию. Далее демо-пример ее использования.

Обработка тестировалась на 1С:Предприятие 8.3 (8.3.13.1513)

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

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

(1)Согласен! Прелести функционального программирования именно в:
1. Декларативности (ну в большей степени чем классический императивный подход)
2. Развёртке кода (когда компилятор условно декларативные инструкции разворачивает в последовательность простых инструкций, попутно проводя оптимизацию, практически без падения производительности; заодно и распараллеливая выполнение при возможности)

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

Эмуляция же этого процесса:
Во-первых, всё-равно будет выглядеть коряво (а не так красиво как это даёт истинный функциональный стиль)
Во-вторых, никакой оптимизиации тут не жди. Та же рекурсия, которая при функциональном программировании почти всегда разворачивается хотя бы в циклы (или даже просто в линейный поток команд, когда число итераций на момент запуска известно и не велико), то тут постоянный вызов операции "Выполнить" рано или поздно заполнит стек, не говоря уже о том, что код постоянно будет компилироваться в рантайме - а это время.
В-третьих, это замечание к операции "Выполнить" - она не поддерживается под iOS и в WEB-Клиенте, а если заменить её на "Вычислить" - всё равно не будет поддерживаться на iOS. Частично, вероятно (сам не проверял) обойти можно заменив её на "ВыполнитьОбработкуОповещения" - но тут тоже свои нюансы, как минимум, будет недоступно в серверном контексте.

В общем - функциональное программирование - это вообще-то очень мощная вещь, особенно с лямда-выражениями, но эмулировать её, по крайней мере вот так - это бред. А, вот, вариант с кодогерерацийе - мог бы быть более интересен: когда в функциональном стиле пишется декларативный код - он читается как строка и на его основе уже кодогенерируется код на языке 1С (или сразу байткод для стековой машины), со всей необходимой оптимизацией.

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