Глава 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,…,счёт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.2024") - это дата, соответствующая строке "20.12.2024", то есть 20 декабря 2024 года.
Преобразование даты в строку символов выполняется с помощью функции:
ДатуВСтроку(дата)
Например, ДатуВСтроку("31.03.2024") - это строка "31.03.2024".
Получение дат начала/конца периодов. Иногда необходимо получить дату начала или окончания какого-либо периода. Например, дату начала недели или окончания квартала. Для этого в ФинГраде есть функции типа НачалоНедели(дата), КонецКвартала(дата) и т.д.
Например, НачалоНедели("03.02.2024") - это дата "05.02.2024", потому что 5 февраля 2024 года - это понедельник. Другой пример: КонецКвартала("03.02.2024") - это дата "29.03.2024" (последний рабочий день марта).
Как и поле Дата, результат получения дат начала/конца периодов - это число. Чтобы перевести это число формат "дд.мм.гггг", используйте команду ДатуВСтроку("дата").
15.5.1 Функции для работы с производственным календарем
Функция Календарь.ЭтоРабочийДень(дата) определяет, является заданная дата рабочим или выходным днем согласно производственному календарю.
Если дата является рабочим днём, то функция Календарь.ЭтоРабочийДень(дата) возвращает значение Истина, в обратном случае функция возвращает значение Ложь.
Пример использования функции Календарь.ЭтоРабочийДень - поле Дата фильтра правила зависимой проводки.
Параметром функции может быть значение поля Дата родительской проводки, переменная Сегодня, а также конкретная календарная дата, заключенная в кавычки.

Ближайший рабочий день по отношению к заданной дате вычисляет функция Календарь.БлижайшийРабочийДень(дата,смещение). В качестве параметра Смещение можно задавать положительные и отрицательные целые числа, а также ноль.
В зависимости от параметра Смещение функция возвращает следующие значения:
0– ближайший рабочий день, следующий после заданной даты;- положительное число - ближайший рабочий день к заданной дате плюс количество дней, указанное в параметре
Смещение; - отрицательное число - ближайший рабочий день, предшествующий заданной дате минус количество дней, указанное в параметре
Смещение.
Например, результатом вычисления функции Календарь.БлижайшийРабочийДень("22.12.2024", 0) будет дата 23.12.2024, так как 22.12.2024 г. - это воскресенье, а ближайший рабочий день к этой дате - это понедельник, 23.12.2024 г.
Количество рабочих дней между двумя датами рассчитывает функция Календарь.РабочихДнейМежду(Дата1,Дата2). Результат вычисления функции будет отрицательным, если Дата2 предшествует Дате1, и равным нулю, если Дата1 равна Дате2.
Например, результат вычисления функции Календарь.РабочихДнейМежду("20.11.2024","23.11.2024") равен трём.
Функции Календарь.БлижайшийРабочийДень(дата,смещение) и Календарь.РабочихДнейМежду(Дата1,Дата2) могут применяться в формулах, используемых в шаблонах документов и трансформациях.
15.5.2 Функции и переменные для работы с датами
Сведём сведения о переменных и функциях для работы с датами в таблицу:
| Функция или переменная | Значение |
|---|---|
р.Дата | Дата исходной (родительской) проводки |
Сегодня | Сегодняшняя дата |
ДатаЗакрытияПериода | Дата закрытия периода или пустое значение, если закрытия периода в ФинГраде не производилось |
вДату("строка") | Преобразование строки в дату. Например, вДату("31.12.2024") - это дата, соответствующая строке "31.12.2024", то есть дате 31 декабря 2024 года |
ДатуВСтроку(дата) | Преобразование даты в строку в формате "дд.мм.гггг". Пример: результатом выполнения команды ДатуВСтроку("31.03.2024") будет строка "31.03.2024" |
НачалоНедели(дата) | Дата начала недели, которой принадлежит передаваемая дата |
КонецНедели(дата) | Дата окончания недели, которой принадлежит передаваемая дата |
НачалоМесяца(дата) | Дата начала месяца, которому принадлежит передаваемая дата |
КонецМесяца(дата) | Дата окончания месяца, которому принадлежит передаваемая дата |
НачалоКвартала(дата) | Дата начала квартала, которому принадлежит передаваемая дата |
КонецКвартала(дата) | Дата окончания квартала, которому принадлежит передаваемая дата |
НачалоПолугодия(дата) | Дата начала полугодия, которому принадлежит передаваемая дата |
КонецПолугодия(дата) | Дата окончания полугодия, которому принадлежит передаваемая дата |
НачалоГода(дата) | Дата начала года, которому принадлежит передаваемая дата |
КонецГода(дата) | Дата окончания года, которому принадлежит передаваемая дата |
Календарь.ЭтоРабочийДень(дата) | Истина или Ложь в зависимости от положения даты в производственном календаре |
Календарь.БлижайшийРабочийДень(дата,смещение) | Дата ближайшего рабочего дня согласно производственному календарю с учетом значения параметра Смещение |
Календарь.РабочихДнейМежду(Дата1,Дата2) | Количество рабочих дней согласно производственному календарю между указанными датами |
15.6 Аналитики в правилах зависимых проводок
Во вкладке Правила зависимых проводок можно использовать значения аналитик и колонок аналитик. Для этого используются следующие обозначения:
| Выражение | Значение |
|---|---|
Аналитика(ИмяАналитики) | Значение аналитики с указанным именем. Например, Аналитика("Вид НДС") - значение аналитики с именем Вид НДС |
Если имя аналитики не содержит пробелов и специальных символов, то её значение можно получить, указав вместо Аналитика(ИмяАналитики) просто ИмяАналитики (без кавычек). Например, вместо Аналитика("Контрагент") можно написать просто Контрагент или р.Контрагент.
Колонки аналитики. Если у аналитики есть колонки, то в зависимых проводках можно использовать значения этих колонок. Для этого к обозначению аналитики добавьте:
| Выражение | Значение |
|---|---|
.Колонка(ИмяКолонки) | Значение указанной колонки |
.ИстКолонка(дата, ИмяКолонки) | Значение указанной исторической колонки по состоянию на заданную дату |
Если имя колонки не содержит пробелов и специальных символов, то значение колонки можно получить, указав вместо .Колонка(ИмяКолонки) просто .ИмяКолонки (без кавычек). Например, вместо р.Контрагент.Колонка("ИНН") можно написать просто р.Контрагент.ИНН.
Если нужно применить в правилах зависимых проводок значение аналитики, которая не используется в проводке, можно воспользоваться командой ЗначениеАналитики(Аналитика, Значение аналитики).
Например, ЗначениеАналитики("Сотрудник", "Иванов А.А.").
Проверка наличия в списке. Так же, как для счетов, для значений аналитики и колонки аналитики можно проверить наличие значения в списке. Для этого к обозначению аналитики или колонки аналитики добавьте
.ИзСписка(Значение1,…,ЗначениеN)
Результатом будет логическое значение Истина (если проверяемое значение содержится в списке) или Ложь (если не содержится). Аргументы функции ИзСписка - это строки или символьные выражения, каждое из которых должно быть существующим значением аналитики или колонки.
Проверка аналитики на удаление. Возвращает Истину, только если выбранное значение аналитики было удалено, например:
р.Сотрудник.Удалено - Истина, если значение аналитики Сотрудник было удалено.
Преобразование значения аналитики в строку. Возвращает строковое значение аналитики, например:
р.Аналитика ("Дата источника").ВСтроку - возвращает значение аналитики в виде строки (например, "05.10.2022").
Примеры:
Аналитика("Контрагент")или простоКонтрагент, илир.Контрагент- значение аналитики Контрагент родительской проводки;Аналитика("Контрагент").Колонка("Адрес")или простоКонтрагент.Адрес- значение колонки Адрес аналитики Контрагент родительской проводки;Аналитика("Сотрудник").ИстКолонка(р.Дата, "Зарплата")- значение исторической колонки Зарплата аналитики Сотрудник родительской проводки по состоянию на дату проводки;Аналитика("Вид НДС")- значение аналитики Вид НДС родительской проводки. Это выражение проще записать нельзя, так как имя аналитики содержит пробел;Аналитика("Вид НДС").ИзСписка("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, Валюта2) | Обменный курс при обмене первой валюты во вторую валюту по курсу на сегодняшнюю дату. Например, выражение ОбменныйКурс("USD","RUR") выдаст количество рублей за 1 доллар США по сегодняшнему курсу |
15.9 Функции выбора и проверки по маске
Для создания сложных выражений в зависимых проводках ФинГрада можно использовать следующие функции:
Выбрать(Условие, Значение1, Значение2) - это выбор одного из значений в зависимости от условия. Здесь Условие - это логическое выражение, Значение1 и Значение2 - любые выражения. Если Условие истинно, то значением функции будет Значение1, а если Условие ложно, то значением функции будет Значение2.
Например, Выбрать(р.Дата < вДату("01.02.2024"), 0, р.Сумма) - если дата текущей проводки до 1 февраля 2024 года, то результат функции 0, в противном случае результат функции равен сумме родительской проводки.
ВыбратьНеПустое(Выражение, ЗначениеПоУмолчанию) - выбирает первое непустое значение из списка. То есть если Выражение имеет непустое значение, то значение функции равно значению Выражения. Иначе оно равно ЗначениюПоУмолчанию.
Иначе говоря, ВыбратьНеПустое(Выражение, ЗначениеПоУмолчанию) - это краткая и более удобная запись формулы Выбрать(Выражение != "", Выражение, ЗначениеПоУмолчанию). Если Выражение длинное и сложное, то повторное его написание в формуле сильно снижает читаемость формулы и повышает риск возникновения ошибок.
Оператор выбора. Вместо функции Выбрать можно использовать конструкцию:
Условие? Значение1: Значение2
Отличие от функции Выбрать в том, что здесь вычисляется Условие, после чего вычисляется только нужное значение (Значение1, если Условие истинно, и Значение2, если Условие ложно). Для функции Выбрать же вычисляются все аргументы.
Дело тут не столько в увеличении скорости выполнения за счёт устранения ненужных вычислений, сколько в том, что при вычислении может произойти ошибка.
Например, функция Выбрать(р.Займ.Валюта=="", р.Займ.Сумма, Конвертировать(р.Займ.Сумма, р.Займ.Валюта, ГлавнаяВалюта)) не будет работать правильно. Если р.Займ.Валюта имеет пустое значение, то при вычислении функции Выбрать произойдёт ошибка в ходе вычисления выражения Конвертировать(р.Займ.Сумма, "", ГлавнаяВалюта). Конструкция же р.Займ.Валюта=="" ? р.Займ.Сумма : Конвертировать(р.Займ.Сумма, р.Займ.Валюта, ГлавнаяВалюта) будет работать правильно.
ПодходитПодМаску(Строка, Маска1, Маска2) - функция выдает значение Истина, если заданная строка подходит под хотя бы одну из перечисленных масок, и Ложь, если не подходит ни под одну из этих масок. Здесь маска - это строка (она может задаваться строковой константой или символьным выражением), в которой символ * означает любую последовательность символов, а ? означает любой единичный символ.
Примеры:
ПодходитПодМаску(р.Комментарий, "91")- возвратит значениеИстина, если в комментарий родительской проводки входит строка "91".ПодходитПодМаску(р.Комментарий, "91", "92.1")- возвратит значениеИстина, если в комментарий родительской проводки входят символы "91" или "92.1".
ПодходитПодРегВыр(Строка, РегВыр1, РегВыр2) - функция выдаёт значение Истина, если заданная строка подходит хотя бы под одно из перечисленных регулярных выражений, и Ложь, если не подходит ни под одно из этих регулярных выражений.
Например, выражение ПодходитПодРегВыр(р.Комментарий, "[0-9]") - если в поле Комментарий родительской проводки будут указаны какие-либо цифры в диапазоне от 0 до 9 в любой последовательности, то функция выдаёт значение Истина, в ином случае - Ложь.
Точный синтаксис регулярных выражений можно посмотреть здесь. В ФинГраде используется ECMA вариант регулярных выражений.
ПользовательИзГруппы(Имя группы) - проверяет, входит ли пользователь в указанную группу.
Например, ПользовательИзГруппы("Бухгалтерия") - выдает значение Истина, если пользователь входит в группу Бухгалтерия.
ВыброситьОшибку(Строка) - функция генерирует ошибку с заданным сообщением. В качестве аргумента (строки) можно использовать любое текстовое сообщение. Можно настроить правила и фильтр так, чтобы при выполнении заданных условий пользователь видел сообщение об ошибке. Проводка при этом генерироваться не будет.
Приведем простой пример. Допустим, нужно запретить проводить проводки, если дата проводки составляет 90 и более дней в прошлом. В блоке Фильтр ограничение может выглядеть так:

Если теперь попытаться провести проводку с датой старше 90 дней, ФинГрад выведет ошибку:

Может возникнуть вопрос: проверка относится к дате, тогда почему помещаем команду ВыброситьОшибку в поле Комментарий? Это объясняется тем, что обработка полей в блоке Фильтр идёт последовательно, от верхнего поля к нижнему. В данном примере проверяется сначала дебет и кредит счетов, затем - дата. Если дата проводки старше текущей более чем на 90 дней, ФинГрад переходит к следующей строке фильтра и далее - к комментарию. В этот момент и выполняется команда ВыброситьОшибку. Если же дата проводки не старше 90 дней, то проводка не попадёт под условия фильтра, её можно будет провести, и пользователь не увидит сообщение об ошибке.
15.10 Общие переменные и свойства проводок
Для удобства соберём сведения о переменных и свойствах проводок, которые можно использовать при задании зависимых проводок ФинГрада, в несколько таблиц.
15.10.1 Глобальные (общие) переменные
| Переменная | Значение |
|---|---|
р | Родительская проводка |
$ | Значение текущего поля в исходной (родительской) проводке |
ГлавнаяВалюта | Обозначение главной валюты (короткое имя, например, RUR) |
ДатаЗакрытияПериода | Дата закрытия периода или пустое значение, если закрытия периода в ФинГраде не производилось |
ЛюбоеЗначение | Логическое значение Истина |
Сегодня | Сегодняшняя дата |
ТекущийПользователь | Идентификатор (login) текущего пользователя ФинГрада |
15.10.2 Свойства проводки
| Свойство | Значение свойства | Пример |
|---|---|---|
Дебет | Дебетуемый счёт проводки | р.Дебет |
Кредит | Кредитуемый счёт проводки | р.Кредит |
Дата | Дата проводки | р.Дата |
Комментарий | Комментарий к проводке | р.Комментарий |
Валюта | Валюта проводки (короткое имя) | р.Валюта |
Сумма | Сумма проводки | р.Сумма |
КоличествоТовара | Количество товара в проводке | р.КоличествоТовара |
Аналитика("имя") | Значение указанной аналитики проводки | р.Аналитика("ИНН") |
15.11 Пример использования - начисление НДС от выручки
В п. 14.3.8 Описание полей зависимых проводок мы рассмотрели пример, в котором представлено начисление НДС с помощью простейшего языка зависимых проводок и с ограничением по ставке НДС 20%.
Теперь - после того, как мы познакомились с языком зависимых проводок - вернёмся к этому примеру и усовершенствуем его с применением новых возможностей.
Подготавливаем справочник Вид НДС. Чтобы правильно проводить вычисления для различных ставок НДС, можно включить сведения о доле НДС в платежах в соответствующий справочник аналитики. Для этого выполним следующие действия:
-
Выберем в главном меню раздел
Настройки |
Аналитики.
-
Выберем в списке аналитик строку Вид НДС и добавим к аналитике Вид НДС две колонки числового типа с именами Доля НДС и Доля без НДС. Сохраним внесенные изменения с помощью кнопки Сохранить.
-
Щёлкнув гиперссылку Открыть справочник, выведем справочник аналитики Вид НДС. Перейдем в режим редактирования справочника с помощью кнопки
Редактировать и заполним ячейки в колонках Доля НДС и Доля без НДС:

Здесь для заполнения ячеек удобно использовать калькулятор Windows. Там можно вычислить нужное значение, например, 18/118, нажать комбинацию клавиш
Ctrl+C, затем переключиться в ФинГрад, щёлкнуть мышью ту ячейку справочника, в которую надо вставить это значение, и нажатьCtrl+V.примечаниеМожно было бы сделать колонки Доля НДС и Доля без НДС не числового, а текстового типа. Тогда в этих колонках можно было бы указывать значения в виде дробей, например: 18/118 и 100/118.
-
Нажмём кнопку Сохранить для внесения изменений в базу данных и закроем справочник Вид НДС с помощью кнопки
в правом верхнем углу вкладки.
Теперь создадим новое правило генерации зависимых проводок на основе того правила, которое мы рассматривали в качестве примера в п. 14.3.8 Описание полей зависимых проводок:
-
Перейдем в раздел
Настройки |
Правила зависимых проводок.
-
В списке правил перейдем к правилу Реальный расход - тому правилу, что мы рассматривали в предыдущей главе.
-
Скопируем правило с помощью кнопки
Скопировать правило около имени правила и переименуем копию (например, как представлено на рисунке ниже).
-
В поле Фильтр внесем следующие коррективы:

Таким образом, будут генерироваться зависимые проводки для всех проводок, в которых кредитуется счёт из групп счетов Доходы(Выручка) и Прочие Доходы/Расходы, сумма проводки не равна нулю и значение аналитики Вид НДС не равно "Без НДС".
-
Поле Зависимые заполним следующим образом:

Данное правило означает, что в создаваемой зависимой проводке:
- Дебетуемым счётом будет кредитуемый счёт родительской проводки (из групп счетов Доходы(Выручка) и Прочие Доходы/Расходы).
- Кредитуемым счётом будет счёт НДС.
- Поля Дата, Валюта, Контрагент и Вид НДС будут такими же, как у исходной (родительской) проводки.
- Комментарий в зависимой проводке составляется из комментария к родительской проводки с добавлением строки вида (Начисление НДС 18%) или (Начисление НДС 10%) и т.п.
- Сумма зависимой проводки равна сумме родительской проводки, умноженной на значение колонки Доля НДС аналитики Вид НДС родительской проводки.
Сохраним настройки правила, щёлкнув мышью кнопку Сохранить в правом нижнем углу вкладки Правила зависимых проводок.
Чтобы правило вступило в силу, в правой области вкладки переведите переключатель около наименования правила в активное положение
, как представлено на рисунке ниже, и нажмите кнопку Сохранить.

Теперь для проводок, в которых кредитуется счёт из групп Доходы(Выручка) и Прочие Доходы/Расходы, значение аналитики Вид НДС не равно "Без НДС" и сумма проводки не равна нулю, ФинГрад будет генерировать зависимые проводки, как показано на рисунке:

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

Теперь в создаваемой зависимой проводке:
- Валютой проводки будет рубль (обозначение "RUR").
- Сумма проводки равна сумме родительской проводки, умноженной на значение колонки Доля НДС аналитики Вид НДС родительской проводки и преобразованной в рубли по курсу на дату родительской проводки.
Сохраним изменённое правило, нажав кнопку Сохранить в правом нижнем углу вкладки Правила зависимых проводок.
Чтобы правило вступило в силу, в правой области вкладки переведите переключатель около наименования правила в активное положение
и нажмите кнопку Сохранить.
Теперь для проводок, в которых кредитуется счёт из групп Доходы(Выручка) и Прочие Доходы/Расходы, ФинГрад будет генерировать зависимые проводки в рублях, даже если исходная проводка была проведена в иностранной валюте. Например, на приведённом ниже рисунке поступила выплата в сумме 2000 дол. США, а ФинГрад сгенерировал проводку по начислению НДС в рублях:
