Опубликовано: 16.08.2022

Работа с журналами расчётов

Общие сведения

Журнал расчётов — это средство для просмотра и редактирования результатов расчёта. Каждая строка журнала отражает единичное событие расчёта для того или иного объекта. Такие события называются «расчётами» и характеризуются следующими данными:

  • объект, для которого произведён расчёт;
  • вид расчёта;
  • документ, на основании которого введён этот расчёт;
  • результат расчёта;
  • время действия (расчёт имеет дату начала и дату окончания) и период регистрации, во время которого расчёт введён в журнал. Причём, время действия акта расчёта и период регистрации могут не совпадать.

Типичным примером журнала расчётов является журнал расчёта заработной платы сотрудников предприятия (каждый сотрудник — объект расчёта), в котором выполняется расчёт тех или иных начислений и удержаний (виды расчёта), имеющих определённую продолжительность и результат. Другой пример — журнал расчёта амортизации основных средств, где справочником объектов расчёта является справочник основных средств предприятия, а видами расчёта — алгоритм расчёта амортизации, списания, переоценки и т.д. Третий пример — журнал расчёта дивидендов для акционеров АО, где объекты расчёта — список акционеров предприятия, а виды расчёта — способы начислений дивидендов на акции разных типов.

Справочник объектов расчета

Одним из самых важных свойств журнала расчётов является ссылка на справочник, элементы которого являются объектами расчёта. Справочник объектов расчёта может быть как простым, так и иерархическим. Не обязательно все элементы этого справочника должны рассчитываться конкретным журналом расчётов, но, в свою очередь, все строки журнала расчётов должны соответствовать тому или иному элементу справочника объектов расчёта. Как правило, журнал расчётов содержит несколько записей по одному объекту расчёта, но одна запись журнала расчётов не может соответствовать сразу нескольким объектам.

Расчётный период

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

Важно! Временной интервал каждой отдельной записи журнала не может лежать в разных расчётных периодах журнала.

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

Рассмотрим подробнее основные моменты работы с журналами расчётов:

Основной журнал расчётов

По умолчанию основным журналом расчётов является первый среди прочих журналов расчётов в списке объектов метаданных.

Журналы расчетов

Установить в качестве основного иной журнал расчётов позволяет системная функция ОсновнойЖурналРасчетов() (англоязычный синоним — BasicCalcJournal()). Возвращаемым значением функции является значение текущего журнала расчетов.

Синтаксис:

ОсновнойЖурналРасчетов(<ЖурналРасч>)

где <ЖурналРасч> — строковое значение — идентификатор журнала расчётов, как он задан при конфигурировании.

Пример записи функции:

ОсновнойЖурналРасчетов("Зарплата");

Контекст работы с журналом расчётов

Так же, как и при работе с другими данными системы «1С:Предприятие», доступ к атрибутам журнала расчётов и вызов его методов зависит от контекста выполнения модуля программы. В контексте выполнения расчёта, доступны атрибуты и методы журнала расчётов, то есть они пишутся непосредственно, с указанием необходимых параметров. Например:

// Запись рассчитанного значения в атрибут "Результат"
// журнала расчетов
Результат = Объект.Оклад * Дни / ВсегоДней;

Во всех остальных случаях доступ к атрибутам и методам журнала расчётов производится через переменную, содержащую ссылку на объект типа "ЖурналРасчетов", созданный при помощи функции СоздатьОбъект(). Чтобы вызвать атрибут или метод объекта, имя этого атрибута, метода (с указанием необходимых параметров) пишется через точку после имени этой переменной.

При создании переменной со ссылкой на объект типа "ЖурналРасчетов" в качестве параметра функции СоздатьОбъект() передаётся полное имя журнала расчётов, состоящее из идентификатора журнала расчётов (как он указан в Конфигураторе), записанного через точку после ключевого слова «ЖурналРасчетов» (англоязычный синоним — «CalcJournal»):

// Рассчитаем все записи журнала расчетов "Зарплата"
// за выбранный период
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьПериод(ВыбДата);
Пока ПолучитьЗапись() = 1 Цикл
   ЖР.Рассчитать();
КонецЦикла;

Контекст работы с записями журнала расчётов

При работе с журналом расчётов приходится сталкиваться с понятием «записи журнала расчётов». Ссылкой на объект типа «запись журнала расчётов» является, например, атрибут ПервичнаяЗапись журнала расчётов. Метод журнала ТекущаяЗапись() также возвращает объект такого типа.

Кроме того, объект этого типа передаётся как параметр предопределённой процедуре формы журнала расчётов ПриРасчете() в том случае, если выполняется расчёт одной записи журнала расчётов. С точки зрения встроенного языка, ссылки на записи журнала расчётов — агрегатные объекты, имеющие свои атрибуты.

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

Пример:

Процедура ПриРасчете(Объект)
   // определим, что считаем
   Если ТипЗначения(Объект) = 12 Тогда
      // если имеем дело с документом
      Если Объект.Автор <> Расчетчик Тогда
         // если автор данного документа не есть
         // текущий расчетчик,
         // запретим расчет чужого документа!
         СтатусВозврата(0);
      КонецЕсли;
   ИначеЕсли ТипЗначения(Объект) = 11 Тогда
      // если это элемент справочника
      Если Объект.Владелец <> Расчетчик Тогда
         // если рассчитываемый объект лежит
         // в папке текущего расчетчика, считать можно,
         // иначе — нет
         СтатусВозврата(0);
      КонецЕсли;
   Иначе
      // иначе — считаем одну запись
      Если (Объект.Документ.Автор <> Расчетчик) ИЛИ
           (Объект.Объект.Владелец <> Расчетчик) Тогда
         // не дадим считать запись
         // чужого документа или объекта
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Контекст работы с периодом журнала расчётов

При работе с журналом расчётов приходится также сталкиваться с понятием «период журнала расчётов». Ссылкой на такого рода объект являются, например, атрибуты ПериодРегистрации и ПериодДействия журнала расчётов. Кроме того, объект этого типа передаётся в качестве параметра предопределённой процедуре ПриСменеРасчетногоПериода(). С точки зрения встроенного языка, период журнала расчётов — агрегатный объект, имеющий свои атрибуты и методы. Атрибуты периода журнала расчётов предназначены только для чтения.

Атрибуты периода журнала расчётов

Дату начала периода журнала расчётов содержит доступный только для чтения атрибут ДатаНачала (англоязычный синоним — DateFrom). Значение атрибута имеет тип "Дата".

Пример использования:

Процедура ПриСменеРасчетногоПериода(ЖР, Период)   // предопределенная процедура
   Если ЖР.Вид() = "Зарплата" Тогда
      Предупреждение("Это смена текущего расчетного периода 
                     | для журнала Зарплата");
   КонецЕсли;
   Если Период.ДатаНачала <= ЖР.НачалоТекущегоПериода Тогда
      // не позволяем откатывать период назад
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

Дату окончания периода журнала расчётов содержит доступный только для чтения атрибут ДатаОкончания (англоязычный синоним — DateTill). Значение атрибута имеет тип "Дата".

Строковое представление расчётного периода журнала расчётов содержит доступный только для чтения атрибут ОписательПериода (англоязычный синоним — РеriodDescriptor). Тип формируемой строки различный для разной периодичности журнала расчётов. Например, для периода журналов с месячной периодичностью строка имеет вид «Январь 1997г», в случае квартальной периодичности журнала расчётов — «1 Квартал 1997г», а в случае недельной периодичности — «12.02.97 – 18.02.97». Данный атрибут, как правило, применяется при формировании отчётов.

Пример использования:

Процедура ВыводПоПериодам()
   Перем Запрос, ТекстЗапроса, Таб;
   Перем ДатаАкт;
   ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   ДатаАкт = ЖЗ.НачалоТекущегоПериода();
   // Создание объекта типа "Запрос"
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = "//{{ЗАПРОС(ВыводПоПериодам)
   |Период с ДатаАкт по ДатаАкт;
   |Сотр = ЖурналРасчетов.Зарплата.Объект;
   |Пер = ЖурналРасчетов.Зарплата.ПериодРегистрации;
   |Рез = ЖурналРасчетов.Зарплата.Результат;
   |Группировка Сотр упорядочить по Сотр.МестоРаботы без групп;
   |Группировка Пер;
   |Функция Сум = Сумма(Рез);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
   КонецЕсли;
   Пока Запрос.Группировка("Сотр") = 1 Цикл
      Сообщить(Запрос.Сотр.Наименование);
      Пока Запрос.Группировка("Пер") = 1 Цикл
         Сообщить(Запрос.Пер.ОписательПериода + "-" + 3апрос.Сум);
      КонецЦикла;
   КонецЦикла;
КонецПроцедуры

Методы периода журнала расчётов

Метод ПрибавитьПериод() (англоязычный синоним — AddPeriod()) предназначен для получения периода, отстоящего от текущего на заданное число периодов. Если в параметре указано положительное число, возвращаемое значение — будущий период, в противном случае — прошлый период.

Синтаксис:

ПрибавитьПериод(<Количество>)

где <Количество> — число периодов, на которое отстоит текущий период от искомого. Значение по умолчанию — 1.

Пример использования:

ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьПериод(РабочаяДата());
// на три расчетных периода (месяца) назад
Пер = ЖР.ПериодДействия.ПрибавитьПериод(-3);
// теперь отбираем записи по нужному нам периоду
ЖР.ВыбратьПериод(Пер.ДатаНачала);
Всего = 0;
Пока ПолучитьЗапись() = 1 Цикл
   Если ЖР.ВидРасч = ВидРасчета.Доплата Тогда
      Всего = Всего + ЖР.Результат;
   КонецЕсли;
КонецЦикла;

Атрибуты журнала расчётов

Ссылку на документ, на основании которого данная запись (расчёт) введена в журнал расчётов, содержит доступный только для чтения атрибут Документ (англоязычный синоним — Document). Это может быть, например, документ «Больничный лист», породивший одну или несколько записей с видом расчёта «Оплата больничного листа».

Этот атрибут заполняется в момент проведения документа ссылкой на этот документ, в случае использования методов ВвестиРасчет(), ВвестиПерерасчет(), ЗаписатьРасчет(), или ссылкой на другой документ, в случае использования методов ВвестиРасчетНаОсновании(), ЗаписатьРасчетНаОсновании(), ВвестиПерерасчетНаОсновании().

Пример использования:

Процедура ПровестиРасчет()
   Календ = Объект.Категория.Получить(ДатаНачала).Календарь;
   Дней = Календ.Дней(ДатаНачала, ДатаОкончания);
   Если ОткрытДок(Документ) = 0 Тогда
      РассчитатьСреднюю(Документ, Константа.МесСреднБЛ,
                        ГруппаРасчетов.СредняяДляБЛ, 0);
   КонецЕсли;
   // среднюю зарплату берем из документа породившего расчет
   Результат = Окр(Дней * Документ.СрЗарплата);
   Дни = ?(Сторно = 1, -Дней, Дней);
КонецПроцедуры

Ссылку на документ расчёта, который ввёл данную запись (расчёт) журнала расчётов содержит доступный только для чтения атрибут РодительскийДокумент (англоязычный синоним — ParentDocument). В момент проведения документа, при вводе новых записей в журнал расчётов любым способом, атрибут РодительскийДокумент заполняется ссылкой на тот документ, который проводится.

Пример использования:

ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьЗаписиПоОбъекту();
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   Если (ЖР.ВидРасч = ВидРасчета.ПоОкладу) И
        (ЖР.РодительскийДокумент.Вид() <> "НачалоМесяца") Тогда
      СообщитьОПерерасчете();
   КонецЕсли;
КонецЦикла;

Ссылку на конкретный элемент того справочника, который при конфигурировании журнала расчётов задан как справочник объектов расчёта, содержит доступный только для чтения атрибут Объект (англоязычный синоним — Object). К этому конкретному элементу справочника имеет отношение данная запись (расчёт) журнала расчётов.

Пример использования:

Процедура ПровестиРасчет()
   // Объект расчета — сотрудник
   Если Объект.Профсоюз.Получить(ДатаОкончания) = 1 Тогда
      // Зануляем результат перед расчетом для того,
      // чтобы не учитывать его при расчете уже взятого налога!!!
      Результат = 0;
      // Журнал расчетов
      ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
      ЖР.ВыбратьЗаписиПоОбъекту(Объект, ЖР.НачалоПериодаПоДате(ДатаНачала),
         ЖР.КонецПериодаПоДате(ДатаНачала));
      Облагаем = 0;
      УжеВзяли = 0;
      Группа = ГруппаРасчетов.ОблагаетсяПроф;
      Пока ЖР.ПолучитьЗапись() > 0 Цикл
         Если ЖР.ВидРасч.ВходитВГруппу(Группа) = 1 Тогда
            Облагаем = Облагаем + ЖР.Результат;
         ИначеЕсли ЖР.ВидРасч = ВидРасчета.ПрофВзносы Тогда
            УжеВзяли = УжеВзяли + ЖР.Результат;
         КонецЕсли;
      КонецЦикла;
      Результат = Окр(Константа.ПроцентПроф.Получить(ДатаНачала) / 100 * Облагаем - УжеВзяли);
   Иначе
      Результат = 0;
   КонецЕсли;
КонецПроцедуры

Ссылку на конкретный вид расчёта, алгоритм которого будет использован при вычислении результата данной записи журнала расчётов (акта расчёта), содержит доступный только для чтения атрибут ВидРасч (англоязычный синоним — CalculKind).

Пример использования:

// Перечисление в банк
Процедура ПровестиРасчет()
   // Процедура выполняется при проведении расчета
   // посчитаем сумму на руки
   НаРуки = 0;
   ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   Пока ЖР.ПолучитьЗапись() = 1 Цикл
      // Если строка журнала расчетов имеет вид расчета, 
      // входящий в группу "Все начисления"
      Если ЖР.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеНачислнения) Тогда
         НаРуки = НаРуки + ЖР.Результат;
      // ... или "Все удержания"
      ИначеЕсли ЖР.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания) Тогда
         НаРуки = НаРуки - ЖР.Результат;
      КонецЕсли;
   КонецЦикла;
   Если Документ.Сумма <> 0 Тогда
      Результат = Окр(Мин(Документ.Сумма, НаРуки));
   ИначеЕсли Документ.Процент <> 0 Тогда
      НаРуки = 0;
      Результат = Окр(НаРуки * Процент / 100);
   КонецЕсли;
   Если Документ.Банк.Выбран() Тогда
      ПроцентУд = Документ.Банк.ПроцентУдержания;
   Иначе
      Сообщить("Не указан банк для перечисления средств!");
      Возврат;
   КонецЕсли;
   ЖР.ВвестиРасчет(Объект, ВидРасчета.БанковскиеИздержки, 
      ДатаНачала, ДатаОкончания, Окр(Результат * ПроцентУд / 100));
КонецПроцедуры

Дату начала действия текущего акта расчёта (записи журнала расчётов) содержит доступный только для чтения атрибут ДатаНачала (англоязычный синоним — DateFrom). Эта дата может не совпадать с периодом регистрации.

Пример использования:

// Процедура выполняется в контексте журнала расчетов
// ДатаНачала и ДатаОкончания доступны непосредственно!
// Календарь
Календ = Объект.Категория.Получить(ДатаНачала).Календарь;
// Размер оклада
Тариф = Объект.Тариф.Получить(ДатаОкончания);
Часов = Календ.Часов(ДатаНачала, ДатаОкончания);
Результат = Окр(Тариф*Часов);
Часы = ?(Сторно = 1, -Часов, Часов);

Дату окончания действия текущего акта расчёта (записи журнала расчётов) содержит доступный только для чтения атрибут ДатаОкончания (англоязычный синоним — DateTill).

Пример использования:

// Процедура выполняется в контексте журнала расчетов
// ДатаНачала и ДатаОкончания доступны непосредственно!
// Календарь
Календ = Объект.Категория.Получить(ДатаНачала).Календарь;
// Размер оклада
Тариф = Объект.Тариф.Получить(ДатаОкончания);
Часов = Календ.Часов(ДатаНачала, ДатаОкончания);
Результат = Окр(Тариф*Часов);
Часы = ?(Сторно = 1, -Часов, Часов);

Период действия текущей записи журнала расчётов содержит доступный только для чтения атрибут ПериодДействия (англоязычный синоним — EffectivePeriod). Значение атрибута имеет тип «период журнала расчетов». Под периодом действия подразумевается тот расчётный период журнала, в который попадают ДатаНачала и ДатаОкончания действия записи журнала расчётов (акта расчёта).

Пример использования:

Процедура ПоПодр()
   Перем Запрос, ТекстЗапроса, Таб;
   // Создание объекта типа "Запрос"
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = "//{{ЗАПРОС(ПоПодр)
   |Период с ДатаНач по ДатаКон;
   |Док = ЖурналРасчетов.Зарплата.ТекущийДокумент;
   |ПД = ЖурналРасчетов.Зарплата.ПериодДействия;
   |Подр = ЖурналРасчетов.Зарплата.Объект.МестоРаботы.Владелец;
   |Рез = ЖурналРасчетов.Зарплата.Результат;
   |Группировка ПД;
   |Группировка Подр без групп;
   |Функция Итог = Сумма(Рез);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
      Возврат;
   КонецЕсли;
   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("ПоПодр");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Пока Запрос.Группировка("ПД") = 1 Цикл
      // Заполнение полей ПД
      Таб.ВывестиСекцию("ПД");
      Сообщить(Запрос.ПД.Описатель);
      Пока Запрос.Группировка("Подр") = 1 Цикл
         // Заполнение полей Подр
         Таб.ВывестиСекцию("Подр");
      КонецЦикла;
   КонецЦикла;
   // Заполнение полей "Итого"
   Таб.ВывестиСекцию("Итого");
   // Вывод заполненной формы
   Таб.Опции(1, 0, 1, 0);
   Таб.Показать("ПоПодр", "");
КонецПроцедуры

Расчётный период, в котором текущая запись была введена в журнал расчётов, содержит доступный только для чтения атрибут ПериодРегистрации (англоязычный синоним — RegistrationPeriod). Это тот расчётный период, который на момент ввода данной записи был установлен для журнала расчётов как текущий. Атрибут имеет тип «период журнала расчетов».

Признак того, что запись является сторнирующей, содержит атрибут Сторно (англоязычный синоним — Storno). Атрибут может принимать два значения: 1 — для сторнирующих записей журнала расчётов; 0 — для обычных записей. Признак «сторно» равен 1 не только для простых сторно-записей, но и для рассчитанных, отредактированных вручную или зафиксированных (не подлежащих редактированию) сторно-записей.

Сторнирующие записи могут появляться в журнале расчётов в результате выполнения методов ВвестиРасчет(), ЗаписатьРасчет() и им подобных, если при этом затрагиваются один или несколько прошлых расчётных периодов и вводимый вид расчёта является «вытесняющим». При этом система автоматически вводит необходимые сторнирующие записи. Для таких записей (введённых системным образом) признак сторнирования не может быть переопределён.

Если сторнирующая запись введена программным образом, то есть атрибут Сторно задан за счёт применения метода УстановитьРеквизит() или непосредственным присвоением

ЖР.Сторно = 1;

тогда он может быть переопределён программным образом.

Пример использования атрибута:

Процедура ПровестиРасчет()
   // Календарь
   Календ = Объект.Категория.Получить(ДатаОкончания).Календарь;
   // Размер оклада
   Оклад = Объект.Оклад.Получить(ДатаОкончания);
   Дней = Календ.Дней(ДатаНачала, ДатаОкончания);
   ВсегоДней = Календ.Дней(НачалоПериодаПоДате(ДатаНачала), 
         КонецПериодаПоДате(ДатаНачала));
   Если ВсегоДней > 0 Тогда
      Результат = Окр(Оклад * Дней / ВсегоДней);
      // Если запись-сторно — поставим отрицательные дни!
      Дни = ?(Сторно = 1, -Дней, Дней);
   Иначе
      Результат = 0;
      Дни = 0;
      Сообщить("Неправильный календарь!");
   КонецЕсли;
КонецПроцедуры

Другой пример:

// вводим сторнирующие рассчитанные записи
ВР = ВидРасчета.ДоплатаКОкладу;
ЖрнЗарплата.УстановитьРеквизит("Сторно", 1);
ЖрнЗарплата.УстановитьРеквизит("Рассчитана", 1);
ЖрнЗарплата.ВвестиРасчет(Сотрудник, ВР, , , Сумма * Процент);

Признак того, что запись является рассчитанной, содержит доступный только для чтения атрибут Рассчитана (англоязычный синоним — Calculated). Атрибут может принимать два значения: 1 — для рассчитанных записей журнала расчётов; 0 — для нерассчитанных записей. Запись журнала расчётов становится рассчитанной в результате выполнения одной из соответствующих команд меню «Действия» или при выполнении методов журнала расчётов ВыпролнитьРасчет(), Рассчитать().

Пример использования:

// Перед выводом отчета проверим, все ли записи рассчитаны
ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖрнЗарплата.ВыбратьПериодПоОбъекту(Сотрудник, ДатаОтчета);
// Признак нерассчитанности
ПлохоДело = 0;
Пока ЖрнЗарплата.ПолучитьЗапись() = 1 Цикл
   Если ЖрнЗарплата.Рассчитана = 0 Тогда
      ПлохоДело = 1;
      Прервать;
   КонецЕсли;
КонецЦикла;
Если ПлохоДело = 1 Тогда
   Предупреждение("Не проведен полный расчет сотрудника!
                  | Формирование отчета невозможно");
   Возврат;
КонецЕсли;
// продолжим формирование документа
 . . .

Признак того, что запись является исправленной, содержит доступный только для чтения атрибут Исправлена (англоязычный синоним — Updated). Атрибут может принимать два значения: 1 — для записей журнала расчётов, результат которых исправлен «вручную»; 0 — для остальных записей. Запись журнала расчётов становится исправленной при редактировании результата расчёта непосредственно в журнале расчётов. Исправленные вручную записи не редактируются при очередном сеансе расчёта, т.е. результат автоматического расчёта не заменяет результат ручного ввода. Это значит, что результат ручного редактирования «главнее» результата автоматического расчёта.

Пример использования:

// Проверим, не редактировали ли результаты
ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖрнЗарплата.ВыбратьЗаписиПоДокументу(ТекущийДокумент());
Счетчик = 0;
Пока ЖрнЗарплата.ПолучитьЗапись() = 1 Цикл
   Если ЖрнЗарплата.Исправлена = 1 Тогда
      Счетчик = Счетчик + 1;
   КонецЕсли;
КонецЦикла;
Если Счетчик <> 0 Тогда
   Сообщить("Исправленных записей — " + Счетчик);
КонецЕсли;
// продолжим формирование документа
 . . .

Признак того, что запись является фиксированной, содержит доступный только для чтения атрибут Фиксирована (англоязычный синоним — Locked). Атрибут может принимать два значения: 1 — для фиксированных записей журнала расчётов; 0 — для остальных записей. Запись журнала расчётов становится фиксированной при выполнении метода журнала расчётов ФиксироватьЗапись(). После фиксации записи результат её расчёта не может быть изменён никаким, в том числе, программным способом. Признак фиксированности записи можно снять, применив метод журнала расчётов ОсвободитьЗапись().

Пример использования:

Если ЖрнЗарплата.Фиксирована = 1 Тогда
   Если ДатаДок > ЖрнЗарплата.НачалоТекущегоПериода() Тогда
      ОсвободитьЗапись();
   Иначе
      // отказ от расчета
       . . .
   КонецЕсли;
КонецЕсли;

Признак того, что запись является записью-перерасчётом, содержит доступный только для чтения атрибут Перерасчет (англоязычный синоним — Recalc). Атрибут может принимать два значения: 1 — для записей-перерасчётов; 0 — для остальных записей. Записи-перерасчёты вводятся в журнал расчётов при выполнении одного из методов журнала расчётов: ВвестиПерерасчет() или ВвестиПерерасчетНаОсновании().

Пример использования:

ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖрнЗарплата.ВыбратьПериодПоОбъекту(Сотрудник, ДатаОтчета);
Есть = 0;
Пока ЖрнЗарплата.ПолучитьЗапись() = 1 Цикл
   Если ЖрнЗарплата.Перерасчет = 0 Тогда
      Есть = 1;
      Пер = ЖрнЗарплата.ПервичнаяЗапись.ПериодРегистрации;
      Прервать;
   КонецЕсли;
КонецЦикла;
Если Есть = 1 Тогда
   Предупреждение("За истекший период проводились перерасчеты
                  | прошлого периода " + Пер.Описатель);
   Возврат;
КонецЕсли;
// продолжим формирование документа
 . . .

Ссылку на первичную запись содержит доступный только для чтения атрибут ПервичнаяЗапись (англоязычный синоним — ParentRecord). Атрибут имеет непустое значение для записей-перерасчётов, т.е. тех записей, которые введены в систему одним из методов журнала расчётов: ВвестиПерерасчет() или ВвестиПерерасчетНаОсновании(). Значение атрибута имеет тип "запись журнала расчетов".

Пример использования:

ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖрнЗарплата.ВыбратьПериодПоОбъекту(Сотрудник, ДатаОтчета);
Есть = 0;
Пока ЖрнЗарплата.ПолучитьЗапись() = 1 Цикл
   Если ЖрнЗарплата.Перерасчет = 0 Тогда
      Есть = 1;
      Пер = ЖрнЗарплата.ПервичнаяЗапись.ПериодРегистрации;
      Прервать;
   КонецЕсли;
КонецЦикла;
Если Есть = 1 Тогда
   Предупреждение("За истекший период проводились перерасчеты
                  | прошлого периода " + Пер.Описатель);
   Возврат;
КонецЕсли;
// продолжим формирование документа
 . . .

Получить доступ к результату расчёта записи позволяет атрибут Результат (англоязычный синоним — Result). Атрибут имеет тип "Число". Вычисление результата расчёта и заполнение атрибута осуществляется процедурой ПровестиРасчет() модуля расчёта.

Пример использования:

Результат = Оклад * Дней / ОтработаноДней;

Другой пример:

// Переберем все записи текущего периода журнала расчетов
// по текущему основному средству и просуммируем результат
ЖР = СоздатьОбъект("ЖурналРасчетов.Амортизация");
ЖР.ВыбратьПериодПоОбъекту(Объект, ЖР.НачалоТекущегоПериода());
// Инициализируем переменную
Сумма = 0;
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Сумма = Сумма + ЖР.Результат;
КонецЦикла

Получить доступ к значению реквизита записи журнала расчётов позволяет атрибут <ИмяРеквизита>. В тексте программного модуля в качестве названия реквизита используется идентификатор конкретного реквизита журнала расчётов, созданного в Конфигураторе.

Пример использования:

// В этом примере журнал расчетов "Зарплата"
// имеет реквизит "ХозОперация"
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   ЖР.ХозОперация = ПолучитьХО(ЖР.ТекущаяЗапись());
   // вызвали вспомогательную функцию пользователя: ПолучитьХО()
КонецЦикла;

Методы журнала расчётов

Общие методы журналов расчётов

Получить название журнала расчётов, как оно задано в Конфигураторе, позволяет метод Вид() (англоязычный синоним — Kind()). Параметры у метода отсутствуют.

Пример использования:

// Преопределенная процедура
Процедура ПриСменеРасчетногоПериода(ЖР, Период)
   Если ЖР.Вид() = "Зарплата" Тогда
      Предупреждение("Это смена текущего расчетного периода 
                     | для журнала Зарплата");
   КонецЕсли;
   Если Период.ДатаНачала <= ЖР.НачалоТекущегоПериода Тогда
      // не позволяем откатывать период назад
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

Получить пользовательское представление вида журнала расчётов позволяет метод ПредставлениеВида() (англоязычный синоним — KindPresent()). Параметры у метода отсутствуют.

Пример использования:

Состояние(ЖР.ПредставлениеВида());

Методы для работы с периодами журнала расчётов

Получить дату начала текущего периода журнала расчётов позволяет метод НачалоТекущегоПериода() (англоязычный синоним — CurrentPeriodBegin()). Параметры у метода отсутствуют.

Текущий период — это отрезок времени, обсчитываемый журналом расчётов в данный момент. Величина расчётного периода журнала расчётов определяется при конфигурировании журнала и может принимать значения: день, неделя, месяц, квартал, год. Текущий период журнала расчётов устанавливается при выполнении операции «Установить период расчета» меню «Действия» журнала расчётов. В случае, если периодичность журнала расчётов равна дню, методы НачалоТекущегоПериода() и КонецТекущегоПериода() возвращают одно и то же значение.

Пример использования метода:

ЖРЗарп = СоздатьОбъект("ЖурналРасчета.Зарплата");
Начало = ЖРЗарп.НачалоТекущегоПериода();

Получить дату окончания текущего периода журнала расчётов позволяет метод КонецТекущегоПериода() (англоязычный синоним — CurrentPeriodEnd()). Параметры у метода отсутствуют.

Текущий период — это отрезок времени, обсчитываемый журналом расчётов в данный момент. Величина расчётного периода журнала расчётов определяется при конфигурировании журнала и может принимать значения: день, неделя, месяц, квартал, год. Текущий период журнала расчётов устанавливается при выполнении операции «Установить период расчета» меню «Действия» журнала расчётов. В случае, если периодичность журнала расчётов равна дню, методы НачалоТекущегоПериода() и КонецТекущегоПериода() возвращают одно и то же значение.

Пример использования метода:

ЖРЗарп = СоздатьОбъект("ЖурналРасчета.Зарплата");
Календ = СоздатьОбъект("Календарь.Служащие");
НормаОтработки = Календ.Дней(ЖРЗарп.НачалоТекущегоПериода(),
                             ЖРЗарп.КонецТекущегоПериода());

Получить период журнала расчётов по указанной дате (т.е. период, в который попадает заданная дата) позволяет метод ПериодПоДате() (англоязычный синоним — PeriodByDate()).

Синтаксис метода:

ПериодПоДате(<Дата>)

где <Дата> — любая дата, которая попадает в требуемый период.

Пример использования:

ЖР = СоздатьОбъект("ЖурналРасчета.Зарплата");
Пер = ЖР.ПериодПоДате(РабочаяДата());

Определить дату начала того периода журнала расчётов, в который попадает указанная дата, позволяет метод НачалоПериодаПоДате() (англоязычный синоним — PeriodBeginByDate()). Работа метода не зависит от наличия в журнале расчётов данных за соответствующий расчётный период.

Синтаксис метода:

НачалоПериодаПоДате(<Дата>)

где <Дата> — любая дата, которая попадает в требуемый период.

Пример использования:

// В каждой строке журнала расчетов проставим в реквизит "Дни"
// количество банковских дней того периода расчета, в который
// попадает запись
ЖР = СоздатьОбъект("ЖурналРасчетов.Дивиденды");
Календ = СоздатьОбъект("Календарь.РаботаБанка");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   ЖР.Дни = Календ.Дней(НачалоПериодаПоДате(ЖР.ДатаНачала),
                        КонецПериодаПоДате(ЖР.ДатаНачала));
КонецЦикла;

Определить дату окончания того периода журнала расчётов, в который попадает указанная дата, позволяет метод КонецПериодаПоДате() (англоязычный синоним — PeriodEndByDate()). Работа метода не зависит от наличия в журнале расчётов данных за соответствующий расчётный период.

Синтаксис метода:

КонецПериодаПоДате(<Дата>)

где <Дата> — любая дата, которая попадает в требуемый период.

Пример использования:

// В каждой строке журнала расчетов проставим в реквизит "Дни"
// количество банковских дней того периода расчета, в который
// попадает запись
ЖР = СоздатьОбъект("ЖурналРасчетов.Дивиденды");
Календ = СоздатьОбъект("Календарь.РаботаБанка");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   ЖР.Дни = Календ.Дней(НачалоПериодаПоДате(ЖР.ДатаНачала),
                        КонецПериодаПоДате(ЖР.ДатаНачала));
КонецЦикла;

Получить текущий расчётный период журнала расчётов позволяет метод ТекущийПериод() (англоязычный синоним — CurrentPeriod()). Параметры у метода отсутствуют. Возвращаемым значением метода является значение типа "период журнала расчетов".

Пример использования:

// Модуль формы журнала расчетов
Пер = ТекущийПериод();
// установим границу просмотра записей на два расчетных периода
ГраницаПросмотра(Пер.ПрибавитьПериод(-1));

Установить текущий период журнала расчётов позволяет метод УстановитьТекущийПериод() (англоязычный синоним — SetCurrentPeriod()). Происходит это так же, как при интерактивной смене текущего периода, но без диалоговых окон. Возвращаемым значением метода является число 1, если действие выполнено, или 0, если действие не выполнено.

Синтаксис метода:

УстановитьТекущийПериод(<Период>, <Способ>)

где

  • <Период> — значение типа "период журнала расчетов";
  • <Способ> — число: 0 — не отрабатывать системные действия, связанные со сменой периода; 1 — отработать системные процедуры по умолчанию (например, отменить рассчитанность записей при откате назад или провести архивацию документов при смене периода «вперёд»). Параметр является необязательным. Значение по умолчанию — 1.

Пример использования:

// Установить следующий период
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
Пер = ЖР.ТекущийПериод();
Пер = Пер.ПрибавитьПериод(1);
Сообщить("Смена периода журнала займет некоторое время...");
ЖР.УстановитьТекущийПериод(Пер);

Получить строковое представление расчётного периода журнала расчётов позволяет метод ОписательПериода() (англоязычный синоним — PeriodDescriptor()). Метод возвращает значение для того расчётного периода, в который попадает дата, указанная в параметре. Тип формируемой строки различается для разной периодичности журнала расчётов. Например, для журналов с месячной периодичностью строка имеет вид «Январь 1997г», в случае квартальной периодичности — «1 Квартал 1997г», а в случае недельной периодичности — «12.02.97 – 18.02.97». Применяется данный метод, как правило, при формировании отчётов.

Синтаксис метода:

ОписательПериода(<Дата>)

где <Дата> — дата периода, описатель которого требуется получить.

Пример использования:

ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
Сообщить("Текущий период — " + ЖЗ.ОписательПериода(РабочаяДата()));

Методы для поиска и выбора записей в журнале расчётов

Метод НайтиЗапись() (англоязычный синоним — FindRecord()) позиционирует запись журнала расчётов, переданную в качестве параметра. Передаваемое в качестве параметра значение, как правило, ранее получается за счёт применения метода ТекущаяЗапись(). Фактически, данный метод открывает выборку журнала расчётов, заведомо состоящую из одной записи, и позиционирует её. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Синтаксис метода:

НайтиЗапись(<Запись>)

где <Запись> — запись журнала расчётов.

Пример использования:

ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.ВыбратьЗаписиПоОбъекту(Сотрудник, ДН, ДО);
Пока ЖЗ.ПолучитьЗапись() = 1 Цикл
   Если ЖЗ.ПлатВедомость.Выбран() = 1 Тогда
      ЗаписьЖР = ЖЗ.ТекущаяЗапись();
   КонецЕсли;
КонецЦикла;

// теперь найдем запись по ссылке
// и что-нибудь с ней поделаем
ЖЗ.НайтиЗапись(ЗаписьЖР);
ЖЗ.ПлатВедомость.Проведена = 1;
ЖЗ.ФиксироватьЗапись();

Методы для циклической обработки записей журнала расчётов

Открыть выборку записей журнала расчётов позволяет метод ВыбратьЗаписи() (англоязычный синоним — SelectRecords()). Выбираются все записи, период действия которых хоть на один день затрагивается тем периодом, который задан параметрами <Начало> и <Окончание>. Это значит, например, что если запись журнала имеет даты начала и окончания '15.12.96' и '25.12.96' то она попадёт в выборку, открытую при помощи любого из следующих методов:

  • ВыбратьЗаписи('10.10.96', '15.12.96')
  • ВыбратьЗаписи('25.12.96', '01.01.97')
  • ВыбратьЗаписи('17.12.96', '17.12.96')

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

Данный метод работает только для объектов, созданных функцией СоздатьОбъект(). Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Синтаксис метода:

ВыбратьЗаписи(<Начало>, <Окончание>)

где

  • <Начало> — дата начала периода;
  • <Окончание> — дата окончания периода.

Пример использования:

// Расчет количества дней, отработанных всеми сотрудниками
// за прошлый период
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
// дата начала прошлого периода
ДатаНачала = ЖР.НачалоПериодаПоДате(ЖР.НачалоТекущегоПериода() - 1);
ЖР.ВыбратьЗаписи(ДатаНачала, ЖР.КонецПериодаПоДате(ДатаНачала));
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Сумма = Сумма + ЖР.Дни;
КонецЦикла;

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

Данный метод работает только для объектов, созданных функцией СоздатьОбъект(). Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Синтаксис метода:

ВыбратьПериод(<Дата>)

где <Дата> — дата, лежащая в выбираемом периоде.

Пример использования:

// Расчет суммы амортизации по результатам всех расчетов
// в текущем периоде
ЖР = СоздатьОбъект("ЖурналРасчетов.Амортизация");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
// Инициализируем переменную
Сумма = 0;
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Сумма = Сумма + ЖР.Результат;
КонецЦикла;

Открыть выборку записей журнала расчётов по заданному объекту позволяет метод ВыбратьЗаписиПоОбъекту() (англоязычный синоним — SelectRecordsByObject()). Выбираются все записи, рассчитанные для объекта, заданного параметром <Объект>, период действия которых хоть на один день затрагивается тем периодом, который задан параметрами <Начало> и <Окончание>.

Данный метод работает только для переменных, созданных функцией СоздатьОбъект(). Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Синтаксис метода:

ВыбратьЗаписиПоОбъекту(<Объект>, <Начало>, <Окончание>)

где

  • <Объект> — объект расчёта, записи которого выбираются;
  • <Начало> — дата начала периода;
  • <Окончание> — дата окончания периода.

Пример использования:

// Проходя по справочнику акционеров, проведем по некоторому
// условию полный расчет дивидендов
Акционеры = СоздатьОбъект("Справочник.Акционеры");
Акционеры.ПорядокКодов();
Акционеры.ВыбратьЭлементы();
// Журнал расчетов дивидендов
ЖР = СоздатьОбъект("ЖурналРасчетов.Дивиденды");
// Начало и конец текущего периода
Нач = ЖР.НачалоТекущегоПериода();
Кон = ЖР.КонецТекущегоПериода();
Пока Акционеры.ПолучитьЭлемент() > 0 Цикл
   Если Акционеры.Статус = 2 Тогда
      ЖР.ВыбратьЗаписиПоОбъекту(Акционеры.ТекущийЭлемент(), , );
      Пока ЖР.ПолучитьЗапись() > 0 Цикл
         ЖР.Рассчитать();
      КонецЦикла;
   КонецЕсли;
КонецЦикла;

Открыть выборку записей журнала расчётов по заданному объекту позволяет метод ВыбратьПериодПоОбъекту() (англ. синоним — SelectPeriodByObject()). Он работает так же, как метод ВыбратьПериод(), за исключением того, что выбираются все записи для того объекта расчёта, который указан в параметре.

Метод работает только для переменных, созданных функцией СоздатьОбъект(). Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Синтаксис метода:

ВыбратьПериодПоОбъекту(<Объект>, <Дата>)

где

  • <Объект> — объект расчёта, записи которого выбираются;
  • <Дата> — дата, лежащая в выбираемом периоде.

Пример использования:

Процедура Начислено(Сотрудник)
   Начисл = 0;
   ПН = 0;
   ЖР.ВыбратьПериодПоОбъекту(Сотрудник, ДатаАктуальности);
   Пока ЖР.ПолучитьЗапись() = 1 Цикл
      Если ЖР.ВидРасч.ВходитВГруппу(ГруппаРасчетов.Начисления)= 1 Тогда
         Начисл = Начисл + ЖР.Результат;
      ИначеЕсли ЖР.ВидРасч = ВидРасчета.ПодоходныйНалог Тогда
         ПН = ПН + ЖР.Результат;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Открыть выборку записей журнала расчётов по заданному документу позволяет метод ВыбратьЗаписиПоДокументу() (англ. синоним — SelеctRecordsByDocument()). Выбираются все записи, документом-основанием для которых служит заданный документ, вне зависимости от того, в каком расчётном периоде записи порождались.

Данный метод работает только для переменных, созданных функцией СоздатьОбъект(). Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Важно! Документом-основанием записи журнала расчётов может являться:

  • документ, непосредственно породивший записи в базе за счёт применения методов ВвестиРасчет() и ЗаписатьРасчет();
  • документ, ссылка на который передана в качестве параметра одному из методов: ВвестиРасчетНаОсновании() или ЗаписатьРасчетНаОсновании().

Синтаксис метода:

ВыбратьЗаписиПоДокументу(<Документ>)

где <Документ> — документ расчёта, который является документом-основанием для отбираемых записей.

Пример использования:

// Рассчитаем все записи по наряду.
// Процедура выполняется в контексте журнала расчетов
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьЗаписиПоДокументу(Документ);
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   ЖР.Рассчитать();
КонецЦикла;

Открыть выборку записей журнала расчётов, которые содержат в указанной графе отбора заданное значение отбора, позволяет метод ВыбратьПоЗначению() (англоязычный синоним — SelеctByValue()). Метод выбирает записи, период регистрации которых лежит в пределах, заданных соответствующими параметрами. Возвращаемым значением метода является число 1, если операция успешно выполнена и выборка содержит хотя бы одну запись, или 0 — в противном случае.

Если первый параметр задан неверно, то есть нет такой графы отбора, выборка не будет выполнена и метод возвратит 0. Если заданное значение отбора не содержится ни в одной строке журнала расчётов, выборка окажется пустой (то есть в неё не попадет ни одна запись журнала расчётов), но метод возвратит значение 1.

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

Примечание: Наименованиями граф отбора журнала расчётов могут служить реквизиты справочника объектов расчёта, заданного для журнала расчётов, а также значения «Владелец» и «Родитель» этого справочника. Это значит, что в общем случае, в качестве первого параметра, методу могут передаваться предопределённые имена Родитель и Владелец, а также названия реквизитов справочника. Какие именно графы отбора задействованы в журнале расчётов, задаётся при конфигурировании.

Данный метод работает так же как и метод формы журнала расчётов УстановитьОтбор(), но, разумеется не осуществляет визуального управления формой журнала.

Синтаксис метода:

ВыбратьПоЗначению(<ИмяГрафы>, <ЗначениеОтбора>,
                  <ПериодНачала>, <ПериодОкончания>)

где

  • <ИмяГрафы> — строковое значение — наименование графы отбора, как она определена при конфигурировании;
  • <ЗначениеОтбора> — отбираемое значение;
  • <ПериодНачала> — значение типа "период журнала расчётов" — первый расчётный период отбора;
  • <ПериодОкончания> — значение типа "период журнала расчётов" — последний расчётный период отбора.

Пример использования:

// Рассчитаем все записи текщего расчетного периода по
// подразделению (переменная Подр)
Процедура РасчетПодразделения(Подр)
   ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   ТекПер = ЖР.ТекущийПериод();
   ЖР.ВыбратьПоЗначению("Подразделение", Подр, ТекПер, ТекПер);
   Пока ЖР.ПолучитьЗапись() > 0 Цикл
      ЖР.Рассчитать();
   КонецЦикла;
КонецПроцедуры

Получить следующую запись журнала расчётов из выборки, предварительно открытой методом ВыбратьЗаписи(), ВыбратьЗаписиПоОбъекту(), ВыбратьЗаписиПоДокументу(), ВыбратьПериод() или ВыбратьПериодПоОбъекту(), позволяет метод ПолучитьЗапись() (англоязычный синоним — GetRecord()). Параметры у метода отсутствуют. Возвращаемым значением является число 1, если очередная запись журнала расчётов найдена, или 0, если очередная запись журнала не найдена (выборка пуста или достигнут конец выборки).

Пример использования:

// Расчет суммы амортизации по результатам всех расчетов
// в текущем периоде
ЖР = СоздатьОбъект("ЖурналРасчетов.Амортизация");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
// Инициализируем переменную
Сумма = 0;
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Сумма = Сумма + ЖР.Результат;
КонецЦикла;

Получить ссылку на текущую запись журнала расчётов, позиционированную в данный момент, позволяет метод ТекущаяЗапись() (англоязычный синоним — CurrentRecord()). Параметры у метода отсутствуют.

Пример использования:

ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.ВыбратьЗаписиПоОбъекту(Сотрудник, ДН, ДО);
Пока ЖЗ.ПолучитьЗапись() = 1 Цикл
   Если ЖЗ.ПлатВедомость.Выбран() = 1 Тогда
      ЗаписьЖР = ЖЗ.ТекущаяЗапись();
   КонецЕсли;
КонецЦикла;

// теперь найдем запись по ссылке
// и что-нибудь с ней поделаем
ЖЗ.НайтиЗапись(ЗаписьЖР);
ЖЗ.ПлатВедомость.Проведена = 1;
ЖЗ.ФиксироватьЗапись();

Методы для работы с записями журнала расчётов

Для ввода строк в журнал расчётов предназначен метод ВвестиРасчет() (англоязычный синоним — InsertCalculation()). Используется он, как правило, в модуле расчёта документа, но может использоваться и в модуле вида расчёта. Метод вводит одну или несколько записей в журнал расчётов, и результат его действия зависит от того, вводится «вытесняющий» расчёт или обычный.

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

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

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

Для случая ввода невытесняющих расчётов анализ существующих записей журнала расчётов и их протяженности во времени не проводится, и расчёт вводится в любом случае.

Во всех вышеописанных случаях ввод записей в журнал расчётов проводится в пределах границ расчётных периодов журнала расчётов. Например, если при месячной периодичности журнала задать дату начала и дату окончания, отстоящие друг от друга более, чем на месяц, будет введено более одной записи журнала расчётов — для всех периодов, затрагиваемых временным интервалом от <ДатаНачала> до <ДатаОкончания>.

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

Атрибуты Документ и РодительскийДокумент журнала расчётов заполняются значением того документа, в модуле расчёта которого сработал метод ВвестиРасчет(). Этот документ будет «родителем» и «основанием» вводимой записи журнала расчётов. В том случае, когда метод сработал в модуле вида расчёта, реквизиты Документ и РодительскийДокумент заполняются значениями этих атрибутов той записи журнала расчётов, при расчёте которой выполнен метод ВвестиРасчет().

Таким образом, конкретный документ является «родителем» не только тех записей журнала расчётов, которые введены непосредственно им, но и тех записей, которые порождены при расчёте записей, введённых документом. Можно считать, что для таких записей документ является не «родителем», а «прародителем».

Параметр <Результат> можно использовать в том случае, когда сразу при вводе записей журнала расчётов можно записать их результат.

Важно! Метод ВвестиРасчет() можно применять только для тех объектов, которые созданы функцией СоздатьОбъект(). Это значит, например, что его нельзя использовать непосредственно (без точки) в форме журнала расчётов или в модуле видов расчёта.

Синтаксис метода:

ВвестиРасчет(<Объект>, <ВидРасчета>, <ДатаНачала>,
             <ДатаОкончания>, <Результат>)

где

  • <Объект> — объект расчёта — элемент справочника, заданного при конфигурировании журнала расчётов;
  • <ВидРасчета> — вид вводимого расчёта — ссылка на агрегатный объект "ВидРасчета";
  • <ДатаНачала> — необязательный параметр. Дата начала действия вводимого расчёта. По умолчанию — дата начала текущего периода журнала расчётов;
  • <ДатаОкончания> — необязательный параметр. Дата окончания действия вводимого расчёта. По умолчанию — дата окончания текущего периода журнала расчётов;
  • <Результат> — необязательный параметр. Результат расчёта. По умолчанию — 0.

Возвращаемым значением метода ВвестиРасчет() является число 1, если операция успешно выполнена, или 0 — в противном случае.

Пример использования:

// Ввод выбранного расчета.
// Атрибут "Расчет" — реквизит формы документа
Процедура ПровестиДокумент()
   // Процедура выполняется при проведении документа расчета
   ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   ЖР.ВвестиРасчет(Сотрудник, Расчет, ДатаН, ДатаК, 0);
КонецПроцедуры

Для ввода строк в журнал расчётов предназначен также метод ВвестиРасчетНаОсновании() (англоязычный синоним — InsertCalculationByReason()). Работает он как и метод ВвестиРасчет(), но при этом реквизит Документ вводимых строк журнала расчётов заполняется значением параметра <Основание>. Использование метода ВвестиРасчетНаОсновании() — один из способов непосредственно установить родительские отношения между любым документом и вводимыми записями журнала расчётов.

Важно! Метод ВвестиРасчетНаОсновании() можно применять только для тех объектов, которые созданы функцией СоздатьОбъект(). Это значит, например, что его нельзя использовать непосредственно (без точки) в форме журнала расчётов или в модуле видов расчёта.

Возвращаемым значением метода ВвестиРасчетНаОсновании() является число 1, если операция успешно выполнена, или 0 — в противном случае.

Синтаксис метода:

ВвестиРасчетНаОсновании(<Основание>, <Объект>, <ВидРасчета>,
                        <ДатаНач>, <ДатаОконч>, <Результат>)

где

  • <Основание> — документ, на основании которого вводится запись (или записи) в журнал расчётов;
  • <Объект> — объект расчёта — элемент справочника, заданного при конфигурировании журнала расчётов;
  • <ВидРасчета> — вид вводимого расчёта — ссылка на агрегатный объект "ВидРасчета";
  • <ДатаНач> — необязательный параметр. Дата начала действия вводимого расчёта. По умолчанию — дата начала текущего периода журнала расчётов;
  • <ДатаОконч> — необязательный параметр. Дата окончания действия вводимого расчёта. По умолчанию — дата окончания текущего периода журнала расчётов;
  • <Результат> — необязательный параметр. Результат расчёта. По умолчанию — 0.

Пример использования:

// Модуль выполняется при проведении документа расчета "Начало месяца"
Процедура ПровестиДокумент()
   // Если можно проводить...
   Если МожноПроводить = 1 Тогда
      // Журнал расчетов — Зарплата
      ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
      ЖРКомп = СоздатьОбъект("ЖурналРасчетов.Компенсации");
      // конец и начало текущего периода
      КТП = ЖР.КонецТекущегоПериода();
      НТП = ЖР.НачалоТекущегоПериода();
      Сотр = СоздатьОбъект("Справочник.Сотрудники");
      Спр = СоздатьОбъект("Справочник.ПриказыДлительногоДействия");
      Сотр.ВыбратьЭлементы();
      Пока Сотр.ПолучитьЭлемент() > 0 Цикл
         // расчет "приказов длительного действия"
         // типа доплат исп. листов, штрафов и пр...
         Спр.ИспользоватьВладельца(Сотрудник);
         Спр.ВыбратьЭлементы();
         // предполагается, что в каждом приказе есть
         // реквизиты Начало, Окончание и Сотрудник
         Пока Спр.ПолучитьЭлемент() > 0 Цикл
             . . .
            Если Спр.Приказ.Вид() <> "" Тогда
               Если ((Спр.Приказ.Окончание >= НТП) И
                    (Спр.Приказ.Начало <= КТП)) Тогда
                  // предполагается, что в каждом приказе
                  // есть реквизиты Начало и Окончание
                  ЖР.ВвестиРасчетНаОсновании(Спр.Приказ,
                     Спр.Приказ.Сотрудник, Спр.Приказ.Расчет,
                     Макс(Спр.Приказ.Начало, НТП),
                     Мин(Спр.Приказ.Окончание, КТП), 0);
               КонецЕсли;
            КонецЕсли;
         КонецЦикла;
      КонецЦикла;
   ИначеЕсли МожноПроводить = 0 Тогда
      Сообщить("Документ не проведен!!!");
   КонецЕсли;
КонецПроцедуры

Для ввода строк в журнал расчётов предназначен также метод ЗаписатьРасчет() (англоязычный синоним — EnterCalculation()). Отличие данного метода от метода ВвестиРасчет() заключается в том, что ввод вытесняющих расчётов приводит к вытеснению только тех расчётов, которые имеют меньший приоритет, а не меньший либо равный, как в случае с методом ВвестиРасчет(). Это приводит, в частности, к тому, что за счёт применения этого метода расчёт не вытесняет «сам себя».

При записи невытесняющего расчёта ввод новых записей также происходит «осмотрительно» — новые записи вводятся только в том случае, если в журнале расчётов нет точно такой же записи. Под точно такой же записью здесь подразумевается запись с таким же видом расчёта, для того же объекта и с тем же периодом действия.

Важно! Метод ЗаписатьРасчет() можно применять только для тех объектов, которые созданы функцией СоздатьОбъект(). Это значит, например, что его нельзя использовать непосредственно (без точки) в форме журнала расчётов или в модуле видов расчёта.

Возвращаемым значением метода ЗаписатьРасчет() является число 1, если операция успешно выполнена, или 0 — в противном случае.

Синтаксис метода:

ЗаписатьРасчет(<Объект>, <ВидРасчета>, <ДатаНач>,
               <ДатаОконч>, <Результат>)

где

  • <Объект> — объект расчёта — элемент справочника, заданного при конфигурировании журнала расчётов;
  • <ВидРасчета> — вид вводимого расчёта — ссылка на агрегатный объект "ВидРасчета";
  • <ДатаНач> — необязательный параметр. Дата начала действия вводимого расчёта. По умолчанию — дата начала текущего периода журнала расчётов;
  • <ДатаОконч> — необязательный параметр. Дата окончания действия вводимого расчёта. По умолчанию — дата окончания текущего периода журнала расчётов;
  • <Результат> — необязательный параметр. Результат расчёта. По умолчанию — 0.

Пример использования:

Если (ПустоеЗначение(ДокументРасчета)=1)ИЛИ
     (ТипЗначения(ДокументРасчета)<>12) Тогда
   ЖР.ЗаписатьРасчет(Сотрудник, Расчет, ДатаНачалаПериода,
                     ДатаОкончанияПериода);
Иначе
   ЖР.ЗаписатьРасчетНаОсновании(ДокументРасчета, Сотрудник, Расчет,
                     ДатаНачалаПериода, ДатаОкончанияПериода);
КонецЕсли;

Для ввода строк в журнал расчётов предназначен метод ЗаписатьРасчетНаОсновании() (англоязычный синоним — EnterCalculationByReason()). Работает он так же, как и метод ЗаписатьРасчет(), но при этом реквизит Документ вводимых строк журнала расчётов заполняется значением параметра <Основание>. Использование метода ЗаписатьРасчетНаОсновании() – один из способов непосредственно установить родительские отношения между любым документом и вводимыми записями журнала расчётов.

Данный метод отличается от метода ВвестиРасчетНаОсновании() тем, что ввод вытесняющих расчётов приводит к вытеснению только тех расчётов, которые имеют меньший приоритет, а не меньший либо равный, как в случае с методом ВвестиРасчетНаОсновании(). Это приводит, в частности, к тому, что за счёт применения этого метода расчёт не вытесняет «сам себя».

При записи невытесняющего расчёта ввод новых записей также происходит «осмотрительно» — новые записи вводятся только в том случае, если в журнале расчётов нет точно такой же записи. Под точно такой же записью здесь подразумевается запись с таким же видом расчёта, для того же объекта и с тем же периодом действия.

Важно! Метод ЗаписатьРасчетНаОсновании() можно применять только для тех объектов, которые созданы функцией СоздатьОбъект(). Это значит, например, что его нельзя использовать непосредственно (без точки) в форме журнала расчётов или в модуле видов расчёта.

Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Синтаксис метода:

ЗаписатьРасчетНаОсновании(<Основание>, <Объект>, <ВидРасчета>,
                          <ДатаНач>, <ДатаОконч>, <Результат>)

где

  • <Основание> — документ, на основании которого вводится запись (или записи) в журнал расчётов;
  • <Объект> — объект расчёта — элемент справочника, заданного при конфигурировании журнала расчётов;
  • <ВидРасчета> — вид вводимого расчёта — ссылка на агрегатный объект "ВидРасчета";
  • <ДатаНач> — необязательный параметр. Дата начала действия вводимого расчёта. По умолчанию — дата начала текущего периода журнала расчётов;
  • <ДатаОконч> — необязательный параметр. Дата окончания действия вводимого расчёта. По умолчанию — дата окончания текущего периода журнала расчётов;
  • <Результат> — необязательный параметр. Результат расчёта. По умолчанию — 0.

Пример использования:

Если (ПустоеЗначение(ДокументРасчета)=1)ИЛИ
     (ТипЗначения(ДокументРасчета)<>12) Тогда
   ЖР.ЗаписатьРасчет(Сотрудник, Расчет, ДатаНачалаПериода,
                     ДатаОкончанияПериода);
Иначе
   ЖР.ЗаписатьРасчетНаОсновании(ДокументРасчета, Сотрудник, Расчет,
                     ДатаНачалаПериода, ДатаОкончанияПериода);
КонецЕсли;

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

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

Пример использования:

// Рассчитаем все основные средства категории
// определенного типа
ЖР = СоздатьОбъект("ЖурналРасчетов.Амортизация");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Если ЖР.Объект.Тип = Тип;
      ЖР.Рассчитать();
   КонецЕсли;
КонецЦикла;

Выполнить расчёт текущей строки журнала расчётов позволяет метод ВыполнитьРасчет() (англоязычный синоним — RunCalculate()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если расчёт записи выполнен успешно, или 0, если расчет записи не выполнен (в том числе, при прерывании процедуры расчёта пользователем путем нажатия клавиши Esc). Метод, как правило, применяется в цикле, выполняющем перебор записей журнала расчётов. Работает точно так же, как и метод Рассчитать(), но имеет возвращаемое значение и может быть прерван.

Пример использования:

// процедура выполняет расчет по журналу Зарплата
Процедура Выполнить()
   ЖрнЗарплата.ВыбратьПериод(ЖрнЗарплата.НачалоТекущегоПериода());
   Пока ЖрнЗарплата.ПолучитьЗапись() > 0 Цикл
      Если ЖрнЗарплата.ВыполнитьРасчет() = 0 Тогда
         // прерываем процедуру, если расчет неудачен или
         // пользователь нажал Еsс
         Прервать;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Для ввода строк-перерасчётов текущей записи в журнал расчётов предназначен метод ВвестиПерерасчет() (англоязычный синоним — InsertRecalc()). Как правило, метод используется в модуле документа, но может использоваться и в модуле вида расчёта. Он вводит полную копию текущей записи в журнал расчётов, не заполняя лишь атрибут Результат. Впоследствии система распознаёт «обычные» записи и записи-перерасчеты. Для записей, введённых в журнал методом ВвестиПерерасчет(), атрибут Перерасчет принимает значение 1.

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

При расчёте записи-перерасчёта результат вычисляется с учётом результата первичной (перерассчитываемой) записи. Это значит, что если в журнале расчётов введён перерасчёт записи прошлого периода, то результат перерасчёта будет рассчитан за вычетом значения Результат первичной записи.

Параметры у метода ВвестиПерерасчет() отсутствуют. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Пример использования:

Процедура Перерасчет(Группа, Сотрудник, Основание, Начало, Окончание)
   // Группа расчетов "оплата по среднему"
   ОС = ГруппаРасчетов.ОплатаПоСреднему;
   // перерасчет по журналу "зарплата"
   ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   // дата, начиная с которой нужно перерассчитывать и начисления
   ДатаНачислений = ЖрнЗарплата.КонецПериодаПоДате(Начало) + 1;
   // выделим все записи ЖР по сотруднику
   ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник,
         ЖрнЗарплата.НачалоПериодаПоДате(Начало),
         Мин(Окончание, ЖрнЗарплата.НачалоТекущегоПериода() - 1));
   Сч = 1;
   Пока ЖрнЗарплата.ПолучитьЗапись() > 0 Цикл
      Если ЖрнЗарплата.ВидРасч.ВходитВГруппу(Группа) = 1 Тогда
         Пересчитать = 1;
         Если ((ЖрнЗарплата.ВидРасч.ВходитВГруппу(ОС)=1)И
              (ЖрнЗарплата.ДатаНачала(ДатаНачислений)) Тогда
            // надо перерассчитывать начисления, оплачиваемые
            // по среднему заработку только следующего
            // (за началом действия данного документа-основания)
            // периода расчета
            Пересчитать = 0;
         КонецЕсли;
         Если Пересчитать = 1 Тогда
            ЖрнЗарплата.ВвестиПерерасчет();
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Для ввода строк-перерасчётов текущей записи в журнал расчётов на основании произвольного документа предназначен метод ВвестиПерерасчетНаОсновании() (англоязычный синоним — InsertRecalcByReason()). Как правило, данный метод используется в модуле документа, но может использоваться и в модуле вида расчёта. Метод вводит полную копию текущей записи в журнал расчётов, не заполняя лишь атрибут Результат и указывая в качестве документа-основания документ, переданный в параметре. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

В отличие от метода ВвестиПерерасчет() (который вводит записи журнала на основании того документа, в модуле которого используется метод) данный метод вводит записи-перерасчёты, задавая для них произвольный документ-основание.

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

Синтаксис метода:

ВвестиПерерасчетНаОсновании(<Документ>)

где <Документ> — документ, на основании которого вводится запись (или записи) в журнал расчётов.

Пример использования:

Процедура ПровестиПерерасчет(Док)
   // Группа расчетов "оплата по среднему"
   ОС = ГруппаРасчетов.ОплатаПоСреднему;
   // перерасчет по журналу "зарплата"
   ЖрнЗарплата = СоздатьОбъект("ЖурналРасчетов.Зарплата");
   // дата, начиная с которой нужно перерасчитывать и начисления
   ДатаНачислений = ЖрнЗарплата.КонецПериодаПоДате(Начало) + 1;
   // выделим все записи ЖР по сотруднику
   ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Док.Сотрудник,
         ЖрнЗарплата.НачалоПериодаПоДате(Док.Начало),
         Мин(Док.Окончание, ЖрнЗарплата.НачалоТекущегоПериода() - 1));
   Сч = 1;
   Пока ЖрнЗарплата.ПолучитьЗапись() > 0 Цикл
      Если ((ЖрнЗарплата.ВидРасч.ВходитВГруппу(ОС) = 1) И
           (ЖрнЗарплата.ДатаНачала < ДатаНачислений)) Тогда
         ЖрнЗарплата.ВвестиПерерасчетНаОсновании(Док);
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

Инициализировать создание новой строки журнала расчётов позволяет метод Новая() (англоязычный синоним — New()). После инициализации создания новой строки, как правило, производится заполнение её реквизитов. Собственно запись новой строки журнала расчётов происходит при вызове метода Записать().

Пример использования:

ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.Новая();
 . . .
ЖР.Записать();

Записать изменённую или новую запись в журнал расчётов позволяет метод Записать() (англоязычный синоним — Write()). Параметры у метода отсутствуют. Метод применяется после метода Новая() и заполнения реквизитов журнала расчётов при помощи метода УстановитьРеквизит().

Данный метод проверяет корректность заполненных реквизитов журнала расчётов. При вводе новых записей журнала расчётов методами Новая() и Записать() обязательно должны быть заполнены следующие реквизиты записи журнала: Объект, Документ и ВидРасч. Кроме того, проверяется корректность реквизитов ДатаНачала и ДатаОкончания. Если реквизиты ДатаНачала и ДатаОкончания не установлены явным образом, при записи они устанавливаются как начало и окончание текущего расчётного периода, соответственно. Реквизит ПериодРегистрации заполняется текущим значением расчётного периода, установленным для журнала расчётов (см. описание метода УстановитьПериодРасчета()). Если реквизит РодительскийДокумент не установлен явным образом, для него устанавливается то же значение, что и для реквизита Документ. Если реквизиты Рассчитана, Сторно, Перерасчет, Фиксирована не установлены, то запись вводится как простая нерассчитанная, нефиксированная запись.

Внимание! При вводе новых записей в журнал расчётов методами Новая() и Записать() записи вводятся «как есть». Система не выполняет правила перерасчётов, а также правила взаимного вытеснения видов расчёта. Ввод произвольных записей журнала расчётов очень ответственная операция. При использовании этих методов следует внимательно следить за логической целостностью журнала расчётов.

Пример использования метода:

Перем Док;
Перем Сотр;
Перем Рез;

Док = СоздатьОбъект("Документ");
// ...позиционируется нужный документ
 . . .
Сотр = СоздатьОбъект("Справочник.Сотрудники");
// ...позиционируется нужный элемент справочника сотрудники
 . . .
Рез = . . .   // считаем результат...

ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.Новая();
ЖР.УстановитьПериод(ЖР.ПолучитьпериордПоДате(ТекДата));
ЖР.УстановитьРеквизит("Документ", Док.ТекущийДокумент());
ЖР.УстановитьРеквизит("Объект", Сотр.ТекущийЭлемент());
ЖР.УстановитьРеквизит("ВидРасч", ВидРасчета.ПоОкладу);
ЖР.УстановитьРеквизит("Рассчитана", 1);
ЖР.УстановитьРеквизит("Результат", Рез);
ЖР.Записать();

Для удаления записей журнала расчётов предназначен метод УдалитьЗапись() (англоязычный синоним — DeleteRecord()). Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае. Данный метод работает только для переменных, созданных функцией СоздатьОбъект().

Пример использования метода:

// Процедура выполняется в контексте журнала расчетов
// Удалим записи, по которым нет рабочих дней!
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
Календ = СоздатьОбъект("Календарь.Служащие");
ЖР.ВыбратьПериод(ЖР.НачалоТекущегоПериода());
Пока ЖР.ПолучитьЗапись() > 0 Цикл
   Если Календ.Дней(ЖР.ДатаНачала, ЖР.ДатаОкончания) = 0 Тогда
      ЖР.УдалитьЗапись();
   КонецЕсли;
КонецЦикла;

Фиксировать текущую запись журнала расчётов позволяет метод ФиксироватьЗапись() (англоязычный синоним — LockRecord()). После применения этого метода атрибут записи Фиксирована принимает значение 1. Фиксация записи, фактически, означает невозможность отредактировать результат её расчёта любым, в том числе программным, способом. Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Пример использования:

ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.ВыбратьЗаписиПоОбъекту(Сотрудник, ДН, ДО);
Пока ЖЗ.ПолучитьЗапись() = 1 Цикл
   Если (ЖЗ.Документ = ТекущийДокумент()) И
        (ЖЗ.ВидРасч = ВидРасчета.ПоТарифу) Тогда
      ЖЗ.ФиксироватьЗапись();
   КонецЕсли;
КонецЦикла;

Снять фиксацию с текущей записи журнала расчётов позволяет метод ОсвободитьЗапись() (англоязычный синоним — ReleaseRecord()). После применения этого метода атрибут записи Фиксирована принимает значение 0. Параметры у метода отсутствуют. Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Пример использования:

Если ЖрнЗарплата.Фиксирована = 1 Тогда
   Если ДатаДок > ЖрнЗарплата.НачалоТекущегоПериода() Тогда
      ЖрнЗарплата.ОсвободитьЗапись();
   Иначе
      // отказ от расчета!
       . . .
   КонецЕсли;
КоненцЕсли;

Исправить результат записи позволяет метод Исправить() (англоязычный синоним — Update()). Метод выполняет то же действие, что и интерактивная процедура исправления результата, т.е. при исправлении записи текущего расчётного периода просто редактируется результат и метится запись «ручкой», а при исправлении записи прошлого периода — вводится сторно той записи и ещё одна запись-исправление.

Синтаксис метода:

Исправить(<НовыйРезультат>)

где <НовыйРезультат> — новый результат записи журнала расчётов.

Отменить исправление, сделанное ранее (вручную или из языка методом Исправить()), позволяет метод ОтменитьИсправление() (англоязычный синоним — UndoUpdate()). Метод выполняет те же действия, что и интерактивная процедура отмены исправления записи журнала расчётов. Параметры у метода отсутствуют.

Методы для работы с реквизитами журнала расчётов

Назначить тип для реквизита журнала расчётов, которому в Конфигураторе назначен тип "Неопределенный" позволяет метод НазначитьТип() (англоязычный синоним — SetType()).

Синтаксис метода:

НазначитьТип(<ИмяРеквизита>, <ИмяТипа>, <Длина>, <Точность>)

где

  • <ИмяРеквизита> – строковое выражение, содержащее название реквизита журнала расчётов неопределённого типа, как он назван в Конфигураторе;
  • <ИмяТипа> — строковое выражение, содержащее название типа данных (или вид субконто), который назначается реквизиту журнала расчётов, например, "Строка", "Число", "Справочник.Товары", "Документ.РасходнаяНакладная" и т.п.;
  • <Длина> — числовое выражение — длина поля представления данных. Параметр является необязательным. Имеет смысл только при задании числового или строкового типа;
  • <Точность> — числовое выражение — число знаков числа после десятичной точки. Параметр является необязательным. Имеет смысл только при задании числового типа.

Для организации заполнения дополнительных реквизитов журнала расчётов при вводе новых записей в журнал предназначен метод УстановитьРеквизит() (англоязычный синоним — SetAttribute()). Метод применяется в двух случаях: во-первых, при вводе записей журнала расчётов в процедуре проведения документа одним из перечисленных ниже методов:

  • ВвестиРасчет();
  • ВвестиРасчетНаОсновании();
  • ЗаписатьРасчет();
  • ЗаписатьРасчетНаОсновании()

Во-вторых, при вводе произвольных новых записей журнала расчётов (методы Новая() и Записать()).

В этих двух случаях метод УстановитьРеквизит() работает по-разному. В случае, когда метод применяется перед вводом записей при проведении документа, не имеет смысла устанавливать значения для реквизитов Объект, Документ, РодительскийДокумент, ВидРасч, ДатаНачала, ДатаОкончания и ПервичнаяЗапись.

Данные установки игнорируются методами ВвестиРасчет(), ЗаписатьРасчет() и им подобными. То есть при вводе записей журнала этими методами возможна установка только дополнительных реквизитов журнала, заданных при конфигурировании, реквизита Результат и таких признаков записи журнала, как: Рассчитана, Исправлена, Сторно, Фиксирована, Перерасчет.

В случае, когда метод применяется при вводе записей методами Новая() и Записать(), в качестве первого параметра <ИмяРеквизита> могут применятся наименования дополнительных реквизитов журнала расчётов, заданные при конфигурировании системы или следующие атрибуты, соответствующие предопределённым реквизитам журнала расчётов:

  • Объект
  • Документ
  • РодительскийДокумент
  • ВидРасч
  • ДатаНачала
  • ДатаОкончания
  • ПервичнаяЗапись
  • Сторно
  • Рассчитана
  • Исправлена
  • Фиксирована
  • Перерасчет
  • Результат

Примечание: Установленные методом значения используются однократно, при первом же вызове одного из вышеперечисленных методов ввода новых записей журнала расчётов установленные значения «сбрасываются». Для записи нескольких реквизитов необходимо использовать метод несколько раз.

Внимание! Атрибуты журнала расчетов ПериодДействия и ПериодРегистрации не устанавливаются пользователем. Атрибут ПериодРегистрации при вводе записи принимает значение текущего (установленного в данный момент для журнала расчетов) периода, а атрибут ПериодДействия соответствует установленным значениям ДатаНачала и ДатаОкончания.

Синтаксис метода:

УстановитьРеквизит(<ИмяРеквизита>, <Значение>)

где

  • <ИмяРеквизита> — строка, содержащая наименование реквизита журнала расчётов;
  • <Значение> — значение, устанавливаемое для записи в реквизит.

Пример использования метода:

Перем Док;
Перем Сотр;
Перем Рез;

Док = СоздатьОбъект("Документ");
// ...позиционируется нужный документ
 . . .
Сотр = СоздатьОбъект("Справочник.Сотрудники");
// ...позиционируется нужный элемент справочника сотрудники
 . . .
Рез = . . .   // считаем результат...

ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.Новая();
ЖР.УстановитьПериод(ЖР.ПолучитьпериордПоДате(ТекДата));
ЖР.УстановитьРеквизит("Документ", Док.ТекущийДокумент());
ЖР.УстановитьРеквизит("Объект", Сотр.ТекущийЭлемент());
ЖР.УстановитьРеквизит("ВидРасч", ВидРасчета.ПоОкладу);
ЖР.УстановитьРеквизит("Рассчитана", 1);
ЖР.УстановитьРеквизит("Результат", Рез);
ЖР.Записать();

Методы контекста Модуля формы журнала расчётов

Примечание: Описанные в данном разделе методы доступны только в контексте Модуля формы журнала расчётов.

Установить значение флага автоматического расчёта записи журнала расчётов при интерактивной отмене её исправления позволяет метод РассчитыватьПриОтменеИсправления() (англоязычный синоним — CalculateOnEditCancel()). Возвращаемым значением метода является текущее числовое значение флага (до исполнения метода). По умолчанию форма журнала расчётов всегда открывается со значением флага 0 (не рассчитывать записи журнала расчётов автоматически).

Синтаксис метода:

РассчитыватьПриОтменеИсправления(<Флаг>)

где <Флаг> — необязательный параметр. Число: 1 — автоматически рассчитывать записи журнала расчётов при интерактивной отмене её исправления; 0 — не рассчитывать автоматически. Если параметр не указан, текущее значение не меняется.

Пример записи метода:

РассчитыватьПриОтменеИсправления(1);

Установить в форме журнала расчётов границу видимости записей позволяет метод ГраницаПросмотра() (англоязычный синоним — ViewBound()). Видимыми (то есть отображаемыми в окне журнала расчётов) становятся записи журнала с периодом регистрации от расчётного периода, заданного параметром метода до текущего расчётного периода. После вызова данного метода происходит перерисовка окна, так же как и при интерактивной смене границы просмотра журнала расчётов.

Синтаксис метода:

ГраницаПросмотра(<Период>)

где <Период> — значение типа "Период журнала расчётов", которое устанавливается как граница видимости записей журнала расчётов. Если параметр не указан, текущее значение не меняется.

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

Пример использования:

// в форме журнала расчетов "зарплата" отодвинемся
// на два расчетных периода назад
СтараяГраница = ГраницаПросмотра();
ГраницаПросмотра(СтараяГраница.ПрибавитьПериод(-2));

Установить режим вывода записей в форме журнала расчётов позволяет метод УстановитьПредставление() (англоязычный синоним — SetPresentation()). Возвращаемым значением метода является число 1, если указанное представление успешно установлено, или 0, если представление по каким-либо причинам не установлено.

Синтаксис метода:

УстановитьПредставление(<Режим>, <Объект>)

где

  • <Режим> — числовое значение, определяющее режим представления журнала расчетов:
    • 1 — отображать записи по всем объектам расчёта;
    • 2 — отображать записи по одному объекту расчёта;
    • 3 — отображать записи по одному документу-основанию.
  • <Объект> — объект, записи которого отображаются. Если устанавливаемый режим — «по одному документу», этот параметр должен иметь тип "Документ"; если режим устанавливаемого представления — «по одному объекту», этот параметр должен иметь тип "Элемент справочника". Если устанавливаемый режим – «просмотр записей по всем объектам расчёта», параметр не используется.

Пример использования:

Перем СтРежим;
Перем СтОбъект;
Перем СменилиРежим;

Процедура ПоОдному(Сотрудник)
   // запомним предыдущие установки
   ПолучитьПредставление(СтРежим, СтОбъект);
   // Сменим режим
   СменилиРежим = УстановитьПредставление(2, Сотрудник);
КонецПроцедуры

Процедура Восстановить()
   Если СменилиРежим = 1 Тогда
      УстановитьПредставление(СтРежим, СтОбъект);
   КонецЕсли;
КонецПроцедуры

Получить текущие установки вывода записей в форме журнала расчётов позволяет метод ПолучитьПредставление() (англоязычный синоним — GetPresentation()).

Синтаксис метода:

ПолучитьПредставление(<Режим>, <Объект>)

где

  • <Режим> — переменная, в которую записывается числовое значение — текущий режим представления журнала расчетов (см. выше описание метода УстановитьПредставление());
  • <Объект> — переменная, в которую записывается объект, записи которого отображаются (см. выше описание метода УстановитьПредставление()).

Пример использования метода:

Перем СтРежим;
Перем СтОбъект;
Перем СменилиРежим;

Процедура ПоОдному(Сотрудник)
   // запомним предыдущие установки
   ПолучитьПредставление(СтРежим, СтОбъект);
   // Сменим режим
   СменилиРежим = УстановитьПредставление(2, Сотрудник);
КонецПроцедуры

Процедура Восстановить()
   Если СменилиРежим = 1 Тогда
      УстановитьПредставление(СтРежим, СтОбъект);
   КонецЕсли;
КонецПроцедуры

Методы для организации отборов в журнале расчётов

Механизм отбора записей журнала предоставляет пользователю возможность просматривать в журнале расчётов записи, отобранные по некоторому значению реквизитов справочника объектов расчёта. Кроме того, в качестве критериев отбора могут использоваться значения Родитель и Владелец этого справочника. Настраивается механизм отбора в Конфигураторе ещё на этапе конфигурирования, когда определяются виды отбора. Использование тех или иных реквизитов справочника в качестве граф отбора указывается галочкой у наименования реквизита.

Свойства журнала расчетов

Примечание: В этот список граф отбора попадают реквизиты справочника, у которых в свойствах установлена опция «Отбор».

Окно свойств реквизита

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

Теперь для установки отбора по конкретному реквизиту из программы пользователю необходимо только последовательно выбрать в главном меню программы пункты «Действия -> Отбор по значению -> Отобрать…»», либо щёлкнуть по кнопке «Отбор по значению» () на панели инструментов журнала. При этом на экран будет выведено диалоговое окно «Отбор» (см. рис. ниже).

Окно 'Отбор'

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

Установить доступные виды отборов журнала расчётов позволяет метод ВидыОтбора() (англоязычный синоним — KindsOfSelection()). Использование данного метода влияет на полноту списка видов отбора, который выдается пользователю в диалоге «Отбор» (см. рис. выше) при работе с системой «1С:Предприятие». Он также позволяет совсем запретить выполнение отбора в журнале. Возвращаемым значением метода является строковое значение, содержащее текущий список имён отборов для журнала, разделённых запятыми (на момент до исполнения метода).

Синтаксис метода:

ВидыОтбора(<СписокОтборов>)

где <СписокОтборов> — строковое выражение, которое может принимать следующие значения:

  • *  (символ «звёздочка») — для журнала используются все назначенные в Конфигураторе виды отборов;
  • ""  (пустая строка) — запрещаются все виды отборов;
  • список имён отборов через запятую — в журнале расчётов будут доступны только указанные виды отборов.

Примечание: Ограничение списка отборов, выполненное при помощи метода ВидыОтбора(), не исключает использование «запрещённого» отбора средствами встроенного языка. Например, методом ВидыОтбора("") можно запретить использование любых отборов в журнале расчётов, но тут же из языка установить отбор записей по конкретному реквизиту справочника. В этом случае пользователь будет просматривать записи с конкретным содержанием, но не будет иметь возможность отобрать записи с другим содержанием.

Пример:

ВидыОтбора("Сотрудник, Расчетчик");

Установить в форме журнала расчётов закладки, дающие возможность быстро переключаться между разными значениями по одному и тому же отбору, позволяет метод ЗакладкиОтбора() (англоязычный синоним — TabCtrlSelection()). Возвращаемым значением метода является число 1, если операция успешно выполнена, или 0 — в противном случае.

Синтаксис метода:

ЗакладкиОтбора(<ИмяОтбора>, <ЗначениеОтбора>)

где

  • <ИмяОтбора> — строковое выражение, содержащее имя графы отбора, по которой будут созданы закладки. Если параметру присвоить значение "" (пустая строка), закладки, установленные ранее методом ЗакладкиОтбора(), будут удалены;
  • <ЗначениеОтбора> — значение отбора, соответствующее закладке устанавливаемой первоначально.

Пример использования:

ЗакладкиОтбора("Родитель", Расчетчик);

Принудительно установить отбор для журнала расчётов позволяет метод УстановитьОтбор() (англоязычный синоним — SetSelection()). Для установки отбора методу должны быть переданы два параметра: имя отбора и значение отбора. Возвращаемым значением метода является число 1, если отбор успешно установлен, или 0 — в противном случае.

Если первый параметр задан неверно — то есть нет такой графы отбора, выборка не будет выполнена и метод возвратит 0. Если заданное значение отбора не будет найдено ни в одной строке журнала расчетов, выборка окажется пустой (то есть в неё не попадёт ни одна запись журнала расчётов), но метод возвратит значение 1.

Если метод сработал, то есть выборка реально установлена, происходит перерисовка окна журнала расчётов так же, как это происходит при интерактивном выполнении операции отбора.

Примечание: Наименованиями граф отбора журнала расчётов могут служить реквизиты справочника объектов расчёта, заданного для журнала расчётов, а также значения Владелец и Родитель этого справочника. Это значит, что в общем случае, в качестве первого параметра, методу могут передаваться предопределённые имена «Родитель» и «Владелец», а также названия реквизитов справочника.

Синтаксис метода:

УстановитьОтбор(<ИмяОтбора>, <ЗначениеОтбора>)

где

  • <ИмяОтбора> — строковое выражение — имя отбора. Если параметру присвоить значение "" (пустая строка), отбор отключается;
  • <ЗначениеОтбора> — значение отбора. Параметр является необязательным, если в первом параметре используется пустая строка.

Пример использования:

// Процедура снимает отбор
Процедура ВыбратьВсе()
   УстановитьОтбор("");
КонецПроцедуры

// Установим отбор сразу при открытии журнала расчетов Зарплата.
// Расчетчик — глобальная переменная со ссылкой на группу
// сотрудников
УстановитьОтбор("Родитель", Расчетчик);

Получить текущее значение отбора, установленное в форме журнала расчётов программным образом или интерактивно, позволяет метод ПолучитьОтбор() (англоязычный синоним — GetSelection()). Возвращаемым значением метода будет число 1, если отбор включен, или 0, если отключен. Имя отбора и текущее значение отбора записываются в переменные, передаваемые методу в качестве параметров.

Синтаксис метода:

ПолучитьОтбор(<ИмяОтбора>, <ЗначениеОтбора>)

где

  • <ИмяОтбора> — имя переменной, куда будет записано строковое значение имени отбора. Параметр является необязательным;
  • <ЗначениеОтбора> – имя переменной, куда будет записано значение отбора. Параметр является необязательным.

Пример использования:

Перем ИмяОтбора;
Перем ЗначОтб;

Процедура ОтборПодразделения(Подразд)
   // ниже ИмяОтбора и ЗначениеОтбора будут заполнены
   // текущими значениями
   БылОтбор = ПолучитьОтбор(ИмяОтбора, ЗначОтб);
   Если БылОтбор = 1 Тогда
      Если ИмяОтбора = "Родитель" Тогда
         // снимем отбор
         УстановитьОтбор("");
      ИначеЕсли ИмяОтбора = "Подразделение" Тогда
         Сообщить("Было отобрано " + ЗначОтб.Наименование);
         УстановитьОтбор(ИмяОтбора, Подразд);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Предопределённые процедуры Модуля формы журнала расчётов

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

Описанные в данном разделе системные предопределённые процедуры могут располагаться только в программном модуле формы журнала расчётов. Эти процедуры предназначены для расширения возможности программного управления правами пользователей на выполнение тех или иных действий.

При попытке «ручного» исправления результата расчёта записи журнала расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриИсправленииРезультата() (англоязычный синоним — OnResuitUpdate()). Если в данной предопределённой процедуре установить статус возврата в 0, то результат не будет отредактирован.

Синтаксис:

Процедура ПриИсправленииРезультата(<3апись>)
    . . .
КонецПроцедуры

где <3апись> — имя переменной, куда будет помещена ссылка на запись журнала расчётов, результат расчёта которой исправляется.

Пример использования:

Процедура ПриИсправленииРезультата(Запись)
   // группа нередактируемых расчетов
   НГ = ГруппаРасчетов.Нередактируемые;
   Если Запись.ВидРасч.ВходитВГруппу(НГ) = 1 Тогда
      Предупреждение("Операция не может быть выполнена!");
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

При попытке отмены «ручного» исправления результата расчёта записи журнала расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриОтменеИсправления() (англоязычный синоним — OnUpdateCancel()). Это действие вызывается пунктом «Отменить ручное редактирование» меню «Действия» при работе с журналом расчётов. Если в данной предопределённой процедуре установить статус возврата в 0, то ручное редактирование не будет отменено (будет оставлено).

Синтаксис:

Процедура ПриОтменеИсправления(<3апись>)
    . . .
КонецПроцедуры

где <3апись> — имя переменной, куда будет помещена ссылка на запись журнала расчётов, исправление результата которой отменяется.

Пример использования:

Процедура ПриОтменеИсправления(Запись)
   // Расчетчик — элемент справочника со списком расчетчиков
   Если Расчетчик.ПравоНаОтмену = 1 Тогда
      // отреагируем на это действие
      ПересчитатьСотрудника(Запись.Объект);
   Иначе
      // иначе — нельзя!
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

При выполнении одной из трёх команд «Рассчитать запись», «Рассчитать объект» или «Рассчитать документ» меню «Действия» журнала расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриРасчете() (англоязычный синоним — OnCalculating()). Если в данной предопределённой процедуре установить статус возврата в 0, то расчёт проводиться не будет.

Синтаксис:

Процедура ПриРасчете(<ОбъектРасчета>)
    . . .
КонецПроцедуры

где <ОбъектРасчета> — имя переменной, куда помещается ссылка на запись журнала расчётов или элемент справочника, являющийся объектом расчёта, или документ, записи которого рассчитываются. Что в данный момент передается системой при вызове процедуры — зависит от выполняемого действия: расчёт одной записи, расчёт объекта или расчёт документа.

Пример использования:

Процедура ПриРасчете(Объект)
   // Определим, что считаем
   Если ТипЗначения(Объект) = 12 Тогда
      // имеем дело с документом
      Если Объект.Автор <> Расчетчик Тогда
         // если автор данного документа не текущий расчетчик, то
         // запретим расчет чужого документа!
         СтатусВозврата(0);
      КонецЕсли;
   ИначеЕсли ТипЗначения(Объект) = 11 Тогда
      // а это — элемент справочника
      Если Объект.Владелец <> Расчетчик Тогда
         // если рассчитываемый объект не лежит в папке текущего расчетчика,
         // считать нельзя
         СтатусВозврата(0);
      КонецЕсли;
   Иначе
      // считаем одну запись
      Если (Объект.Документ.Автор <> Расчетчик) ИЛИ
           (Объект.Объект.Владелец <> Расчетчик) Тогда
         // не дадим считать запись чужого документа или объекта
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

При интерактивном выборе владельца журнала расчётов (при интерактивной смене владельца, то есть смене позиции в справочнике-владельце, которая приводит к смене отображаемых расчётов) в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриВыбореВладельца() (англоязычный синоним — OnSetOwner()). Если в данной предопределённой процедуре установить статус возврата в 0, то выбор владельца не будет произведён.

Внимание! Процедура выполняется только в том случае, когда журнал расчётов выводится «по объекту», то есть в нём отображаются записи по одному объекту расчёта. Вызов процедуры происходит в момент смены текущего элемента в «главном» справочнике, для которого создан журнал расчётов.

Синтаксис:

Процедура ПриВыбореВладельца(<Владелец>)
    . . .
КонецПроцедуры

где <Владелец> — имя переменной, куда помещается значение устанавливаемого владельца, то есть элемент справочника, по которому будут выведены расчёты.

Пример использования:

Процедура ПриВыбореВладельца(Владелец)
   Если НазваниеНабораПрав() = "Кассир" Тогда
      Если Владелец = ЗапрещенныйВладелец Тогда
         Предупреждение("Нельзя изменять объект расчетов", 2);
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

При интерактивной попытке установить отбор записей в журнале расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриУстановкеОтбора() (англоязычный синоним — OnSetSelection()). Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя устанавливать данное значение отбора документов), установка не будет выполнена.

Синтаксис:

Процедура ПриУстановкеОтбора(<ИмяОтбора>, <ЗначениеОтбора>)
    . . .
КонецПроцедуры

где

  • <ИмяОтбора> — имя переменной, куда помещается строковое значение — наименование графы отбора, которая выбрана пользователем при интерактивной установке отбора;
  • <ЗначениеОтбора> — имя переменной, куда помещается значение отбора, которое выбрано пользователем при интерактивной установке отбора.

Пример использования:

Процедура ПриУстановкеОтбора(ИмяОтбора, ЗначОтбора)
   Если НазваниеНабораПрав() = "Расчетчик" Тогда 
      Если (ИмяОтбора = "Владелец") И
           (ЗначОтбора <> ТекущийРасчетчик) Тогда
         Предупреждение("Недостаточно прав!", 2);
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

При интерактивной попытке установить другую границу просмотра записей в журнале расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриУстановкеГраницыПросмотра() (англоязычный синоним — OnSetViewBound()). Если в данной предопределённой процедуре установить статус возврата в 0 (например, если данному пользователю нельзя просматривать расчёты определённой «давности»), установка не будет выполнена.

Синтаксис:

Процедура ПриУстановкеГраницыПросмотра(<Период>)
    . . .
КонецПроцедуры

где <Период> — имя переменной, куда помещается значение типа "Период журнала расчётов" – период, устанавливаемый пользователем как граница просмотра записей.

Пример использования:

Процедура ПриУстановкеГраницыПросмотра(Период)
   Если НазваниеНабораПрав() = "Расчетчик" Тогда 
      ТП = ТекущийПериод();
      // не позволим смотреть более чем на три периода назад
      МинПер = ТП.ПрибавитьПериод(-3);
      Если Период.ДатаНачала < МинПер.ДатаНачала Тогда
         Предупреждение("Недостаточно прав!", 2);
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

При интерактивной попытке установить другой режим представления записей в журнале расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриУстановкеПредставления() (англоязычный синоним — OnSetPresentation()). Если в данной предопределённой процедуре установить статус возврата 0 (например, если данному пользователю нельзя использовать определённый режим), установка не будет выполнена.

Синтаксис:

Процедура ПриУстановкеПредставления(<Режим>)
    . . .
КонецПроцедуры

где <Режим> — имя переменной, куда помещается числовое значение — режим представления записей журнала расчётов, устанавливаемый пользователем.

Пример использования:

Процедура ПриУстановкеПредставления(Режим)
   Если НазваниеНабораПрав() = "Расчетчик" Тогда 
      Если Режим = 1 Тогда
         Предупреждение("Недостаточно прав!", 2);
         СтатусВозврата(0);
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Предопределённые процедуры Глобального модуля

При попытке смены текущего расчётного периода любого журнала расчётов в системе «1С:Предприятие» неявно производится вызов предопределённой процедуры ПриСменеРасчетногоПериода() (англоязычный синоним — OnPeriodChange()). Если в данной предопределённой процедуре установить статус возврата в 0, то текущий расчётный период не будет изменён.

Данная процедура может располагаться только в глобальном программном модуле и используется для расширения возможности программного управления правами доступа пользователя к системе.

Синтаксис:

Процедура ПриСменеРасчетногоПериода(<ЖурналРасчетов>, <Период>)
    . . .
КонецПроцедуры

где

  • <ЖурналРасчетов> — ссылка на журнал расчётов, период которого изменяется (то есть на агрегатный объект типа "ЖурналРасчетов");
  • <Период> — устанавливаемый расчётный период (значение типа "ПериодРасчета").

Пример использования:

Процедура ПриСменеРасчетногоПериода(ЖР, Период)
   Если ЖР.Вид() = "Зарплата" Тогда
      Предупреждение("Это смена текущего расчетного периода для журнала Зарплата");
   КонецЕсли;
   Если Период.ДатаНачала <= ЖР.НачалоТекущегоПериода Тогда
      // не позволяем откатывать период назад
      СтатусВозврата(0);
   КонецЕсли;
КонецПроцедуры

Другие статьи по схожей тематике