Глава 15. Язык зависимых проводок
В предыдущей главе вы на примерах познакомились с начальными сведениями о языке, на котором задаются правила генерации зависимых проводок. Вы узнали, что:
- строка $ в правилах генерации зависимых проводок означает значение того же поля родительской проводки;
- если в поле фильтра значение поля — это строка ЛюбоеЗначение, то ограничений фильтра по этому полю нет. Иными словами, проводки будут генерироваться для любого значения в этом поле проводки;
- в правилах генерации зависимых проводок можно использовать арифметические выражения и скобки, как в Excel.
Язык правил генерации зависимых проводок этим далеко не исчерпывается. В этой главе вы познакомитесь с ним поближе. Но прежде чем говорить о самом языке, расскажем о том, из чего состоят правила зависимых проводок, чтобы подытожить то, что вы видели в примерах.
15.1. Структура правила зависимых проводок
Каждое правило зависимых проводок состоит из:
- фильтра — он задаётся в блоке Фильтр окна Редактирование правил зависимых проводок;
- одного или нескольких правил для генерации зависимых проводок — они задаются в блоке Зависимые окна Редактирование правил зависимых проводок.
Фильтр — это таблица, каждая строка которой соответствует одному из полей исходной (родительской) проводки. В левой колонке этой таблицы указывается имя поля проводки, а в правой колонке — условие, которому должно соответствовать это поле проводки.
Например, на приведённом ниже рисунке в фильтре заданы условия для следующих полей проводки: Дебет, Кредит, Дата, Валюта и Сумма.
Зависимые проводки по правилу будут генерироваться для тех проводок, у которых:
- будут выполнены все условия, заданные в фильтре данного правила зависимых проводок;
- сумма проводки не равна нулю.
Каждое условие в строке фильтра может задаваться как:
- строка, с которой должно совпадать значение данного поля родительской проводки;
- логическое выражение, то есть формула, которая может принимать значение «Истина» или «Ложь». Зависимые проводки генерируются, если значение выражения — «Истина».
О логических и других выражениях мы расскажем ниже.
Таблица и табличное условие. В блоке Фильтр окна Редактирование правил зависимых проводок можно использовать специальные поля Таблица и Табличное условие. Смысл этих полей таков:
Поле |
|
Для чего используется |
Таблица |
|
Позволяет задать таблицу, для каждой строки которой генерируются зависимые проводки. Если задать Табличное Условие или условия фильтра, то зависимые проводки будут генерироваться для всех строк таблицы, удовлетворяющих условиям. |
Табличное Условие |
|
Позволяет задать условие отбора тех строк таблицы, для которых генерируются зависимые проводки. |
Указание таблицы позволяет генерировать по одной исходной (родительской) проводке множество зависимых проводок. Например, по одной проводке начисления дивидендов можно сгенерировать сотни и тысячи проводок начисления задолженности по выплате дивидендов конкретным акционерам. В этом случае в качестве таблицы используется справочник аналитики Акционеры со сведениями об акционерах организации.
Замечание. Поиск требуемых значений таблицы будет быстрее, если фильтрацию таблицы проводить в поле Таблица.
Пример применения фильтра в поле Таблица:
Таблица: |
|
ТаблАналитики("Материалы").Колонка("Номенклатура").Фильтр(р.Аналитика("Номенклатура"))... |
Табличное условие: |
|
ЛюбоеЗначение |
Правила зависимых проводок. В окне Редактирование правил зависимых проводок может указываться одно или несколько правил зависимых проводок. Каждое правило — это таблица, в левой колонке которой указываются имена полей проводки, а в правой колонке — формулы для вычисления этого поля генерируемой зависимой проводки.
На примере ниже описаны две зависимые проводки. Для каждой из них задаются формулы для вычисления полей Дебет,Кредит, Дата, Валюта и Сумма.
15.2. Из чего состоят выражения в правилах зависимых проводок
Выражения в правилах зависимых проводок конструируются из следующих элементов: числа, строки символов, имена констант и переменных, операторы (арифметические, логические, сравнения, соединения строк), скобки, вызовы функций и свойств. Опишем эти элементы выражений чуть подробнее.
Элемент |
|
Описание и примеры |
Числа |
|
Например: 100,, 2345.56 и т. п. При записи дробных чисел для отделения целой и дробной частей числа используется точка, а не запятая. |
Строки символов |
|
Строки символов заключаются в двойные кавычки, например: "Таможня",, 18%", "Ставка НДС", "50.1 – Касса", или в одинарные кавычки-апострофы, например: '50.1 – Касса'. Если в строке символов имеется двойная кавычка, то её можно записать так: \" |
Имена констант и переменных |
|
В правилах зависимых проводок можно использовать различные имена, обозначающие значения полей родительской проводки или других параметров, например:
В именах констант и переменных ФинГрада не бывает пробелов и специальных символов, кроме знаков доллара и знака подчёркивания. |
Арифметические операторы |
|
Символы +, –, * и / в выражениях зависимых проводок используются как арифметические операторы сложения, вычитания, умножения и деления. Символ – («минус») перед числом или именем также используется для получения противоположного по знаку числа. |
Операторы сравнения |
|
Сочетания символов ==, !=, <, >, <=, >=— это операторы сравнения: == это оператор «равно»; != это оператор «не равно»; < это оператор «меньше»; > это оператор «больше»; <= это оператор «меньше или равно»; >= это оператор «больше или равно». Результатом применения оператора сравнения является логическое значение «истина» или «ложь». Обычно сравниваются числа. Но строки символов тоже можно сравнивать, для них «меньше» означает «предшествует в алфавитном порядке». |
Логические операторы |
|
Для создания сложных логических условий можно использовать логические операторы !, ||и &&: ! это логический оператор «Не»; || это логический оператор «Или»; && это логический оператор «И». Так, если У — это условие, то !У — это условие, истинное, когда У ложно, и ложное, когда У истинно. Если У1 и У2 — это условия, то У1||У2 — условие, истинное, если хотя бы одно из условий У1 и У2 истинно; а У1&&У2 — условие, истинное, только когда оба условия У1 и У2 истинны. |
Оператор соединения строк |
|
Символ + используется также для соединения (конкатенации) строк. Например, если значение переменной ГлавнаяВалюта это RUR (то есть, главная валюта — это рубль), то значение выражения "Валюта:"+ГлавнаяВалюта будет таким: Валюта:RUR |
Скобки ( и ) |
|
Задают порядок вычисления выражений (формул) в правилах зависимых проводок. |
Функции |
|
В правилах зависимых проводок ФинГрада можно использовать различные встроенные функции. Например, функция Знак(число) имеет значение 1, если аргумент функции положительный; 0, если аргумент нулевой; и –1, если аргумент функции отрицательный. |
Свойство |
|
У многих объектов ФинГрада имеются свойства. Чтобы получить значение свойства объекта, используется запись:ИмяОбъекта.ИмяСвойства Например, объект р в выражениях зависимых проводок означает родительскую проводку. Поэтому р.Контрагент это значение свойства Контрагент родительской проводки (в данном случае это то же самое, что значение аналитики Контрагент). В свою очередь, у объекта р.Контрагент тоже могут быть свойства. Их значения можно получить аналогично — добавив точку и имя нужного свойства. Например, р.Контрагент.ИНН — это значение свойства ИНН контрагента, указанного в родительской проводке, а р.Контрагент.Адрес — это значение свойства Адрес контрагента, указанного в родительской проводке. |
Теперь расскажем об этом более подробно.
15.3. Отбор проводок по счетам дебета и кредита
В полях Дебет и Кредит блока Фильтр окна Редактирование правил зависимых проводок указываются выражения, задающие условия отбора проводок, для которых надо генерировать зависимые проводки. Чаще всего в этих полях фильтра используются следующие выражения:
Выражение в поле фильтра |
|
Устанавливает ограничения для поля проводки: |
ЛюбоеЗначение |
|
Ограничений по данному полю нет. |
"название-счёта" |
|
Счёт должен иметь указанное название. |
ИзСписка(счёт1,…,счётN) |
|
Счёт должен быть одним из перечисленных в скобках. |
ИзГрупп(группа1,…,группаN) |
|
Счёт должен содержаться в одной из указанных групп счетов. |
Комментарий(коменнтарий к счёту) | Счёт должен содержать указанный комментарий. |
Приведём несколько примеров:
Выражение в поле фильтра |
|
Устанавливает ограничения для поля проводки: |
ЛюбоеЗначение |
|
Ограничений по данному полю нет. |
"НДС" |
|
Значение счёта должно быть НДС. |
ИзСписка("Покупатели","Поставщики") |
|
Счёт должен либо счётом Покупатели, либо счётом Поставщики. |
ИзГрупп("Наличные", "Безналичные") |
|
Счёт должен содержаться либо в группе счетов Наличные, либо в группе счетов Безналичные. |
Замечания.1. Если счёта, указанного в функции ИзСписка, не существует в плане счетов ФинГрада, будет сгенерирована ошибка.
2. Если группы счетов, указанной в функции ИзГрупп, не существует в плане счетов ФинГрада, будет сгенерирована ошибка. Счёт, у которого нет подсчетов, группой не считается.
Можно использовать и более сложные выражения для отбора проводок. В этих выражениях можно использовать, например, операторы сравнения, логические операторы, а также следующие обозначения:
Обозначение |
|
Значение |
$ |
|
Значение текущего поля исходной проводки. |
р.Дебет |
|
Счёт дебета исходной проводки. |
р.Кредит |
|
Счёт кредита исходной проводки. |
р.Дебет.ИзСписка(счёт1,…,счётN) |
|
Истина, если счёт дебета исходной проводки содержится в указанном списке счетов. |
р.Кредит.ИзСписка(счёт1,…,счётN) |
|
Истина, если счёт кредита исходной проводки содержится в указанном списке счетов. |
р.Дебет.ИзГрупп(группа1,…,группаN) |
|
Истина, если счёт дебета исходной проводки содержится в одной из указанных групп счетов. |
р.Кредит.ИзГрупп(группа1,…,группаN) |
|
Истина, если счёт кредита исходной проводки содержится в одной из указанных групп счетов. |
Приведём примеры:
Выражение в поле фильтра |
|
Устанавливает ограничения: |
($=="Касса1")||($=="Касса2") |
|
Счёт в данном поле проводки может иметь значение Касса1 или Касса2. |
ИзГрупп("Наличные", "Безналичные") && !($=="Касса3") |
|
Счёт в данном поле проводки должен быть из групп счетов Наличные или Безналичные, но не должен быть счётом Касса3. |
р.Дебет.ИзГрупп("Наличные", "Безналичные") && р.Кредит.ИзСписка("Покупатели", "Поставщики") |
|
Счёт дебета исходной проводки должен быть из групп счетов Наличные или Безналичные, а счёт кредита исходной проводки — счётом Покупатели, либо счётом Поставщики. |
15.4. Счета в правилах генерации зависимых проводок
В правилах для генерации зависимых проводок для указания счетов дебета и кредита (в полях Дебет и Кредит) чаще всего используются уже известные нам обозначения:
Обозначение |
|
Указывает, что у проводки значением этого поля будет: |
$ |
|
Тот же счёт, что и в этом поле у исходной проводки. |
"НазваниеСчёта" |
|
Указанный счёт. |
р.Дебет |
|
Счёт дебета исходной проводки. |
р.Кредит |
|
Счёт кредита исходной проводки. |
При желании, конечно, в полях Дебет и Кредит правил генерации зависимой проводки можно использовать и более сложные выражения.
15.5. Даты в правилах зависимых проводок
В зависимых проводках ФинГрада, как и в Excel, можно использовать даты. Чаще всего в поле Дата правил генерации зависимых проводок стоит значение $ — это означает, что даты у зависимых проводок такие же, как у родительской проводки.
Прибавление числа к дате и вычитание числа из дате. Можно прибавлять или отнимать от даты число, и получать дату, большую или меньшую на указанное количество дней. Например, в поле Дата правил генерации зависимых проводок можно использовать выражения:
Выражение |
|
Значение |
$+1 или р.Дата+1 |
|
дата, следующая после даты родительской проводки. |
$–7 или р.Дата–7 |
|
дата, которая на 7 дней раньше даты родительской проводки. |
Переменные, выдающие даты. В ФинГраде есть встроенные переменные, выдающие даты:
Переменная |
|
Значение |
Сегодня |
|
сегодняшняя дата |
ДатаЗакрытияПериода |
|
дата закрытия периода или пустое значение, если закрытия периода в ФинГраде не производилось |
Разность дат. В ФинГраде можно вычитать одну дату из другой. Результат вычитания — количество дней между датами. То есть, результат вычисления выражения
Дата1 – Дата2
это количество дней, на которое Дата1 позже Даты2. Если Дата1 не позже, а раньше Даты2, то результат вычитания будет отрицательным.
Например, выражение Сегодня – р.Дата означает количество дней между датой родительской проводки и сегодняшним днём.
Преобразование строки символов в дату выполняется с помощью функции:
вДату(строка) — дата, соответствующая строке.
Например, вДату("20.12.2011") — это дата, соответствующая строке "20.12.2011", то есть 20 декабря 2011 года.
Замечание. Если записать в поле комментария правила генерации зависимой проводки выражение р.Дата, то в сгенерированную проводку будет помещено число. Например, для даты родительской проводки 20 декабря 2011 значение выражения р.Дата в поле комментария будет показано не как 20 декабря 2011, и не как 20.12.2011, а как число 40897! Дело в том, что в ФинГраде, как и в Excel, даты это на самом деле разновидность чисел. Числовое значение даты — это количество дней, прошедших с 1 января 1990 года. Дата 20 декабря 2011 года хранится в ФинГраде как число 40897, потому что с 1 января 1990 года до 20 декабря 2011 прошло 40897 дней. Лишь при отображении в колонках отчётов ФинГрада, имеющих тип Дата, эти числа отображаются в виде день.месяц.год.
Преобразование даты в строку символов выполняется с помощью функции:
ДатуВСтроку(дата)
Например, ДатуВСтроку("31.03.2015") — это строка "31.03.2015". Или, например, ДатуВСтроку(42095) — это дата 1 апреля 2015 года.
Получение дат начала/конца периодов. Иногда бывает нужно получить дату начала или окончания какого-либо периода. Например, дату начала недели или окончания квартала. Для этого в ФинГраде есть функции типа НачалоНедели(дата), КонецКвартала(дата) и т.д.
Например, НачалоНедели("03.02.2015") — это дата "02.02.2015", потому что 2 февраля 2015 года — это понедельник. А, например, КонецКвартала("03.02.2015") — это дата "31.03.2015" (последний рабочий день марта).
Замечание. Как и поле Дата, результат получения дат начала/конца периодов — это число. Чтобы перевести это число формат «дд.мм.гггг», используйте команду ДатуВСтроку(дата).
Функции для работы с производственным календарем
Функция ЭтоРабочийДень(дата) определяет, является заданная дата рабочим или выходным днем согласно производственному календарю.
Если дата является рабочим днём, то функция ЭтоРабочийДень(дата) возвращает значение Истина, в обратном случае функция возвращает значение Ложь.
Пример использования функции ЭтоРабочийДень – поле Дата фильтра правила зависимой проводки.
Параметром функции может быть значение поля Дата родительской проводки, переменная Сегодня, а также конкретная календарная дата, заключенная в кавычки, например "05.10.2021".
Ближайший рабочий день по отношению к заданной дате вычисляет функция БлижайшийРабочийДень(дата,смещение). В качестве параметра Смещение можно задавать положительные и отрицательные целые числа, а также ноль.
В зависимости от параметра Смещение функция возвращает следующие значения:
- 0 – ближайший рабочий день, следующий после заданной даты;
- положительное число - ближайший рабочий день к заданной дате плюс количество дней, указанное в параметре Смещение;
- отрицательное число - ближайший рабочий день, предшествующий заданной дате минус количество дней, указанное в параметре Смещение.
Например, результатом вычисления функции БлижайшийРабочийДень("02.10.2021",0) будет дата 04.10.2021.
Количество рабочих дней между двумя датами рассчитывает функция РабочихДнейМежду(Дата1,Дата2). Результат вычисления функции будет отрицательным, если Дата2 предшествует Дате1, и равным 0, если Дата1 равна Дате2.
Например, результат вычисления функции РабочихДнейМежду(“20.09.2021”,”22.09.2021”) равен двум.
Функции БлижайшийРабочийДень(дата,смещение) и РабочихДнейМежду(Дата1,Дата2) могут применяться в формулах, используемых в шаблонах документов и трансформациях.
Сведём сведения о переменных и функциях для работы с датами в таблицу:
Функции и переменные для работы с датами
Функция или переменная |
|
Значение |
р.Дата |
|
Дата исходной (родительской) проводки. |
Сегодня |
|
Сегодняшняя дата. |
ДатаЗакрытияПериода |
|
Дата закрытия периода, или пустое значение, если закрытия периода в ФинГраде не производилось. |
вДату(строка) |
|
Преобразование строки в дату. Например, вДату("31.12.2010") — это дата, соответствующая строке "31.12.2010", то есть дате 31 декабря 2010 года. |
ДатуВСтроку(дата) |
Преобразование даты в строку в формате «дд.мм.гггг». Пример: результатом выполнения команды ДатуВСтроку("31.03.2015") будет строка "31.03.2015". А результат выполнения команды ДатуВСтроку(42095) — это 1 апреля 2015 года. |
|
НачалоНедели(дата) | Дата начала недели, которой принадлежит передаваемая дата. | |
КонецНедели(дата) | Дата окончания недели, которой принадлежит передаваемая дата. | |
НачалоМесяца(дата) | Дата начала месяца, которому принадлежит передаваемая дата. | |
КонецМесяца(дата) | Дата окончания месяца, которому принадлежит передаваемая дата. | |
НачалоКвартала(дата) | Дата начала квартала, которому принадлежит передаваемая дата. | |
КонецКвартала(дата) | Дата окончания квартала, которому принадлежит передаваемая дата. | |
НачалоПолугодия(дата) | Дата начала полугодия, которому принадлежит передаваемая дата. | |
КонецПолугодия(дата) | Дата окончания полугодия, которому принадлежит передаваемая дата. | |
НачалоГода(дата) | Дата начала года, которому принадлежит передаваемая дата. | |
КонецГода(дата) | Дата окончания года, которому принадлежит передаваемая дата. | |
ЭтоРабочийДень(дата) | Истина или Ложь в зависимости от положения даты в производственном календаре. | |
БлижайшийРабочийДень(дата,смещение) | Дата ближайшего рабочего дня согласно производственному календарю с учетом значения параметра Смещение. | |
РабочихДнейМежду(Дата1,Дата2) | Количество рабочих дней согласно производственному календарю между указанными датами. |
15.6. Аналитики в правилах зависимых проводок
В окне Редактирование правил зависимых проводок можно использовать значения аналитик и колонок аналитик. Для этого используются следующие обозначения:
Выражение |
|
Значение |
Аналитика(ИмяАналитики) |
|
Значение аналитики с указанным именем. Например, Аналитика("Вид НДС") — значение аналитики с именем Вид НДС. |
Если имя аналитики не содержит пробелов и специальных символов, то её значение можно получить, указав вместо Аналитика(ИмяАналитики) простоИмяАналитики (без кавычек). Например, вместо Аналитика("Контрагент") можно написать просто Контрагент, или р.Контрагент.
Колонки аналитики. Если у аналитики есть колонки, то в зависимых проводках можно использовать значения этих колонок. Для этого к обозначению аналитики добавьте:
.Колонка(ИмяКолонки) |
|
Чтобы получить значение указанной колонки. |
.ИстКолонка(дата, ИмяКолонки) |
|
Чтобы получить значение указанной исторической колонки по состоянию на заданную дату. |
Если имя колонки не содержит пробелов и специальных символов, то значение колонки можно получить, указав вместо .Колонка(ИмяКолонки) просто .ИмяКолонки (без кавычек).Например, вместо р.Контрагент.Колонка("ИНН") можно написать просто р.Контрагент.ИНН.
Если нужно применить в правилах зависимых проводок значение аналитики, которая не используется в проводке, можно воспользоваться командой ЗначениеАналитики(Аналитика, Значение аналитики).
Например, ЗначениеАналитики("Сотрудник", "Иванов А.А.").
Проверка наличия в списке. Так же, как для счетов, для значений аналитики и колонки аналитики можно проверить наличие значения в списке. Для этого к обозначению аналитики или колонки аналитики добавьте
.ИзСписка(Значение1,… ,ЗначениеN)
Результатом будет логическое значение «истина» (если проверяемое значение содержится в списке) или «ложь» (если не содержится). Аргументы функции ИзСписка — это строки или символьные выражения, каждое из которых должно быть существующим значением аналитики или колонки.
Проверка аналитики на удаление. Возвращает Истину, только если выбранная аналитика удалена, например:
р.Сотрудник.Удалено — истина, если аналитика Сотрудник была удалена.
Преобразование значения аналитики в строку. Возвращает строковое значение аналитики, например:
р.Доля.ВСтроку — возвращает значение аналитики в виде строки ("0.5", "0.45", "0.8" и т.д.).
Примеры:
- Аналитика("Контрагент") или просто Контрагент, или р.Контрагент — значение аналитики Контрагент родительской проводки;
- Аналитика("Контрагент").Колонка("Адрес") — значение колонки Адрес аналитики Контрагент родительской проводки;
- Аналитика("Акционеры").ИстКолонка(р.Дата, "Доля") — значение исторической колонки Доля аналитики Акционеры родительской проводки по состоянию на дату проводки;
- Аналитика("Вид НДС")— значение аналитики Вид НДС родительской проводки. Это выражение проще записать нельзя, так как имя аналитики содержит пробел;
- Аналитика("Вид НДС").ИзСписка("18%","10%") — возвращает значение «Истина», если значение аналитики Вид НДС родительской проводки — это 18% или 10%, иначе возвращает значение «Ложь».
15.7. Математические функции
В зависимых проводках ФинГрада можно использовать следующие функции:
Функция |
|
Значение |
Знак(Число) |
|
1, если аргумент функции положительный; 0, если аргумент функции нулевой; –1, если аргумент функции отрицательный. |
Модуль(Число) |
|
Модуль (абсолютная величина) числа. Например, Модуль(5) это 5, Модуль(–10) это 10, Модуль(0) это 0. |
Округл(Число, КоличЗнаков) |
|
Округление числа или числового выражения до указанного количества знаков в дробной части. Например, Округл(3.14159,2) это 3.14, Округл(2.71828,0) это 3. |
15.8. Валюты в правилах зависимых проводок
Для работы с валютами в зависимых проводках ФинГрада можно использовать следующие выражения:
Выражение |
|
Значение |
р.Валюта |
|
Валюта исходной (родительской) проводки (короткое имя). Например, RUR — рубли, USD — доллары США, EUR — евро. |
ГлавнаяВалюта |
|
Обозначение главной валюты ФинГрада (короткое имя) Например, RUR — рубли, USD — доллары США, EUR — евро. |
Конвертировать(Число, Валюта1, Валюта2, Дата) |
|
Результат конвертации указанной суммы первой валюты во вторую валюту по курсу на указанную дату. Например, Конвертировать(р.Сумма, р.Валюта, "EUR", р.Дата) — выдаёт результат конвертации суммы родительской проводки в евро по курсу на дату проводки |
Конвертировать(Число, Валюта1, Валюта2) |
|
Результат конвертации указанной суммы первой валюты во вторую валюту по курсу на сегодняшнюю дату. Например, Конвертировать(р.Сумма, р.Валюта, "USD") — выдаёт результат конвертации суммы родительской проводки в доллары США по сегодняшнему курсу |
ОбменныйКурс(Валюта1, Валюта2, Дата) |
|
Обменный курс при обмене первой валюты во вторую валюту по курсу на указанную дату. Например, выражение ОбменныйКурс("EUR","RUR",вДату("1.1.2012")) выдаёт результат 41,6714 (количество рублей на 1 евро на дату 1 января 2012 года) |
ОбменныйКурс(Валюта1, Валюта2) |
|
Обменный курс при обмене первой валюты во вторую валюту по курсу на сегодняшнюю дату. Например, выражение ОбменныйКурс("USD","RUR") выдаст количество рублей за 1 доллар США по сегодняшнему курсу. |
15.9. Функции выбора и проверки по маске
Для создания сложных выражений в зависимых проводках ФинГрада можно использовать следующие функции:
Выбрать(Условие, Значение1, Значение2) — это выбор одного из значений в зависимости от условия. Здесь Условие — это логическое выражение, Значение1 и Значение2 — любые выражения. Если Условие истинно, то значением функции будет Значение1, а если Условие ложно, то значением функции будет Значение2.
Пример. Выбрать(р.Дата < вДату("01.01.2008"), 0, р.Сумма) — если дата текущей проводки до 1 января 2008 года, то результат функции 0, в противном случае результат функции равен сумме родительской проводки.
ВыбратьНеПустое(Выражение, ЗначениеПоУмолчанию) — если Выражение имеет не пустое значение, то значение функции равно значению Выражения. Иначе оно равно ЗначениюПоУмолчанию.
Замечание. Иначе говоря, ВыбратьНеПустое(Выражение, ЗначениеПоУмолчанию) —это краткая и более удобная запись формулы Выбрать(Выражение <> "", Выражение , ЗначениеПоУмолчанию). Если Выражение длинное и сложное, то повторное его написание в формуле сильно снижает читаемость формулы и повышает риск возникновения ошибок.
Оператор выбора. Вместо функции Выбрать можно использовать конструкцию:
Условие ? Значение1 : Значение2
Отличие от функции Выбрать в том, что здесь вычисляется Условие, после чего вычисляется только нужное значение (Значение1 если Условие истинно, и Значение2 если Условие ложно). А для функции Выбрать вычисляются все аргументы.
Дело тут не столько в увеличении скорости выполнения за счёт устранения ненужных вычислений, сколько в том, что при вычислении может произойти ошибка.
Пример. Функция Выбрать(р.Займ.Валюта=="", р.Займ.Сумма, Конвертировать(р.Займ.Сумма, р.Займ.Валюта, ГлавнаяВалюта)) не будет работать правильно. Так как если р.Займ.Валюта имеет пустое значение, то при вычислении функции Выбрать произойдёт ошибка в ходе вычисления выражения Конвертировать(р.Займ.Сумма, "", ГлавнаяВалюта). А конструкция р.Займ.Валюта=="" ? р.Займ.Сумма : Конвертировать(р.Займ.Сумма, р.Займ.Валюта, ГлавнаяВалюта) будет работать правильно.
ПодходитПодМаску(Строка,Маска1,Маска2…) — функция выдаёт значение «истина», если заданная строка подходит под хотя бы одну из перечисленных масок, и «ложь», если не подходит ни под одну из этих масок. Здесь маска — это строка (она может задаваться строковой константой или символьным выражением), в которой символ * означает любую последовательность символов, а ? означает любой единичный символ.
Примеры:
- ПодходитПодМаску(р.Комментарий,'*91.*') — возвратит значение Истина, если в комментарий родительской проводки входит подстрока «91.».
- ПодходитПодМаску(р.Комментарий,'91.*','92.1*') — возвратит значение Истина, если комментарий родительской проводки начинается с сочетаний символов «91.» или «92.1».
ПодходитПодРегВыр(Строка,РегВыр1,РегВыр2…) — функция выдаёт значение «истина», если заданная строка подходит хотя бы под одно из перечисленных регулярных выражений, и «ложь», если не подходит ни под одно из этих регулярных выражений.
Замечание. Точный синтаксис регулярных выражений можно посмотреть здесь: http://msdn.microsoft.com/ru-ru/library/bb982727.aspx. В ФинГраде используется ECMA вариант регулярных выражений.
ПользовательИзГруппы(Имя группы) — проверяет, входит ли пользователь в указанную группу.
Примеры:
- ПользовательИзГруппы("Бухгалтерия") — возвратит значение Истина, если пользователь входит в группу Бугхалтерия.
ВыброситьОшибку(Строка) — функция генерирует ошибку с заданным сообщением. В качестве аргумента (строки) вы можете использовать любое текстовое сообщение. Можно настроить правила и фильтр так, чтобы при выполнении заданных условий пользователь видел сообщение об ошибке. Проводка при этом генерироваться не будет.
Простой пример. Допустим, нужно запретить проводить проводки, если дата проводки — 90 и более дней в прошлом. В блоке Фильтр ограничение может выглядеть так:
Если теперь попытаться провести проводку с датой старше 90 дней, ФинГрад выведет ошибку:
Может возникнуть вопрос: проверка относится к дате, тогда почему мы поместили команду ВыброситьОшибку в поле Комментарий? Это объясняется тем, что обработка полей в блоке Фильтр идёт последовательно, от верхнего поля к нижнему. В нашем примере проверяется сначала дебет и кредит счетов. Затем — дата. Если дата проводки старше текущей более чем на 90 дней, ФинГрад переходит к следующей строке фильтра, в данном случае — Комментарий. В этот момент и выполняется команда ВыброситьОшибку. Если же дата проводки не старше 90 дней, то проводка не попадёт под условия фильтра, её можно будет провести и пользователь не увидит сообщение об ошибке.
15.10. Общие переменные и свойства проводок
Для удобства соберём сведения о переменных и свойствах проводок, которые можно использовать при задании зависимых проводок ФинГрада, в несколько таблиц.
15.10.1. Глобальные (общие) переменные
Переменная |
|
Значение |
р |
|
Родительская проводка. |
$ |
|
Значение текущего поля в исходной (родительской) проводке. |
ГлавнаяВалюта |
|
Обозначение главной валюты (короткое имя, например RUR). |
ДатаЗакрытияПериода |
|
Дата закрытия периода, или пустое значение, если закрытия периода в ФинГраде не производилось. |
ЛюбоеЗначение |
|
Логическое значение «истина». |
Сегодня |
|
Сегодняшняя дата. |
ТекущийПользователь |
|
Идентификатор (login) текущего пользователя ФинГрада. |
15.10.2. Свойства проводки
Свойство |
|
Значение свойства |
|
Пример |
Дебет |
|
Дебетуемый счёт проводки |
|
р.Дебет |
Кредит |
|
Кредитуемый счёт проводки |
|
р.Кредит |
Дата |
|
Дата проводки |
|
р.Дата |
Комментарий |
|
Комментарий к проводке |
|
р.Комментарий |
Валюта |
|
Валюта проводки (короткое имя) |
|
р.Валюта |
Сумма |
|
Сумма проводки |
|
р.Сумма |
КоличествоТовара |
|
Количество товара в проводке |
|
р.КоличествоТовара |
Аналитика("имя") |
|
Значение указанной аналитики проводки |
|
р.Аналитика("ИНН") |
15.11. Пример использования — начисление НДС с полученных авансов
В п. 14.3. Пример — начисление НДС с полученных авансов мы рассмотрели пример, в котором описали использование механизма генерации зависимых проводок для начисления обязательств по уплате в бюджет НДС при получении авансов за предстоящие работы или услуги. Но мы делали это ещё до описания языка зависимых проводок. Поэтому там мы использовали лишь простейшие возможности языка зависимых проводок. В частности, нам пришлось ограничиться случаем, когда для всех поступающих авансов применяется ставка НДС 18%.
Теперь, после того, как мы познакомились с языком зависимых проводок, вернёмся к этому примеру и улучшим его с применением новых возможностей.
Подготавливаем справочник Виды НДС. Чтобы правильно начислять НДС для различных ставок НДС, удобно сведения о доле НДС в платежах включить в справочник аналитики Виды НДС. Для этого поступим так:
- Выберем в главном меню раздел Основная информация | Аналитики.
- Выберем в списке аналитик строку Вид НДС и добавим к аналитике Вид НДС две колонки числового типа с именами ДоляНДС и ДоляБезНДС.
- Щёлкнув гиперссылку Открыть справочник, выведем справочник аналитики Вид НДС. Нажмём кнопку и заполним ячейки в колонках ДоляНДС и ДоляБезНДС:
Здесь для заполнения ячеек удобно использовать калькулятор Windows. Там можно вычислить нужное значение, например, 18/118, нажать комбинацию клавиш +, затем переключиться в ФинГрад, щёлкнуть мышью ту ячейку справочника, в которую надо вставить это значение, и нажать +.
Замечание. Можно было бы сделать колонки ДоляНДС и ДоляБезНДС не числового, а текстового типа. Тогда в этих колонках можно было бы указывать значения в виде дробей, например: 18/118 и 100/118.
- Нажмём кнопку для сохранения изменений и закроем окно справочника Вид НДС, а затем окно Редактор аналитик. Эти окна можно закрыть нажатием кнопки в правом верхнем углу окна).
Задаём правило для генерации зависимых проводок. Исправим то правило генерации зависимых проводок, которое мы создали в п. 14.3. Пример — начисление НДС с полученных авансов. Поступаем следующим образом.
- Выберем в главном меню ФинГрада раздел Основная информация | Правила зависимых проводок.
- Откроется окно Редактирование правил зависимых проводок. щёлкнем мышью гиперссылку Начисление НДС на полученные авансы в правом верхнем углу окна. Это правило, которое мы создали в предыдущем примере.
- Нажмём кнопку . Откроется окно Выберите поля. Добавим в список Выбранные поля поля Комментарий и Вид НДС. Затем нажмём кнопку .
- Заполним прямоугольник Фильтр следующим образом:
То есть, мы будем генерировать зависимые проводки для всех проводок, в которых кредитуется счёт Расчеты по полученным авансам, и значение аналитики Вид НДС не равно «Без НДС».
- Заполним прямоугольник Зависимые так:
Эти правила означают, что в создаваемой зависимой проводке:
- дебетуемым счётом будет кредитуемый счёт родительской проводки (счёт Расчеты по полученным авансам);
- кредитуемым счётом будет счёт НДС;
- поля Дата, Валюта и Сумма будут такими же, как у исходной (родительской) проводки;
- комментарий в зависимой проводке составляется из комментария к родительской проводки с добавлением строки вида (Начисление НДС 18%), или (Начисление НДС 10%), и т. п.;
- сумма зависимой проводки равна сумме родительской проводки, умноженной на значение колонки ДоляНДС аналитики ВидНДС родительской проводки.
- Сохраним изменённое правило, щёлкнув мышью кнопку на панели инструментов окна Редактирование правил зависимых проводок.
- Нажмём кнопку или кнопку в правом верхнем углу окна Редактирование правил зависимых проводок, чтобы закрыть это окно.
Теперь для проводок, в которых кредитуется счёт Расчеты по полученным авансам, значение аналитики Вид НДС не равно «Без НДС», и сумма проводки не равна нулю, ФинГрад будет генерировать зависимые проводки, как показано на рисунке:
Замечание. Для пересчёта ранее сгенерированных зависимых проводок может понадобиться применить команду Работа | Пересчёт зависимых проводок, и обновить или заново вывести отчёты, как это показано в п. 14.5.2. Пересчёт зависимых проводок.
Начисление НДС с преобразованием суммы в рубли. В приведённом выше примере мы начисляли задолженность по уплате НДС в той же валюте, в какой к нам поступил НДС. Но может оказаться, что более правильно начислять НДС в рублях, так как организация обязана уплачивать НДС в рублях. Исправим приведённый выше пример.
- Выберем в главном меню ФинГрада раздел Основная информация | Правила зависимых проводок.
- В окне Редактирование правил зависимых проводок щёлкнем мышью гиперссылку Начисление НДС на полученные авансы в правом верхнем углу окна (выберем правило, которое мы создали и отредактировали ранее).
- Заполним блок Зависимые так:
Теперь в создаваемой зависимой проводке:
- валютой проводки будет рубль (обозначение "RUR);
- сумма проводки равна сумме родительской проводки, умноженной на значение колонки ДоляНДС аналитики ВидНДС родительской проводки, и преобразованной в рубли по курсу на дату родительской проводки.
- Сохраним изменённое правило, нажав кнопку на панели инструментов окна Редактирование правил зависимых проводок.
- Щёлкнем кнопку или кнопку в правом верхнем углу окна Редактирование правил зависимых проводок, чтобы закрыть это окно.
Теперь для проводок, в которых кредитуется счёт Расчеты по полученным авансам, ФинГрад будет генерировать зависимые проводки в рублях, даже если аванс получен в валюте. Например, на приведённом выше рисунке поступил аванс в сумме 50000 дол. США, а ФинГрад сгенерировал проводку по начислению НДС в рублях:
Спасибо!
В ближайшее время мы с вами свяжемся.